problem z koncowka zadania

0

napisalam program do 'mini biblioteki'(zawierajacej max 10 ksiazek...Taki ze uzytkownik ma mozliwosc dopisania wyszukania i wypisania ksiazek . i mam problem z ta ostatnia funkcja. nie do konca ja rozumiem a tym bardziej bledow ktore sie pokazuja. Prosze o pomoc...Czy moze musze rok wydania i ocene zadeklarowac jako tablice? wolalabym nie...pogibilam sie w tym moemencie. prosze o wyrozumialosc :)

#include <stdio.h>
#include <stdlib.h>

struct book
{
        char tytul[40];
        char autor[30];
        int rok_wyd;
        char gatunek[20];
        int ocena;
        }book;
FILE *fp;
#define MAX 10
#define BELL '\x07'
#define FILENAME "Ksiazki.txt"
//tu prototypy fszystkich funkcji wystepujacych w programie
void main(void); //funkcja przekierowywujaca menu
void err_msg(char err_msg[]);
void disp_menu(void); //funkcja wyswietlajaca menu
void clear_sc(void); //czysci ekran
void zapisz(void); //zapisujaca
void add_to_file(struct book z);//dodaj do pliku dyskowego
void wypisz(void); //funckja wypisujaca
void pause_sc(void);
void pr_data(struct book z);
void get_new_z(struct book *z);
void zmien(void); //szuka i zmienia

///////////////////////////////////////
//i zaczynamy
void main(void)
{
     struct book list[MAX];
     char ans;
     do
       { disp_menu(); //wyswietli menu uzytkownika
         scanf("%d",&ans);
         switch (ans)
         {
                case (1) : { zapisz();
                     break; }
                case (2) : { wypisz() ;
                     break; }
                case (3) : { zmien() ;
                     break; }
                case (4) : { break;}
                default : {err_msg("*** Musisz podac");
                        printf("od 1 do 4 ***");
                        break; }
                }
         } while (ans!=4);
                return ;

////////////////////////////////////////
void disp_menu()
{
     clear_sc();
     print("\t\t Program do obslugi mini biblioteki\n");
     printf("Czy chcesz:   ?\n");
     printf("1. Wpisac nowa pozycje\n");
     printf("2. Zobaczyc co jest\n");
     printf("3. Zmienic jedna z pozycji\n");
     printf("4. Zakonczyc ten program\n");
     printf("Ktora opcje wybierasz?");
     return ;
}
//////////////////////////////////////////////
void clear_sc()
{
     int ctr;
     for(ctr=0;ctr<25;ctr++)
          { print("\n"); }
          return ;
}
////////////////////////////////////////////
void zapisz(void)
     {
     struct book z;
     char ans;
     do
     { fflush(stdin); //oproznij bufor wejsciowy przed pobraniem lancucha znakowego
     printf("Podaj tytul: \n");
     gets(z.tytul);
     printf("Podaj autora: \n");
     gets(z.autor);
     printf("Podaj rok wydania: \n");
     scanf("%d",z.rok_wyd);
     printf("Podaj gatunek: \n");
     gets(z.gatunek);
     printf("Ocen ksiazke w skali od 1 do 5: \n");
     scanf("%d",&z.ocena);
     add_to_file(z);
     printf("\n Czy chcesz wprowadzic nowa pozycje? (T/N");
     ans=getchar();
     getchar();
     }
     while (toupper(ans)=='T');
     return ;
     }
     
////////////////////////////////////////////

void wypisz(void)
{
     struct book z;
     int s, linectr=0;
     s=sizeof(struct book);
     if((fp=fopen(FILENAME, "r"))==NULL)
          { err_msg("Blad odczytu -upewnij sie ze plik istnieje");
          return ;
          }
     do
     {
          if(fread(&z, sizeof(struct book), 1, fp)!=s)
               {if(feof(fp))
               { break; }
          }
          pr_data(z); //drukuje dane
          linectr+=4;
          }
          while (!eof(fp));
     fclose(fp);
     pause_sc();
     return ;
}
 /////////////////////////////////////////////
 void zmien(void)
 {
      struct book z;
      int ans, s;     //przechowuje rozmiar struktury
      int change_yes = 0; //bedzie rowne true jesli uzytkownik znajdzie nazwisko to co chce zmienic
      char test_tytul[40];
      printf("\nPodaj tytul ksiazki ktora chcesz zmienic");
      fflush(stdin);
      gets(test_tytul);
      fflush(stdin);
      s=sizeof(struct book);
      if((fp=fopen(FILENAME, "r+"))==NULL)
      { err_msg("Blad odczytu -upewnij sie ze plik istnieje");
          return ;
          }
 do
 {
          if(fread(&z, sizeof(struct book),1, fp)!=s)
          {if(feof(fp))
          { break; }
          }
          if(strcmp(z.tytul, test_tytul)==0)
          {
              pr_data(z);
              printf("\n Czy o ta pozycje ci chodzilo? (T/N)");
              ans=getchar();
              getchar();
              if (toupper(ans)=='N')
                 {continue;} //pobierz nowe nazwisko
              get_new_z(&z); //powierz nowe info od uzytkownika 
              fseek(fp, (long)-s, SEEK_CUR); //cofa o jedna strukture do tylu
              fwrite(&z, s, 1, fp); //wpisz nowe info
              change_yes = 1;
              break;
              }
          }while (!eof(fp)); 
          fclose(fp);
          if(!change_yes)
          {erg_msg("nie znaleziono nazwiska");}
          return ;
 }
 ////////////////////////////
 void err_msg(char err_msg[])
 {
      printf("\n\n%s\n", err_msg);
      printf("c", BELL);
      return ;
}
//////////////////////////////
void add_to_file(struct book z)
{
     if((fp=fopen(FILENAME, "a"))==NULL) //otwiera plik w trypie dolaczania danych
     { err_msg("Blad dysku-sprawdz dysk");
          return ;
          }
     fwrite(&z, sizeof(z), 1, fp); //dodaje strukture do pliku
     fclose(fp);
     return ;
}
////////////////////
void pause_sc()
{
     char ans;
     fflush(stdin); //usun wszystkie dodatkowe znaki z bufora wejsciowego
     printf("\n Nacisnij enter aby kontynuowac");
     ans=getchar();
     fflush(stdin);
     return ;
     }
////////////////////////////////////////
void pr_data(struct book z)
{
     printf("\n Tytul: %-40s\n",z.tytul);
     printf("Autor: %-30s\n"),z.autor;
     printf("Rok wydania: %d\n"),z.rok_wyd;
     printf("Gatunek: %-20s\n"),z.gatunek;
     printf("Ocena: %d\n"),z.ocena;
     return ;
}
////////////////////////////////////////////////////
void get_new_z(struct book *z)  //???????????????
{
     struct book temp_z; //przechowuje tymczasowe i zmienione dane wejsciowe
     printf("\n Wprowadz nizej dane nowej pozycji(nacisnij klawisz enter nie wrowadzajac danych aby zachowac poprzednie");
     printf("Podaj nowy tytul: ");
     if (strlen(gets(temp_z.tytul))>0)
        {strcpy((*z) .tytul, temp_z.tytul); }
     printf("Podaj nowego autora: ");
     if (strlen(gets(temp_z.autor))>0)
        {strcpy((*z) .autor, temp_z.autor); }
     printf("Podaj nowy rok wydania: ");
     
        strcpy((*z) .rok_wyd, temp_z.rok_wyd); 
     printf("Podaj nowy gatunek: ");
     (strlen(gets(temp_z.gatunek)>0));
     printf("Podaj nowa ocene ksiazki: ");
        strcpy((*z) .ocena, temp_z.ocena); 
        return ;
        }
 
0

main "zwraca" int i wykonuje się na początku programu, nie deklarujesz tej funkcji (void main(void); jest niedopuszczalne), w tym przypadku będziesz musiała zmienić maina na coś innego i go z prawdziwego wywołać (1 i 2 error) . po drugie funkcja która coś zwraca musi coś zwracać, a u ciebie jest samo return (3 error), zaś co do pozostałych to jak jest {, musi być i } z jakiego IDE korzystasz? teraz standardem jest że jak otworzysz blok programu to go automatyka sama zamknie (starczy tylko w odpowiednim miejscu 2x strzałkę w dół wcisnąć). Poza tym są też warny (ostrzeżenia) ale tym można zająć się później albo i zignorować jak program będzie działał poprawnie.

os obie podane przez ciebie wartości to liczby i tablicami być nie muszą.

edit:czytaj opisy błędów i tłumacz je na polski, to będziesz wiedzieć o co chodzi.

edit2: czasem w errorze nie chodzi o pokazaną linijkę tylko poprzednią , tak jest u ciebie z "niedomkniętymi" {. Tworzysz następną funkcję a końca poprzedniej(}) brak.

0

main "zwraca" int i wykonuje się na początku programu, nie deklarujesz tej funkcji (void main(void); jest niedopuszczalne), w tym przypadku będziesz musiała zmienić maina na coś innego i go z prawdziwego wywołać (1 i 2 error) . po drugie funkcja która coś zwraca musi coś zwracać, a u ciebie jest samo return (3 error), zaś co do pozostałych to jak jest {, musi być i } z jakiego IDE korzystasz? teraz standardem jest że jak otworzysz blok programu to go automatyka sama zamknie (starczy tylko w odpowiednim miejscu 2x strzałkę w dół wcisnąć). Poza tym są też warny (ostrzeżenia) ale tym można zająć się później albo i zignorować jak program będzie działał poprawnie.

Hmm...Mialbys moze jakas propozycje na co konkretnego zmienic main? Czy dobrze rozumiem? zamiast maina(void) zadeklarowac cos innego a pod wszystkimi funkcjami w zwyklym mainie zrobic jakas operacje? czy tylko zmienic 'nazwe' funkcji main(void) na cos innego z ta sama zawartoscia?
korzystam z Dev C++ 4.9.9.2. (zaraz poszukam brakujacego nawiasu:) )
co do tego 'samego' return gdy dawalam return 0, lub return z tez byl blad...wiem wlasnie ze powinno cos zwracac ale co?

0

ps. przepraszam za zacytowanie nie uzywajac opcji cytuj*

0

korzystam z Dev C++ 4.9.9.2.
<facepalm>

0

A więc generalnie main wykonuje się tylko raz, aczkolwiek jeśli nigdzie nie wywołujesz tej funkcji "ręcznie" może zostać, pętlę wykonującą się do momentu "ręcznego" wyjścia z programu widzę masz. Można by jednak zintegrować go z funkcją wyświetlającą menu.

wywal tą linijkę o której wcześniej pisałem (dekralację maina), i zamień void main(void) (tą bez średnika na końcu, bo ze średnikiem dopiero co wyrzucona) na int main(void) (nie jestem pewien czy to akurat tak w c wygląda, ale możesz to sprawdzić w dowolnym prostym programie, inaczej wywołuje się tylko jeśli program może przyjąć parametry z linii poleceń).

A teraz najważniejsze : Zmień IDE, np na code:blocks. DEV nie jest rozwijany od dłuższego czasu, i nijak ma się do współczesnego programowania.

Co powinien zwracać return? do sprawdzenia w miejscu gdzie wywołujesz tą funkcję, albo "coś tam liczy" i zwraca albo nic nie zwraca i należy ją "voidnąć" definicji i/lub deklaracji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1