один из выходных данных показывает (нулевой) результат в простой программе структуры (без массива Struct) - PullRequest
1 голос
/ 07 мая 2020

Я создал простую программу для отображения данных о студентах колледжа и подсчета накопленных баллов в оценку (A, B, C, D, E) и использования структуры (мне запрещено создавать с помощью Array of Struct) , поэтому проблема заключается в том, что один из выходных данных «Оценка» дает (нулевой) результат при печати с% s и полностью пустой результат при печати с% c. Между прочим, тип данных "Grade" - char. Вот полный код.

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

struct student
{
char nim[11];
char name[100];
char subjectCode[5];
int sks;
char grade;
}studentScore[100];

bool cekKarakter(char input[])
{
for(int x = 0; x < strlen(input); x++)
{
    if(isdigit(input[x]))
    return false;
}
return true;
}

bool cekNumeric(char input[])
{
for(int x = 0; x < strlen(input); x++)
{
    if(input[x] >= 48 && input[x] <= 57)
    return false;
}
return true;
}

int main()
{
int n;
printf("Input number of Student Data: ");
scanf("%d", &n); 
fflush(stdin);
printf("\n\n");
for(int i = 1; i <= n; i++)
{
    do
    {
        printf("NIM [Hanya numerik][10 Digit]: ");
        gets(studentScore[i].nim);
        fflush(stdin);
    }
    while(strlen(studentScore[i].nim) != 10 || 
 cekNumeric(studentScore[i].nim));

    printf("\n");

    do
    {
        printf("Name [Hanya karakter]: ");
        gets(studentScore[i].name); 
        fflush(stdin);
    }
    while(strlen(studentScore[i].name) < 5 || strlen(studentScore[i].name) > 
 30 || cekKarakter(studentScore[i].name) == false);

    printf("\n");

    do
    {
        printf("Subject Code [Must 5 length]: ");
        gets(studentScore[i].subjectCode); 
        fflush(stdin);
    }
    while(strlen(studentScore[i].subjectCode) != 5);

    printf("\n");

    do
    {
        printf("SKS [Min 2|Max 8]: ");
        scanf("%d", &studentScore[i].sks); 
        fflush(stdin);
    }
    while(studentScore[i].sks < 2 || studentScore[i].sks > 8);

    printf("\n");

    int score[5];
    int WeightGrade = 0; 

    printf("Input 5 College Subject Score:\n\n");
    for(int z = 0; z < 5; z++)
    {
        do
        {
            printf("Input Score[%d][Must be between 0 and 100]: ", z + 1);
            scanf("%d", &score[z]);
        }
        while(score[z] < 0 || score[z] > 100);

        WeightGrade += score[z];
    }

    if(WeightGrade / 25 == 4)
    {
        studentScore[i].grade = 'A';
    }
    else if(WeightGrade / 25 >= 3 && WeightGrade / 25 < 4)
    {
        studentScore[i].grade = 'B';
    }
    else if(WeightGrade / 25 >= 2 && WeightGrade / 25 < 3)
    {
        studentScore[i].grade = 'C';
    }
    else if(WeightGrade / 25 >= 1 && WeightGrade / 25 < 2)
    {
        studentScore[i].grade = 'D';
    }
    else if(WeightGrade / 25 == 0)
    {
        studentScore[i].grade = 'E';
    }
}

printf("\nStudent Data\n");

for(int i = 1; i <= n; i++)
{
    printf("NIM: %s\nName: %s\nSubject Code: %s\nSKS: %d\nGrade: %s\n",
        studentScore[i].nim, 
        studentScore[i].name, 
        studentScore[i].subjectCode, 
        studentScore[i].sks, 
        studentScore[i].grade); 
}
getchar();

return 0;
}

Это изображение программы, когда она работает (null) результат вывода с использованием% s в виде напечатанного

1 Ответ

2 голосов
/ 07 мая 2020

В вашем коде WeightGrade фактически является суммой всех оценок, поэтому для вашего примера - WeightGrade = 370.

370/25 не попадает ни в одну из опций, поэтому studentScore [i]. оценка не имеет значения. Чтобы предотвратить такие случаи, всегда вводите предложение else, которое показывает ошибку

Поскольку у вас 5 значений, вы должны разделить на 5 * 25 = 125, как в WeightGrade / 125

Также для printf , вы не должны использовать% s для значения char, вы должны использовать% c

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