用 C 代码创建 GPA 计算器

标签 c

我刚刚编写了这段代码,但我无法让它工作 - 更不用说输出所需的结果了。我应该创建一个程序来计算未知数量的学生的 GPA(我已经缩小到最多 25 个),分别有未知数量的类(class)(也将那些缩小到最多 10 个,以使我的生活更轻松)。

任何人都可以看到我犯了什么错误并可能将我推向正确的方向吗?我感谢任何人的时间和建议:)

我的代码:

// C Program - GPA calculator for x amount of students with x amount of classes
// Program developer: Diana Wright - Novembet 22nd, 2014
#include <stdio.h>

int main(void) {

    // Declare variables
    int grade[5], g, class_num[9], c;
    char name[24], n;
    float GPA=0.0, grade_point=0.0, result=0.0;

    // Input student names implying amount of students
    for(n=0; n<25; n++) {
        scanf(" %s", &name[n]);
        printf("Please enter student names: %s.", name[n]);

        // Input number of classes
        for(c=0; c<10; c++) {
            scanf(" %d", &class_num[c]);
            printf("Please enter amount of classes (max.10): %d", class_num[c]);

            // Input grades
            for(g=0; g<=class_num; g++) {
                scanf(" %d", &grade[g]);    
                printf("Please enter students' grades: %d.", grade[g]);
            }

            // Conversion of grades
            if (grade == "A"){
                grade_point = 4.0;
            }
            if (grade == "B"){
                grade_point = 3.0;
            }
            if (grade == "C")
            {
                grade_point =2.0;
            }
            if (grade == "D"){
                grade_point = 1.0;
            }
            if (grade == "F"){
                grade_point = 0.0;
            }

            // Formula to calculate GPA
            result += grade_point[g];
            GPA = result/class_num[c];
        }
    }

    // Print user input and results in a table
    printf(“\n Student name \t Grades \t GPA”);
    for(n=0; n<25; n++) {
        printf(“ %s \t %d \t %f”, name[n], grade[g], GPA);
    }
    return 0;
}

我的初始输入:

Diana 3 A A A Edward 4 B C B A Stuart 4 A F C D Bert 2 F F

最佳答案

// the following implements the needed data set,
// corrects several coding errors
// has (not yet run) compiling code

编辑:以下代码已过时,请进一步查看新代码

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

struct studentGrade
{
    char name[24];
    char grades[10];
    int  class_num;
    float GPA;
};


int main(void)
{

    // Declare variables
    struct studentGrade studentGrades[25] = {{"",{'F','F','F','F','F','F','F','F','F','F'},0,0.0F}};


    int  c; // index into student grades[]

    int n; // student number/loop counter


    float grade_point=0.0f, result=0.0f;

    // Input student names implying amount of students
    for(n=0; n< (sizeof( studentGrades)/sizeof(struct studentGrade)); n++)
    {
        result = 0.0f; // initialize for each student

        printf( "please enter student name:\n     ");
        scanf(" %s", (char*)(studentGrades[n].name) );
        printf("Student Name is: %s.", studentGrades[n].name);

        printf("please enter student class count:\n");
        scanf(" %d", &studentGrades[n].class_num);
        printf("Student Number of classes: %d", studentGrades[n].class_num);

        // Input class grades
        for(c=0; c< 10; c++)
        {
            printf("please enter grade for class: %d", c);
            scanf(" %c", &(studentGrades[n].grades[c]));
            printf("student grade for class: %d is %c\n", c, studentGrades[n].grades[c]);


            // following makes wild assumption that grade entered
            // is 'A'...'F'
            // Conversion of grades
            grade_point = 0.0f; // init for each class
            switch( studentGrades[n].grades[c] )
            {
                case 'A':
                    grade_point = 4.0f;
                    break;

                case 'B':
                    grade_point = 3.0f;
                    break;

                case 'C':
                    grade_point = 2.0f;
                    break;

                case 'D':
                    grade_point = 1.0f;
                    break;

                case 'F':
                    grade_point = 0.0f;
                    break;

                default:
                    printf( "invalid grade entered\n");
                    c--; // so will properly handle loop control, etc
                    break;
            }  // end switch
            result += grade_point;


            // Formula to calculate GPA
            result += grade_point;
        } // end for each grade

        studentGrades[n].GPA = result/(float)c;
    } // end for each student

    // Print user input and results in a table
    printf("\n Student name \tGPS\n\t\tgrades\n");

    for(n=0; n< (sizeof(studentGrades) / sizeof( struct studentGrade)); n++)
    {
        if( 0 != strlen(studentGrades[n].name) )
        {
            printf( " %s \tGPS: %.2f\n",
                studentGrades[n].name,
                studentGrades[n].GPA);
            for( c=0; c< studentGrades[n].class_num; c++)
            {
                printf("\tclass: %d\t%c:\n", c, studentGrades[n].grades[c] );
            }
        }
    }
    return 0;
}

编辑:新代码:

  1. 干净地编译
  2. 正确检查错误
  3. 使用#define 语句来消除“魔数(Magic Number)”
  4. 清除总是尝试输入10个等级的逻辑错误
  5. 允许大写和小写成绩输入
  6. 使用有意义的变量名
  7. 合并适当的水平间距以提高可读性

现在是新代码:

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

#define MAX_STUDENTS 25
#define MAX_NAME_LEN 23
#define MAX_GRADES   10


#define STR_VALUE(x) STR(x)
#define STR(x) #x



struct studentGrade
{
    char name[ MAX_NAME_LEN+1 ];
    char grades[ MAX_GRADES ];
    int  class_num;
    float GPA;
};


int main(void)
{
    // Declare variables
    struct studentGrade studentGrades[ MAX_STUDENTS ] =
    {
        {"",
            {'F','F','F','F','F','F','F','F','F','F'}
            ,0,
            0.0F
        }
    };



    float result      = 0.0f;

    // Input student names implying amount of students
    for( size_t whichStudent=0;
        whichStudent < (sizeof( studentGrades)/sizeof(struct studentGrade));
        whichStudent++)
    {
        result = 0.0f; // initialize for each student

        printf( "please enter student name:\n     ");

        if( scanf(" %" STR_VALUE(MAX_NAME_LEN) "s",
                studentGrades[ whichStudent ].name ) != 1 )
        {
            fprintf( stderr, "scanf for student name failed");
            exit( EXIT_FAILURE );
        }

        // implied else, scanf for student name successful
        printf("Student Name is: %s.",
                studentGrades[ whichStudent ].name);

        printf("please enter student class count:\n");
        if( scanf(" %d", &studentGrades[ whichStudent ].class_num) != 1 )
        {
            fprintf( stderr, "scanf for student class count failed\n" );
            exit( EXIT_FAILURE );
        }

        // implied else, scanf for student class count successful

        printf("Student Number of classes: %d",
            studentGrades[ whichStudent ].class_num);

        // Input class grades
        for( int whichClass=0;
            whichClass < studentGrades[ whichStudent ].class_num;
            whichClass++)
        {
            printf( "please enter grade for class: %d", whichClass );
            if( scanf( " %c",
                        &(studentGrades[ whichStudent ].
                            grades[ whichClass ]) ) != 1)
            {
                fprintf( stderr,
                        "scanf for class grade %d failed\n",
                        whichClass );
                exit( EXIT_FAILURE );
            }

            // implied else, scanf for class grade successful

            printf( "student grade for class: %d is %d\n",
                whichClass,
                studentGrades[ whichStudent ].grades[ whichClass ] );


            // following makes wild assumption that grade entered
            // is 'A'...'F'
            // Conversion of grades
            float grade_point = 0.0f; // init for each class
            switch( studentGrades[ whichStudent ].grades[ whichClass ] )
            {
                case 'A':
                case 'a':
                    grade_point = 4.0f;
                    break;

                case 'B':
                case 'b':
                    grade_point = 3.0f;
                    break;

                case 'C':
                case 'c':
                    grade_point = 2.0f;
                    break;

                case 'D':
                case 'd':
                    grade_point = 1.0f;
                    break;

                case 'F':
                case 'f':
                    grade_point = 0.0f;
                    break;

                default:
                    printf( "invalid grade entered\n");
                    whichClass--; // so will properly handle loop control, etc
                    break;
            }  // end switch
            result += grade_point;


            // Formula to calculate GPA
            result += grade_point;
        } // end for each grade

        studentGrades[ whichStudent ].GPA =
            result/(float)studentGrades[ whichStudent ].class_num;
    } // end for each student

    // Print user input and results in a table
    printf( "\n Student name \tGPS\n\t\tgrades\n" );

    for( size_t whichStudent=0;
         whichStudent < (sizeof(studentGrades) / sizeof( struct studentGrade));
         whichStudent++ )
    {
        if( 0 != strlen( studentGrades[ whichStudent ].name ) )
        {
            printf( " %s \tGPS: %.2f\n",
                studentGrades[ whichStudent ].name,
                studentGrades[ whichStudent ].GPA );

            for( int whichClass=0;
                  whichClass < studentGrades[ whichStudent ].class_num;
                  whichClass++)
            {
                printf( "\tclass: %d\t%c:\n",
                    whichClass,
                    studentGrades[ whichStudent ].grades[ whichClass ] );
            }
        }
    }
    return 0;
}

关于用 C 代码创建 GPA 计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27085841/

相关文章:

c - 如果 (memcmp (版本, "\x0\x0\x0", 3) == 0 )

C 编程 - Sprintf 和字符串数组

结构数组上的冲突类型错误

c - 尝试复制并分配此指针以使用堆栈,但它给了我一个段错误

C - 模 (%),如何计算 IntToString 转换的值,其中 num/= 10

c - 以结构作为值的枚举?

c - scanf 函数无限接受值

c - 二字母和三字母不能一起使用吗?

c - 反转 5 位数字得到负数

c - 结构中的字符串