【发布时间】:2022-07-07 19:33:24
【问题描述】:
下面编写的代码似乎不适用于 C 编译器,我不知道为什么,但是如果在 C++ 编译器上完成,在 C 编译器上完成时似乎只有一堆破折号的输出,但可以工作通常在 C++ 编译器上。基本上代码是什么,它要求一定数量的学生,它会找到代码开头提到的数字的平均成绩百分比。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include <unistd.h>
int main(int argc, char *argv[]){
int numStudents;
int currentStudent=0;
int student[numStudents],Rec[numStudents],quiz[numStudents],exam[numStudents],eval[numStudents];
int final;
char remarks[numStudents][15];
char letter[numStudents][15];
printf("Enter amount of students: ");
scanf("%d",&numStudents);
currentStudent=0;
do {
printf("Enter Student Number:");
scanf("%d",&student[currentStudent]);
printf("Enter Recitation:");
scanf("%d",&Rec[currentStudent]);
printf("Enter Quizzes:");
scanf("%d",&quiz[currentStudent]);
printf("Enter Final Exam:");
scanf("%d",&exam[currentStudent]);
printf("Enter Evaluation:");
scanf("%d",&eval[currentStudent]);
currentStudent++;
} while(currentStudent!=numStudents);
currentStudent=0;
do {
final=(Rec[currentStudent]*.2)+(quiz[currentStudent]*.35)+(exam[currentStudent]*.4)+(eval[currentStudent]*.05);
if(final<=100&&final>=96){
strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"A+");
}
if(final<=95&&final>=92){
strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"A-");
}
if(final<=88&&final>=91){
strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"B+");
}
if(final<=83&&final>=87){
strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"B-");
}
if(final<=78&&final>=82){
strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"C+");
}
if(final<=74&&final>=77){
strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"C-");
}
if(final<=70&&final>=73){
strcpy(remarks[currentStudent],"Passed");
strcpy(letter[currentStudent],"D");
}
if(final<70){
strcpy(remarks[currentStudent],"Failed");
strcpy(letter[currentStudent],"F");
}
printf("\nNumber Recitation Quizzes Final Exam Evaluation Final Grade Remarks Letter");
printf("\n%d %d %d %d %d %d %s %s",student[currentStudent],Rec[currentStudent],quiz[currentStudent],exam[currentStudent],eval[currentStudent],final,remarks[currentStudent],letter[currentStudent]);
currentStudent++;
final=0;
} while(numStudents!=currentStudent);
}
【问题讨论】:
-
你不能像这样声明可变大小的数组。
-
int numStudents;— 你声明了一个变量,但没有初始化它,所以它会有一些任意值。int student[numStudents]— 现在你声明了一个数组,但是有多少个元素?由于此时未初始化numStudents,因此访问它会导致未定义的行为。 -
... 尤其是在大小根本没有初始化的情况下。此代码在 C 和 C++ 中都被破坏(由于扩展而编译)。如果您正在学习,请养成让编译器帮助您的习惯,对于 GCC 或 Clang,请指定
-pedantic -Wall -Wextra,然后阅读诊断信息并采取行动。 -
另请注意,即使您将正确初始化
numStudents,在 C++ 中它也需要是编译时常量,因为 C++ 标准不支持可变长度数组 (VLA)。 -
从技术上讲,代码在 C 中具有未定义的行为(使用 VLA,大小由未初始化的变量给出)并且不是有效的 C++(由于使用 VLA,这是一个可诊断的错误在标准 C++ 中)。您碰巧使用了支持 VLA 作为 非标准 扩展的 C++ 编译器,在这种情况下,行为也未定义。当行为未定义时,任何结果(写一些明智的东西,让您的计算机崩溃)都是同样正确的结果 - 不需要诊断。