Неверный вывод матрицы при записи в CSV-файл только для первой строки [C] - PullRequest
0 голосов
/ 07 ноября 2019

Я пишу программу, которая принимает в качестве входных данных имена пользователей и ответы, связанные с каждым кандидатом, и печатаю их в файле .csv следующим образом:

name, answer A, answer B,..., answer Z.

каждое имяхранится в матрице с именем nome_cognome;
каждый ответ сохраняется в матрице с именем matrice_risposte;

По какой-то причине, которую я игнорирую, программа печатает неправильный ответ только для последнего из первых кандидатов (вопрос "Z"). У любого другого кандидата все ответы указаны правильно.

что я пытался сделать: я отлаживал программу в течение 5 дней, не понимая причину проблемы. Я искал в Интернете похожие проблемы, пытался изменить код, но не могу решить. Я обычно пишу на форумах как последний шанс, если не могу найти какое-либо решение.

Я проверяю правильность введенных ответов для каждого кандидата перед тем, как перейти к следующему. При печати ответов на экране они сообщаются правильно. При печати на файле это происходит как описано.

Следующее изображение ясно показывает, о чем я говорю enter image description here

Я набрал для Павла все ответы как 1, а для Мари я набрал все ответы как2.

Код показывает раздел, в котором программа записывает файл csv (он создан).

FILE *file_risultati; //apertura file di testo
strcat(corso,".csv");
file_risultati=fopen(corso, "w");

for (j=0;j<iscritti;j++){

    p=0;
    while(nome_cognome[j][p]!='\n')
    {
    fprintf(file_risultati,"%c", nome_cognome[j][p]);
    p=p+1;
    }
    fprintf(file_risultati,",");


    for(i=0; i<22; i++)
    {
        fprintf(file_risultati,"%d,", matrice_risposte[j][i]);
    }
    if(j != (iscritti-1)){
        fprintf(file_risultati,"\n");
    }
}
    fclose(file_risultati); //chiusura file di testo

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char corso[100];
char acquisizione_nome [40];
char domande[]= "ABCDEFGHIJLMNOPQRSTUVZ";
int iscritti;
int risposta;

int i;
int j;
int k=1;
int p;

// variabili variazione risposta

int modifica_risposta = 1;
int risposta_precedente;
char risposta_modificata;
char domande_min[]="abcdefghijlmnopqrstuvz";

int main()
{
    printf("Program written by Gianluca Gregnol\n\n");
    printf("Raccolta del fabbisogno formativo\n\n");
    printf("Digitare il corso di interesse: ");
    gets(corso);
    printf("Digitare numero di iscritti al corso: ");
    scanf("%d", &iscritti);

    char nome_cognome[iscritti][40];
    int matrice_risposte[iscritti][21];

    // processo di inserimento votazioni //
    for (k=0;k <(iscritti);k++)
    {
        printf("\n iscritto ");
        printf("%d \n\n", k+1);
        printf("nome e cognome: ");
        fflush(stdin);
        fgets(acquisizione_nome,40,stdin);

        for (i=0; i<40; i++)
        {
            nome_cognome[k][i]= acquisizione_nome[i];
        }

        for (i=0; i<22; i++)
        {
            printf("\nvoto della domanda ");
            printf("%c: ", domande[i]);
            scanf("%d", &risposta);

            while (risposta<0 || risposta>3)
            {
                printf("\n VOTO NON VALIDO!\n i voti validi sono: 0,1,2,3\n inserire nuovamente il voto per la domanda ");
                printf("%c:", domande[i]);
                fflush(stdin);
                scanf("%d", &risposta);
            }
            matrice_risposte[k][i]=risposta;

        }

//stampa le risposte attuali per permetterne il controllo
        printf("\nLe risposte attualmente inserite sono: \n");

        for (i=0; i<22; i++)
        {
            printf("%c  ", domande[i]);
        }
        printf("\n");

        for (i=0; i<22; i++)
        {
            printf("%d  ", matrice_risposte[k][i]);
        }

        printf("\nDesideri modificare delle risposte? \n No = 0 \n Si = 1 \n");
        printf("Risposta: ");
        fflush(stdin);
        scanf("%d", &modifica_risposta);


// controlla se l'utente vuole cambiare delle risposte
        while(modifica_risposta == 1){

            printf("\n\nQuale risposta vuoi modificare?\n");
            printf("Risposta: ");
            fflush(stdin);
            scanf("%c", &risposta_modificata);

            for(i=0; i<22; i++){

                if(risposta_modificata == domande_min[i] || risposta_modificata == domande[i]){

                printf("\nIndica il nuovo valore della domanda %c: ", domande[i]);
                fflush(stdin);
                scanf("%d", &risposta);
                while (risposta < 0 || risposta > 3)
                {
                    printf("\n VOTO NON VALIDO!\n i voti validi sono: 0,1,2,3\n inserire nuovamente il voto per la domanda ");
                    printf("%c:", domande[i]);
                    fflush(stdin);
                    scanf("%d", &risposta);
                }
                risposta_precedente = matrice_risposte[k][i] ;
                matrice_risposte[k][i] = risposta;

                printf(" -- Risposta modificata correttamente --\n\n");

                }
            }

            printf("\nDesideri modificare delle risposte? \n No = 0 \n Si = 1 \n");
            printf("Risposta: ");
            fflush(stdin);
            scanf("%d", &modifica_risposta);


        } //main  while

    }

// processo scrittura su file

    FILE *file_risultati; //apertura file di testo
    strcat(corso,".csv");
    file_risultati=fopen(corso, "w");

    for (j=0;j<iscritti;j++){

        p=0;
        while(nome_cognome[j][p]!='\n')
        {
        fprintf(file_risultati,"%c", nome_cognome[j][p]);
        p=p+1;
        }
        fprintf(file_risultati,",");


        for(i=0; i<22; i++)
        {
            fprintf(file_risultati,"%d,", matrice_risposte[j][i]);
        }
        if(j != (iscritti-1)){
            fprintf(file_risultati,"\n");
        }
    }
        fclose(file_risultati); //chiusura file di testo

        return 0;
}

1 Ответ

3 голосов
/ 07 ноября 2019

Краткий ответ:

в строке 32:

int matrice_risposte[iscritti][21];

изменить 21 на 22

Объяснение:

Я заметил (из прикрепленной картинки), что у вас 22 вопроса, но объявлен массив из 21 элемента. В большинстве языков многомерные массивы реализуются путем сериализации. Таким образом, matrice_risposte [1] [22] на самом деле является matrice_risposte [2] [0]. Вы не заметили ошибку, потому что сначала печатаете результаты, а затем перезаписываете последний результат следующим циклом ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...