2016-05-31 6 views
-2

я не понимаю, почему, когда я пытаюсь напечатать значения в archivio[] с stampa функции, эта программа печатаетПочему этот код не печатает некоторые значения?

"studente","matricola","nome","cognome"

правильно, но не печатает значения от stampaEsami.

#include <stdio.h> 
#include <stdlib.h> 
#define MAXSTUDENTI 20 
#define MAXSTRINGA 100 
#define MAXESAMI 25 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */ 

typedef char Stringa[MAXSTRINGA]; 

typedef enum { uno, due, tre, FC 
} AnnoCorso; 

typedef struct { 
    Stringa nomeEsame; 
    int voto; 
} Esame; 

typedef struct { 
    Esame listaEsami[MAXESAMI]; 
    int numeroEsami; 
}ListaEsame; 

typedef struct { 
    int matricola; 
    Stringa nome; 
    Stringa cognome; 
    AnnoCorso anno; 
    ListaEsame esami; 
} Studente; 

void init(Studente[], int); 
void acquisisciEsami(Studente, int); 
void stampa(Studente[], int); 
void stampaEsami(ListaEsame); 

void init(Studente archivio[], int n){ 

    int i; 
    int nEsami; 

    for(i = 0; i < n; i++){ 
     printf("Studente n. %d\n", i+1); 
     printf("Inserire matricola: "); 
     scanf("%d", &archivio[i].matricola); 
     printf("Inserire nome: "); 
     scanf("%s", &archivio[i].nome); 
     printf("Inserire cognome: "); 
     scanf("%s", &archivio[i].cognome); 
     printf("Inserire il numero di esami svolti: "); 
     scanf("%d", &archivio[i].esami.numeroEsami); 
     nEsami = archivio[i].esami.numeroEsami; 
     if(nEsami != 0) { 
      acquisisciEsami(archivio[i], nEsami); 
     } 

    } 

} 

void acquisisciEsami(Studente studente, int n){ 

    int i; 

    for(i = 0; i < n; i++) { 
     printf("Inserire nome esame:"); 
     scanf("%s", studente.esami.listaEsami[i].nomeEsame); 
     printf("Inserire voto esame:"); 
     scanf("%d", &studente.esami.listaEsami[i].voto); 
    } 

} 

void stampa(Studente archivio[], int n){ 

    printf("\nGli studenti presenti in archivio sono:\n"); 

    int i; 

    for(i = 0; i < n; i++){ 
     printf("Studente n. %d:\n", i+1); 
     printf("Matricola: %d\n", archivio[i].matricola); 
     printf("Nome: %s\n", archivio[i].nome); 
     printf("Cognome: %s\n", archivio[i].cognome); 
     stampaEsami(archivio[i].esami); 
    } 
} 

void stampaEsami(ListaEsame esami){ 

    int i = 0; 
    int n = esami.numeroEsami; 

    for(i = 0; i < n; i++){ 
     printf("Nome esame: %s\n", esami.listaEsami[i].nomeEsame); 
     printf("Voto esame: %d\n", esami.listaEsami[i].voto); 
    } 
} 

int main(int argc, char *argv[]) { 

    Studente studenti[MAXSTUDENTI] ; 
    int n; 

    printf("Inserire il numero di studenti da memorizzare in archivio:\n "); 
    scanf("%d", &n); 
    init(studenti, n); 
    stampa(studenti, n); 

    return 0; 
} 

Если вход:

Inserire il numero di studenti da memorizzare in archivio:1 
Inserire matricola: 13434 
Inserire nome: test 
Inserire cognome: test 
Inserire il numero di numero di esami svolti: 1 
Inserire nome esame: asd2 
Inserire voto esame: 20 

печатает:

Gli studenti presenti in archivio sono: 
Studente n.1: 
Matricola: 13434 
Nome : test 
Cognome: test 
Nome esame: 
Voto esame: 0 
+0

Вы ум создавая [___MCVE___] (http://stackoverflow.com/help/mcve)? –

+0

Я думаю, что весь написанный мной код служит для запуска и понимания проблемы. –

+1

Для какого-то конкретного ввода, каков фактический результат и каков ожидаемый результат? Пожалуйста, включите его, скопировав фактический ввод/вывод. –

ответ

3

Ваша проблема acquisisciEsami функция.

Он должен принять Studente * вместо переменной, переданной по значению.

void acquisisciEsami(Studente *studente, int n) 
{ 
    int i; 

    for(i = 0; i < n; i++) 
    { 
     printf("Inserire nome esame:"); 
     scanf("%s", studente->esami.listaEsami[i].nomeEsame); 
     printf("Inserire voto esame:"); 
     scanf("%d", &studente->esami.listaEsami[i].voto); 
    } 
} 

В чем проблема? Ваш код компилирует структуру с локальной областью в функцию acquisisciEsami, и все данные будут потеряны, когда функция закончится. Таким образом, esami член archivio[i] не изменяется.

Передача archivio[i] ссылкой на acquisisciEsami вы можете изменить содержание ЭСАМИ memeber из archivio[i]

Очевидно, что вызов acquisisciEsami будет:

acquisisciEsami(&archivio[i], nEsami); 

Как я заметил, у вас есть проблемы, чтобы исправить:

  • scanf("%s", &archivio[i].nome); должно быть scanf("%s",archivio[i].nome);
  • scanf("%s", &archivio[i].cognome); должен быть scanf("%s",archivio[i].cognome);
Смежные вопросы