Problem ze strukturami i funkcjami

0

Witajcie!
Piszę program na zajęcia z C, ma to być taka baza danych o znajomych. Kiedy wpisuje dane osób z klawiatury program nie wiem dlaczego, ale kończy działanie po pierwszym obiegu pętli. Poniżej wklejam fragment kodu.
Dla przykładu, wpisuję że chcę dodać 2 osoby, wpisuje ich dane i program kończy działanie po pierwszym przebiegu pętli. Być może błąd jest w funkcji z peselem, gdyż kiedy miałem w pętli tylko funkcje z imieniem i nazwiskiem działało poprawnie. Sam niestety nie potrafię znaleźć w tym błędu, a męczyłem się z tym naprawdę długo.
Pozdrawiam i proszę o porady :))

#include<stdio.h>
#include<string.h>

   struct baza{
    char imie[30];
    char nazwisko[30];
    char pesel[12];
    char email[40];
    char tel[20];
    char data[14];
    char plec[10];
};
int i,a,pl,b,e,c,err,k,n,pp;
struct baza osoba[5];   // tablica struktur
int kontrolna;

void imie(struct baza *p,int y){         //funkcje dodajace kolejne dane i funkcje sprawdzające poprawność danych
p=p+y;                                      //zwiekszenie wskaźnika tak by działał na odpowiedniej strukturze
        printf("\nPodaj imie: ");
scanf("%s",p->imie);

}
int testimie(struct baza *p,int i){
    a=0;b=0;
    p=p+i;
     if(strlen(p->imie)>30){
                           
                       a++;
                        printf("\nWpisales zbyt dluga nazwe! Spróbuj jeszcze raz");
                       }
                       
                           for(i=0;i<strlen(p->imie);++i){
                                                          if(p->imie[i]>'0' &&p->imie[i]<'9')
                                                          b++;
                                                          }
                                                          if(b)
                                                          printf("Wyrażenie zawiera niedozwolone znaki");
                   if(a>0 || b>0) return 0;
                               
                               else
                               return 1;
                               
                              
}
void nazwisko (struct baza*w,int y){
     w=w+y;
      printf("\nPodaj nazwisko: ");
      scanf("%s", w->nazwisko);
      }
 int testnazwisko (struct baza*p,int i){
     p=p+i;
      a=0;b=0;
     if(strlen(p->nazwisko)>30){
                           
                       printf("\nWpisales zbyt dluga nazwe!");
                     a++;
                       }
                    for(i=0;i<strlen(p->nazwisko);++i){
                                                          if(p->nazwisko[i]>'0' &&p->nazwisko[i]<'9')
                                                          b++;
                                                          }
                                                          if(b)
                                                          printf("Wyrażenie zawiera niedozwolone znaki");
                   if(a>0 || b>0) return 0;
                               
                               else
                               return 1;
}   
     void pesel (struct baza *p,int y){
           p+=y;
      printf("\nPodaj PESEL: ");
      scanf("%s", p->pesel);
      }
      int testpesel (struct baza *rp,int y){
           rp+=y;
           a=0;
            if(strlen(rp->pesel)!=11){
                           
                       printf("\nPESEL powinien zawierac 11 znakow!");
                     return 0;
                       }
           for(i=0;i<strlen(rp->pesel);++i)
               if(rp->pesel[i]<'0' || rp->pesel[i]   >'9') ++a;
               if(a>0){
                        printf("\nPodany PESEL zawiera bledne dane");
                        return 0;
                        
                        }
     kontrolna=rp->pesel[0]-48 + 3* (rp->pesel[1] -48) + 7* (rp->pesel[2] -48) + 9* (rp->pesel[3] -48)+ rp->pesel[4]-48 + 3* (rp->pesel[5]-48) +7*( rp->pesel[6]-48) + 9*( rp->pesel[7]-48) + rp->pesel[8]-48 + 3*(rp->pesel[9]-48);
              
     kontrolna=kontrolna%10;
 
     if(kontrolna){
                   kontrolna=10-kontrolna;
                   if(kontrolna+48 !=   rp->pesel[10]){
                                   
                                   return 0;           
                                   }}
     else{
          if(kontrolna +48 !=rp->pesel[10]){
                       return 0;
                       }
                       }
                       printf("\nPESEL poprawny.");
                       return 1;
}


int main(){
                       
                       int w,ilu,l;
                        printf("Ile osób chcesz dodac");
                        scanf("%d",&ilu);    
     for(i=0;i<ilu;i++){            // pętla, o której wspominałem
do{
    imie(osoba,i);         // do funkcji przekazuje nazwę tablicy czyli adres pierwszego elementu
    l=testimie (  osoba,i); 
}
while(l==0);

do{
    nazwisko(osoba,i);
    l=testnazwisko (  osoba,i);
} 
while(l==0);       
do{
    pesel(osoba,i);
 l= testpesel ( osoba,i);
    
}while(l==0);
}
 system("pause");
                       }
0

Po przeczytaniu pierwszych 4 linijek dałbym ci 2.0
Jak powinieneś był to zrobić? Zrobić osobną strukturę np. Osoba gdzie przechowujesz sobie dane jakiejś osoby. I osobną strukturę do przechowywania tablicy osób. Tak jak zrobiłeś teraz to jest bez sensu. Równie dobrze tej struktury w ogóle mogłoby tam nie być. Struktury są po to zeby fizycznie związać ze sobą grupę atrybutów które logicznie są powiązane. Np. "imie" i "nazwisko" jakiejś osoby. Są logicznie powiązane i fajnie gdyby powiązać je też fizycznie. Jak wepchniesz "imie" do tablicy imiona[] a "nazwisko" do tablicy nazwiska[] to nijak tego powiązania nie ma. Jak się machniesz gdzieś i sobie źle indeksy poustawiasz to nagle imiona i nazwiska się pomieszają. Struktur używamy żeby temu zapobiegać. Łączysz powiazane dane w strukturę i wtedy masz dostęp od razu do wszystkich danych jakiejś osoby. Szansa na błąd jest mniejsza a dostęp wygodniejszy.

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