1、C语言程序设计小结,内容,C语言程序设计基础 数据类型、常用库函数 运算符、表达式、位运算控制结构与语句 数组,函数及其应用 编译预处理 指针结构体、共用体 、枚举文 件,函数是C语言程序的基本模块,下一张,上一张,【例】输入两个整数,判断大小,并输出大数。,#include /编译预处理命令void main() /主函数main() int a,b; int max (int, int); scanf(%d,%d, 编译 连接 运行 源程序.c 目标程序 .obj 可执行文件 .exe 结果,下一张,上一张,整型实型(浮点型)字符型 char枚举类型数组类型 结构体类型 struct共用体
2、类型,单精度型 float双精度型 double,基本类型构造类型指针类型 *空类型 NULL自动类型 auto静态类型 static寄存器类型 register外部类型 extern,数据类型存储类型,数据类型的分类,各种数据类型所表示的数据有一定范围,若将超出其范围的数据放入其中,会产生数据的“溢出”。 Wirth 程序数据结构算法,下一张,上一张,基本整型 int短整型 short长整型 long 基本型无符号型 unsigned短整型 长整型,变量类型,第2章 基本数据类型与常用库函数,字符集与标识符基本数据类型常量、变量 输入输出函数用法 常用函数,字符集基本符号是ASCII字符集标
3、识符程序设计过程中用到的各种元素的名字组成:英文字母、数字和下划线“_” ,首字符为字母或下划线。建议字符数不超过8个。定义:见名知义、区分大小写字母、禁用保留字Year,day,a_1,A_1,_Time %A,356B ,abc$基本数据类型 :整型数据 类型标识符:unsigned short、int、long sizeof(int) 计算所占字节数实型数据float、double字符型数据 char以其ASCII码存放在内存,C语言保留字,除上述32个保留字(用小写字母表示)不能另作他用外,象main、printf等库函数名,include、define、undef、indef、inf
4、def、endif等在C语言中具有特定的意义,也不要另作他用。,上一张,常量用来表示固定的数值和字符值的量整型常量:十进制、八进制(0)、十六进制(0x),L|l、U|u 0578、234实型常量(浮点数): 十进制小数形式(.) 、指数形式E|e ,F|f字符常量:A ,可以其ASCII码值参加运算, %c、%d 转义字符 :n、ddd、xhh 、 、 符号常量代表常量的标识符 #define 符号常量 常量 #define PI 3.1415926变量程序执行过程中,其值可以改变的量。变量定义:类型标识符变量名列表; double x, y =3.1; /使用前需定义、赋初值,常量、变量,
5、表2.3常用转义字符及其含义,下一张,上一张,输入输出函数,#include 从键盘读入一个字符: c = getchar();输出一个字符: putchar(c); putchar(65); putchar(x41); puts() 输出字符串并换行puts(s1); gets() 读取字符串直到回车结束 gets(s1);格式输出函数 printf(”格式控制字符串”, 表达式列表); 格式输入函数 scanf(“格式控制字符串”, 地址列表); scanf(“i=%d, j=%f”, ,程序执行:2 3.1415 1.2 a2 3.142 a 97,常用函数,#include /数学函数
6、 函数原型:double sqrt(double x) sin cos tan exp pow log log10.#include /字符函数 tolower(A) isalpha isupper isdigit isalnum#include /其它常用函数 exit(0);/正常终止程序,值传给调用过程;为1则异常终止程序,下一张,上一张,表. 数学函数(math.h),下一张,上一张,第3章 运算符和表达式,运算符优先级、结合性、运算对象表达式形式、求解过程类型转换,下一张,C语言的表达式,书写规则:写在同一行,只能使用圆括号且匹配 1 a+b1.0/2 * ( (a+b) / (3*
7、c) ) 2 3c (x+r)*8-a+b)7、b*b-4ac -b /(2*a) 不能写成 -b/2*a = ,下一张,上一张,算术运算符: +、-、*、/、 %、+ +、- - (整型变量)关系运算符: 、=、 .复合位运算赋值运算符: &=、|=、=、=、c2; / bc; a=0; 0=0 /* z=0 &、|组成的逻辑表达式, 只对能确定整个表达式值的最少数目的子表达式进行计算 */sizeof(char) / 1 sizeof (类型标识符| 常量 |变量) , 返回字节长度。,下一张,上一张,算术运算中的类型转换方向强制类型转换:(类型标识符)表达式 i=5; j=2; (dou
8、ble)i/j (double)(i/j) double(i/j) / 2.5, 2.0, (int)(d*1000)/1000.0 / 将实数d保留3位小数 ,不四舍五入 k / (int)pow(10,n-1) % 10 / 求整数的右边第n位上的数字 / pow返回值为double型,k/10n-1%10,下一张,上一张,内容,C语言程序设计基础 数据类型、常用库函数 运算符、表达式 分支、循环结构程序设计 *数组,函数及其应用 编译预处理指针结构体、共用体 、枚举位运算文 件,结构化程序设计,顺序结构按语句的先后次序依次执行程序选择结构根据给定条件,从两条或多条路径选择要执行的操作路径
9、双分支(单分支,if嵌套) if (表达式) 语句1 else 语句2多分支 switch (表达式) case 常量表达式1: 语句序列1 default:语句序列n+1 循环结构在满足给定的条件下,反复执行某一组操作 while (表达式) do for (表达式1; 表达式2; 表达式3) 语句 语句 语句 while (表达式); 先判断,后执行 先执行,后判断 循环次数确定,先判断,后执行循环的嵌套 1!2! 10!、矩阵运算转向语句break立即结束循环,执行循环语句的后续语句。continue跳过循环体尚未执行的语句,结束本次循环。 goto,if语句的单分支形式: if (表达
10、式) 语句; if语句的双分支形式:if (表达式) 语句1; else 语句2; if语句嵌套,下一张,上一张,注意:= = 、=,else-if嵌套的一般形式:,if (表达式1) 语句1else if (表达式2) 语句2 else if (表达式3) 语句3 else if (表达式n-1) 语句n-1 else 语句n /*用于处理“非上述情况”、前面各个if都不满足的缺 省情况(若无时,可省略)、出错检查 */,下一张,上一张,【例】已知一分段函数 x+lnx 当1x2 y = x2+ex 当2x3 log10x 当3x=1else ,if (x=1 else ,if (x=1el
11、se ,printf(“y =%fn”, sqrt(x) +log(x)”);,y=sqrt(x)+double log(double x),#include #include void main() double x,y; printf(“Enter x=”); scanf(“%lf”,下一张,上一张,if (x=1,if (x=1 ,if (x=1 ,C语言规定:else总是与前面最接近的、不带else的if配对。if (a=b) if (b=c) printf(“a=b=c”);else /else与第2个if配对 printf (“a!=c”); if (a=b) if (b=c) p
12、rintf(“a=b=c”); /加上 “”else /else与第1个if配对 printf (“a!=c”);,上一张,#include void main() int i, j, k; scanf(“%d”, j=0, k=5 j=99, k=-1 j=9, k=-1 j=0, k=0,下一张,上一张,二级题,程序运行:5?99?12行改为:k=-1; j=i/10;99?7行改为:if( (i/10)0) 12行改为:k=-1;5?,switch语句,多路分支嵌套的if语句,程序的可读性较低。switch的一般形式: switch (表达式) /表达式值为整型或字符型 case 常量1
13、:语句组1 /语句组可为空或多条语句 case 常量2:语句组2 case 常量n:语句组n default:语句组n+1 /可省略 功能:表达式值为常量i 从语句组i执行至break语句 均不等 default:执行语句n+1,下一张,例】设考试成绩采用A(90-100分)、B(80-89分)、C(70-79分)、D(60-69分)、E(60分) 5级等级计分,编程判别某考试成绩等级是否满60分。,#include void main() char grade; printf(”Please input the grade:”); scanf(”%c”, ,下一张,上一张,下一张,上一张,w
14、hile 语句,一般形式:while(表达式) 语句 1; 语句 2; 表达式循环条件,语句循环体。while(表达式) 语句s;,下一张,【例】统计输入字符的个数,并统计其中有多少个字符a,用【Enter】结束字符输入。,#include void main() int n=0, i=0; char c; while ( (c =getchar() != n) i+; if (c = = a) n+; printf(“输入字符总数i=%d,字符a数n=%dn,i,n);,下一张,上一张,【例4.13】 输入一个整数,统计它有几位数。,#include void main()int m, n=
15、0; / n存放位数printf(“Input m: n); scanf(“%d”, ,下一张,上一张,【例】求sum=ai,其中,ai为从键盘输入的整数。,100,i=1,#include void main() int i, sum=0, a; for (i=1; i=100; i+) printf(Enter a%d= ,n); scanf(%d, ,下一张,上一张,int i=1, sum=0, a; while (i=100) printf(Enter a%d= ,n); scanf(%d, ,【例】用for 语句求sum=n。,100,n=1,#include void main(
16、) int n, sum=0; for (n=1; n=100; n+) sum=sum+n; printf(sum=%dn, sum); ,下一张,上一张,阅读下列程序说明和程序,在每小题提供的若干可选答案中,挑选一个正确答案。*【程序说明】求 1 + 2/3 + 3/5 + 4/7 + 5/9 + 的前20项之和。 运行示例:sum = 11.239837【程序】#include void main( ) int i, b = 1; double s; (1) ; for (i = 1; i = 20; i+) s = s + (2) ; (3) printf( (4) , s);,【供选
17、择的答案】(1) A、s = 0B、s = 1 C、s = -1D、s = 2(2) A、i/b B、double(i)/double(b) C、i/2*i-1 D、(double)i/(double)b(3) A、; B、b = 2 * i 1; C、b = 1.0 * b; D、b = b + 2; (4) A、sum = %dn B、s = %cn C、sum = %fn D、s = %sn“ADDC,#include void main() int i, m; printf(input m:); scanf(%d, ,下一张,上一张,【例】判断整数m(m2)是否为素数。素数是除了1和他
18、本身外,没有其他的因子的一个大于1的自然数。,int flag=1;for (i=2; i=m/2; i+) if (m%i= =0) flag=0;if (flag=1) printf(“Yes”);else printf(“No”);,【例5.13】输出100以内的所有素数。 在外层套一层循环,使数m(从2100)由该循环自动生成,并将判别出的素数直接输出。设置标志以标明某种状态的变化。,#include void main() int i, m, flag; for (m=2; m100; m+) flag=1; / 设置标志flag, 1表示素数 for (i=2; i=m/2; i+
19、) if( m%i= = 0) flag=0; / 修改标志flag, 0表示非素数 break; / m不是素数, 不需继续循环 if (flag= =1) printf(%d, m); /判断标志,素数则输出m ,下一张,上一张,【例5.13】输出100以内的所有素数。 在外层套一层循环,使数m(从2100)由该循环自动生成,并将判别出的素数直接输出。设置标志以标明某种状态的变化。,#include void main() int i, m, flag; for (m=2; m100; m+) flag=1; / 设置标志flag, 1表示素数 for (i=2; i=m/2; i+) i
20、f( m%i= = 0) flag=0; / 修改标志flag, 0表示非素数 break; / m不是素数, 不需继续循环 if (flag=0) continue; /判断标志,非素数, 跳过输出m, 进入下一次循环 printf(%d, m); ,下一张,上一张,【例6.5】判别和输出2100之间的素数,按每行8个素数输出。 #include #include int isprime(int n) int i; for (i=2; i= sqrt(n); i+) if (n%i=0) return 0; / 返回0,k非素数 return 1; / 返回1,k为素数; void main
21、() int k, count=0; for (k=2; k=100; k+) / k从2100,穷举i是否素数 if (isprime(k)=1) /调用函数prime(), 将实参k传递给形参n. 若返回1, k为素数 printf(%5d, k); count+; if (count%8=0) printf(n); /控制每行输出8个数据 ,下一张,上一张,2 3 5 7 11 13 17 1923 29 31 37 41 43 47 5359 61 67 71 73 79 83 8997,【例4.25 】 计算 1!+2!+3!+10!,#include void main() int
22、 i, n, s=0, y; for (n=1; n=10; n+) /外循环 y=1; for (i=1; i=n; i+)/内循环计算n! y*=i; s+=y; /将n!累加到s printf(“1!+2!+3!+10! =%d n”, s);,下一张,上一张,int i;long s=0, y=1;for (i=1; i= 10 B、power = 100 C、t != 0 D、number !=0(3) A、power = 0 B、digit != 0 C、number != 0 D、power = 1(4) A、number /= power; B、number %= 10; C、
23、number %= power; D、number /= 10;BADC,#include void main( ) int digit, number, power, t; printf(Enter an integer:); scanf(%d, ,阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。*【程序】#include void main( ) int k; for(k = 5; k 0; k-) if(k=3) continue; /* 第6行 */ printf(%d , k); ,(13) 程序的输出是 。 A、5 4 3 2 1 B、5 4 2 1 C、5
24、 4 D、3(14) 将第6行中的continue改为break后,程序的输出是 。 A、5 4 3 2 1 B、5 4 2 1 C、5 4 D、3 (15) 将第6行中的continue删除(保留分号)后,程序的输出是 A、5 4 3 2 1 B、5 4 2 1 C、5 4 D、3 (16) 将第6行全部删除后,程序的输出是 。 A、5 4 3 2 1 B、5 4 2 1 C、5 4 D、3BCAD,比较:for写程序较紧凑、清晰,能利用表达式给变量初始化并修改其值;while和do-while语句只能在循环之前进行初始化,在循环体中进行修改。 若循环的次数确定,使用for较合适;否则,采用
25、while或dowhile语句较为清晰。dowhile语句是“先执行、后判断”,至少执行一次循环体;而while、for是“先判断、后执行”,若条件一开始就不成立,循环体一次都不执行。,下一张,上一张,while( ),.,do,while( );,for(),do,while( );,do,while( ),while( );,(A) 正确的嵌套形式,(B) 不正确的嵌套形式,嵌套形式示意图,上一张,数组,一维数组排序、查找算法二维数组 字符数组和字符串,数组一批同类型相关数据的有序集合一维数组由一个下标确定元素的数组 定义形式:数据类型 数组名 常量表达式 int t10; int n=1
26、0,an; 通过对单个数组元素的引用来使用数组: 数组名下标初始化: int j, t10; for(j=0;j10;j+) tj = j; for(j=0;j10;j+) scanf(%d, ,下一张,上一张,#define M 4double aM;,字符数组定义、初始化: charc5=L,i,k,e,0; char a3; a0=N ; charc5=Like; charc5=Like; charc5; c=Like; char c20; scanf(“%s”,c); printf(“String is %s”,c); / 回车,Tab,空格 结束输入逐个字符的输入/输出:getcha
27、r、putchar, scanf、printf用格式符%c char c81; int i; for(i=0; (ci=getchar() != n; i+) ; / 输入字符串字符串输入/输出函数: gets(str); / 回车结束输入 puts(str);常用字符串函数: string.h strcat(c1,c2); / c1=c1c2 strcpy(c1,c2); / c1=c2 strcmp(c1,c2) / =返回0; 返回1 strlen(c1); / 注意110二维字符数组: char str39=”Hzhou”, ”Shai”, ”Bjing”; gets(str1); s
28、trcpy(str0,”Abc”); puts(str2);,下一张,上一张,#include void main() int i; int f40=1,1; for (i=2; i40; i+) fi=fi-1+fi-2; for (i=0; i40; i+) if (i%5=0) printf(n); /每行输出5个数据 printf(%8d, fi); 程序执行:,1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 .,下一张,上一张,【例6.2】利用数组求Fibonacci数列的前40项。fibonacci数列具有下面的性质: f1=1 (n=1) f
29、2=1 (n=2) fn=fn-1+fn-2 (n3)分析:利用数组元素fn-1 存储数列的第n项fn,int f40;for (i=0; i40; i+) if(i=0|i=1) fi=1; else fi=fi-1+fi-2;,排序冒泡法排序选择法排序【例】用冒泡法对8个数排序(从小到大)。分析:将相邻两个数进行比较,将大数调换到后面,经过一轮操作将最大数放在最后; 7次, j=0; jaj+1 ? 再对前n-1个数进行相同的比较交换操作,将次大数放在倒数第二的位置; 7次, i=0; ia1? a0a1a1a2? a1a2a2a3? a2a3a6a7? a6a7for(i=0; iai+
30、1) aiai+1; /第1趟for(i=0; iai+1) aiai+1;for(i=0; iai+1) aiai+1;for(i=0; iai+1) aiai+1; /第7趟,for(j=0; jai+1) aiai+1;,#include 冒泡法排序(升序)#define N 8void main() int i, j; double aN, t; printf(Input %d numbers:n“, N); for (i=0; iaj+1) /若相邻两元素不是小到大升序,则互换 t=aj; aj=aj+1; aj+1=t; printf(The sorted numbers are:n); for (i=0; iN; i+) printf(%5.2f, ai);,上一张,#include 冒泡法排序(升序)#define N 8void main() int i, j; double aN, t; printf(Input %d numbers:n“, N); for (i=0; iaj+1) t=aj; aj=aj+1; aj+1=t; printf(The sorted numbers are:n); for (i=0; iN; i+) printf(%5.2f, ai);,