我想问一下我的c程序是不是出了什么问题。我是一名大学新生,我们有一个项目,那就是制作一个对我们的课程有用的程序,这就是为什么我选择了热量学这个话题。我不擅长编程,所以希望有人能帮助我..下面是我的代码。提前谢谢你
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void shc();
void main(){
int c=0;
do{
printf("\n----------------------\n\nEnter-1 for Quantity of Heat\nEnter-2 for Mass of Substance\nEnter-3 to Specific Heat Capacity of Material\nEnter-4 for Change in Temperature\n\nEnter-5 to exit\n");
scanf("%d",&c);
switch(c){
case 1:qoh();
break;
case 2:mos();
break;
case 3:shcm();
break;
case 4:cit();
break;
case 5:exit(0);
break;
}
}while(!(c==5));
void qoh(){
int mos, shcm, cit, qoh;
printf("Enter Mass of Substance: ");
scanf("%d",&mos);
printf("Specific Heat Capacity of Material: ");
scanf("%s", &shcm);
printf("Change in Temperature: ");
scanf("%d",&cit);
qoh=(mos*shcm*cit);
printf("Quantity of Heat: %d",qoh);
}
void mos(){
int mos, shcm, cit, qoh;
printf("Enter Quantity of Heat: ");
scanf("%d",&qoh);
printf("Specific Heat Capacity of Material: ");
scanf("%s", &shcm);
printf("Change in Temperature: ");
scanf("%d",&cit);
mos=qoh/(shcm*cit);
printf("Mass of Substance: %d",mos);
}
void cit(){
int mos, shcm, cit, qoh;
printf("Enter Mass of Substance: ");
scanf("%d",&mos);
printf("Specific Heat Capacity of Material: ");
scanf("%s", &shcm);
printf("Enter Quantity of Heat: ");
scanf("%d",&qoh);
cit=qoh/(mos*shcm);
printf("Quantity of Heat: %d",qoh);
}
}发布于 2020-12-12 14:10:48
问题:
main函数没有右大括号},或者您在文件末尾使用了额外的}。使用int main()时
void main()不正确int变量,所以在scanf中使用%d,不要使用%s (这是用于字符串的)schm()的定义,所以在调用中注释,一旦您有了它的定义,就启用它。正确修改和编辑:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void shc();
void mos();
void shcm();
void cit();
void qoh();
int main() {
int c=0;
do{
printf("\n----------------------\n ");
printf("Enter-1 for Quantity of Heat \n");
printf("Enter-2 for Mass of Substance \n");
printf("Enter-3 to Specific Heat Capacity of Material\n");
printf("Enter-4 for Change in Temperature\n");
printf("Enter-5 to exit\n");
scanf("%d",&c);
switch(c) {
case 1:
qoh();
break;
case 2:
mos();
break;
case 3:
//shcm();
break;
case 4:
cit();
break;
case 5:
exit(0);
break;
}
}while(!(c==5));
}
void qoh()
{
int mos, shcm, cit, qoh1;
printf("Enter Mass of Substance: ");
scanf("%d",&mos);
printf("Specific Heat Capacity of Material: ");
scanf("%d", &shcm);
printf("Change in Temperature: ");
scanf("%d",&cit);
qoh1=(mos*shcm*cit);
printf("Quantity of Heat: %d",qoh1);
}
void mos()
{
int mos1, shcm, cit, qoh;
printf("Enter Quantity of Heat: ");
scanf("%d",&qoh);
printf("Specific Heat Capacity of Material: ");
scanf("%d", &shcm);
printf("Change in Temperature: ");
scanf("%d",&cit);
mos1=qoh/(shcm*cit);
printf("Mass of Substance: %d",mos1);
}
void cit()
{
int mos, shcm, cit1, qoh;
printf("Enter Mass of Substance: ");
scanf("%d",&mos);
printf("Specific Heat Capacity of Material: ");
scanf("%d", &shcm);
printf("Enter Quantity of Heat: ");
scanf("%d",&qoh);
cit1=qoh/(mos*shcm);
printf("Quantity of Heat: %d",qoh);
}发布于 2020-12-12 14:22:54
步骤1:
实际上,助手函数是在main函数中声明的--因为右大括号就在代码的底部。您应该将这个右大括号移到函数定义void qoh()之前。
第2步:
接下来,更改您的main函数的原型,这是无效的C。请参阅this post。最好使用第一个版本--即int main(void);,因为在这种情况下您的代码没有使用参数。此外,由于main的目的是返回一个int,因此您应该实际执行此操作--在main的末尾添加return 0;。
第3步:
您的main函数正在调用您的帮助器函数;但是,它们是在您的main函数之后(即下面)定义的。您应该在您的main函数之上添加原型--使用您在顶部已经完成的格式:
void shc(); /* This is a function prototype */(虽然这似乎在您的代码中没有使用)。
第4步:
正如注释中所提到的,您的一些scanf使用%s格式说明符而不是%d --您在所有情况下都在读取int,所以它们都应该使用%d。
第5步:
正如在上面的注释中提到的,您不应该将函数名重用为局部变量。虽然这是可能的,但这是一种糟糕的风格,只会导致混乱。
步骤6:
努力修复代码中的缩进,使其在整个过程中更加一致--它不仅使代码更容易阅读和理解,而且最重要的是,随着您继续工作,它将有助于进一步的调试。
希望这能有所帮助!
发布于 2020-12-12 14:43:21
我看到这个问题现在已经回答了,但是当我看到这个问题的时候,我已经写了大部分,所以我还是要发帖。
以下是一些事情:
1
当它显示implicit declaration of function或undefined reference to时,意味着您使用了编译器以前未见过的变量名、函数名等。在本例中,switch语句中的case调用的是尚未声明的函数。您可以在稍后的代码中声明和定义您的函数,但是编译器会从上到下读取您的代码,因此当它到达函数调用qoh时,例如,它以前没有看到过该函数的声明,因此它抛出一个错误。你可以通过将你的函数定义移到main上面或者(更好的)把函数原型放在main上面(就像你对shc所做的那样)来解决这个问题(如注释中所指出的)。这将告诉编译器该函数将存在,因此它不会抛出错误,但仍然允许您将main放在程序顶部附近(有利于可读性)。您可以通过复制并粘贴函数定义的第一行(例如,将void cit(){粘贴到main之上的程序顶部,并简单地以分号结束,而不是左花括号(同样,就像您对shc所做的那样)来实现此目的。
2
正如在另一个答案中指出的,void main()是不正确的。通常,当函数返回一个值时,该值就可以在调用该函数的任何地方使用,例如,您可以使用int x = func(3)调用一个函数,然后x将等于func的返回值。这对于main是不同的。main的返回值成为程序的退出代码,本质上是程序退出原因的指示器。按照惯例,退出代码为0表示程序成功运行并正常退出。任何其他退出代码都意味着问题(并且,如果您正在编写一个将要分发给用户的程序,则可以在文档中定义每个退出代码的含义)。因此,虽然它与其他函数不同,但main确实返回值,因此您应该用int main()替换void main()。如果您的程序运行成功,您还应该通过将return 0;添加到main的末尾来使main返回0。
3.
main的结束大括号应该在其他函数定义之前。
4.
正如注释和其他答案中所指出的,如果您正在阅读scanfs,请在ints中使用%d而不是%s。
5
在您的switch语句中,在第三种情况下,您调用了一个没有在任何地方定义的shcm函数。您在顶部有一个shc函数的原型,所以我不确定您的意图是什么。您应该定义shcm函数并为其添加原型,或者定义shc函数并调用它而不是shcm
6
虽然您可以摆脱它,但使用与函数同名的变量是不好的做法,因为这会导致混淆,并使代码更难阅读。取而代之的是,变量的名称由您决定。
7
你的风格总体上很难读懂。更一致的缩进将使其更具可读性,同时也更容易发现括号问题,就像您在main中遇到的问题一样。
https://stackoverflow.com/questions/65262065
复制相似问题