مشكل اين برنامه چيه؟

hobab1987

Member
سلام
مشكل اين برنامه چيه؟ 2 تا ارور ميده!!

#include <stdio.h>
#include <conio.h>
#include <process.h>
struct bookinfo{
addnew();
private:
Char title[20];
char author[15];
char publisher[15];
char stead[50];
int history;
int version_num;
};
int menu();
void addnew();
void quit();
//******************************************************************************
//main part of the program
//******************************************************************************
int main()
{ bookinfo inf;
int choise;
char wrd;
for(;;)
{
clrscr();
choise=menu();
switch(choise)
{
case 1: //entering new bookinf
clrscr();
inf.addnew();
break;
case 2: //searching a word
printf("enter a word to search:");
scanf("%s",&wrd);
break;
case 3: //reports
case 4: //exit the program
quit();
break;
default: //incorrect value
printf("enter a valid number between 1_4!");
printf("\a");
getch();
break;
}
}
}
//***********<<main menu>>**********
int menu()
{
int p;
gotoxy(35,20);
printf("1)add record");
gotoxy(35,21);
printf("2)search record");
gotoxy(35,22);
printf("3)reports");
gotoxy(35,23);
printf("4)exit");
gotoxy(35,24);
printf("enter your select(1_4)");
scanf("%d",&p);
return p;
}
//*************<<quit>>*************
void quit()
{
char ans;
gotoxy(28,28);
printf("<<quit>>");
gotoxy(30,30);
printf("do u wanna to quit(y/n)?");
ans=getch();
if(ans=='y' || ans=='y')
exit(0);
else
return;
}
//**************<<addnew bookinfo>>*************
void bookinfo::addnew()
{
int col=35;
gotoxy(col,20);
printf("title:");
scanf("%s",inf.title);
gotoxy(col,21);
printf("author:");
scanf("%s",inf.author);
gotoxy(col,22);
printf("publisher");
scanf("%s",inf.publisher);
gotoxy(col,23);
printf("stead");
scanf("%s",inf.stead);
gotoxy(col,24);
printf("history");
scanf("%d",inf.history);
gotoxy(col,25);
printf("version_num");
scanf("%d",inf.version_num);
}
 

the_king

مدیرکل انجمن
مورد اول) لطفا برای قرار دادن کد برنامه از دکمه
code.gif
استفاده کنید.

مورد دوم) توابعی که از خارج ساختمان bookinfo صدا می زنید، مثلا addnew بایستی public باشند و در داخل ساختمان تعریف شوند
و نه بیرون از آن.

مورد سوم) متغیر wrd را بصورت یک کاراکتر char تعریف کردید که برای دریافت یک رشته مناسب نیست ("s%")
برای دریافت یک رشته بایستی متغیر یک آرایه از char باشد، مثلا [char wrd[20 برای دریافت یک رشته حداکثر 19 کاراکتری
مناسب است.

مورد چهارم) تابع scanf برای دریافت مقادیر به آدرس آنها نیازمند است، آدرس متغیر های int نظیر history را با درج
کاراکتر & قبل از نام آن ارسال کنید، یعنی history&

کد:
#include <stdio.h>
#include <conio.h>
#include <process.h>

struct bookinfo
{
   private:
   char title[20];
   char author[15];
   char publisher[15];
   char stead[50];
   int history;
   int version_num;
   public:
   void addnew();
};

void quit();
int menu();
//************************************************** ****************************
//main part of the program
//************************************************** ****************************
int main()
{
   bookinfo inf;
   int choise;
   char wrd[20];
   for(;;)
   {
      clrscr();
      choise=menu();
      switch(choise)
      {
         case 1: //entering new bookinf
            clrscr();
            inf.addnew();
            break;
         case 2: //searching a word
            printf("enter a word to search:");
            scanf("%s",wrd);
            break;
         case 3: //reports
         case 4: //exit the program
            quit();
            break;
         default: //incorrect value
            printf("enter a valid number between 1_4!");
            printf("\a");
            getch();
         break;
      }
   }
}
//***********<<main menu>>**********
int menu()
{
   int p;
   gotoxy(35,20);
   printf("1)add record");
   gotoxy(35,21);
   printf("2)search record");
   gotoxy(35,22);
   printf("3)reports");
   gotoxy(35,23);
   printf("4)exit");
   gotoxy(35,24);
   printf("enter your select(1_4)");
   scanf("%d",&p);
   return p;
}
//*************<<quit>>*************
void quit()
{
   char ans;
   gotoxy(28,28);
   printf("<<quit>>");
   gotoxy(30,30);
   printf("do u wanna to quit(y/n)?");
   ans=getch();
   if(ans=='y' || ans=='y')
      exit(0);
   else
      return;
}
//**************<<addnew bookinfo>>*************
void bookinfo::addnew()
{
   int col=35;
   gotoxy(col,20);
   printf("title:");
   scanf("%s",title);
   gotoxy(col,21);
   printf("author:");
   scanf("%s",author);
   gotoxy(col,22);
   printf("publisher:");
   scanf("%s",publisher);
   gotoxy(col,23);
   printf("stead:");
   scanf("%s",stead);
   gotoxy(col,24);
   printf("history:");
   scanf("%d",&history);
   gotoxy(col,25);
   printf("version_num:");
   scanf("%d",&version_num);
}
 

hobab1987

Member
ممنون از وقتي كه گذاشتيد.:rose:

ببخشيد براي تكميل برنامه چند تا سوال داشتم :
1-وقتي اطلاعات كتاب جديد رو از كاربربا استفاده از تابع << addnew bookinfo >>مي گيرم به كتبها اضافه ميشه؟

2- براي جستجوي ركورد كتاب هاي ساختمان از تابع strops() ميخوام استفاده كنم اما نمي دونم چه طوري بايد اين كار رو انجام بدم!

3- براي اينكه يك ركورد رو از حافظه پاك كنم و مشخصات ركورد بعدي را كه جستجو كرده بودم در آن قرار دهم چه كنم؟
لطفا راهنماييم كنيد.
 

the_king

مدیرکل انجمن
ممنون از وقتي كه گذاشتيد.:rose:

ببخشيد براي تكميل برنامه چند تا سوال داشتم :
1-وقتي اطلاعات كتاب جديد رو از كاربربا استفاده از تابع << addnew bookinfo >>مي گيرم به كتبها اضافه ميشه؟

2- براي جستجوي ركورد كتاب هاي ساختمان از تابع strops() ميخوام استفاده كنم اما نمي دونم چه طوري بايد اين كار رو انجام بدم!

3- براي اينكه يك ركورد رو از حافظه پاك كنم و مشخصات ركورد بعدي را كه جستجو كرده بودم در آن قرار دهم چه كنم؟
لطفا راهنماييم كنيد.

1) نه متاسفانه، bookinfo به تنهایی فقط معرفی ساختار یک رکورد شما است، و تعداد نمونه های این ساختمان بستگی
به تعداد اشیائی دارد که از نوع bookinfo ایجاد می کنید. در کل برنامه شما صرفا یک متغیر inf را از نوع bookinfo ایجاد کرده اید
بنابر این همواره فقط اطلاعات یک رکورد (یک کتاب) در داخل inf ذخیره می گردد و اگر مجددا ()addnew را فراخوانی کنید،
محتویات آن (اطلاعات کتاب قبلی) باز نویسی می شوند و از دست می روند.
شما به یک مجموعه (اصولا یک آرایه یا لیست پیوندی) از اشیاء bookinfo نیاز دارید تا بتوانید اطلاعات چندین کتاب را
نگهداری کنید.

2) شما به یک تابع نیاز دارید که یک مقدار ورودی (مثلا پارامتر lookfor) داشته باشد و مقدار درون lookfor را با title (یا هر
فیلد دیگری که نیاز دارید) درون bookinfo مقایسه کند و اگر جستجو نتیجه مثبت داشت، مقدار true برگرداند.
اما قبل از اینکار ابتدا بایستی ساختار چند رکوردی (مورد 1) را ایجاد کنید و بعد از آن برای پیاده سازی قابلیت جستجو اقدام کنید.

3) نحوه پاک شدن یک رکورد بستگی به نوع ایجاد شدن آن دارد. اصولا اگر رکورد ها را در یک آرایه قرار دارند، نیازی به حذف
فیزیکی رکورد ها نیست. ابتدا آخرین رکورد موجود در آرایه را جایگزین رکوردی نمایید که بایستی حذف شود و سپس تعداد
رکورد های آرایه (مثلا مقدار متغیری نظیر count) را یک واحد کاهش دهید. این الگوریتم برای حذف کردن منطقی یک رکورد
کفایت می کند.

کد:
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <string.h>

struct bookinfo
{
   private:
   char title[20];
   char author[15];
   char publisher[15];
   char stead[50];
   int history;
   int version_num;
   public:
   void addnew();
   void print();
   int search(char[]);
};

void quit();
int menu(int);
//************************************************** ****************************
//main part of the program
//************************************************** ****************************
int main()
{
   bookinfo inf[20];
   int count = 0, choise, i, n, error = 0, scount;
   char wrd[20], ans;
   for(;;)
   {
      clrscr();
      choise=menu(error);
      error = 0;
      switch(choise)
      {
         case 1: //entering new bookinf
            clrscr();
            inf[count].addnew();
            count++;
            break;
         case 2: //searching a word
            clrscr();
            printf("enter a word to search:");
            scanf("%s",wrd);
            scount = 0;
            for (i = 0; i < count; i++)
               if (inf[i].search(wrd))
               {
                  scount++;
                  if (scount == 1)
                     printf("%-4s %-20s %-15s %-15s\n     %-50s %-10s %-10s\n"
                     ,"NO.", "TITLE", "AUTHOR", "PUBLISHER", "STEAD"
                     , "HISTORY", "VERSION");
                  printf("%-4d ", scount);
                  inf[i].print();
               }
            if (scount == 0)
               printf("\n not found.");
            printf("\n press any key to continue.");
            getch();
            break;
         case 3: //reports
            clrscr();
            printf("%-4s %-20s %-15s %-15s\n     %-50s %-10s %-10s\n"
            ,"NO.", "TITLE", "AUTHOR", "PUBLISHER", "STEAD"
            , "HISTORY", "VERSION");
            for (i = 0; i < count; i++)
            {
               printf("%-4d ", i + 1);
               inf[i].print();
            }
            printf("\n press any key to continue.");
            getch();
            break;
         case 4: //remove
            clrscr();
            if (count > 0)
            {
               printf("book number (1 to %d):",count);
               scanf("%d", &n);
               if ((n > 0) && (n <= count))
               {
                  printf("%-4s %-20s %-15s %-15s\n     %-50s %-10s %-10s\n"
                  ,"NO.", "TITLE", "AUTHOR", "PUBLISHER", "STEAD"
                  , "HISTORY", "VERSION");
                  printf("%-4d ", n);
                  inf[n-1].print();
                  printf("\n do u wanna to remove (y/n)?");
                  ans=getch();
                  if(ans=='Y' || ans=='y')
                  {
                     inf[n-1] = inf[count-1];
                     count--;
                  }
               }
            }
            break;
         case 5: //exit the program
            quit();
            break;
         default: //incorrect value
            error = -1;
            break;
      }
   }
}
//***********<<main menu>>**********
int menu(int error)
{
   char ans;
   gotoxy(35,18);
   printf("1)add record");
   gotoxy(35,19);
   printf("2)search record");
   gotoxy(35,20);
   printf("3)reports");
   gotoxy(35,21);
   printf("4)remove");
   gotoxy(35,22);
   printf("5)exit");
   gotoxy(35,23);
   printf("enter your select(1 to 4)");
   if (error)
   {
      gotoxy(35,24);
      printf("enter a valid number between 1 to 4!");
   }
   fflush(stdin);
   ans=getch();
   return ans - '0';
}
//*************<<quit>>*************
void quit()
{
   char ans;
   clrscr();
   gotoxy(35,23);
   printf("<<quit>>");
   gotoxy(35,24);
   printf("do u wanna to quit(y/n)?");
   ans=getch();
   if(ans=='Y' || ans=='y')
      exit(0);
   else
      return;
}
//**************<<addnew bookinfo>>*************
void bookinfo::addnew()
{
   int col=35;
   gotoxy(col,20);
   printf("title:");
   scanf("%s",title);
   gotoxy(col,21);
   printf("author:");
   scanf("%s",author);
   gotoxy(col,22);
   printf("publisher:");
   scanf("%s",publisher);
   gotoxy(col,23);
   printf("stead:");
   scanf("%s",stead);
   gotoxy(col,24);
   printf("history:");
   scanf("%d",&history);
   gotoxy(col,25);
   printf("version_num:");
   scanf("%d",&version_num);
}
//**************<<print bookinfo>>*************
void bookinfo::print()
{
   printf("%-20s %-15s %-15s\n     %-50s %-10d %-10d\n", title, author
   , publisher, stead, history, version_num);
}

//**************<<search bookinfo>>*************
int bookinfo::search(char wrd[])
{
   if (strstr(title, wrd))
      return -1;
   if (strstr(author, wrd))
      return -1;
   if (strstr(publisher, wrd))
      return -1;
   return 0;
}
 

hobab1987

Member
يه دنيا تشكر
مي دونيد مي خوام برنامه اولين ركوردي رو كه پيدا كرد يك منو زير آن نشان بده كه يكي از گزينه هاي اين منو "حذف ركورد" كه ركورد رو از حافظه پاك كنه و ركورد بعدي رو بجاي اون قرار ميده
و گزينه ديگه اين منو "تغيير ركورد" كه مشخصات تازه رو از كاربر مي گيره و محتواي موجود در آرايه رو تغيير ميده
و گزينه بعديش" ركورد بعدي" به سراغ ركورد بعدي ميره و اين كار را تكرار ميكنه تا هيچ ركوردي باقي نمونه
-----
اومدم تابع منو ()page رو در حلقه جستجو قرار دادم تا بعد از اولين جستجو قرار بگيره و فقط روي يك ركورد تك تك تا انتها كار بشه نه كلي. از تابع strcpy ميشه استفاده كرد چطوري؟

در تابع menu2() تابع 1menu() را در case 4 صدا زدم اما ارور ميده!
لطفا كمكككككككككك!

کد:
//This program do management a library,add books,delete books, search a book.
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <string.h>
struct bookinfo{
       private:
                          char title[10];
                          char author[10];
                          char publisher[10];
                          char stead[10];
                          int history;
                          int version_num;
       public:
                         void addnew();
                         void print();
                         int search(char[]);
};
int menu2();
void quit();
int menu1(int);
//******************************************************************************
//Main Part Of The Program
//******************************************************************************
int main()
{    
             bookinfo inf[600];
             int  count = 0, choise, error =  0, scount, i;
             char wrd[20], ans;
   for( ; ; )
     {
  clrscr();
  choise = menu1(error);
  error = 0;
      switch(choise)
           {
  case 1:                 //Entering new bookinfo
 
         inf[count].addnew();
          count++;
                            break;
  case 2:                      //Searching new bookinfo
    clrscr();
     gotoxy(33,20);
        printf("Enter a word to search:");
       scanf("%s",wrd);
      clrscr();
    scount = 0;
        for(i = 0; i < count; i++)
     {
      if(inf[i].search(wrd))
           scount++;
        if(scount == 1)
       printf("%-4s %-10s %-10s %-10s %-10s %-10s %-10s\n"
        ,"NO.", "Title", "Author", "Publisher", "Stead"
             , "History", "Version");
          printf("%-4d ", scount);
                        inf[i].print();
                        menu2();
                                  }
                                     if (scount == 0)
           printf("\n not found.");
           printf("\n press any key to continue.");
                                 getch();           
                           break;
     case 3:              //Reports
     case 4:              //Exit the program
                              quit();
                           break;
     default:             //incorrect value
                                   error = -1;
                            break;
           }
     }
}
//***********<<Main menu1>>**********
int menu1(int error)
     {
     char ans;
     int row=25;
    gotoxy(row,17);
       printf("1) Add record");
    gotoxy(row,19);
       printf("2) Search record");
    gotoxy(row,21);
       printf("3) Reports");
    gotoxy(row,23);
       printf("4) Exit");
    gotoxy(row,25);
       printf("Enter a valil number between 1 to 4 :");
              if (error){
         gotoxy(35,30);
    printf("enter a valid number between 1 to 4!");
}
     fflush(stdin);
     ans=getch();
     return ans - '0';
}
//********************<<Quit>>**********************
void quit()
{
   char ans;
clrscr();
         gotoxy(35,22);
               printf("<<Quit>>");
         gotoxy(28,25);
        printf("Do You Want to Quit(Y/N)?");
      ans=getch();
          if(ans=='y' || ans=='Y')
      exit(0);
           else
                 return;
}
//**************<<Add new bookinfo>>*************
void bookinfo::addnew()
{
  int col=25;
   clrscr();
         gotoxy(col,18);
                          printf("Enter Title Of Book:");
                          scanf("%s",title);
         gotoxy(col,20);
                          printf("Enter Author Name :");
     scanf("%s",author);
                                     gotoxy(col,22);
                          printf("Enter Publisher Name:");
                          scanf("%s",publisher);
         gotoxy(col,24);
                          printf("Enter Stead Of Propagation:");
                          scanf("%s",stead);
         gotoxy(col,26);
                          printf("Enter History Of Propagation :");
     scanf("%d",&history);
         gotoxy(col,28);
     printf("Enter Number Of This Book Exist:");
     scanf("%d",&version_num);
}
//********************<<Print bookinfo>>*******************
void bookinfo::print()
{    
   printf("%-10s %-10s %-10s %-10s %-10d %-10d\n", title, author
   , publisher, stead, history, version_num);
}
//**************<<search bookinfo>>*************
int bookinfo::search(char wrd[])
{
   if (strstr(title, wrd))
      return -1;
   if (strstr(author, wrd))
      return -1;
   if (strstr(publisher, wrd))
      return -1;
   return 0;
}
//*************<<Main menu2>>************
int menu2()
{
    int num;
    char ans;
     printf("\n %s %s %s %s","1) Delete Record","2)Change Record"
    ,"3)Next Record>>","4)Main Menu");
       printf("  Select:");
    scanf("%d",&num);
    switch(num)
    {
       case 1:     //Delete Record
       case 2:     //Change Record
       case 3:    //Next Record
       case 4:    //back to Main Menu
       clrscr();
       1menu()
       break;
       default:   //incorect number
       return num;
    }
}
//*********************<<Delete Record>>**************
void del()
{
  printf("\n do u wanna to remove (y/n)?");
    ans=getch();
    if(ans=='Y' || ans=='y')
       {
 
        }
  }
//*************<<change record>>**********
void change()
{
 char n[10];
   for(i=0;i
     strcpy(inf[i].title,n);
 
آخرین ویرایش:

hobab1987

Member
در تابعmain menu 1 در اين قسمت
کد:
[FONT=Times New Roman][SIZE=3][SIZE=3][FONT=Times New Roman]printf("Enter a valil number between 1 to 4 :");[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]             if (error){[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                         gotoxy(35,30);[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                                    printf("enter a valid number between 1 to 4!");[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]}[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]               fflush(stdin);[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]               ans=getch();[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]               return ans - '0';[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]}[/FONT][/SIZE]
[/SIZE][/FONT]

بعد از
کد:
 printf("Enter a valil number between 1 to 4 :");

نبايد يك scacf بزاريم؟
و يه كوچولو در مورد 3 خط آخر لطفا توضيح بدبد!!!
 

the_king

مدیرکل انجمن
در تابعmain menu 1 در اين قسمت
کد:
printf("Enter a valil number between 1 to 4 :");
             if (error){
                                         gotoxy(35,30);
                                    printf("enter a valid number between 1 to 4!");
}
               fflush(stdin);
               ans=getch();
               return ans - '0';
}

بعد از
کد:
 printf("Enter a valil number between 1 to 4 :");

نبايد يك scacf بزاريم؟
و يه كوچولو در مورد 3 خط آخر لطفا توضيح بدبد!!!

دلیل اینکه از ()getch بجای ()scanf استفاده کردم، عدم نیاز به زدن کلید enter بعد از انتخاب اعداد 1 الی 9 بود.

با فرمان (fflush(stdin محتویات بافر صفحه کلید پاک می شود، تا اگر قبل از آنکه به این موقعیت برسیم، کلید های
پردازش نشده ای فشار داده شده باشند، از بافر حذف گردند. زمانی که از توابع scanf و getch بصورت ترکیبی استفاده
می کنید، احتمال بروز مشکل از جانب کلید های پردازش نشده درون بافر صفحه کلید وجود دارد. با پاک کردن بافر
صفحه کلید، این مشکل برطرف می شود.

زمانی که یک کاراکتر را از صفحه کلید خوانده و در ans قرار دادیم، بایستی آنرا از کاراکتر های '0' الی '9' (کد های ASCII
48 الی 57) به اعداد 0 الی 9 تبدیل کنیم. این عمل را با کم کردن کد کاراکتر '0' (عدد 48) از مقدار داخل ans انجام دادم.
 

hobab1987

Member
چه جالب كار اين تابع!
منظورم از نوشتن scanef بعد از printf اولي، قبل از if بود . آخه تا زماني كه قبل از if عدد 1 تا 9 را نگرفته چطور ميتونه error بده و بگه عدد مورد نظر بايد بين اين دو مقدار باشه؟!
يا اينكه من اشتباه ميكنم و printf اولي اضافيه!
 

the_king

مدیرکل انجمن
چه جالب كار اين تابع!
منظورم از نوشتن scanef بعد از printf اولي، قبل از if بود . آخه تا زماني كه قبل از if عدد 1 تا 9 را نگرفته چطور ميتونه error بده و بگه عدد مورد نظر بايد بين اين دو مقدار باشه؟!
يا اينكه من اشتباه ميكنم و printf اولي اضافيه!
اگر دقت کنید error یک متغیری است که صرفا دو وضعیت 0 و 1- دارد و مقدار اولیه اش 0 است. در حالت 0 هم پیغام خطایی
نمایش نمی یابد.

شما روتین برنامه را طوری نوشته بودید که پیش از نمایش لیست menu، صفحه نمایش را پاک کند. به همین دلیل زمانی که
به کاربر پیغام می دادید که عدد وارد شده قابل قبول نیست، از او می خواستید که یک کلید را فشار دهد تا صفحه پاک شود
و مجددا لیست نمایش یابد. این مرحله کمی غیر عادی بود.

من این روتین شما را تغییر دادم، به نحوی که پیغام غیر قابل قبول بودن عدد وارد شده در همان تابع menu نمایش یابد.
برای اینکه تفاوت بین دو حالت قابل قبول و غیر قابل قبول مشخص شود، یک متغیر به نام error تعریف کردم که صرفا دو
وضعیت 0 و 1- دارد و یک متغیر boolean است. پیغام خطا تنها زمانی نمایش می یابد که متغیر error برابر 1- (true) باشد.
اگر دقت کرده باشید، در هنگام تعریف متغیر مذکور و بعد از اجرای تابع menu، مقدار این متغیر 0 است و پیغام خطا نمایش
نمی یابد.

هر زمانی که کاربر یک عدد نادرست را وارد کند، error مقدار 1- خواهد گرفت و در دور بعدی نمایش menu، پیغام خطا نیز
نمایش می یابد. پس از اجرای menu متغیر error مجددا 0 (false) می شود تا در اجرای بعدی دیگر پیغام خطا نمایش نیابد.
مگر آنکه دوباره کاربر عدد اشتباهی را وارد کند که منجر به true شدن متغیر error شود.
 

hobab1987

Member
چقدر شما خوب توضيح ميدهيد نمي دونم چه طور تشكر كنم!!
ببخشيد براي مرتب كردن كتاب ها بر اساس عنوانشان اين تابع رو نوشتم اما نمي دونم مشكل چيه كه ارور ميده!!!!!!!
کد:
[LEFT][SIZE=3][FONT=Times New Roman][SIZE=3][FONT=Times New Roman]Struct bookinfo{[/FONT][/SIZE][/FONT][/SIZE][SIZE=3][FONT=Times New Roman]
[SIZE=3][FONT=Times New Roman]…[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]…[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]Void bubble(int);[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]};[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]Int main(){[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]Bookinfo inf1[400],inf2;[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]…[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]….inf2.bubble();[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman].}[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]void bookinfo::bubble(int count)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]{[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    n=getch();[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]          switch(n)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            {[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]              case 1:[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    for(i=count-1;i>0;i--)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                     {[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                       for(j=0;j<i;i++)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                         {[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                           if(strcmp(inf1[j].title,inf1[j+1].title)>0)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                      {[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                     strcpy(temp,inf1[j].title);[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                        strcpy(inf1[j].title,inf1[j+1].title);[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                        strcpy(inf1[j+1].title,temp);[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                      }[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                         }[/FONT][/SIZE][/LEFT]
[/FONT][/SIZE]
 

the_king

مدیرکل انجمن
چقدر شما خوب توضيح ميدهيد نمي دونم چه طور تشكر كنم!!
ببخشيد براي مرتب كردن كتاب ها بر اساس عنوانشان اين تابع رو نوشتم اما نمي دونم مشكل چيه كه ارور ميده!!!!!!!
کد:
[LEFT]Struct bookinfo{
…
…
Void bubble(int);
};
Int main(){
Bookinfo inf1[400],inf2;
…
….inf2.bubble();
.}
void bookinfo::bubble(int count)
{
    n=getch();
          switch(n)
            {
              case 1:
                    for(i=count-1;i>0;i--)
                     {
                       for(j=0;j<i;i++)
                         {
                           if(strcmp(inf1[j].title,inf1[j+1].title)>0)
                      {
                     strcpy(temp,inf1[j].title);
                        strcpy(inf1[j].title,inf1[j+1].title);
                        strcpy(inf1[j+1].title,temp);
                      }
                         }[/LEFT]
مورد اول) تابع bubble را جزئی از ساختمان bookinfo تعریف کرده اید؟ bookinfo ساختمانی است که تنها مشخصات
یک کتاب را در خود نگهداری می کند. طبیعی است که در داخل این ساختمان شما به آرایه inf1 دسترسی ندارید. آرایه inf1 در
داخل تابع main تعریف شده و فقط و فقط در داخل main قابل دسترسی است، مگر آنکه خودتان آرایه inf1 را به داخل تابع به
عنوان یک پارامتر ورودی به درون تابع bubble ارجاع بدهید.

مورد دوم) کاربرد inf2 چیست؟ اگر در فراخوانی تابع bubble بصورت (400)inf1.bubble با مشکل مواجه شده اید، دلیل
آن این است که inf1 به تنهایی یک آرایه است و نمی تواند به عنوان یک نمونه از ساختمان bookinfo تابع bubble را
فراخوانی کند. برای رفع این مشکل تابع bubble را بصورت (400)inf1[0].bubble فراخوانی کنید. چون [inf1[0 یک نمونه از
ساختمان است، مشکلی نخواهد داشت. البته همانطور که در مورد اول اشاره کردم، بایستی آرایه inf1 خود نیز جزئی از
پارامتر های ورودی تابع bubble باشد :

کد:
   void bubble(bookinfo[], int);

مورد سوم) روتین مرتب سازی bubble که نوشتید دو اشکال دارد، یک اشکال مختصر و یک اشکال بزرگ.
اشکال مختصر این است که در حلقه for داخلی (حلقه متغیر j) اشتباها مقدار i را افزایش دادید (++i) در حالی که بایستی
مقدار j را افزایش می دادید :
کد:
                       for(j=0;j<i;[B]i++[/B])

اشکال بزرگ این است که اگر نام کتاب اول Bird باشد و مولف اش Babak و نام کتاب دوم Art باشد و مولف اش Ali ، طبیعی
است که کتاب Art بایستی در لیست قبل از کتاب Bird باشد ولی شما فقط نام کتاب Art را با کتاب Bird عوض می کنید، آنگاه
دو کتاب منتشر نشده خواهید داشت، کتاب Art ای که مولف اش Babak است و کتاب Bird ای که مولف اش Ali است.
شما بایستی تمامی اطلاعات دو کتاب را با هم تعویض کنید، نه فقط title آنها را، یعنی :

کد:
void bookinfo::bubble(bookinfo inf1[], int count)
{
   bookinfo [B]temp[/B];
   for(int i = count - 1; i > 0; i--)
      for(int j = 0; j < i; j++)
         if(strcmp(inf1[j].title, inf1[j + 1].title) > 0)
         {
             [B]temp[/B] = inf1[j];
             inf1[j] = inf1[j + 1];
             inf1[j + 1] = [B]temp[/B];
         }
}

دقت کنید که متغیر temp یک bookinfo است و این کد نه تنها title کتاب، بلکه تمامی مشخصات آنرا جابجا می کند.

و نحوه فراخوانی این تابع bubble در داخل برنامه (درون تابع main) :

کد:
            inf1[0].bubble(inf1, count);
 

hobab1987

Member
ايول 11 تا ارور كم شد!!
اينا رو رو برنامه انجام دادم اما 5 تا ارور ميده
. به رنگ قرمز ارورها رو مشخص كردم
ببخشيد استاد من شمارنده كتاب رو در تابع اصلي شمارش كردم
و تو تابع bubble نيز استفاده كردم كه به تعداد كتاب ها حلقه بچرخه با اين شيوه مشكلي پيش نمياد؟(با رنگ آبي)​
کد:
//This program do management a library,add books,delete books, search a book.
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <string.h>
struct bookinfo{
    private:
      char title[10];
      char author[10];
      char publisher[10];
      char stead[10];
      int history;
      int version_num;
    public:
      void addnew();
      int search(char[]);
      void print();
      int menu1(int);
      void menu2();
      void quit();
      void bubble1(bookinfo[],int);
      void bubble2(bookinfo[],int);
};

//******************************************************************************
//Main Part Of The Program
//******************************************************************************
int main()
 {
    bookinfo inf1[400];
     int  count = 0, choise, error =  0, scount, row = 25,i;
     char wrd[10];
  for( ; ; )
   {
      clrscr();
      choise = inf1[0].menu1(error);
      error = 0;
    switch(choise)
     {
 case 1:                       //Entering new bookinfo
     inf1[count].addnew();
     count++;
   break;
 case 2:               //Searching new bookinfo
     clrscr();
     gotoxy(31,20);
     printf("Enter a word to search:");
        gets(wrd);
     clrscr();
       scount = 0;
   for(i = 0; i < count; i++)
    {
     if(inf1[i].search(wrd))
       scount++;
     if(scount == 1)
      {
        printf ("%-4s %-10s %-10s %-10s %-10s %-10s %-10s\n"
          ,"NO.", "Title", "Author", "Publisher", "Stead"
         , "History", "Version");
    printf("%-4d ", scount);
        inf1[0].print();
        inf1[i].menu2();
      }
   }
 if(scount == 0)
 {
  printf("\n not found.");
  printf("\n press any key to continue.");
  getch();
  }
      break;
      case 3:              //Reports
    inf1[0].bubble1(inf1, count);
      case 4:              //Exit the program
  inf1[0].quit();
      break;
      default:             //incorrect value
  error = -1;
      break;
 }
     }
}
//***********<<Main menu1>>**********
int bookinfo::menu1(int error)
  {
     char ans;
     int row=25;
    gotoxy(row,17);
       printf("1) Add record");
    gotoxy(row,19);
       printf("2) Search record");
    gotoxy(row,21);
       printf("3) Reports");
    gotoxy(row,23);
       printf("4) Exit");
    gotoxy(row,25);
       printf("Enter a valil number between 1 to 4 :");
              if (error)
                {
      gotoxy(35,30);
    printf("Enter a valid number between 1 to 4!");
                }
     fflush(stdin);
     ans=getch();
     return ans - '0';
      }
//********************<<Quit>>**********************
void bookinfo::quit()
{
   char ans;
   clrscr();
         gotoxy(35,22);
               printf("<<Quit>>");
         gotoxy(28,25);
        printf("Do You Want to Quit(Y/N)?");
      ans=getch();
          if(ans == 'y' || ans == 'Y')
      exit(0);
           else
                 return;
}
//**************<<Add new bookinfo>>*************
void bookinfo::addnew()
{
  int col=25;
   clrscr();
         gotoxy(col,18);
                          printf("Enter Title Of Book:");
                          scanf("%s",title);
         gotoxy(col,20);
                          printf("Enter Author Name :");
     scanf("%s",author);
                                     gotoxy(col,22);
                          printf("Enter Publisher Name:");
                          scanf("%s",publisher);
         gotoxy(col,24);
                          printf("Enter Stead Of Propagation:");
                          scanf("%s",stead);
         gotoxy(col,26);
                          printf("Enter History Of Propagation :");
     scanf("%d",&history);
         gotoxy(col,28);
     printf("Enter Number Of This Book Exist:");
     scanf("%d",&version_num);
}
//********************<<Print bookinfo>>*******************
void bookinfo::print()
{
   printf("%-10s %-10s %-10s %-10s %-10d %-10d\n", title, author
   , publisher, stead, history, version_num);
}
//**************<<search bookinfo>>*************
int bookinfo::search(char wrd[])
{
   if (strstr(title, wrd))
      return -1;
   if (strstr(author, wrd))
      return -1;
   if (strstr(publisher, wrd))
      return -1;
   return 0;
}
//*************<<Main menu2>>************
void bookinfo::menu2()
{
    int num;
     printf("\n %s %s %s %s","1)Delete Record","2)Change Record"
    ,"3)Next Record>>","4)Main Menu");
       printf("  Select:");
       scanf("%d", &num);
    switch(num)
    {
       case 1:     //Delete Record
       case 2:     //Change Record
       case 3:    //Next Record
       case 4:    //back to Main Menu
       clrscr();
       break;
    }
}
//***********<<Reports main menu>>**************
int bookinfo::reports()
{
  gotoxy(row,17);
  printf("1)Report by book layout");
  gotoxy(row,19);
  printf("2)Report by author layout");
  gotoxy(row,21);
  printf("3)Return to main menu");
  gotoxy(row,23);
  printf("Enter a value number between 1 to 3: ");
  n=getch();
  return n;
}
//********<<Report by book title>>********
void bookinfo::bubble1(bookinfo inf1[], int count)
{
    bookinfo temp;
     int i,j;
   for(i = count - 1; i > 0; i--)
   {
    for(j = 0; j < i; j++)
    {
     if(strcmp(inf1[j].title, inf1[j + 1].title) > 0)
     {
      temp = inf1[j];
      inf1[j] = inf1[j + 1];
      inf1[j + 1] = temp;
     }
    }
   }
}
//***********<<Report by author>>*****************
void bookinfo::bubble2(bookinfo inf1[], int count)
{
 int i,j;
 bookinfo temp;
   for(i = count - 1; i > 0; i--)
    {
      for(j = 0; j < i; j++)
      {
 if(strcmp(inf1[j].author, inf1[j + 1].author) > 0)
  {
    temp = inf1[j];
    inf1[j] = inf1[j + 1];
    inf1[j + 1] = temp;
  }
      }
    }
 }
}
//*******<<Delete record>>*******
//*******<Change record>>*******
//*******<<Next record>>********
 
آخرین ویرایش:

the_king

مدیرکل انجمن
از بس این کد case ها رو در توابع برنامه کپی کردین، دیگه سر و ته توابع رو نمیشه تشخیص داد.
در تابع bubble تان 8 تا } وجود دارد و 6 تا { ، این مساله برنامه را غیر قابل کامپایل می کند.

توابع case چه ارتباطی با مرتب سازی دارند که داخل bubble نوشتید؟ از منطق برنامه تان سر در نمیارم.

تعریف متغیر ans داخل تابع main هیچ کاربردی نداره، می تونستید حذف اش کنید.

داخل تابع bubble درخواست اجرا شدن (menu1(error را دادید در حالی که تابع bubble درون ساختمان bookinfo است و
همانطور که قبلا هم اشاره کردم، دسترسی به متغیر error درون تابع main ندارد. در نتیجه نمی تواند (menu1(error را
فراخوانی کند.

تعریف یک متغیر در درون case اشتباهه :
کد:
      case 3:              //Reports
      [B]int[/B] row=25;

کد:
     case 2:        //Searching new bookinfo
       clrscr();
        gotoxy(31,20);
        printf ("Enter a word to search:");
     gets(wrd);
        clrscr();
  scount = 0;
  for ([B]int[/B] i = 0; i < count; i++)

شما زمانی که تعریف یک متغیر (مثل row یا i) را در درون بدنه یک فرمان شرطی مثل case (یا مثلا if) قرار می دهید، مفهوم
آن این است که اگر شرطی برقرار بود، این متغیر تعریف شود و اگر شرط برقرار نبود تعریف نشود. کامپایلر چنین موردی را
نمی پذیرد. متغیر هایتان را در خارج از بدنه شرطی و ترجیحا در ابتدای برنامه تعریف کنید :

کد:
int main()
{
     [B]int[/B] i;
     [B]int[/B] row=25;
 

hobab1987

Member
سلام
اگر بخوام عمل جستجو كردني كه در صفحه اصلي برنامه نوشته شده و در بين كه تابع سرچ صدا شده با تابع search كه چند تابع زير صفحه اصلي نوشتيد را يكي كنم چه كار بايد بكنم تا فقط در صفحه اصلي فقط تابع صدا زده شده مشاهده شود؟!( case 2 را با تابع سرچ يكي كنم و در case 2 فقط تابع سرچ را صدا كنم)
 
آخرین ویرایش:

hobab1987

Member

ارورهاي برنامه رو پيدا كردم فقط يك مورد را مشكل دارم،محدوده‌ي حلقه ها تابع "​
"menu2 ميشه راهنمايي كنيد يا يك توضيح بدهيد؟
توضيح: حلقه اول مربوط به ركورد بعدي يافته شده را در ركورد قبل مي ريزد. و حلقه دوم مشخصات جديد را براي تغيير ركورد يافته شده مي پرسد و جايگزين مي كند.

براي حلقه ها چه محدوده اي مشخص كنم آخه؟
 

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

بالا