C语言的这个碑上的字刻错怎么修改错了

C语言编程学习:出错信息的处理 - 简书
C语言编程学习:出错信息的处理
C语言是面向过程的,而C++是面向对象的C和C++的区别:C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。
}小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!11、出错信息的处理—————————你会处理出错信息吗?哦,它并不是简单的输出。看下面的示例:if ( p == NULL ){printf ( "ERR: The pointer is NULL " );}告别学生时代的编程吧。这种编程很不利于维护和管理,出错信息或是提示信息,应该统一处理,而不是像上面这样,写成一个“硬编码”。第10条对这方面的处理做了一部分说明。如果要管理错误信息,那就要有以下的处理:/* 声明出错代码 */#define ERR_NO_ERROR 0 /* No error */#define ERR_OPEN_FILE 1 /* Open file error */#define ERR_SEND_MESG 2 /* sending a message error */#define ERR_BAD_ARGS 3 /* Bad arguments */#define ERR_MEM_NONE 4 /* Memeroy is not enough */#define ERR_SERV_DOWN 5 /* Service down try later */#define ERR_UNKNOW_INFO 6 /* Unknow information */#define ERR_SOCKET_ERR 7 /* Socket operation failed */#define ERR_PERMISSION 8 /* Permission denied */#define ERR_BAD_FORMAT 9 /* Bad configuration file */#define ERR_TIME_OUT 10 /* Communication time out *//* 声明出错信息 */char* errmsg[] = {/* 0 */ "No error",/* 1 */ "Open file error",/* 2 */ "Failed in sending/receiving a message",/* 3 */ "Bad arguments",/* 4 */ "Memeroy is not enough",/* 5 */ "S try later",/* 6 */ "Unknow information",/* 7 */ "A socket operation has failed",/* 8 */ "Permission denied",/* 9 */ "Bad configuration file format",/* 10 */ "Communication time out",/* 10 */ "Communication time out",};/* 声明错误代码全局变量 */long errno = 0;/* 打印出错信息函数 */void perror( char* info){if ( info ){printf("%s: %s ", info, errmsg[errno] );}printf("Error: %s ", errmsg[errno] );}这个基本上是ANSI的错误处理实现细节了,于是当你程序中有错误时你就可以这样处理:bool CheckPermission( char* userName ){if ( strcpy(userName, "root") != 0 ){errno = ERR_PERMISSION_DENIED;return (FALSE);}...}main(){...if (! CheckPermission( username ) ){perror("main()");}...}一个即有共性,也有个性的错误信息处理,这样做有利同种错误出一样的信息,统一用户界面,而不会因为文件打开失败,A程序员出一个信息,B程序员又出一个信息。而且这样做,非常容易维护。代码也易读。当然,物极必反,也没有必要把所有的输出都放到errmsg中,抽取比较重要的出错信息或是提示信息是其关键,但即使这样,这也包括了大多数的信息。12、常用函数和循环语句中的被计算量—————————————————看一下下面这个例子:for( i=0; i&1000; i++ ){GetLocalHostName( hostname );...
}小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!GetLocalHostName的意思是取得当前计算机名,在循环体中,它会被调用1000次啊。这是多么的没有效率的事啊。应该把这个函数拿到循环体外,这样只调用一次,效率得到了很大的提高。虽然,我们的编译器会进行优化,会把循环体内的不变的东西拿到循环外面,但是,你相信所有编译器会知道哪些是不变的吗?我觉得编译器不可靠。最好还是自己动手吧。同样,对于常用函数中的不变量,如:GetLocalHostName(char* name){char funcName[] = "GetLocalHostName";sys_log( "%s begin......", funcName );...sys_log( "%s end......", funcName );}如果这是一个经常调用的函数,每次调用时都要对funcName进行分配内存,这个开销很大啊。把这个变量声明成static吧,当函数再次被调用时,就会省去了分配内存的开销,执行效率也很好。13、函数名和变量名的命名————————————我看到许多程序对变量名和函数名的取名很草率,特别是变量名,什么a,b,c,aa,bb,cc,还有什么flag1,flag2, cnt1, cnt2,这同样是一种没有“修养”的行为。即便加上好的注释。好的变量名或是函数名,我认为应该有以下的规则:1) 直观并且可以拼读,可望文知意,不必“解码”。2) 名字的长度应该即要最短的长度,也要能最大限度的表达其含义。3) 不要全部大写,也不要全部小写,应该大小写都有,如:GetLocalHostName 或是UserAccount。4) 可以简写,但简写得要让人明白,如:ErrorCode -& ErrCode,ServerListener -& ServLisner,UserAccount -& UsrAcct 等。5) 为了避免全局函数和变量名字冲突,可以加上一些前缀,一般以模块简称做为前缀。6) 全局变量统一加一个前缀或是后缀,让人一看到这个变量就知道是全局的。7) 用匈牙利命名法命名函数参数,局部变量。但还是要坚持“望文生意”的原则。8) 与标准库(如:STL)或开发库(如:MFC)的命名风格保持一致。14、函数的传值和传指针————————————向函数传参数时,一般而言,传入非const的指针时,就表示,在函数中要修改这个指针把指内存中的数据。如果是传值,那么无论在函数内部怎么修改这个值,也影响不到传过来的值,因为传值是只内存拷贝。什么?你说这个特性你明白了,好吧,让我们看看下面的这个例程:voidvoidGetVersion(char* pStr){pStr = malloc(10);strcpy ( pStr, "2.0" );}main(){char* ver = NULL;GetVersion ( ver );......free ( ver );}我保证,类似这样的问题是一个新手最容易犯的错误。程序中妄图通过函数GetVersion给指针ver分配空间,但这种方法根本没有什么作用,原因就是——这是传值,不是传指针。你或许会和我争论,我分明传的时指针啊?再仔细看看,其实,你传的是指针其实是在传值。15、修改别人程序的修养———————————当你维护别人的程序时,请不要非常主观臆断的把已有的程序删除或是修改。我经常看到有的程序员直接在别人的程序上修改表达式或是语句。修改别人的程序时,请不要删除别人的程序,如果你觉得别人的程序有所不妥,请注释掉,然后添加自己的处理程序,必竟,你不可能100%的知道别人的意图,所以为了可以恢复,请不依赖于CVS或是SourceSafe这种版本控制软件,还是要在源码上给别人看到你修改程序的意图和步骤。这是程序维护时,一个有修养的程序员所应该做的。如下所示,这就是一种比较好的修改方法:/** ----- commented by haoel
------** char* p = ( char* ) malloc( 10 );* memset( p, 0, 10 );*//* ------ Added by haoel
----- */char* p = ( char* )calloc( 10, sizeof char );/* ---------------------------------------- */* char* p = 开始使劲) malloc( 10 );* memset( p, 0, 10 );*//* ------ Added by haoel
----- */char* p = ( char* )calloc( 10, sizeof char );/* ---------------------------------------- */...
小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!当然,这种方法是在软件维护时使用的,这样的方法,可以让再维护的人很容易知道以前的代码更改的动作和意图,而且这也是对原作者的一种尊敬。以“注释 — 添加”方式修改别人的程序,要好于直接删除别人的程序这些是C/C++能做的服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等
C语言/C++学习交流QQ群:群里有开发工具和学习资料视频教程,还有大神老司机解答问题,快来加入吧。
表格数据更新 增加 删除deleteRowsAtIndexPaths左滑删除按键 commitEditingStyle,若要增加额外的按钮,需要用到手势tableView.editing = YES;将表格设置为编辑模式,cell的左边会根据编辑样式的不同,显示加号(增加)...
亲爱哒填卷人: 您好哟, 我们是来自首都师范大学学前教育专业的大二学生 ,现在正在进行一项寒假调研活动。
我们的目的是通过收集填写者真实、可靠的反馈 ,了解公众对于学前教育价值的看法或认识 。
问卷采取匿名的形式,不会涉及到您的隐私及个人信息,请您放心填写? 。您的真实...
租赁一词早已出现在人们生活之中,而植物租赁自然也是如此。随着人们生活水平的提高,人们对生活环境的要求越来越高。现在,越来越多的人崇尚自然之美,植物租赁行业应运而生。 现今很多人家中或者办公室都有摆放绿色植物,尤其是办公室商场,摆放的绿植很多。这些公司企业摆放的绿植一般源于植...
财务疑问 年后刚刚上班,好多公司组织员工吃个饭、聚个餐,从酒店取得“餐饮费”的发票如何入账? 专家回复 员工聚餐的“餐饮费”发票,应该计入“应付职工薪酬--福利费”。 借:应付职工薪酬--福利费 2340元 贷:银行存款 2340元 当月结转福利费 借:管理费用--福利费 ...我这个c语言程序哪里错了
#include &stdio.h&
#define SIZE 100
int main()
int arr[SIZE]={65,76,85,77,56,44};
int length=6,temp,i=0
scanf("%d",&temp);
if(temp==0||i&SIZE)
浏览 330回答 3
magic_monkey
if(temp==0||i&SIZE)
}这直接就跳出死循环了,怎么运行length都等于7
第 10 行的 if 判断条件是 temp==0 || i&SIZE,这是“temp 等于 0”或“i 小于SIZE”。i 的初值是 0,肯定小于 SIZE。那么不管 temp 的值是多少,第一次执行 do 部分时,这个条件就是 true,导致 break 跳出循环。
while(l);这是一个死循环
随时随地看视频51CTO旗下网站
C语言初学者常见问题与错误
不知不觉,学习C语言也快一年了。虽然有C语言课,但是老师完全让我们自己看书,在自学的过程中,和周围同学交流中,以及后来在 CSDN,BCCN,百度知道看帖回帖中,也看到许多C语言新人常遇到的问题与常犯的错误。为了让新人们少走弯路少碰壁,我便打算写下此文。当然,由于我 自己的水平也有限,其中可能自己也不知不觉犯了错误,望高手们果断斧正。
作者:来源:| 11:45
下面的程序,基本是摘自在CSDN,BCCN,百度知道的提问帖,以及我身边的人和我自己写的程序,限于篇幅,对于问题影响不大的部分我已经删去或改写,一些与相应问题无关的错误也一并进行了修改。对于完整的修正后的程序都在code::blocks 10.05(编译器gcc,调试器gdb,平台windows 7旗舰版)上运行过。
1、程序画面一闪而过
int main(void)
/*定义变量表示信号灯的状态*/
printf(&the Red Light is 0,the Green Light is 1\n&); /*输出提示信息*/
scanf(&%d&,&iSignal);
/*输入iSignal变量*/
if(iSignal==1)
/*使用if语句进行判断*/
printf(&the Light is green,cars can run\n&);
/*判断结果为真时输出*/
if(iSignal==0)
/*使用if语句进行判断*/
printf(&the Light is red,cars can't run\n&);
/*判断结果为真时输出*/
解析:在XP以上的系统用win-tc,dev-cpp等IDE编译运行此程序时,无论输入什么数字,结果都是一闪而过,因为程序执行完语句后就直接退出了。
解决方案:这里有几个办法:
(1):在程序开头加上#include,然后在程序末尾加上system(&pause&);
此方法仅适用于MS-DOS,windows,不适用于*nix等系统
(2):在需要暂停的地方加入一个或两个getchar();
这种方法,实质上并不是暂停程序,而是让程序等待用户输入若干个回车。但是效果和暂停是相同的。
(3):在程序开头加上#include,在需要暂停的地方加入一个getch();,原理和上一种差不多。在win-tc里用得比较多。
2、if,for,while的判断后直接跟;
int main(void)
scanf(&%d&,&a);
if (a == 123);////错误,if(a == 123)后面不应加上;,而应该紧跟着
////{ printf();}代码
printf(&ccc&);
printf(&ddd&);
getchar();
int main(void)
printf(&please input a number&2:&);
scanf(&%d&,&n);
if(n%i==0)
printf(&%d not a sushu\n&,n);
printf(&%d is a sushu\n&,n);
解析&解决方案:见注释
3、漏头文件,main函数格式不规范
scanf(&%d&,&a);
printf(&input %d&, a);
解析:这段程序没有带上头文件stdio.h。即漏写了#include&。如果仅有scanf,printf函数的话,stdio.h是可以省略并可以正确运行的,但是这是非常不好的习惯。而main()这种写法,C89标准勉强充许这种形式,C99标准是不允许的。而void main(),至今仍未有任何标准考虑接受它。但是有些编译器的确允许。当然,这种写法广为流行,应该和老谭的书关系非常大。
解决方案:用到的头文件应该用include包含进去。main()函数应该写成int main(void)这种形式,在main()函数尾部加上return 0;
int main(void)
scanf(&%d&,&a);
printf(&input %d&, a);
4、scanf格式控制误用
int main(void)
float a,b,c;
printf(&shuru 3 ge xi shu :&);
scanf(&%f,%f,%f&,&a,&b,&c);
printf(&he shi %f&,a + b + c);
解析:&scanf()函数允许把普通字符放在格式字符串中。除了空格字符之外的普通字符一定要与输入串准确匹配。否则,例如上面的程序,那么scanf()将其解释成,将键入一个数字,键入一个逗号,然后再键入一个数字,再键入一个逗号,最后再键入一个数学。也就是说必须像这样输入:2.3,5.1,3.8。如果不能精确匹配,则scanf()读取将失败。
作为编写这个程序的人,你可以按照这个格式输入,但是用户则不知应该以何种格式输入。所以应该改为scanf(&%f%f%f&,&a,&b,&c);
解决方案:&scanf一行见解析。
5、scanf参数错误
int main(void)
char str[80];
printf(&Please enter your first name&);
scanf(&%s&, &str);
printf(&Hello %s&, str);
解析:scanf()中,读取int, long, float, double, char等类型的数据,是需要在第n(n&=2)个参数里加上&的,因为scanf()函数里,第n(n&=2)个参数是变量的地址,而不是变量本身:例如定义则scnaf(&%d&, &num);而读取字符串是不需要加上&,因为字符串的变量名本身就代表了地址。所以例子中应为scanf(&%s&, str);同时,这条规则对于结构体内的变量的也适用,即
struct foo {
char str[80];
那么应该是
scanf(&%c%s%d&, &data.ch, data.str, &data.num);
解决方案:见解析
6、数据类型混淆
int main(void)
double b=1;
for(a=1;a&=6;aA++)
printf(&%ld&,b);
解析:定义b为双精度浮点型,而输出使用%ld即长整型,数据类型不一致,输出为0.PS:老谭的书讲到用TC调试那一节举的例子貌似就是&后面写到printf(&%f&,a);产生错误的。
解决方案:把b定义为长整型long,即long b = 1;(其实这里还涉及到隐式转换,所以,更为正确的方法是把a也定义为长整型)
7、C语言中的&除法&
int main(void)
printf(&请输入一个华氏温度\n&);
float a,c;
scanf(&%f&,a);
c=5/9*(a-32);
printf(&摄氏温度为%4.2f&,c);
解析:&C语言中,两个整型数相除,如果不能除尽,那么小数部分会直接被丢弃,即&截尾&。因此5/9的结果是0.
解决方案:应该使用类型转换,或者明确相除的两数的类型
c=(float)5/9*(a-32);
c=5.0/9*(a-32);
c=5.0/9.0*(a-32);
8、混合输入数字和字符的杯具
int main(void)
printf(&Enter a character and a integer:\n&);
while((ch = getchar()) != '\n')
scanf(&%d&, &num);
for(i = 0; i & ++i)
putchar(ch);
putchar('\n');
printf(&Enter an another pair.Empty line to quit&);
解析:这段程序表面看起来没有什么问题,但是,实际运行一遍的,就会发现,只输入了一组数据,程序就退出了。
在开始的时候,程序运行良好,例如输入 a 2,程序就会打印出aa。但是,程序还没响应第二次输入就退出了。
问题就出在换行符,这次是紧跟在第一个输入的2后面的那个换行符。scanf()函数将该换行符留在输入队列中,而getchar()并不跳过换行符。所以在循环的下一个周期,getchar()读取了第一次输入时的换行符,而换行符正是终止循环的条件。
解决方案:吃掉输入流中的回车即可
在while循环最后,加上以下语句
while (getchar() != '\n')
也可以加上fflush(stdin);刷新输入流。
9、i++,i++;的纠结
#include &stdio.h&
int main(void)
int i = 5;
printf(&%d %d&, i++, i++);
解析:这个问题,在实际编程应该是没有人会这么写的,可还是有很多初学者纠结于此。在编程这个领域里,很多时候,实践是最好的老师。对于代码有疑问,那么上机敲一遍,编译运行一遍是很好的方法。但是,在i++,i++这个方面,即使编译运行了这个程序,也不一定会有正确的结果。用VC,TC,gcc编译运行后的结果不一定相同。或者从某个角度来说,这里结果的正确与否其实并不重要了。
printf(&%d %d&, i++, i++);这一个语句,其中的i++,i++是未指定行为。即C语言的标准并没有指定这运算是以何种顺序进行的。如果用gcc编译加上-Wall选项,那么会有warning:
gcc 2_1.c -o 2_1 -g -Wall
2_1.c: 在函数&main&中:
2_1.c:6:24: 警告:&i&上的运算结果可能是未定义的
因此,要解决这个问题,最好的方法就是不要在程序中写这样的代码。
解决方案:见上。
10、60&=grade&=70
if (60 &= grade &= 70)
printf(&及格&);
else if(70 &= grade &= 85)
printf(&良好&);
解析:在数学中,60&=grade&=70这种表达是成立的,但是在C语言中,并没有这种表达。
解决方案:应该改写为
if ((60 &= grade) && (grade &= 70))
printf(&及格&);
11、switch接受什么值?
#include &stdio.h&
int main(void)
scanf(&%lf&, &choice);
switch(choice){
case 1.0 : printf(&1.0&);
case 2.0 : printf(&2.0&);
default : printf(&It's not 1.0 or 2.0&);
解析:这种问题同样是不会出现在实际的编程当中。但是一些C语言题目可能会这么出。switch()接受的是整数:整型或者字符型。所以,浮点型,字符串等类型是不被switch()接受的。
解决方案:无他&&
12、== =的困惑
void count(void);/*计数器函数*/
void show_count(void);/*报告计数结果*/
int main(void)
puts(&Please enter some letters:(# to end)&);
show_count();
puts(&Thank you for using this program made by HerBal_Tea!&);
system(&pause&);
void count(void)
while ((ch = getchar()) != STOP)
if (ch = SPACE)
sp_count++;
if (ch = ENTER)
n_count++;
other_count++;
}/*end of while ((ch = getchar()) != '#')*/
void show_count(void)
puts(&The number of \nspace enter other&);
printf(&%5d%6d%6d\n&, sp_count, n_count, other_count);
解析:话说我自己也犯了这个错。在数学中,=表示相等,而在很多编程语言中,=表示赋值,==才 表示相等。思维惯性导致错误。而且这个错误C编译器既不会报错也不会警告。出错了检查起来非常难。我看了不下二十遍调试的值监视都找不到,最后还是一行一 行源代码看,才知道是这个问题。在C语言四书五经中的 c traps and pitfalls 和 expert c
programming都提到过这个问题。
解决方案:无他,唯细心。
13、溢出问题
例:求斐波那契数列的前n项
#include &stdio.h&
#define N 100
int main(void)
int fib[N];
fib[0] = fib[1] = 1;
printf(&%d %d &, fib[0], fib[1]);
for (i = 2; i & N; ++i)
fib[i] = fib[i - 1] + fib[i - 2];
printf(&%d &, fib[i]);
解析:在数学的概念中,整数、小数都是无限的,但是计算机中,即使是long long int或者double类 型都是有一定限度的,超过限度就会溢出。即是,假设一个指针式体重秤最大量程为120KG,那么一个体重130KG的人站上去,那么指针会指向10KG的 刻度处。溢出同理。而C语言,编译器是不会对溢出进行检查或者处理的。因此在编程中,应该自己估算一下数的大小,以选用合适的数据类型来表示数据。
PS:由于TC编译出的程序是16位的,所以int也是16位,很容易就会溢出。
解决方案:一方面是使用合适的数据类型,比如long ,long long
或者double。另一方面是,如果数特别大,连unsigned long long
int或者连double都表示不了的时候,那么就用数组吧。不过定义数组的加减法还算好,但是定义乘除法就不是那么简单了。所以推荐新人使用第一种方 法。第二种方法,可以考虑自己编个小程序实现一下。
14、四舍五入?
例:要求将输入的数按指定精度四舍五入输出
#include &stdio.h&
int main(void)
double a = 158.385427;
printf(&%.2lf&, a);
解析:&C语言中,printf(&%.2lf&, num);是直接截断至小数点后两位,并非四舍五入而是类似于趋零截尾。
解决方案:如下
//四舍五入显示数字,精确由用户输入
//可辨别正负
#include&stdio.h&
#include&stdlib.h&
#include&math.h&
int main(void)
double a = 158.385427;
puts(&Enter the width&);
scanf(&%d&,&width);
a = (int)(a*pow(10,width) + 0.5)/pow(10,width);
a = (int)(a*pow(10,width) - 0.5)/pow(10,width);
printf(&The result is %.*lf\n&,width,a);
system(&pause&);
15、函数的返回值
#include&stdio.h&
double salary();/*计算工资税的函数*/
void main()
char want0;
printf(&欢迎使用个人所得税计算器\n&);
printf(&\n&);
printf(&1.工资、薪金所得税计算\n&);
printf(&\n&);
printf(&请输入需要计算的税收项目序号:&);
scanf(&%d&, &choice);
if(choice==1)
printf(&%lf&, result);
double salary()
double sal,
printf(&请输入您的薪水:&);
scanf(&%lf&, &sal);
if(sal&=3000)
if(sal&3000&&sal&=4500)
result=sal*0.05;
if(sal&4500&&sal&=7500)
result=sal*0.1-75;
if(sal&7500&&sal&=12000)
result=sal*0.2-525;
if(sal&12000&&sal&=38000)
result=sal*0.25-975;
if(sal&38000&&sal&=58000)
result=sal*0.3-2725;
if(sal&58000&&sal&=83000)
result=sal*0.35-5475;
if(sal&83000)
result=sal*0.45-13475;
解析:这个问题简单来说是,用户定义函数并未返回计算所得数值。往深的来说是关于存储类、链接,即变量的作用域、链接、存储时期的问题。
解决方案:
* Created on:
* Author: ice
#include&stdio.h&
double salary();/*计算工资税的函数*/
int main(void)
char want0;////这个want0变量没有使用
printf(&欢迎使用个人所得税计算器\n&);
printf(&\n&);
printf(&1.工资、薪金所得税计算\n&);
printf(&\n&);
printf(&请输入需要计算的税收项目序号:&);
scanf(&%d&, &choice);
if(choice==1)
result = salary();//要有一个值接受返回值才可以
printf(&%lf&, result);
double salary()
double sal,
printf(&请输入您的薪水:&);
scanf(&%lf&, &sal);
if(sal&=3000)
if(sal&3000&&sal&=4500)
result=sal*0.05;
if(sal&4500&&sal&=7500)
result=sal*0.1-75;
if(sal&7500&&sal&=12000)
result=sal*0.2-525;
if(sal&12000&&sal&=38000)
result=sal*0.25-975;
if(sal&38000&&sal&=58000)
result=sal*0.3-2725;
if(sal&58000&&sal&=83000)
result=sal*0.35-5475;
if(sal&83000)
result=sal*0.45-13475;
【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条关注热点热点
24H热文一周话题本月最赞
讲师:125333人学习过
讲师:51174人学习过
讲师:41371人学习过
精选博文论坛热帖下载排行
针对Ajax技术的日益流行,本书对Ajax技术的典型应用进行了归纳总结,基本上覆盖了Ajax技术应用的典型场景。书中共有45个实例,分为9章:动...
订阅51CTO邮刊C语言程序中对错误的调试C语言程序中对错误的调试科技潮流百家号程序调试现在我们已经可以编写一个简单的 C语言程序了,但是你可能会犯一些简单的错误。程序的错误通常叫做 bug,而发现和修正这些错误的过程叫做调试。下面有一个带有一些错误的程序,看看你能找出多少。语法错误上面的程序中包含了几个语法错误。如果你不遵循 C语言的规则就会犯语法错误。C 的语法错误是指把正确的 C符号放在了错误的位置。那么程序 上面的程序中到底出现了什么语法错误呢?错误一:它使用圆括号而不是花括号来包围函数体,这是正确的 C 符号用错了位置的情况。错误二:声明应该采用以下形式:int n, n2, n3;或者采用以下形式int n2;int n3;错误三:示例程序中忽略用一个 */ 符号来结束注释。或者也可以用新形式 //来替代/*修改完错误之后调试运行试试:没有语法错误了!那么我们如何检测程序的语法错误?首先,在编译前浏览程序的源代码看看是否有明显的错误。其次,可以查看由编译器发现的错误,因为它的工作之一就是检测语法错误。在编译程序时,编译器会报告所找到的任何错误,同时指出每一个错误的性质和位置。然而,编译器也会发生错误。大家可以看到上面的内容,这里位置上一个真正的语法错误可能导致编译器误认为它发现了其他错误。例如,因为上面的程序末能正确声明 n2 和 n3,当后面用到这些变量的时候,编译器可能认为它发现了更多的错误。实际上,不用立刻试图改正所有发现的错误,只是修改前一个或前二个,然后重新编译,其余的某些错误就可能会消失。一直这样做,直到程序能够运行为止。编译器的另一个常见毛病是发现的错误位置比真正的错误要滞后一行。例如,编译器要编译下一行时才发现上一行缺少一个分号。因此,如果编译器指出某个具有分号的行少了一个分号,那么请检查上一行。语义错误语义错误就是在意思上的错误。例如,考虑下面的句子:furry inflation thinks greenly。句子中形容词,名词,动词和副词的位置都很正确,所以语法没有错,但是句子却什么意思也没表达出来。在 C 中,当你正确遵循 C语言的规则,但是结果不正确的时候,那就是犯了语义错误。示例程序中有这样一个错误:n3 = n2 * n2;此处,原本是希望 n3 代表 n 的三次方, 但是代码把它设置成了 n 的四次方。这样的语义错误编译器是检测不到的,因为它没有违反 C语言的规则。编译器无法了解你的真正意图,只好留给你自己去找出这类错误。那么你就需要去将自己计算出来的结果和与程序给出的结果比较了。例如,假设你已经修正了上面程序中的语法错误,现在程序应该如下图所示。输出结果是:n =5, n的平方 = 25, n的立方 = 625如果你懂得立方的话,就会知道结果 625 是错误的。下一步要跟踪程序是如何得出这个答案的。对于本例,通过观察你可能会发现其中的错误,但你需要采取更为系统的方法。方法之一就是把自己想你成计算机,跟着程序的步骤一步一步的执行。现在让我们试一下这种方法。程序体一开始是声明 3个变量:n,n2,n3.第一步,程序把 5赋给变量 n, n就变成5。第二步n 和 n 相乘,然后把结果赋给 n2, 5和5相乘得到25,结果 n2变成25.第三步 n2 和 n2相乘,然后把结果赋给 n3, 25和25相乘得到625, 结果 n3变成625。哦,原来是在进行 n2的平方而不是用 n去相乘了。对于上面的例子,这个过程可能比较烦琐一点。但用这种方式一步一步地查看程序的执行情况通常是发现程序中问题所在的最好方法。程序状态通过手工方式一步一步地跟踪程序,并记录每个变量,这样就可以监视程序状态。程序状态是指在程序执行过程中的给定点上所有变量值的集合。它是当前计算状态的一个快照。我们刚刚讨论了跟踪程序状态的方法之一:自己逐步执行程序。然而,对于迭代10000次的程序,这样的任务你是不可能完成的。不过,你仍然可以跟踪其中的一小部分选代看看程序是不是按照你所期望的方式执行的。然而,经常有这么一种可能,即你是按照你的期望那样去执行步骤,而不是按照你实际所写的代码去执行的,因此要尽量忠于实际的代码。另一种查找语义错误的方法是,在程序的几个关键点处加入额外的 printf()语句以监视所选变量的值。通过观察变量值的变化可以了解程序的执行情况。当程序的工作让你满意之后,就可以把额外的语句去掉,然后重新编译。检查程序状态的第三种方法是使用调试器。调试器是一种程序,让你能够一步一步运行另一个程序并检查该程序的变量值。不同的调试器具有不同的易用性和复杂度。较高级的调试器可以显示出正在执行的源代码行。这对于有多条可选执行路径的程序来说是非常方便的,因为可以很容易地知道执行了哪条特殊路径。如果你的编译器带有调试器,那么现在请花点时间去学会怎么用它。关键字和保留标识符关键字是C语言中的词汇。因为它们对 C来说比较特殊,所以你不能将它们用作标识符,例如作为变量名。许多关键字用于指定不同的类型,比如 int。其他的关键字,比如 if,用来控制程序中语句的执行顺序。如果试图把一个关键字用作变量名,编译器把它作为一个语法错误捕获到。还有一些你不该用的其他字符,称为保留标识符。因为它们是合法的名字,所以并不引起语法错误。保留标识符包括那些以下划线字符开始的标识符和标准库函数的名字, 例如 printf()。关键概念计算机编程是一件富有挑战性的事情。它需要抽象的,概念性的思考并细致地对待细节问题。你会发现编译器强迫你注意细节问题。当你跟朋友谈话时,你可以用错几个字,犯一两个语法错误,可能还有几个没有结束的句子,但朋友能明白你想说什么。而编译器却不允许这样做,对于编译器来说,几乎正确仍然等于错误。了解了这么多,我们的目标应该是理解什么是 C程序。你可以这么理解:程序是对你希望计算机采取何种行为的描述。编译器负责完成把你的描述转换成底层的机器语言的细节工作。由于编译器不具有真正的智能,所以必须把你对程序的描述用编译器的术语表达出来,这些术语就是 C标准所设置的格式规则!总结总的来说,C语言程序是由一个或者多个函数组成的。每一个 C程序必须包含一个名为main()的函数,因为程序开始时要调用该函数。一个简单的函数结构台下:函数头后面紧跟着一个开始花括号,后面是构成函数体的语句,然后是起终止作用的结束花括号。每个C语句都是一个针对计算机的指令,并以一个分号作为结束标志。声明语句为变量指定一个名字并指明该变量中存储的数据类型。赋值语句把值赋给变量,或者更一般地说,是把值赋给存储区域。函数调用语句会导致所指定函数的执行。当被调函数执行完毕之后,程序会返回到函数调用之后的语句继续进行。printf()函数用于输出语句和变量的值。一门语言的语法是一套规则,用于管理这种语言中的合法语句组织在一起的方式。语句的语义就是它所表达的意思。编译器可以帮助你发现语法上的错误,但是程序里的语义错误只有在编译完之后才能从程序的行为中表现出来。检测语义错误可能包括跟踪程序的状态,即程序每执行一步之后所有变量的值。如果可以的话,请大家多多转发关注,谢谢支持!想要学习交流的小伙伴可以申请加群!群号:同时也可以关注我们的微信公众号:【轻松学C语言】本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。科技潮流百家号最近更新:简介:科学不会舍弃真诚爱它的人们。作者最新文章相关文章}

我要回帖

更多关于 碑上的字刻错怎么修改 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信