gpt4 book ai didi

不用数组计算学生的 GPA

转载 作者:行者123 更新时间:2023-11-30 14:48:45 25 4
gpt4 key购买 nike

我的代码有什么问题吗?它没有正确给出值,当我插入 q 时,它没有正确执行......

#include<stdio.h>
void main()
{
double a=0, x, ctot;
double y, stot;
char b, c='q';
double score=x*y;
while(a<200){
printf("Enter no of Credits of the subject = ");
scanf("%lf\n",&x);
printf("Enter the score for the subject = ");
scanf("%lf\n",&y);
scanf("%c\n",&b);
if(b=='q'){
break;
}else{

ctot+=x;
stot+=score;
a++;
}
}
printf("GPA of the student = %f\n", stot/ctot);
}

最佳答案

尝试访问具有不确定值(即未初始化)的变量会调用未定义的行为,并且代码的有效操作将在此时停止。它可能看起来工作正常、SegFault 或介于两者之间的任何情况。

为了避免未初始化的值,请始终初始化它们 - 特别是当您刚刚开始编程时。 (它会拯救你自己......),例如

    int a = 0;          /* always initialize all variables - good practice */
double ctot = 0.0,
stot = 0.0,
score = 0.0,
x = 0.0,
y = 0.0;
char c = 0;

main 的正确声明是 int main (void)int main (int argc, char **argv) (您可以使用将看到用等效的 char *argv[] 编写的)。 注意: main 是一个int 类型 的函数,它返回一个值。请参阅:C11 Standard §5.1.2.2.1 Program startup p1 (draft n1570)。另请参阅:See What should main() return in C and C++?

虽然有一些古老的编译器和一些微 Controller 允许 void main(),但它是非标准调用,任何有值(value)的编译器都会发出警告。 (您正在使用编译器警告启用进行编译,对吗?例如,对于 gcc/clang 为 -Wall -Wextra ,对于 VS 为 /W3 ( >cl.exe))

必须每次检查scanf返回,并验证返回是否等于您请求的转化次数 - 否则发生匹配输入失败(或者用户通过生成手动EOF取消)。这是确保您正在处理有效数据并且不会进一步调用未定义行为(或让自己陷入无限输入循环)的唯一方法。每次输入后必须始终清空 stdin格式字符串中的 '\n' 花招将不起作用。清空 stdin 的一个简单方法是定义一个辅助函数,在每次输入后调用,以删除任何未读的无关或附加字符,例如

/* simple function to empty remaining chars in stdin */
void empty_stdin (void) /* if no parameter - spcecify 'void' explicitly */
{
int c = getchar();

while (c != '\n' && c != EOF)
c = getchar();
}
...
printf ("Enter no of Credits of the subject = ");
if (scanf ("%lf", &x) != 1) { /* validate EVERY input */
fprintf (stderr, "error: invalid input for 'x'.\n");
return 1;
}
empty_stdin(); /* empty stdin, your \n gimick doesn't work */

总而言之,您可以执行类似于以下操作的操作:

#include <stdio.h>

/* simple function to empty remaining chars in stdin */
void empty_stdin (void) /* if no parameter - spcecify 'void' explicitly */
{
int c = getchar();

while (c != '\n' && c != EOF)
c = getchar();
}

int main (void) {

int a = 0; /* always initialize all variables - good practice */
double ctot = 0.0,
stot = 0.0,
score = 0.0,
x = 0.0,
y = 0.0;
char c = 0;

for (; a < 200; a++) { /* loop however you like */

printf ("Enter no of Credits of the subject = ");
if (scanf ("%lf", &x) != 1) { /* validate EVERY input */
fprintf (stderr, "error: invalid input for 'x'.\n");
return 1;
}
empty_stdin(); /* empty stdin, your \n gimick doesn't work */

printf ("Enter the score for the subject = ");
if (scanf ("%lf", &y) != 1) {
fprintf (stderr, "error: invalid input for 'y'.\n");
return 1;
}
empty_stdin();

score = x * y; /* compute values each iteration */
ctot += x;
stot += score;

/* prompt for additional credits? */
printf ("add additional credits? (y/n): ");
if (scanf (" %c", &c) != 1) {
fprintf (stderr, "error: user canceled input.\n");
return 1;
}
empty_stdin();

if (c == 'n' || c == 'N') /* you can use 'q', but (y/n) is fine */
break;
}
printf ("\nGPA of the student = %f\n", stot/ctot);

return 0;
}

(你能弄清楚为什么if (scanf ("%c", &c) != 1)只能表示用户取消了输入吗?)

示例使用/输出

注意:下面故意输入了一些无关字符,以提供示例来说明如何在代码中添加简单内容来安全地处理它们。 (尝试使用您的原始代码输入下面的内容,看看会发生什么)

$ ./bin/credits_grades
Enter no of Credits of the subject = 3
Enter the score for the subject = 90
add additional credits? (y/n): y
Enter no of Credits of the subject = 4 (seemed like 40)
Enter the score for the subject = 80 (thank god!)
add additional credits? (y/n): y
Enter no of Credits of the subject = 3
Enter the score for the subject = 85
add additional credits? (y/n): n

GPA of the student = 84.500000

仔细检查一下,如果您还有其他问题,请告诉我。

关于不用数组计算学生的 GPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50208353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com