مشکل در گرفتن اطلاعات از کاربر به صورت آرایه ای

E-Beshkani

Member
سلام خسته نباشید.
من یه پروژه در C++‎ باید بنویسم.
میخوام از کاربر اطلاعات مثلا 10 کتاب رو دریافت کنم!
ولی هر چی سعی کردم نتونستم.
حتی وقتی به صورت تکی هم cin میکنم ، بعدش همون رو cout میکنم هیچی ذخیره نمیشه و چیزی چاپ نمیشه!
ممنون میشم یکم توضیح بدین

#include<iostream>
#include<string>
using namespace std;
int i=0;
void add_book(struct book);
//void search_book();
struct book{
char book_name[50];
char autor[30];
int year;
int isbn;
int book_number;
int book_stock;
};
book bo5;
int main()
{
int n, t = 0;
while (t == 0)
{
cout << endl << "Hello! " << endl << "Please Select an Option:" << endl;
cout << endl << "-1 For Add a Book" << endl;
cout << "-2 For Edit a Book" << endl;
cout << "-3 For Search a Book" << endl;
cout << "-4 For Exit Application" << endl;
cin >> n;
switch (n)
{
t = 0;
case 1:
add_book(bo5);
edit_book(bo5);
break;
case 2:
edit_book(bo5);
break;
case 3:
//search_book();
break;
case 4:
t = 1;
default:
break;
}
}

}
void add_book(struct book bo)
{
cout << "Please Enter The Book's Info:" << endl << endl;
cout << "Book Name: "; cin >> bo.book_name;
cout << "Autor: "; cin >> bo.autor;
cout << "Year: "; cin >> bo.year;
cout << "ISBN: "; cin >> bo.isbn;
cout << "Number of Book: "; cin >> bo.book_number;
cout << "Stock of Book: "; cin >> bo.book_stock;
}​
 

the_king

مدیرکل انجمن
سلام خسته نباشید.
من یه پروژه در C++‎ باید بنویسم.
میخوام از کاربر اطلاعات مثلا 10 کتاب رو دریافت کنم!
ولی هر چی سعی کردم نتونستم.
حتی وقتی به صورت تکی هم cin میکنم ، بعدش همون رو cout میکنم هیچی ذخیره نمیشه و چیزی چاپ نمیشه!
ممنون میشم یکم توضیح بدین

#include<iostream>
#include<string>
using namespace std;
int i=0;
void add_book(struct book);
//void search_book();
struct book{
char book_name[50];
char autor[30];
int year;
int isbn;
int book_number;
int book_stock;
};
book bo5;
int main()
{
int n, t = 0;
while (t == 0)
{
cout << endl << "Hello! " << endl << "Please Select an Option:" << endl;
cout << endl << "-1 For Add a Book" << endl;
cout << "-2 For Edit a Book" << endl;
cout << "-3 For Search a Book" << endl;
cout << "-4 For Exit Application" << endl;
cin >> n;
switch (n)
{
t = 0;
case 1:
add_book(bo5);
edit_book(bo5);
break;
case 2:
edit_book(bo5);
break;
case 3:
//search_book();
break;
case 4:
t = 1;
default:
break;
}
}

}
void add_book(struct book bo)
{
cout << "Please Enter The Book's Info:" << endl << endl;
cout << "Book Name: "; cin >> bo.book_name;
cout << "Autor: "; cin >> bo.autor;
cout << "Year: "; cin >> bo.year;
cout << "ISBN: "; cin >> bo.isbn;
cout << "Number of Book: "; cin >> bo.book_number;
cout << "Stock of Book: "; cin >> bo.book_stock;
}​
روتین add_book تون ایراد داره، اطلاعات به درستی در bo ذخیره میشه ولی bo ای که شما به add_book ارسال می کنید یک نسخه کپی از bo5 ئه، نه خود bo5. شما خود bo5 رو تغییر نمی دهید چون در تعریف پارامتر bo در add_book از اشاره گر استفاده نکرده اید. اگر از اشاره گر استفاده نکنید کامپایلر یک نسخه کپی از bo5 رو در bo به روتین ارسال می کنه، شما هر تغییری در محتویات این bo بدهید تاثیری روی bo5 نخواهد گذاشت.
درضمن متغیر bo5 فقط برای یک کتاب جا داره و اگه مجددا برای کتاب بعدی add_book رو اجرا کنید اطلاعات کتاب قبلی درون bo5 پاک میشه.
توصیه می کنم که سه تا مورد رو در کد تون تغییر بدهید، اول تعریف پارامتر bo در add_book ئه که باید از & استفاده کنید تا کامپایلر از اشاره گر برای ارسال bo5 استفاده کنه.
دوم اینکه bo5 رو به آرایه تبدیل کنید، مثلا آرایه 100 خانه ای تا برای 100 تا کتاب جا داشته باشه و سوم یک متغیر مثل book_count به کدتون اضافه کنید تا تعداد کتاب هایی که اطلاعات اش رو در آرایه ذخیره کرده اید دست تون باشه.

کد:
// test.cpp : Defines the entry point for the console application.
//

#include <iostream>
#include <string>

using namespace std;

int i=0;

void add_book(struct book&);
void search_book();

struct book{
    char book_name[50];
    char autor[30];
    int year;
    int isbn;
    int book_number;
    int book_stock;
};

book bo5[100];
int book_count = 0;

int main()
{
    int n, t = 0;
    while (t == 0)
    {
        cout << endl << "Hello! " << endl << "Please Select an Option:" << endl;
        cout << endl << "-1 For Add a Book" << endl;
        cout << "-2 For Edit a Book" << endl;
        cout << "-3 For Search a Book" << endl;
        cout << "-4 For Exit Application" << endl;
        cin >> n;
        switch (n)
        {
            t = 0;
        case 1:
            add_book(bo5[book_count]);
            //edit_book(bo5);
            break;
        case 2:
            //edit_book(bo5);
            break;
        case 3:
            search_book();
            break;
        case 4:
            t = 1;
        default:
            break;
        }
    }

}

void search_book()
{
    char book_name[50];
    cout << "Please Enter The Book's Info:" << endl << endl;
    cout << "Book Name: "; cin >> book_name;
    for (int i=0;i<book_count;i++)
    {
        if (strcmp(bo5[i].book_name,book_name)==0)
        {
            cout << "The specified book found:" << endl << endl;
            cout << "Book Name: " << bo5[i].book_name << endl;
            cout << "Autor: " << bo5[i].autor << endl;
            cout << "Year: " << bo5[i].year << endl;
            cout << "ISBN: " << bo5[i].isbn << endl;
            cout << "Number of Book: " << bo5[i].book_number << endl;
            cout << "Stock of Book: " << bo5[i].book_stock << endl;
            return;
        }         
    }
    cout << "The specified book not found:" << endl << endl;
}

void add_book(struct book &bo)
{
    cout << "Please Enter The Book's Info:" << endl << endl;
    cout << "Book Name: "; cin >> bo.book_name;
    cout << "Autor: "; cin >> bo.autor;
    cout << "Year: "; cin >> bo.year;
    cout << "ISBN: "; cin >> bo.isbn;
    cout << "Number of Book: "; cin >> bo.book_number;
    cout << "Stock of Book: "; cin >> bo.book_stock;
    book_count++;
}
 

E-Beshkani

Member
روتین add_book تون ایراد داره، اطلاعات به درستی در bo ذخیره میشه ولی bo ای که شما به add_book ارسال می کنید یک نسخه کپی از bo5 ئه، نه خود bo5. شما خود bo5 رو تغییر نمی دهید چون در تعریف پارامتر bo در add_book از اشاره گر استفاده نکرده اید. اگر از اشاره گر استفاده نکنید کامپایلر یک نسخه کپی از bo5 رو در bo به روتین ارسال می کنه، شما هر تغییری در محتویات این bo بدهید تاثیری روی bo5 نخواهد گذاشت.
درضمن متغیر bo5 فقط برای یک کتاب جا داره و اگه مجددا برای کتاب بعدی add_book رو اجرا کنید اطلاعات کتاب قبلی درون bo5 پاک میشه.
توصیه می کنم که سه تا مورد رو در کد تون تغییر بدهید، اول تعریف پارامتر bo در add_book ئه که باید از & استفاده کنید تا کامپایلر از اشاره گر برای ارسال bo5 استفاده کنه.
دوم اینکه bo5 رو به آرایه تبدیل کنید، مثلا آرایه 100 خانه ای تا برای 100 تا کتاب جا داشته باشه و سوم یک متغیر مثل book_count به کدتون اضافه کنید تا تعداد کتاب هایی که اطلاعات اش رو در آرایه ذخیره کرده اید دست تون باشه.

کد:
// test.cpp : Defines the entry point for the console application.
//

#include <iostream>
#include <string>

using namespace std;

int i=0;

void add_book(struct book&);
void search_book();

struct book{
    char book_name[50];
    char autor[30];
    int year;
    int isbn;
    int book_number;
    int book_stock;
};

book bo5[100];
int book_count = 0;

int main()
{
    int n, t = 0;
    while (t == 0)
    {
        cout << endl << "Hello! " << endl << "Please Select an Option:" << endl;
        cout << endl << "-1 For Add a Book" << endl;
        cout << "-2 For Edit a Book" << endl;
        cout << "-3 For Search a Book" << endl;
        cout << "-4 For Exit Application" << endl;
        cin >> n;
        switch (n)
        {
            t = 0;
        case 1:
            add_book(bo5[book_count]);
            //edit_book(bo5);
            break;
        case 2:
            //edit_book(bo5);
            break;
        case 3:
            search_book();
            break;
        case 4:
            t = 1;
        default:
            break;
        }
    }

}

void search_book()
{
    char book_name[50];
    cout << "Please Enter The Book's Info:" << endl << endl;
    cout << "Book Name: "; cin >> book_name;
    for (int i=0;i<book_count;i++)
    {
        if (strcmp(bo5[i].book_name,book_name)==0)
        {
            cout << "The specified book found:" << endl << endl;
            cout << "Book Name: " << bo5[i].book_name << endl;
            cout << "Autor: " << bo5[i].autor << endl;
            cout << "Year: " << bo5[i].year << endl;
            cout << "ISBN: " << bo5[i].isbn << endl;
            cout << "Number of Book: " << bo5[i].book_number << endl;
            cout << "Stock of Book: " << bo5[i].book_stock << endl;
            return;
        }        
    }
    cout << "The specified book not found:" << endl << endl;
}

void add_book(struct book &bo)
{
    cout << "Please Enter The Book's Info:" << endl << endl;
    cout << "Book Name: "; cin >> bo.book_name;
    cout << "Autor: "; cin >> bo.autor;
    cout << "Year: "; cin >> bo.year;
    cout << "ISBN: "; cin >> bo.isbn;
    cout << "Number of Book: "; cin >> bo.book_number;
    cout << "Stock of Book: "; cin >> bo.book_stock;
    book_count++;
}

ممنونم
این صورت سوال یک قسمته :
مشخصات کتاب دریافت شود. اگر نام و شابک دریافت شده با نام و شابک یک کتاب برابر باشد، تنها تعداد آن کتاب یکی اضافه شود. در غیر این صورت اطلاعات آن به کتابهای قبلی اضافه شود.

من میخوام مثل تاب search شما بنویسم ولی نمیشه ارور میده ، یعنی نمیفهمم چیکار کنم که اول چک کنه و اگه درست بود بعدا ذخیره کنه.

کد:
void add_book(struct book &bo)
{
    for (i = 0; i < book_count; i++)
    {
        cout << "Please Enter The Book's Info:" << endl << endl;
        cout << "Book Name: "; cin >> bo.book_name;
        if (strcmp(bo[i].book_name, bo.book_name))
            {
                bo.book_stock++;
            }
    }
    cout << "Autor: "; cin >> bo.autor;
    cout << "Year: "; cin >> bo.year;
    cout << "ISBN: "; cin >> bo.isbn;
    cout << "Number of Book: "; cin >> bo.book_number;
    cout << "Stock of Book: "; cin >> bo.book_stock;
    book_count++;
}
 

the_king

مدیرکل انجمن
ممنونم
این صورت سوال یک قسمته :
مشخصات کتاب دریافت شود. اگر نام و شابک دریافت شده با نام و شابک یک کتاب برابر باشد، تنها تعداد آن کتاب یکی اضافه شود. در غیر این صورت اطلاعات آن به کتابهای قبلی اضافه شود.

من میخوام مثل تاب search شما بنویسم ولی نمیشه ارور میده ، یعنی نمیفهمم چیکار کنم که اول چک کنه و اگه درست بود بعدا ذخیره کنه.

کد:
void add_book(struct book &bo)
{
    for (i = 0; i < book_count; i++)
    {
        cout << "Please Enter The Book's Info:" << endl << endl;
        cout << "Book Name: "; cin >> bo.book_name;
        if (strcmp(bo[i].book_name, bo.book_name))
            {
                bo.book_stock++;
            }
    }
    cout << "Autor: "; cin >> bo.autor;
    cout << "Year: "; cin >> bo.year;
    cout << "ISBN: "; cin >> bo.isbn;
    cout << "Number of Book: "; cin >> bo.book_number;
    cout << "Stock of Book: "; cin >> bo.book_stock;
    book_count++;
}
ابتدا اون اطلاعاتی که برای جستجو لازمه رو دریافت کنید، یعنی نام و شابک. بعد بر اساس اش جستجو کنید، اگر کتاب مورد نظر وجود داشت، از بقیه اطلاعات فقط به book_stock احتیاج دارید، پس دریافت اش کنید و به موجودی کتاب پیدا شده اضافه اش کنید و کلا از روتین add_book خارج بشید تا book_count هم تغییری نکنه. اما اگر کتاب مورد نظر پیدا نشد، بقیه اطلاعات رو هم دریافت می کنید و کتاب جدید به مجموعه اضافه میشه.
کد:
void add_book(struct book &bo)
{
    cout << "Please Enter The Book's Info:" << endl << endl;
    cout << "Book Name: "; cin >> bo.book_name;
    cout << "ISBN: "; cin >> bo.isbn;
    for (int i=0;i<book_count;i++)
    {
        if (strcmp(bo5[i].book_name,bo.book_name)==0)
        {
            if (bo5[i].isbn == bo.isbn)
            {
                cout << "Stock of Book: "; cin >> bo.book_stock;
                bo5[i].book_stock+=bo.book_stock;
                return;
            }
        }
    }    
    cout << "Autor: "; cin >> bo.autor;
    cout << "Year: "; cin >> bo.year;
    cout << "Number of Book: "; cin >> bo.book_number;
    cout << "Stock of Book: "; cin >> bo.book_stock;
    book_count++;
}
 

E-Beshkani

Member
ابتدا اون اطلاعاتی که برای جستجو لازمه رو دریافت کنید، یعنی نام و شابک. بعد بر اساس اش جستجو کنید، اگر کتاب مورد نظر وجود داشت، از بقیه اطلاعات فقط به book_stock احتیاج دارید، پس دریافت اش کنید و به موجودی کتاب پیدا شده اضافه اش کنید و کلا از روتین add_book خارج بشید تا book_count هم تغییری نکنه. اما اگر کتاب مورد نظر پیدا نشد، بقیه اطلاعات رو هم دریافت می کنید و کتاب جدید به مجموعه اضافه میشه.
کد:
void add_book(struct book &bo)
{
    cout << "Please Enter The Book's Info:" << endl << endl;
    cout << "Book Name: "; cin >> bo.book_name;
    cout << "ISBN: "; cin >> bo.isbn;
    for (int i=0;i<book_count;i++)
    {
        if (strcmp(bo5[i].book_name,bo.book_name)==0)
        {
            if (bo5[i].isbn == bo.isbn)
            {
                cout << "Stock of Book: "; cin >> bo.book_stock;
                bo5[i].book_stock+=bo.book_stock;
                return;
            }
        }
    }   
    cout << "Autor: "; cin >> bo.autor;
    cout << "Year: "; cin >> bo.year;
    cout << "Number of Book: "; cin >> bo.book_number;
    cout << "Stock of Book: "; cin >> bo.book_stock;
    book_count++;
}

ممنونم از شما.

Capture.PNG

مشکل این کد ها کجاست؟!
چرا ارور میده!؟

کد:
void search_book()
{
    char new_book_name[50];
    cout << "Please Enter The Book Name" << endl << endl;
    cout << "Book Name: "; cin >> new_book_name;
    for (int i = 0; i < book_count; i++)
    {
        for (int j = 0; j < 50; j++)
        {
            if (strcmp(bo5[i].book_name[j], new_book_name[j]) == 0)
            {
                cout << "The specified book found:" << endl << endl;
                cout << "Book Name: " << bo5[i].book_name << endl;
                cout << "Autor: " << bo5[i].autor << endl;
                cout << "Year: " << bo5[i].year << endl;
                cout << "ISBN: " << bo5[i].isbn << endl;
                cout << "Number of Book: " << bo5[i].book_number << endl;
                cout << "Stock of Book: " << bo5[i].book_stock << endl;
            }
            else
            {
                cout << "The specified book not found:" << endl << endl;
            }
        }
    }
}
 

E-Beshkani

Member
جستوجو :
نام یا بخشی از نام کتاب را وارد میکند. درصورتیکه موجود باشد مشخصات کامل آن چاپ شود. اگر موجود نباشد به کاربر اطلاع دهد. اگر نام واردشده بخشی از نام چندین کتاب باشد مشخصات همه چاپ شود.
 

the_king

مدیرکل انجمن
ممنونم از شما.

مشاهده پیوست 111755

مشکل این کد ها کجاست؟!
چرا ارور میده!؟

کد:
void search_book()
{
    char new_book_name[50];
    cout << "Please Enter The Book Name" << endl << endl;
    cout << "Book Name: "; cin >> new_book_name;
    for (int i = 0; i < book_count; i++)
    {
        for (int j = 0; j < 50; j++)
        {
            if (strcmp(bo5[i].book_name[j], new_book_name[j]) == 0)
            {
                cout << "The specified book found:" << endl << endl;
                cout << "Book Name: " << bo5[i].book_name << endl;
                cout << "Autor: " << bo5[i].autor << endl;
                cout << "Year: " << bo5[i].year << endl;
                cout << "ISBN: " << bo5[i].isbn << endl;
                cout << "Number of Book: " << bo5[i].book_number << endl;
                cout << "Stock of Book: " << bo5[i].book_stock << endl;
            }
            else
            {
                cout << "The specified book not found:" << endl << endl;
            }
        }
    }
}
تابع strcmp یک رشته رو با یک رشته دیگه مقایسه می کنه، نه یک کاراکتر رو با یک کارکتر، شما یک حلقه بیرونی قرار دادید که برای هر 50 کاراکتر رشته تکرار میشه، strcmp که نمی تونه برای هر کاراکتر مجزا مقایسه انجام بده، برای همین خطا میده که اون [j] ای که اضافه کردید از رشته یک کاراکتر رو جدا می کنه و نمی تونم روی یک کاراکتر عملیاتی انجام بدم. کلا اون حلقه j ئه 0 تا 50 منطق درستی نداره.
اون تابعی که شما برای جستجوی یک تکه رشته در رشته دیگری لازم دارید strcmp نیست، strcmp برای اینکار ساخته نشده، باید از strstr استفاده کنید.
strstr میگه این تکه رشته در کجای رشته دیگری پیدا شد، اگه پیدا نشه 0 یا null رو بر می گردونه.
کد:
void search_book()
{
    char book_name[50];
    cout << "Please Enter The Book's Info:" << endl << endl;
    cout << "Book Name: "; cin >> book_name;
    int count=0;
    for (int i=0;i<book_count;i++)
    {
        if (strstr(bo5[i].book_name,book_name)!=0)
        {
            count++;
            if (count == 1)
            {           
                cout << "The specified book found:" << endl << endl;
            }
            cout << "Book Name: " << bo5[i].book_name << endl;
            cout << "Autor: " << bo5[i].autor << endl;
            cout << "Year: " << bo5[i].year << endl;
            cout << "ISBN: " << bo5[i].isbn << endl;
            cout << "Number of Book: " << bo5[i].book_number << endl;
            cout << "Stock of Book: " << bo5[i].book_stock << endl << endl;
        }         
    }
    if (count == 0)
    {
        cout << "The specified book not found." << endl << endl;
    }
}
 

E-Beshkani

Member
تابع strcmp یک رشته رو با یک رشته دیگه مقایسه می کنه، نه یک کاراکتر رو با یک کارکتر، شما یک حلقه بیرونی قرار دادید که برای هر 50 کاراکتر رشته تکرار میشه، strcmp که نمی تونه برای هر کاراکتر مجزا مقایسه انجام بده، برای همین خطا میده که اون [j] ای که اضافه کردید از رشته یک کاراکتر رو جدا می کنه و نمی تونم روی یک کاراکتر عملیاتی انجام بدم. کلا اون حلقه j ئه 0 تا 50 منطق درستی نداره.
اون تابعی که شما برای جستجوی یک تکه رشته در رشته دیگری لازم دارید strcmp نیست، strcmp برای اینکار ساخته نشده، باید از strstr استفاده کنید.
strstr میگه این تکه رشته در کجای رشته دیگری پیدا شد، اگه پیدا نشه 0 یا null رو بر می گردونه.
کد:
void search_book()
{
    char book_name[50];
    cout << "Please Enter The Book's Info:" << endl << endl;
    cout << "Book Name: "; cin >> book_name;
    int count=0;
    for (int i=0;i<book_count;i++)
    {
        if (strstr(bo5[i].book_name,book_name)!=0)
        {
            count++;
            if (count == 1)
            {          
                cout << "The specified book found:" << endl << endl;
            }
            cout << "Book Name: " << bo5[i].book_name << endl;
            cout << "Autor: " << bo5[i].autor << endl;
            cout << "Year: " << bo5[i].year << endl;
            cout << "ISBN: " << bo5[i].isbn << endl;
            cout << "Number of Book: " << bo5[i].book_number << endl;
            cout << "Stock of Book: " << bo5[i].book_stock << endl << endl;
        }        
    }
    if (count == 0)
    {
        cout << "The specified book not found." << endl << endl;
    }
}

خیلی ممنونم
اگه بخوام این اطلاعات رو درون یک فایل ذخیره کنم باید چیکار کنم؟!
برای کار با فایل های آموزش یا فیلم خوبی سراغ ندارین؟!
 

جدیدترین ارسال ها

بالا