1、计算概论 之 C语言程序设计,期终总结,关于考试,时间:2011年1月4日下午3:105:00(请提前10分钟到) 地点:计算中心机房(平时上机地)请将学生证放到桌面上关于用户和IP绑定:考试时,每个人都只能用自己的帐户在同一台机器上登录,否则将被锁定,不能继续考试!,复习:讲义,基本概念及基本语法 多阅读以前的源代码 解决问题的思路 计算,计算过程中变量的值及其变化 循环过程中的当前循环、循环的跳出 通过中间变量来记录一些状态 ,关于考试,一、关于工程的创建,1、每一个程序(有一个main()函数),都应创建一个工程。2、我们创建的工程(Project)类型为:Win32 Console A
2、pplication。3、工程的命名要有规律可循,工程文件存放的文件夹位置应为Z盘上以你自己的学号命名的文件夹。4、新建的应用程序(Application)类型为: A “Hello World” Application,创建工程,工程类型,工程名称,工程文件存放位置,一、关于工程的创建,如果创建的应用程序类型为“Hello World” Application ,则VC+编程环境会为你创建所有所需源文件及程序框架,你只需对源程序文件进行修改即可: 你要修改的源程序文件为“工程名.cpp” 程序框架不要变动 将语句 printf(“Hello World!”); 删除,加上自己的代码即可,将工
3、程视图切换到File View,修改与工程名同名的源文件,编译时请选择Build,编辑你的程序,程序框架不要修改,二、关于程序的错误修改及调试,当程序编译出现错误时,不要惊慌,编译结果输出窗口已经为你指明了程序的出错行及错误原因,可以据此来修改程序错误。 修改错误时,应从出错信息中的第一条开始,用鼠标双击该条信息,程序源文件窗口就将定位到出错行。 很多时候,程序编译后会出很多错误,但很可能是由第一个错误衍生而来的,改完第一个错误后,再编译时其他错误就不再出现了。所以,应该每修改完一个错误后就编译一次。,二、关于程序的错误修改及调试,这里少了一个“”。,双击第一行,定位错误及了解错误原因!,二、
4、关于程序的错误修改及调试,当程序编译通过后,在程序执行时,由于程序算法及其他原因,执行结果有可能不正确,这时从源程序表面上就很难发现错误,而是需要对程序进行跟踪调试。 在跟踪调试过程中,可以一步一步执行程序语句,在每一条语句执行后,可以查看相关变量的值,以判断和预期结果是否相符;也可以了解程序的执行顺序,看它是否和预期的程序流程相符。 当然,在跟踪调试前,还需要确定一下程序可能从哪里出错,设置一个断点,让程序在此停止自动运行,由我们手动一步一步发出程序执行命令。如果不能确定程序是从哪里出错,则可以将断点设置在程序的第一条语句处。,设置程序断点,跟踪方式执行程序,查看变量值,当前程序执行停留在此
5、行,程序手动执行 进入函数 一步一步执行 从函数中执行出来 执行到光标所在行,三、程序设计的基本过程,目标:利用计算机来解决问题 过程: 创建一个新工程:每一个问题,都创建一个工程 创建一个源文件:只用一个源文件 编写源程序:预编译、函数声明、main()函数,其他函数 编译链接、修改错误 运行、调试,三、问题求解的基本步骤,目标:给出解决问题的程序 步骤: 分析问题,明确输入和输出的数据 确定数据的表示方法(数据类型、数据结构及相应变量) 寻找解决问题的算法(包括明确中间过程所使用的数据) 编写程序,三、问题求解的基本步骤,求2个整数的和,输入数据:两个整数先要定义2个整数变量输出数据:一个
6、整数定义1个整数变量,来存放2个数的和算法:先从键盘输入2个整数,将这2个数相加,并赋给相应的变量,最后将和输出。,#include int main() int a, b, c; scanf(“%d%d”, ,四、常见问题,标准输入输出的使用: scanf():用于从键盘中输入数据,赋给变量 printf():将希望输出的内容显示在屏幕上(一行一行地显示),先定义变量,再利用scanf()函数给该变量输入相应的数据,最后才能使用该变量。int a, b, c;scanf(“%d%d”, ,printf()函数可以将变量的内容以及其他的提示信息输出到屏幕上。printf(“n%d + %d =
7、 %cn”, a, b, c);,如果a 为1,b为4,则输出为:1 + 4 = 5,double r;scanf(“%lf”, ,四、常见问题,字符和字符串的输入输出: char s100;输入字符: scanf(“%c”, ,数值的表达范围不同的数据类型,其表达范围是不同的,也是有限的浮点数精度float和 double 的计算精度不同,double的精度要高2.33和2.33f在计算机内是不同的整数的除法得到的仍是整数,小数部分舍去,如:1/2 0, 5/2 2。若需要得到小数部分,则需要进行强制类型转换:(float)1/2,或者1.0/21/2*(a+b+c+d)运算符“”和“”这是
8、两个完全不同的运算符,前者是赋值,后者是比较if(x=2) if(x= =2) ,四、常见问题,字符常量的表达 x = a; (错误,此事a被当作变量名) x = a; (正确) if(x=a) if(x=a) 漏大括号, 本应在一起执行的程序结果只执行一条 if(x0) if(x0) x = x + 4; x = x/4; x = x + 4; x = x/4; 乱加分号, 比如在if、for 和while后加分号 for(x=1;x0); /此时形成空语句 ,四、常见问题,switch/case语句:往往忘了在分支后加break语句,导致后续不该执行的分支语句也执行;case子句后面应该是
9、整型常量,包括字符。 变量初始化:没有初始化就引用,导致结果错误,尤其对于数组问题。“自创”表达式:注意关系表达式和逻辑表达式的使用方法if( 11 ,四、常见问题,程序的执行顺序 V = 4 * 3.14f * r * r * r;L = 2 * 3.14f * r;scanf(%f, ifelse ifif( x0 )else if( x=0 )else if( x0 ) if( x0&x10) else ,不理解题意,有些要用循环多次输入的题目,只实现了一次的功能。 变量作用域问题:在作用域外引用变量。 工程的创建,头文件的包含程序书写格式不规范,导致代码不够清晰,可读性不好。 欠缺独立
10、解决问题的意识,比如在碰到问题时不知道先查阅讲义、参考书等,四、常见问题,编译错误的解决指定行前后,错误的原因充分利用调试工具debug特定的输入变量的的当前值表达式的当前值程序的执行顺序,四、常见问题,不同类型数据的混合运算:整型数据和浮点数据的混合运算double a;a = 75/100*7.5; /a = ?a = 0.6*(2/3); /a = ?,四、常见问题,此时a的结果都为0!,四、常见问题,数组读入问题 int a; scanf(“%d”, /回车结束,四、常见问题,动态数组的使用:当处理的数据个数在编程时不确定时 int i, n; struct ABC char name
11、100; int num; *stu; scanf(“%d”, ,全局和局部变量同名int x;void p() printf(“%d”, x); void main() int x; /不能和全局变量同名! scanf(“%d”, ,四、常见问题,四、常见问题,大数组的定义:应定义为全局变量int x50000;int s1000010000;void main() int i, j; for( i=0; i50000; i+) scanf(“%d”, ,四、常见问题,数组的越界访问int s1000010000;void main() int i, j; for( i=0; i10000;
12、 i+) for( j=0; j10000; j+) if( sij-1 = 0 & sij+1 = 0 ) ,四、常见问题,循环控制:连续退出二重循环 int i, j; for( i=0; i10000; i+) int isbreak = 0; for( j=0; j10000; j+) if( ) isbreak = 1; break; if( isbreak ) break; ,四、常见问题,字符串的处理:字符串在字符数组中以0结束字符串长度与字符数组的长度不是一个概念!char s100;int i;scanf(“%s”, s);for( i=0; i0 ) strcpy(tmp,
13、 str1); strcpy(str1, str2); srcpy(str2,tmp); ,四、常见问题,编程网格中一个常见的输入输出控制问题第一行输入一个整数n,其后有n行,每行是输出有n行,int n;scanf(“%d”, ,“程序提交后输出为空”有几个原因: 1、对于某些测试用例,程序确实没有输出(考虑不够全面); 2、程序超时;3、程序运行时有错误,还没有输出就结束了(有些错误,在VC环境中是不会出现的, 但在编程网格中是会出错的。比如数组的越界访问),五、编程网格的常见问题,五、编程网格的常见问题,为什么我的程序在VC中正确,但在PG上不对?你的程序对变量未正确地初始化你分配的数组
14、大小太小了,无法处理大测试数据程序对特殊情形的处理不正确程序判断语句中该使用“ = ”的地方使用了“ =”,五、编程网格的常见问题,为什么我的程序在VC中编译正确,但在PG上是Compile Error?main函数定义为void main()了,应该为int main()程序中使用了strlwr和strupr等函数(strlwr和strupr不是ANSI C的标准函数)忘记了相应的#include多了一行VC专用的#include stdafx.h,五、编程网格的常见问题,为什么我的程序编译不通过?强制类型转换应为(int)a,而不是int(a)#define 语句中使用了等号:#defin
15、e PAI = 3.14159对浮点数使用了求余数运算符%,C语言中%只能用于整数间的运算for循环语句的循环控制中用“,”而不是“;”分隔三部分,五、关于程序风格,Any fool can write code that a computer can understand. Good programmer write code that human can understand.Martin Fowler,问题1: 给定年月日,判断该日是这年的第几天。,int year, month, day, total, i;scanf(“%d%d%d”, ,六、程序示例,问题1: 给定年月日,判断该日
16、是这年的第几天。,/利用数组来存放每月的天数int year, month, day, total, i;int mday12 = 31,28,31,30,31,30,31,31,30,31,30,31;scanf(“%d%d%d”, ,六、程序示例,问题2: 细菌繁殖。细菌数目每天成倍增长。给定起始和终止日,以及起始日细菌数目,求终止日细菌数目。,int m1, d1, m2, d2, num1, num2;int total1, total2, days, i;scanf(“%d%d%d%d%d”, ,六、程序示例,问题2: 细菌繁殖。细菌数目每天成倍增长。给定起始和终止日,以及起始日细菌
17、数目,求终止日细菌数目。,int m1, d1, m2, d2, num1, num2;int mday12 = 31,28,31,30,31,30,31,31,30,31,30,31;int days, i;scanf(“%d%d%d%d%d”, ,六、程序示例,六、程序示例,问题3:编写一个程序,要求用户从键盘上输入一个整数,并把每位数字转换成英文。如当用户输入1024时,屏幕上输出:one, zero, two, four,如何做?输入输出数据:算法关键:如何确定一个整数有多少位?每位数是多少?该如何表达?,#include #include int main() int a, b, p
18、; int len; /a的位数 scanf(“%d”, ,if( i!=0 ) switch(p) case 0: printf(zero,); break; case 1: printf(one,); break; case 2: printf(two,); break; case 3: printf(three,); break; case 4: printf(four,); break; case 5: printf(five,); break; case 6: printf(six,); break; case 7: printf(seven,); break; case 8: pr
19、intf(eight,); break; case 9: printf(nine,); break; else switch(p) case 0: printf(zero); break; case 1: printf(one); break; case 2: printf(two); break; case 3: printf(three); break; case 4: printf(four); break; case 5: printf(five); break; case 6: printf(six); break; case 7: printf(seven); break; case 8: printf(eight); break; case 9: printf(nine); break; ,关于答疑,答疑:2012年1月3日晚上7点,方正大厦4楼412房间,