C структура указателей массива, извлекающая информацию - PullRequest
0 голосов
/ 24 марта 2020

так что это QI получил:

Напишите программу, которая содержит следующие определения типов:

  1. Структура Student, которая содержит следующие члены:
    • ID студента
    • Тип оценки (0 для оценки персонажа и 1 для оценки int)
    • Оценка студента (это может быть оценка персонажа типа B 'или оценка типа int, такая как 84)
  2. Union StuGrade, которая содержит следующие члены:
    • charGrade
    • intGrade

Ваша программа должна создать массив указателей для структуры Student размера 5 и заполнить его от пользователя. Затем он должен распечатать информацию учеников, которые учатся в классе А.

Я почти уверен, что моя проблема в последнем сегменте

Ожидается:

Enter ID: 111
0 for char grade or 1 for int grade: 0
Enter a char grade: A
Enter ID: 112
0 for char grade or 1 for int grade: 0
Enter a char grade: C
Enter ID: 113
0 for char grade or 1 for int grade: 1
Enter an int grade: 84
Enter ID: 114
0 for char grade or 1 for int grade: 1
Enter an int grade: 99
Enter ID: 115
0 for char grade or 1 for int grade: 0
Enter a char grade: A
***Student(s) who take grade 'A' is/are***
ID: 111
Grade: A
ID: 114
Grade: 99
ID: 115
Grade: A

мой вывод:

Enter ID: 111
0 for char grade or 1 for int grade:0
Enter a char grade:A
Enter ID: 112
0 for char grade or 1 for int grade:0
Enter a char grade:C
Enter ID: 113
0 for char grade or 1 for int grade:1
Enter an int grade:84
Enter ID: 114
0 for char grade or 1 for int grade:1
Enter an int grade:99
Enter ID: 115
0 for char grade or 1 for int grade:0
Enter a char grade:A
***Student(s) who take grade 'A' is/are***
ID : 115
Grade: A
ID : 115
Grade: A
ID : 115
Grade: A
ID : 115
Grade: A
ID : 115
Grade: A

Код:

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

struct StuGrade{

    int intGrade;
    char charGrade[1];

};

struct Student{

    char ID[20];
    char typeG[1];

    struct StuGrade Grade;

};

int main(){

    int i = 0;
    struct Student std[5] ;

    struct Student *ptr = NULL ;

    ptr = std ;


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

        printf("Enter ID: ");
        scanf("%s", ptr->ID);

        printf("0 for char grade or 1 for int grade:");
        scanf("%s", ptr->typeG);

        if(strcmp(ptr->typeG,"0") == 0){

            printf("Enter a char grade:");
            scanf("%s", ptr->Grade.charGrade);

        }else{

            printf("Enter an int grade:");
            scanf("%d", &ptr->Grade.intGrade);

        } 
    }

    i =0;   
    printf("***Student(s) who take grade 'A' is/are***");


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

        if(strcmp(ptr->Grade.charGrade,"A") == 0){

            printf("\nID : %s",ptr->ID);
            printf("\nGrade: %s",ptr->Grade.charGrade);

        }

        if(ptr->Grade.intGrade >= 90){  

            printf("\nID : %s",ptr->ID);
            printf("\nGrade: %d",ptr->Grade.intGrade);
        }

    }




    return 0;
}




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

    if(strcmp(ptr->Grade.charGrade,"A") == 0){

        printf("\nID : %s",ptr->ID);
        printf("\nGrade: %s",ptr->Grade.charGrade);

    }

    if(ptr->Grade.intGrade >= 90){  

        printf("\nID : %s",ptr->ID);
        printf("\nGrade: %d",ptr->Grade.intGrade);
    }

}

1 Ответ

1 голос
/ 24 марта 2020

В инструкциях сказано:

создать массив указателей на структуру Student

struct Student std[5] ;

- это массив структур, а не массив указателей. Массив указателей выглядит следующим образом:

struct Student* std[5] ;

Затем необходимо выделить память для каждой Student структуры.

for (i = 0; i < 5; i++) {
    std[i] = malloc(sizeof(*std[i]));
    ptr = std[i];
    ...
}

Другая проблема заключается в том, что char charGrade[1]; недостаточно велик для держать строку с оценкой. Строка нуждается в дополнительном символе для нулевого терминатора, поэтому 1-символьная строка должна быть объявлена ​​char charGrade[2];. То же самое касается typeG (хотя я не уверен, почему вы в первую очередь используете для этого строку, похоже, это должна быть int).

Полная исправленная программа это:

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

struct StuGrade{
    int intGrade;
    char charGrade[2];
};

struct Student{
    char ID[20];
    char typeG[2];
    struct StuGrade Grade;
};

int main(){
    int i = 0;
    struct Student* std[5] ;

    for (i = 0; i < 5; i++) {
        std[i] = malloc(sizeof(*std[i]));
        ptr = std[i];
        printf("Enter ID: ");
        scanf("%s", ptr->ID);

        printf("0 for char grade or 1 for int grade:");
        scanf("%s", ptr->typeG);

        if(strcmp(ptr->typeG,"0") == 0){
            printf("Enter a char grade:");
            scanf("%s", ptr->Grade.charGrade);
        }else{
            printf("Enter an int grade:");
            scanf("%d", &ptr->Grade.intGrade);
        } 
    }

    i =0;   
    printf("***Student(s) who take grade 'A' is/are***");

    for (i = 0; i < 5; i++) {
        ptr = std[i];
        if(strcmp(ptr->Grade.charGrade,"A") == 0){
            printf("\nID : %s",ptr->ID);
            printf("\nGrade: %s",ptr->Grade.charGrade);
        }
        if(ptr->Grade.intGrade >= 90){  
            printf("\nID : %s",ptr->ID);
            printf("\nGrade: %d",ptr->Grade.intGrade);
        }
    }

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