用C代码创建GPA计算器

时间:2014-11-23 05:12:37

标签: c

我刚刚编写了这段代码,我无法让它工作 - 更不用说输出所需的结果了。我应该创建一个程序来计算未知数量的学生的GPA(我已经缩小到最多25个),分别具有未知数量的类(也缩小到最多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

3 个答案:

答案 0 :(得分:2)

// 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语句来消除魔法&#39;编号
  4. 清除始终尝试输入10个等级的逻辑错误
  5. 允许大写和小写等级条目
  6. 使用有意义的变量名称
  7. 包含适当的水平间距以提高可读性
  8. 现在是新代码:

    #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;
    }
    

答案 1 :(得分:1)

这个东西很少生锈,但我认为这里发生了一些奇怪的事情,可能并非有意。

for(g=0; g<=class_num; g++) 

认为我们正在寻找存储在偏移c处的输入值,而不是数组。

for(c=0; c<10; c++)

我不太清楚这个循环的价值。我们每个学生只需要上课一次。

if (grade == "A")

同样,这并没有抓住数组中的正确偏移量。比较char需要单引号吗?

您还将打印出一堆打印报表...例如,您可能希望将此行移到循环之外:

printf("Please enter students' grades: %d.", grade[g]);

答案 2 :(得分:1)

所以,不要对你的案件进行判断,不论这是否是家庭作业,并且赞扬了Laughpine和Gopi已经说过的话......

您的代码中存在一些明显的错误,这些错误会阻止您编译和运行以产生任何影响。首先,让我们看看你的变量声明:

// Declare variables
// You don't initialize any of your char or int non array and array variables. 
int grade[5], g, class_num[9], c;
char name[24], n;
float GPA=0.0, grade_point=0.0, result=0.0; // You initialize your floating point variables.

初始化时,编译器将指定这些变量所在的内存区域。如果你不这样做,那么编译器就会开始做出假设&#39;您正在使用的变量,并将随机内存位置分配给您的变量。下一个:

for (c = 0; c<10; c++) {
        scanf(" %d", &class_num[c]); // You ask the user to enter one digit at a time for the class number
        printf("Please enter amount of classes (max.10): %d", class_num[c]); 

        // Input grades
        for (g = 0; g <= class_num; g++) // You try and make a comparison to a single variable int to an entire array which is not allowed.
        {
            scanf(" %d", &grade[g]);
            printf("Please enter students' grades: %d.", grade[g]);
        }

您无法将单个变量与整个数组进行比较,此行for (g = 0; g <= class_num; g++)将无法编译。另:

if (grade == "A"){
        grade_point = 4.0;
        }

您尝试从您的案例中作为int数据类型的成绩与不允许的字符串/字符文字"A"进行比较...

result += grade_point[g]

如果在此之前没有以这种方式定义,则Grade_point成为一个数组...

这看起来像是你匆匆完成了程序的设计过程。我建议你坐下来用一张纸和一支铅笔/笔,并在要求用户输入的每个阶段写出你想要完成的是什么。这将有助于定义您应该使用哪些变量数据类型来完成任务。