- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码有什么问题吗?它没有正确给出值,当我插入 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/
void fillQueueWithStudents(Queue *q) { int counter = 1; char answer = 'Y'; //this signifies th
我在 JSP 上做了一个项目,通过 MySQL 数据库根据分数计算 GPA(平均绩点)。这是我的公式: sb=con.prepareStatement("select round((((score)/
为了更详细地说明我正在处理的问题,确切的任务是: 编写一个程序,计算平均值、最小值、最大值和 所有学生的平均 GPA。首先,你的程序会读入学生记录 (姓名和 GPA)并确定文件中学生记录的数量。毕竟
我可以制作一个表格来显示每个部门的 GPA,但我不知道如何让它只显示 GPA 最高的部门。 我的查询是: SELECT avg(grade) as GPA, deptID from tblStuden
package gpatogradecalculator; import java.util.Scanner; public class GPAtoGradeCalculator { publ
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
到目前为止,这是我的代码(已更新): import java.util.Scanner; public class gpa { public static void main(String[]
这里是 Java 初学者。所以我对如何制作它感到困惑,所以如果用户输入是“A+”,我将得到 4.0 并且不会更高?类似地,对于“F”,我想让 F、F-、F+ 的结果都是 0.0 gpa。我想要么为字母
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我的主类中有这段代码。我的问题是,GPA 是用总分除以类(class)来计算的。它没有给我完整的号码。 EX,如果总数为 14,类(class)为 4,则为 3.5,我的代码只给我 3.0。有谁知道为
所以这段代码的整个目标是计算一个学期的 GPA。它要求用户提供学期名称(即 2014 年秋季)、类(class)名称、学分和成绩。它将这些信息列出到一个文本文件中,并计算 GPA。 我似乎不知道如何做
我无法找出我的程序的问题,非常感谢任何帮助!不幸的是,我是一名初学者程序员......当我运行该程序时,它会正确要求类(class)数量、学分和成绩,但它会忽略输入的学分,只给出字母成绩的正常值。最后
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 8 年前。 GPA计算器 我知道那里有类似的线程,但我见过的没有一个遇到我遇到的问
我想根据成绩和学分计算每个学生的 GPA。我已经执行了这样的事情 SET GPA=(SELECT((t.grade*c.credits)/c.credits) FROM Student s, Take
我在连接这个表格上的表格以获得单一结果时遇到了一些问题。计算 GPA 的方法如下: 获取每门类(class)的平均成绩。 将每个平均值乘以该类(class)的学分数。 添加 2 的结果。 将结果除以
我正在尝试创建一个表单,要求用户输入姓名、GPA 和电话号码。我需要帮助来验证 GPA 是否为 0 到 4 之间的数字,包括成绩后最多两位小数。我不知道从哪里开始!
我是 JavaScript 初学者。在这里,我无法弄清楚为什么我的代码没有读取我输入的值,尽管我找不到代码中的任何错误。有什么有用的建议来编辑我的代码以修复错误吗? function gpacalc(
出于某种原因,我的程序在计算 GPA 平均值时出错。如果我输入 4.0 3 次,那么它说平均 GPA 是 3.0 但应该是 4.0。有人可以帮我找到问题吗? //variables double gp
家庭作业问题。我需要遍历一系列字典以获得最高的 gpa 并打印学生的名字和姓氏。我在访问字典条目的 gpa 字段时遇到问题。 // Task 6 var highestGPA = 0.0 var st
我是一名优秀的程序员,十分优秀!