Struktury, a pętle z warunkami i tablice struktur

0

Dlaczego, jeżeli w moim "laickim" programie w związku z utworzoną strukturą zrobię pętlę jak np. w tym programie w funkcji dodaj ucznia, pewnie dla tego, że jest w switch casie (miałem już takie przypadki), od razu po napisie podaj imię wyświetla się podaj nazwiskom, bez zastosowania w ogóle linijki gets(tablica[i].imie);

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#define MAX 40
#include <windows.h>

using namespace std;

typedef struct UCZEN
{
char imie[20];
char nazwisko[40];
char klasa[10];
float srednia;
};

void dodaj_ucznia(UCZEN tablica[MAX], int& i)
{
     
     cout<<"Podaj imie ucznia"<<endl;
     gets(tablica[i].imie);
     cout<<"Podaj nazwisko ucznia"<<endl;
     gets(tablica[i].nazwisko);
     cout<<"Podaj klase ucznia"<<endl;
     gets(tablica[i].klasa);
     cout<<"Podaj srednia ucznia"<<endl;
     cin>>tablica[i].srednia;
     i++;
     system("CLS");
     }
void dopliku(UCZEN tablica[MAX], int i)
{
         fstream plik;
         plik.open("plik.txt",ios::out); 
         if(plik.good()==true)
         {
         cout<<"Otwieranie pliku powiodlo sie"<<endl;                     
         for(int k=0;k<i;k++)
         plik<<tablica[k].imie<<" "<<tablica[k].nazwisko<<" "<<tablica[k].klasa<<" "<<tablica[k].srednia<<endl;
         plik.close();
         cout<<"Zakonczono zapisywanie\n"<<endl;  
         }
         else cout<<"Pliku nie otwarto"<<endl;
         
 }     
void menu()
{
cout<<"Menu - Wybierz:\n1 - wczytaj dane uczniow z klawiatury\n - wczytaj dane uczniow z pliku\n - wyswietl dane uczniow wg nazwisk"
<<"\n - wyswietl dane uczniow wg imion\n - wyswietl dane uczniow wg srednich\n - wyswietl dane uczniow wg klas. "
<<"W przypadku uczniow z jednej klasy kryterium sortowania to nazwisko\n2 - zapisz dane do pliku\n0 - aby zakonczyc"<<endl;
}


int main(int argc, char *argv[])
{
    int odp=10, i=0; 

    UCZEN* tablica=new UCZEN[MAX];
 

  

do
{
   
menu();    
cin>>odp;
system("CLS");
switch(odp)
{
           case 1:
                dodaj_ucznia(tablica,i); break;
           case 0:
                    {
                                       system("PAUSE");
                                       return EXIT_SUCCESS;    

                                       } 
          case 2:
               dopliku(tablica,i); break;                            
           default: cout<<"Zle dane"; break;                              


}


}
while(odp!=0);



system("PAUSE");
return EXIT_SUCCESS;
}
1

(cin>>odp).sync();

0

A czemu by nie, skoro to następna instrukcja?

Chociaż podejrzewam że chodzi Ci o co innego niż myślę, ciężko stwierdzić po tym słowotoku.

1

zamień:
cin>>odp;
na:
(cin>>odp).sync();
lub, po:
cin>>odp;
daj:
cin.sync();

0

Dzięki za pomoc, jeszcze pytanie takie co zmienia taka konstrukcja (cin>>odp).sync(); do czego służy sync()? Jestem początkujący, więc wybaczcie, chcę zrozumieć od początku. Co było źle w tamtej składni, albo raczej co robiła poprzednia składnia, że omijało pierwszy gets?

marcinAllmighty napisał(a)

A czemu by nie, skoro to następna instrukcja?

Chociaż podejrzewam że chodzi Ci o co innego niż myślę, ciężko stwierdzić po tym słowotoku.

Wiem, spieszyłem się, żeby jak najszybciej napisać i się dowiedzieć. Chodziło mi o to, że od razu przeskakuje do kolejnego gets nie wczytując imienia. Po prostu jakby tam coś już było podawane z klawiatury od razu.

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