宁夏大学数学计算机学院.doc_第1页
宁夏大学数学计算机学院.doc_第2页
宁夏大学数学计算机学院.doc_第3页
宁夏大学数学计算机学院.doc_第4页
宁夏大学数学计算机学院.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

宁夏大学数学计算机学院C语言课程设计报告专业 计算机科学与技术 班级 09级(5)班学号 12009242483 姓名 罗海燕课题六 小学算术运算测试指导教师 马子睿 报告成绩日期:2010年 12月19日目 录一、课程设计目的4 1.1、对C语言知识的巩固4 1.2、提高运用C语言的能力4二、课程设计要求及分析6 2.1、题目的要求及分析6 2.2、程序内容的分析6三、课程设计内容93.1、总体设计9 3.1.1、设计框架10 3.1.2、系统功能模块图103.2、详细设计11 3.2.1、功能模块的说明11 3.2.2、工作流程图143.3、调试与测试15 3.3.1、调试过程及数据结果的分析15 3.3.2、调试所遇问题及解决措施16 四、设计心得与总结18 4.1、心得体会及收获18 4.2、对C语言的认识22五、建议23六、评阅意见24 一 课程设计目的C语言功能丰富、表达能力强,使用灵活方面应用广泛。目标程序效率高,可移植性好,既具有高级语言的特点,又具有低级语言的许多特点。学习程序设计课程的目的是学习程序设计的方法,进行程序设计的基本训练,掌握设计程序的基本思路,学会用计算机语言编写程序,用来解决实际生活中的有些问题,为将来学习C语言打下坚实的基础。1.1 对C语言知识的巩固 程序设计是一门实践性很强的课程,既要掌握概念,又要学习动手编写程序,还要上机亲自调试、运行。前面我们已经有过一学期学习C语言的经验,对C语言已经有了一些基本的掌握和了解。为了进一步加深对C语言知识的理解和进一步巩固C语言知识及编写程序的方法,我们学习了C语言程序设计这门课程。由于用C语言编写的程序可移植性强,基本上不做修改就能用运用与各种型号的计算机和各种操作系统,其次,许多大的软件都是用C语言编写的,这点主要是由于C语言的可移植性好和硬件控制能力高所影响的。而且表达能力和运算能力也很强。为了是计算机能按照人们的意志进行工作,必须根据问题的要求,编写出相应的程序,以解决相关的实际问题。一个好的、有实用价值的源程序都应当有自己实际的用途。我们把有高级语言编写的程序成为“源程序”,把由二进制代码表示的程序称为“目标程序”。为了把源程序能转换成机器接受的目标程序,软件工程这边只了一系列软件,通过这些软件可以把用户按规定语法一一翻译成二进制的机器指令。这种具有翻译功能的软件成为“编译程序”,每种高级语言都有有它对应的编译程序。我们所写的每条C语句,经过编译最终都将转换成二进制的机器指令。这种结构化程序有三种基本结构组成。即顺序结构、选择结构、循环结构。已经证明有三种基本结构组成的算法可以解决任何复杂的问题。有三种基本解雇组成的算法成为结构化算法;有三种基本结构组成的程序成为结构化程序。C语言是一种结构化程序设计语言。它提供里三种基本结构的语句;提供了定义“函数”的基本功能,在C语言中没有子程序的概念,它提供的函数可以完成子程序的所有功能;C语言允许对函数单独进行编译,从而可以实现模块化。另外C语言提供了丰富的数据类型。这些都为结构化程序设计提供了有力的工具。C语言源程序文件名的后缀是C;经过编译后,生成文件的后缀是OBJ;经过连接后生成文件的后缀是EXE。C语言最小编一单位是“函数”,并且C语言规定必须用main主函数名,其后还不许跟一对圆括号,括号里面可以是空的,但是括号绝对不可以省略。程序中main()函数是程序的起始行,也是C程序执行的起始行。每一个可执行的C程序都必须有且只有一个主函数。一个C程序可以包含多个函数,但是只能有一个主函数。一个C程序总是从主函数开始执行的。在函数的后面用一对花括号“ ”括起来的部分为函数体。函数体内通常有定义说明部分和执行语句部分。如函数中“int i,n,s=0,p=1,t=0,j=1; int a,b,num;”就为程序的定义部分;如“loop: while(j=3)s=0; printf(输入的题数); scanf(%d,&n); srand(%d,&n); srand(time(NULL);”等到“t+; printf(得满分以上的人数%d,t);fprintf(fp,得满分以上的人数%dn,t);”就是程序的执行部分。执行部分的语句必须放在定义部分之后,语句的数量不限,程序中这些语句向计算机系统发出指令操作。其次,在C语言中,定义语句必须用“ ; ”结束。分号是C语句的一部分,不是语句之间的分隔符。C语言程序有比较自由的书写格式,例如在编写程序是可以加入注释部分,以说明变量的含义、语句的作用和程序段的功能,从而帮助人们理解和阅读程序。当然也可以不加。因此一个好的程序应该有详细的注释。再添加程序注释时必须注意,注释内容一定放在“/*”和“*/”之间。而且“/*”和“*/”必须成对出现,“*”和“/”之间还不能有空格。注释部分只适用于阅读,对程序的运行不起任何作用。按照语法规定在注视之间不可以再嵌套“/*”和“*/”,例如“/*/*/*/”这种形式是非法的,尤其要注意:注释从“/*”开始到最近的一个“*/”结束,期间的任何内容都被编译程序忽略。程序中“#include#include#include”等通常称为命令行,命令行必须用“#”开头,行为不能加分号“;”,它不是程序中的语句。一对括号“”之间的stdioh是系统提供的头文件,该文件中包含着有关输入输出函数的信息。在程序中调用不同的标准库函数,应当包含相应的文件,以使程序包含有所调用标准库函数的信息。最后还想说的是在C语言中有许多符号的命名,如变量名、函数名、数组名等,都必须遵守一定的规则,按照此规则命名的符号称为标识符。和法标识符的规则是:标识符可以有数字、字母和下划线组成,并且第一个字母必须是字母或下划线。C语言中的标识符分为三类,既关键字、预定义标识符、用户标识符。在C语言的标识符中,大写字母和小写字母被认为是两个不同的字符,例如page和Page就是两个不同的字符。对于标识符的长度,C语言也是有规定的,即标识符的前若干个字符有效,超过的字符将不被识别。注意:不同的C语言编译系统所规定的标识符有效长度可能会不同。还有很多有关C语言知识需我们巩固,这里就不不一一列出,具体在程序中会体现的。1.2 提高运用C语言的能力 学习C语言不仅仅要掌握C语言的理论知识,还要有效的运用所学的知识,用来帮助我们解决一些实际的问题。用高级语言编写的程序成为“源程序”。实际上计算机只能识别和执行有0和1组成的二进制的指令,而不能直接识别和执行用高级语言表编写的指令。为了使计算机能执行高级语言源程序,必须先利用一种称为“编译程序的软件”,把源程序翻译成二进制的形式的“目标程序”,然后再将该目标程序与系统的函数库以及其他目标程序连接起来,形成可执行的目标程序。然而这种能力要我们经过不断的努力去才能提高的。 这门课是对C程序设计课程的课堂一个重要补充,与理论学习起着相辅相成的作用。通过本程序可的训练,可以增强我们对编程课程的进一步认识,进一步掌握编程思路,使我们具备了基本的程序设计与调试技能,加强学生对相关概念的理解,更准确的掌握C语言的特点及语法,熟练掌握C语言的编程方法,具有运用C语言解决和处理实际问题的能力。培养学生程序设计的逻辑抽象能力和编程素质,使学生养成良好的程序设计风格,培养学生的自学能力,获取计算机新知识、新技术的能力,使学生具备一定的实践能力和创新能力,为后续课程的学习打下坚实的基础。 上机实验之前,学生应当为每次上机内容做好充分的准备。对每次上机完成的内容进行认真的分析,选择合适的算法,列出具体的步骤,写出符合题目要求的程序步骤。按照实验目的和实验内容以及思考题的要求进行上机操作,录入程序,编译调试,反复修改,直到使用要求的算法,使程序正常运行得出真确的输出结果为止。根据实验结果,写出实验报告。实验报告应包括:实验目的,程序清单呢,运行结果,所选取的算法及其优缺点以及通过上机取得哪些经验。根据各模块的知识点,划分成从基础型、应用型、综合设计型到创兴提高的循序渐进的四个层次。基础型实验为应知应会的基础语法实验。 二 课程设计要求及分析本课程设计是重要的实践性环节之一,是在学习完高级程序设计语言(C)课程之后进行的一次全面的综合练习。为了能够更好的掌握C语言程序,要求必须选出具体的题目,这样才能通过自己亲手编写程序,掌握编写程序的方法及要点。2.1 题目的要求及分析小学算术运算测试要求:制作一个可供小学数学运算的测试。要求编写一个程序能够实现以下功能。功能:10以内加减法,能根据输入的题数出题,判断做题是否正确,并且要求计算出最后的得分。例如:请输入题数:31+5=2+4=5+7=由用户输入答案,程序能够根据答案判断正误,输出正确率。对于这样的程序要求,首先能够让读者读懂,能够单独理解该程序,明白它的功能。由于C语言,乃至所有的程序语言都与你以前所接收的知识尤其是一些高中的基本知识背道行之。题目的主要部分,即题目所揭示的写作对象或写作的基本内容。对于此题目,要求编程人员必须从程序中实现其所有的功能。题目既是一个程序最重要的一部分,若是偏离了程序题目的要求,即就是此程序没有实现其要求的任何功能,要学会对一个程序的题目做起应有的内容。题目要做到特性和有构思特性和构思可以激起人们心里的潜在愿望,并且愈加有吸引力,然则笔者不倡议一些另类的题目,不倡导运用低俗的词语来吸引眼球,并且这类题目往往都邑被编纂直接枪毙,就算可以逃过编纂的眼睛,那么这些低俗的文字吸引到的人群对你的网站又有什么协助呢?往往还会拔苗助长,要晓得目前我们正在反低俗,正在进行新一轮的整风活动,所以低俗的题目不克不及要!小学算术运算测试,10以内的加减法。题目明确规定是小学算术运算测试,而且是10以内的加减法运算。所以在做此程序时一定要注意,仅仅是10以内的加减法,能够随机出题,程序在编译连接之后,在运行时要自动出题,然后由用户输入正确答案,继续下一到提出来,用户继续输入答案,知道把所要求的题数出完为止。而且要系统自动判断所输答案的正误以及计算出最后的得分。着点点滴滴都要求要在程序中体现出来,每一点都应有他自己的C语句,用来实现其特有的功能。题目实践上就是你文章的高度归纳综合,是浓缩的精髓,当然,文章要题目与内容相符。2.2 程序内容的分析对于此程序,每一行自然有其每一行的作用与意义。#include#include#include#define SWAP(a,b,c) (c)=(a); (a)=(b); (b)=(c);void main()int i,n,s=0,p=1,t=0,j=1; int a,b,num; FILE *fp; fp=fopen(work.txt,w+); if(fp=NULL) printf(n The system can not open the file!n);return; loop: while(j=3)s=0; printf(输入的题数); scanf(%d,&n); srand(%d,&n); srand(time(NULL);for(i=0;in;i+) a=rand()%10+1; b=rand()%10+1; if(p) p=0; printf(%d+%d=,a,b); scanf(%d,&num);if(num=a+b) s+; else p=1; if(ab) SWAP(a,b,p); printf(%d-%d=0,a,b); scanf(%d,&num);if(num=a-b) s+; printf(总分%d,得分%d,n,s); fprintf(fp,总分%d,得分%d,n,s); j+; if(s=n)t+; printf(得满分以上的人数%d,t); fprintf(fp,得满分以上的人数%dn,t); goto loop; flose(fp); 程序开头的几个库函数,即头文件#include#include#include就是每个C程序的必备部分,这些都是c语言里的一些头文件,里面包含一些已经编写好的函数提供给用户使用stdio.h是输入输出头文件,所有有关输入输出的函数。例如printf,scanf,putchar,getchar等,都要用该头文件,头文件其实就是定义了这个函数的文件,它是系统提供给我们的接口 stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。“time.h”包含有关时间的各种函数。#define SWAP(a,b,c) (c)=(a); (a)=(b); (b)=(c);就是一个宏定义。然后从main()函数开始就实现该程序的功能,从左花括号“”开始到右花括号“”结束就是整个程序结束,完成了他该有的功能。其中还用了文件FILE *fp; fp=fopen(work.txt,w+); if(fp=NULL) printf(n The system can not open the file!n);return; 以及flose(fp); fprintf(fp,总分%d,得分%d,n,s);以用来打开文件和关闭文件,别且保存结果。其中还用了一对函数rand()和srand()。因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。其次,srand()这个函数一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的数字。复制的,只想说明rand不是真正意义的随机 。这句是这个C程序的几个关键点。如果不能正确运用它们,程序很可能就无法实现其应有的功能。在程序的一对花括号“”和“”内部的内容就是实现该程序的各个功能的所有语句,应用了一对标准输入输出函数printf(输入的题数);和 scanf(%d,&n);来实现系统自动出题和用户输入所出题的答案。以及最后系统能够输出题目所要求的所有内容,没有这对函数的话,对于我们这写程序员来说就很难实现输入输出所需数的结果,或者说是个根本就不能实现的。因此会用这对函数对编写程序也是非常重要的。三 课程设计内容课程设计内容这部分包括了课程的总体设计和详细设计,以及程序的调试与测试。为了能更明确说明程序的内容,下面我以小节的形式一点一点给出程序内容及功能的说明。3.1、总体设计根据题目要求,要设计一个程序,小学算术运算测试要求:制作一个可供小学数学运算的测试。要求编写一个程序能够实现以下功能。10以内加减法,能根据输入的题数出题,判断做题是否正确,并且要求计算出最后的得分。在编写完程序之后经编译、连接等步骤检查程序是否有错,若没有错就应进入运行界面。进入运行界面之后就应该有程序所要求的功能模块。首先在你输入要出的题数之后,系统应该要自动出题。 3.1.1、设计框架编写程序之前就应该定义好所需变量以及所需文件等类型,要求必须保存结果编写程序,在编写完程序之后就应该上机调试,要在运行界面显示有关数据及结果。调试程序时,在进入运行界面后,界面上就会显示输入题数,由用户输入后系统会自动出题,接着用户输入答案,系统判断正误并加分。运行结束后会自动返回界面,当第二次打开文件时,上次的运行结果还会在的。3.1.2、系统功能模块图 每个程序自然都会有其自己的功能,所以每部分也就会有它对应的模块图。这个模块图就是他所实现的功能了。对于小学算术运算测试这个C程序,它也有它的功能模块图。其显示的内容应该有,“请输入题数”、输完后按回车键后就有系统自动出的题目,接着就有用户做题,做完后系统会判断正误。在所有学生做完所有题后,按任意键就会返回。1图为初次进入系统的功能模块图。2为输入题数后的系统功能图。3.2、详细设计 这部分包含了功能模块的说明和工作流程图。要想让该程序实现其所要求的程序功能,必须设计出每部分所需要的程序语句。3.2.1、功能模块的说明改程序虽然简短,但每一段都应该有应有的功能多的。开始的几个头文件,#include#include#include里面包含了程序所需要的所有函数及其应有的功能。stdio.h是输入输出头文件,所有有关输入输出的函数。例如printf,scanf,putchar,getchar等,都要用该头文件,头文件其实就是定义了这个函数的文件,它是系统提供给我们的接口 stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。“time.h”包含有关时间的各种函数。#define SWAP(a,b,c) (c)=(a); (a)=(b); (b)=(c);就是一个宏定义。然后从main()函数开始就实现该程序的功能,从左花括号“”开始到右花括号“”结束就是整个程序结束,完成了他该有的功能。main()函数是每个程序必备部分,而且每个程序中只能有一个main()函数。C语言规定必须用main作为主函数名,其后的一对圆括号()中间可以是空的,但这一对圆括号不能省略。程序中的main()是主函数的起始行,也是C语言程序执行的起始行。每一个C程序都必须有一个且只有一个主函数。一个程序中可以包含任意多个不同的函数名,但只能有一个主函数。一个C程序总是从主函数开始执行的。程序中这两行int i,n,s=0,p=1,t=0,j=1; int a,b,num;是定义了几个整型变量i、n、s、p、t、j以及a、b、num。C语言中所谓变量是指在程序运行过程中其值可以改变的量。程序中所用到的所有变量都必须有一个名字作为标识符,变量的名字有用户定义,他必须符合标识符的命名过则,例如在这个程序中i、n、s、p、t、j以及a、b、num就是我自己定义的变量。a、b在程序中代表程序中系统自动出题时的两个随机数,s是计算总得分的变量,num是用户输入的正确答案,p是用来根据其值的真假来判断要出的题是加法还是减法,j是控制程序所要重复的次数,及所要做题的人数。等等就不一一解释了。在程序的开头定义了一个文件指针,FILE *fp; fp=fopen(work.txt,w+); if(fp=NULL) printf(n The system can not open the file!n);return; 其中这一句fp=fopen(work.txt,w+);是用来打开文件的,“w+”用来写入的,而且是每次做完题之后系统都要自动写入下次所需要的数据。其中if(fp=NULL)用来判断文件是否存在的,若不从在,则系统就会输出找不到该目标文件,然后返回原地,即是程序中这句所言实现的功能:printf(n The system can not open the file!n);return; 接下来程序就利用goto语句来实现循环这一功能:loop之后的while()函数是用来控制所需做题的人数,在这个程序中我定义了三个人做题,所以while语句就是这样写的; while(j=3)。While后的花括号“”后的内容就是进行程序的主要内容。其中s=0;意思是做题之前系统记录的总得分是“0”分,里面这句printf(输入的题数);是实现系统自动根据用户的需求输出用户输入的题数。printf()函数是C语言用的最广泛的输出函数,他与scanf()是一对,scanf(%d,&n);这一句的功能是让用户输入所需的总题数,scanf是C语言应用最广泛的标准输入函数,它俩的调用格式基本相同,printf是用来在终端设备上按指定格式输出。Printf函数的调用行式是:printf(格式控制,输出项1,输出项2,)格式控制是字符串行式。在printf调用之后必须加上“;”,构成一条完整的输出语句。如printf(总分%d,得分%d,n,s)其中用双引号括起来的部分“总分%d,得分%d”是输出格式控制,决定了输出数据的内容和格式。其中n、s是输出项,是printf函数的参数。printf函数中格式控制的作用是:1、给输出项提供输出格式说明输出格式说明的作用是将要输出地数据按照指定的格式输出。格式中“%”符号和紧跟在其后的格式描述符组成。当输出项是int类型时,用d作为格式描述符,其形式为%d。当输出项是float的double类型时,用e或f作为格式描述符,其形式为%f或%e。2、提供需要原样输出的文字或字符除了格式转换说明外,字符串中的其他字符将按原样输出。Printf函数中个输出项之间要用逗号隔开,而且输出项可以使任意的合法常量、变量或表达式。其次,在格式控制中,每个格式说明都必须用%开头,以一个格式字符座位号结束,在此之间可以根据需要插入“宽度说明”、左对齐符号“-”、前导零符号“0”等。scanf函数是C语言提供的标准输入函数,起作用是从终端键盘上读入数据。它的一般调用形式为;scanf(格式控制,输入项1,输入项2,)在scanf调用之后必须加上“;”,构成一条完整的输入语句。如scanf(%d,&num);其中scanf是函数名,双引号括起来的部分是字符串部分是格式控制部分其后的&num是输出项。程序中srand(%d,&n);是用来初始化函数rand的函数。因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。程序中for(i=0;in;i+);是控制循环的,用来控制系统所出的题必须是10以内的两个数的加法或减法。其中a=rand()%10+1; b=rand()%10+1;就是系统产生的两个随机数,而且是10以内的。如果不控制好,可能就不是10以内的数的加减法了,这样就不符合题目的要求。接下来的就是这段程序:if(p) p=0; printf(%d+%d=,a,b); scanf(%d,&num);if(num=a+b) s+; else p=1; if(ab) SWAP(a,b,p); printf(%d-%d=0,a,b); scanf(%d,&num);if(num=a-b) s+;分别是进行加减法运算的程序语句,通过if语句的判断,如果p=0,就进行加法运算,即是p=0; printf(%d+%d=,a,b);并且输入答案判断正误,最后计算得分,即是scanf(%d,&num);if(num=a+b) s+; 如果是p=1;就进行减法运算,即else p=1; if(ab) SWAP(a,b,p); printf(%d-%d=0,a,b);别且由用户输入答案判断正误,最后计算出得分,即为scanf(%d,&num);if(num=a-b) s+;最后要输出得分,而且要利用文件保存其结果。即所用的C语句是printf(总分%d,得分%d,n,s); fprintf(fp,总分%d,得分%d,n,s);又要求计算出得满分的人,并保存得满分的人数,所以用C语句if(s=n) t+; printf(得满分以上的人数%d,t); fprintf(fp,得满分以上的人数%dn,t);如果为满分,则t自动加1。最后就是关闭文件flose(fp);这就是这个程序的具体设计语句及其所包含的功能。3.2.2、工作流程图 开始 打开文件文件是否存在 输入题数 j=3 P=1printf(“%d-%d”,a,b)printf(“%d+%d”,a,b)num=a-bnum=a+bS+= 输出s j+结束3.3、调试与测试 编写完之后,就应该上机调试,这样才能发现错误并改正。C语言的功能强 ,使用方便,得到广泛的使用,程序设计员可以编写出能解决复杂问题的,运行效率高的,占内存少的,高质量程序。C是函数式的语言,利用标准库函数,可以实现模块化,将许多函数组织成一个大的程序,但由于C的灵活性,使C编译程序对语法的检查不如其他高级语言那样严格,往往会出现一些意想不到的错误。因此,在C的学习中,调试与测试过程是一个相当重要的环节。3.3.1、调试过程及数据结果的分析所谓程序调试,是指对程序的查错和排错。调试程序一般经过以下几个步骤:一、.进行人工排查,即静态检查,在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查,这一不是十分重要的,它能让我们发现由于疏忽而造成的多数错误,如某条语句后忘写“;”,或“”没有成对出现。为了更有效地进行人工检查,所编程序应力求做到以下几点:1、应该采用结构化程序方法编程,以增加可读性,2、尽可能多加注释,以帮助每段程序的理解,3、在编写复杂的程序时,不要将全部语句都写在main函数中,而要更多的利用函数,用一个函数来出现一个单独独的功能,这样既易于阅读也便于调试。二、在人工检查后,才可以上机调试,通过上机发现错误成为静态检查,在编译时,给出语法错误的信息,它包括哪一行错及错误类型,可以各根据提示的信息具体找出程序中出错之处并改正,应当注意的是:有时提示出错行并不是真正出错的行,如果再提示出错的行上找不到错误的话应当到上一行再找,另外,有时提示出错的类型并非绝对准确,由于出错的情况繁多而且各种错误互有关联,因此,要善于分析,找出真正的错误,而不要只从字面 意义上死抠出错误信息。如果系统提示的错误信息多,应当从上到下逐一改正。有时显示出一大片错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对所用变量未定义,编译时就会对所有含该变量的语句发出出错信息,只要加上一个定义变量,所有错误就都消除,不用再检查其他。三、在改正语法错误后,程序经过连接就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。数据结果分析:对于此程序他的数据较为简单。有时,数据比较复杂,难以立即判断结果是否正确,可以事先找出一组具有特征的数据,输入这些数据可以很容易判断正确与否的结果。运行结果不对,大多属于逻辑错误,对这类错误往往需要仔细检查和分析才能发现。可以采用以下办法对程序结果进行检查:一、将程序与流程图仔细对照,如果流程图是正确的话,程序写错了,这样就很容易发现了。二、如果实在找不出错误,可以采取“分段检查”的方法。在程序不同位置设计个printf函数语句,输出有关变量的值,逐段往下检查,直到找到在某一段中数据不对为止。这时就把错误局限在这一段中。不断缩小“差错区”,就可能发现错误所在。三、可以用“条件编译”命令进行程序调试,在程序调试阶段,使用若干printf函数语句进行编译并执行。当调试完后,这些语句不用在编译,也不用在执行,可以不必一一删去printf函数语句,以提高效率。四、如果在程序中没有发现问题,就要检查流程图是否有误,如有则改正之,接着修改程序。总之,程序调试试一项细致深入的工作,要求写程序者必须认真对自己的程序检查。3.3.2、调试所遇问题及解决措施一、忘记定义变量。C要求对程序中用到的每一个变量都必须在本函数中且运用前定义其类型。二、输入与输出地数据的类型与所运用格式说明不一致。编译时不显示出错信息,但运行结果将于原意不符。他们并不是按照赋值的规则进行转换,而是将数据在存储单元中的形式按格式符的要求组织输出。三、在输入语句scanf中忘记使用变量的地址符。这是许多学习C语言者时常被忽略的一个问题,或是习惯性的错误,因为在其他语言中在输入时只需写出变量名即可,而C语言要求指明“向那个地址标识的单元送值”。输入数据的形式与要求不符,用scanf函数输入数据,应注意如何组织输入数据。对scanf函数中格式字符中除了个是说明外,对其他必须按原样输出。四、误把“=”作为“等于”运算符,在C语言中,“=”是赋值运算符,“=”才是关系运算符“等于”。语句后面漏分号,C语言规定语句末尾必须有分号。分号是c语句不可缺少的部分。或在不该加分号的地方加分号,如if、for、while语句中。如果在for()后加一个分号,使循环体变成一个空语句 。五、对应有花括号的复合语句,忘记加花括号,括号不配对,当一个语句中使用多层括号时常出现这类错误。在用标识符时,忘记大写字母和小写字母的区别。编译程序把字母认作是两个不同的变量名处理。六、混淆字符数组与字符指针的区别,在引用指针变量之前没有对它赋予正确的值,没有给指针变量赋值就引用。混淆字符和字符串的表示形式,字符变量只能存放一个字符,而字符常量的形式是用单撇号括起来的,用双撇号括起来的是字符串。使用自加,自减运算时出的错误。七、所调运的函数在调运语句 后才定义,而又在调运前未被声明。对函数声明和函数定义不匹配。在需要加头文件时没有用#include命令去包含头文件,如程序中用到输入输出函数,没有用#include,误认为形参值的改变会影响实参的值,函数的实参和形参的类型不一致,程序虽可以运行但在编译时给出“警告”信息。不同类型的指针的混用,指向不同类型的指针的赋值必须进行强制类型转化,如用malloc函数开辟的内存单元,函数返回的是指向被分配内存空间的void *类型的指针。而人们希望开辟的是存放一个结构体变量值的存储单元,要求得到指向该结构体变量的指针。没有注意函数参数的求值顺序,C语言中没有具体规定函数参数求值顺序。八、使用文件时忘记打开,或打开方式与使用情况不匹配。如,对文件的读写,用只读方式打开,却企图向该文件输出数据。此外,有的程序常忘记关闭文件,虽然系统会自动关闭所有文件,但可能会丢失数据,因此必须在用完文件后关闭它。总之,程序是语法的错误还是逻辑错误,都要进行逐一分析并处理,语法错误是违背了该语言的规定,逻辑错误是由于算法有错或编写程序有错。 四 设计心得与总结通过了一学期的C程序设计学习,对C语言有了不少的认识和收获,而且通过要学期自我实践,我也产生了很多感想。对C语言的掌握提高到了一个新的水平,能够利用C语言编写出一个实用的程序,很大程度提高了程序综合设计能力、分析能力和编程能力。掌握了很多新的编程技巧,积累了一些编程经验。以前学过一学期的C语言,现在才发现原来那只是对C语言的一个很浅薄的认识,仅仅对C语言的语法有了点认识,根本就不知道C语言程序编程的方法或者说是编写C程序的任何技术。经过了这一学期的编程学习,对C语言程序有了更进一步的认识,而且也得出了不少结论。4.1 心得体会及收获对于C语言编程,我们决不能只看不编写。只有自己亲手做了才能体会到学习C语言编程的快乐以及奥妙,也只有自己亲手做了才能学到更多的知识,自己才可以学会应用C语言的知识来解决我们现实生活中的一些实际问题。学习C语言已经快一年了,这一年中,领会到它的博大精深,而我只是学习了皮毛而已,许多人把其一生奉献给它,它是另一个世界的通行证。从接触C语言那天起,从无知到相识,曾经有过多少迷茫的日子,多少次想和你说再见,但对你的崇敬与喜爱迫使我一步步坚持下来了,从小就有一个简单的梦想,但实现起来就变得不现实了,所以经常想着如何利用某种东西或者是某种工具能够解决我们自己不能解决的事。出于这种想法,在进入大学的校园里,大一就接触了C语言,就认识了C语言。就在浩如烟海的图书馆里寻找端倪,从翻动自动化原理的书籍开始,现在才知道当初自己有多么的天真无知,多么的好高骛远,总以为,只要心中有着满腔热血,世界就会因此而改变,在花费大量的时间来对自己水平所不及的书走马观花后,便开始觉得自己有些走火入魔的境地,那几天,浑浑噩噩颓废无比,心里特别的难过,无助与失望,就这样,毫无所获的告别自己的第一个阶段,还是不肯认输,也许是社会的就业压力,我又一次捡起了信心,很明显的知道自己的学习方法出了很大的问题,于是,便开始改变策略,从最基础的开始,于是我便和C语言相遇了,这一次教训:开始学习时,要脚踏实地充分利用手头的资源,找到最简单最直接的学习方向,别把时间花费在哪不着边际的研究上,那样会让人头疼。说起着手学习,最开始,现在也觉得有点可笑,那便是盲目,我自认为自己不够聪明,但我愿意花费比别人更多的 时间,吃比别人更多的苦,在初期还是用高中学习所用的那套方法,在图书馆随便挑了几本书,就开始自学,一般的课本就是按C语言的历史及意义开始,之后就介绍数据类型,顺序,循环,条件语句,之后就是函数,数组,指针及结构体等,最开始的一个礼拜,死读书本的第一章,那时几乎都快把那些内容背下来了,后来就开始看数据类型,如果要背这些知识我自认为,那他的记忆水平是相当的高了,至少我是不行的,所以这样注定了失败,不久就心灰意冷了,那个阶段,心中的疑惑很多,甚至连什么是C语言都不明白,书上讲的是程序,然而程序又是什么呢,没见过?是自己不知道,究竟是怎么回事,语言,而且是计算机语言干吗要我们人学习呢?现在才知道我们人类不但要学习计算机语言,而且还要精通计算机语言,因为计算机语言对我们在日常生活中的作用是如此重要。 要想学好C程序设计,必须做到以下几点;一、首先必须要学好C语言的运算符和运算顺序。这是学好C程序设计的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来就会得心应手,而有些可暂时放弃不记,等用到时再记不迟。首先要明确运算符按优先级不同分类,C程序设计运算符可分为15种优先级,从高到低,优先级为1 15,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。例如5*8/4%10 这个表达式中出现3种运算符,是同级运算符,运算顺序按从左至右结合,因此先计算5 *8=40,然后被4除,结果为10,最后是%(求余数)运算,所以表达式的最终结果为10%10 = 0;二、要学好C语言的三种基本结构(1)顺序结构顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。例如;a = 3,b = 5,现交换a,b的值,这个问题就好象交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径 r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。(2)选择结构顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图,弄清各分支所要执行的功能,嵌套结构也就不难了。嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的。例如if(条件)分支体这种分支结构中的分支体可以是一条语句,此时“ ”可以省略,也可以是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过分支体,这时分支体就不会执行。如:要计算x的绝对值,根据绝对值定义,我们知道,当x=0时,其绝对值不变,而x0时其绝对值是为x的反号,因此程序段为:if(x0) x=-x;又例如if(条件)分支1else分支2这是典型的分支结构,如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成。(3)循环结构:循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、dowhile、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。在学完这三个循环后,应明确它们的异同点:用while和dowhile循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而dowhile循环是先执行循环体后判断表达式,也就是说dowhile的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与 if构成的循环,是不能用break和 continue语句进行控制的。顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论