2016-03-31 10 views
0

Ich habe eine Weile in diesem Chaos gewesen und ich habe immer noch nicht herausgefunden, wo ich falsch liege, total kniff mich, wenn es etwas lächerlich wie ein Zeiger ist.Auf der Suche nach einer Übereinstimmung in einem Struktur-Array

Gezeigte Aufgabe: Es wird versucht, ein Struktur-Array mit Studenten-ID, Name, Nachname, Geburtsdatum und Noten zu füllen. Suchen Sie dann nach einer übereinstimmenden ID, die dem Benutzer zugewiesen wurde.

Ich würde jede Hilfe in Bezug auf dieses Thema sehr schätzen, ich habe ernsthaft für eine Weile daran feststecken. Auch ich entschuldige mich im Voraus für die französisch Teile

// Part 1 
struct Date{ 
    int day; 
    int month; 
    int year; 
}; 

// Part 2 
struct Student{ 
    int ID; 
    char name[20]; 
    char lastname[20]; 
    struct Date DOB; 
    int notes[J]; 
}; 

// Part 3 
void FillStudentList(struct Student E){ 
    int i; 
    printf("\nInsert ID: "); 
    scanf("%d", &E.ID); 
    printf("Insert name: "); 
    scanf("%s", &E.name); 
    printf("Insert last name: "); 
    scanf("%s", &E.lastname); 
    printf("Insert date of birth: "); 
    scanf("%d %d %d", &E.DOB.day, &E.DOB.month, &E.DOB.year); 
    printf("Insert notes: "); 
    for(i=0; i<J; i++) 
     scanf("%d", &E.Notes[i]); 
} 

// Part 4 
void ShowByNb(int Nb, struct Student E[], int NbStudents){ 
    int j, i; 
    for(i=0; i<NbStudents; i++){ 
     if (E[i].ID== Nb){ 
      printf("\nID: %d", E[i].ID); 
      printf("\nName: %s", E[i].name); 
      printf("\nLast Name: %s", E[i].lastname); 
      printf("\nDate Of Birth: %s-%s-%s", E[i].DOB.day, E[i].DOB.month, E[i].DOB.year); 
      printf("\nNotes: "); 
      for(j=0; j<J; j++){ 
       printf("%d", E[i].Notes[j]); 
      } 
     } 
     else 
      printf("\nInvalid Student!\n"); 
    } 
} 

// Part 5 
void main(){ 
    int i, x; 
    struct Student E[N]; 
    for(i=0; i<N; i++){ 
     printf("\n\nStudent #%d", i+1); 
     FillStudentList(E[i]); 
    } 

    printf("\n\nSearch student by NB: "); 
    scanf("%d", &x); 
    ShowByNb(x, E, N); 
    } 
+0

Was ist die Ausgabe, die Sie bekommen? Verwenden Sie bessere Namen für Ihre Variablen und Funktionen. –

+2

Die Elemente von 'Dat' sind' int', aber Sie lesen sie mit '% s' anstelle von'% d'. Das wird nicht funktionieren. – Barmar

+0

@ViniciusZaramella Entschuldigung, dies ist ein französisches Projekt, deshalb sind die Namen auf Französisch. Die Ausgabe, die ich bekomme, ist "Ungültiger Student!" wenn ich versuche, eine Suche zu machen, die funktionieren sollte. Es wird zweimal geschrieben. EDIT: Ich reparierte es –

Antwort

0

Der bearbeitete Code unten, glaube ich, erreicht Ihr Ziel. Das Hauptproblem (abgesehen vom Lesen/Drucken von 'int' mit '% s' war, wie Sie Ihre Struktur an Ihre Funktionen übergeben. Es ist notwendig, die Struktur als Referenz zu übergeben, so dass ihre Werte außerhalb der FillStudentList-Funktion sichtbar sind; link

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

#define N 2 
#define J 2 

// Part 1 
struct Dat{ 
    int jour; 
    int mois; 
    int annee; 
}; 

// Part 2 
struct Etudiant{ 
    int numero; 
    char nom[20]; 
    char prenom[20]; 
    struct Dat DDN; 
    int Notes[J]; 
}; 

// Part 3 
/* Modified this so that a pointer to the struct is passed instead of a copy of the struct */ 
void FillStudentList(struct Etudiant *E){ 
    int i; 
    printf("\nInsert ID: "); 
    scanf("%d", &E->numero); 
    printf("Insert name: "); 
    scanf("%s", E->nom); 
    printf("Insert last name: "); 
    scanf("%s", E->prenom); 
    printf("Insert date of birth: "); 
    /* These are integers. Do not read with %s */ 
    scanf("%d %d %d", &E->DDN.jour, &E->DDN.mois, &E->DDN.annee); 
    printf("Insert notes: "); 
    for(i=0; i<J; i++) 
     scanf("%d", &E->Notes[i]); 
} 

// Part 4 
void ShowByNb(int Nb, struct Etudiant E[]){ 
    /* Don't redefine N == NbEtudiants making it seem that N is variable */ 
    int j, i; 
    for(i=0; i<N; i++){ 
     if (E[i].numero == Nb){ 
      printf("\nID: %d", E[i].numero); 
      printf("\nName: %s", E[i].nom); 
      printf("\nLast Name: %s", E[i].prenom); 
      /* Again, can't print integers with %s */ 
      printf("\nDate Of Birth: %d-%d-%d", E[i].DDN.jour, E[i].DDN.mois, E[i].DDN.annee); 
      printf("\nLes notes: "); 
      for(j=0; j<J; j++){ 
       printf("%d ", E[i].Notes[j]); 
      } 
      return; 
     } 
     /* Your previous else would print invalid student every time you ran through the loop even 
     * if the student number was valid for a later student. 
     */ 
    } 
    /* Only print this if student was not found in any of the N Student structures */ 
    printf("\nInvalid Student!\n"); 
} 

// Part 5 
void main(){ 

    setbuf(stdout, NULL); 

    int i, x; 
    struct Etudiant E[N]; 

    for(i=0; i<N; i++){ 
     printf("\n\nStudent #%d", i+1); 
     FillStudentList(&E[i]); 
    } 

    printf("\n\nSearch student by NB: "); 
    scanf("%d", &x); 
    ShowByNb(x, E); 
} 

Eingang

1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 

Ausgabe

Student #1 
Insert ID: 1 
Insert name: 1 
Insert last name: 1 
Insert date of birth: 1 
1 
1 
Insert notes: 1 
1 


Student #2 
Insert ID: 2 
Insert name: 2 
Insert last name: 2 
Insert date of birth: 2 
2 
2 
Insert notes: 2 
2 


Search student by NB: 2 

ID: 2 
Name: 2 
Last Name: 2 
Date Of Birth: 2-2-2 
Les notes: 2 2 
+0

Vielen Dank für die Antwort, aber das Problem besteht weiter. Ich habe versucht, es so zu tun, und ich bekomme den Fehler "Fehler C2232: '-> nom': linker Operand hat 'struct' Typ, verwenden Sie '.' " –

+0

Können Sie versuchen, den genauen Code, den ich gepostet habe, zu kopieren? Es funktioniert für mich. Ich habe die Antwort aktualisiert, um Eingabe und Codeausgabe einzuschließen. – PZwan

+0

@PZwan Sie Code hat immer noch einige Fehler. In 'scanf ("% s ", & E-> nom);' scanf erwartet ein 'char *', aber Sie verwenden 'char (*) [20]'. Das gleiche gilt für "scanf" ("% s", & E-> prenom); 'Es sollte' scanf ("% s", E-> nom); 'und' scanf ("% s", E-> prenom) sein); ' – SSC

0

klassische Fehler. geben Parameter als Wert statt durch referenc e:

void FillStudentList(struct Student E){ 
..... 
} 

Was, dass eine lokale Kopie Ihrer Struktur ist hier passiert, auf dem Stapel erstellt wird, bevölkert mit dem, was der Eingang ist, und wenn die Funktion beendet wird zerstört.

Im Allgemeinen in C, auch wenn Sie die Struktur nicht ändern möchten, übergeben Sie Strukturparameter per Zeiger; Wenn Sie sie nach Wert übergeben, wird jedes Mitglied der Struktur auf den Stapel kopiert ... was eine Zeitverschwendung und eine Erinnerung ist.

Ändern So den Funktionsprototyp (und den Code mit der neuen Signatur zu arbeiten) soll das Problem beheben:

void FillStudentList(struct Student *E){ 
.... 
} 
Verwandte Themen