
C讲解文档资料.ppt
51页一、基本概念数据结构数据结构 + + 算法算法 = = 程序程序1 1、算法:、算法:是对特定问题求解步骤的一种描述是对特定问题求解步骤的一种描述2 2、数据结构:数据的组织形式及其相互关系、数据结构:数据的组织形式及其相互关系1二、算法举例1 1、、求求1*2*3*4*51*2*3*4*5的值2 2、、判断一个数判断一个数n n是否为素数是否为素数n>2n>2))2四、算法的表示四、算法的表示1 1、、自然语言自然语言2 2、、流程图流程图3 3、、伪代码伪代码4 4、、计算机语言计算机语言3五、结构化程序设计方法五、结构化程序设计方法1 1、含义:规范程序设计风格和程序结构含义:规范程序设计风格和程序结构2 2、思路:将复杂的问题分阶段处理、思路:将复杂的问题分阶段处理3 3、方法:自顶向下、逐步细化、模块化、方法:自顶向下、逐步细化、模块化设计、结构化编码设计、结构化编码4S1:求:求1 2,得到结果,得到结果2.S2:将第:将第1步所得结果步所得结果2乘以乘以3,得到结果,得到结果6.S3:将:将6乘以乘以4,得,得24.S4: 将将24乘以乘以5,得,得120.求求1*2*3*4*51*2*3*4*5的值。
的值 (思路一思路一) )5设设p为被乘数,为被乘数,i为乘数为乘数S1:使:使p=1.S2:使:使i=2.S3:使:使p i,乘积赋给乘积赋给p.S4: 使使i的值加的值加1.S5: 若若i<=5,执行执行S3;否则程序结束;否则程序结束.求求1*2*3*4*51*2*3*4*5的值 (思路二思路二) )6S1:输入:输入n的值的值.S2:置变量:置变量i的值为的值为2.S3:求解:求解m=n%i ;若若m=0,转向转向S6,否则执行否则执行S4.S4: 变量变量i的值自加的值自加1.S5: 判断判断i
请计算共需要多少麦粒?为止请计算共需要多少麦粒?18,446,744,073,709,551,61588 8皇后互不攻击皇后互不攻击 在国际象棋棋盘上放在国际象棋棋盘上放8 8个皇后,要求个皇后,要求任何任何1 1个皇后都不会攻击其他皇后请问个皇后都不会攻击其他皇后请问有多少种放法?有多少种放法?9汉诺塔汉诺塔 在古代有一座塔,塔里有在古代有一座塔,塔里有3 3个座个座A A、、B B、、C C,,A A座上有座上有6464个大小不等的盘子,大盘在下,个大小不等的盘子,大盘在下,小盘在上要求把小盘在上要求把A A座上座上6464个盘子移到个盘子移到C C座,座,但每次只能移动但每次只能移动1 1个盘,且要始终保持大盘个盘,且要始终保持大盘在下,小盘在上,在移动过程中可以利用在下,小盘在上,在移动过程中可以利用B B座问如何移动?座问如何移动?10N-SN-S流程图流程图AB顺序结构顺序结构P成立成立不成立不成立AB选择结构选择结构当当P成立成立A循环结构循环结构11打印打印x x的绝对值(伪代码)的绝对值(伪代码)If x is positive thenIf x is positive thenPrint xPrint xElse Else Print -xPrint -x12打印打印x x的绝对值(的绝对值(C C源程序段)源程序段)if ( x > 0 )if ( x > 0 )printf( "|x|=%d ", x );printf( "|x|=%d ", x );else else printf( "|x|=%d ", -x );printf( "|x|=%d ", -x );13l:用:用 {…}括起来的一组语句括起来的一组语句–一般形式:一般形式: { [数据说明部分;数据说明部分;] 执行语句部分;执行语句部分; } –说明:说明:l“}”后不加分号后不加分号l语法上和单一语句相同语法上和单一语句相同l复合语句可嵌套复合语句可嵌套复合语句复合语句14算法的基本控制结构算法的基本控制结构问题的提出问题的提出: (1) -1 (x<0) y=0 (x=0)1 (x>0)(2)统计任意一个人群的平均身高统计任意一个人群的平均身高算法算法算法的基本控制结构:算法的基本控制结构:顺序结构顺序结构• 分支结构 分支结构• 循环结构 循环结构•程序流程图程序流程图15–结构化程序设计l基本思想:任何程序都可以用三种基本结构表示,限制使用无条件转移语句(goto)l结构化程序:由三种基本结构反复嵌套构成的程序叫~l优点:结构清晰,易读,提高程序设计质量和效率–三种基本结构l顺序结构ABAB流程图N-S图程序的三种基本结构程序的三种基本结构16PAB真假PBA真假A1A2AiAnk=k2k=k1k=knk=ki......l二分支选择结构二分支选择结构l多分支选择结构多分支选择结构选择结构17l当型循环结构l直到型循环结构PA假真当P为真AAP真假A直到P为真注:A,B,A1….An可以是一个简单语句,也可以是一个基本结构循环结构循环结构18赋值语句赋值语句l格式:赋值表达式;l赋值语句与赋值表达式的区别: 赋值表达式可以包含在其它表达式中,而赋值语句不可。
例:if ((a=b)>0) t=a;不可写为:if ((a=b;)>0) t=a;19这是这是C++中新加的非常简单易用的输入、输出方式,++中新加的非常简单易用的输入、输出方式,C++中没有专门的输入输出语句,是用中没有专门的输入输出语句,是用I/O流类来实现流类来实现在程序的开头增加一行:在程序的开头增加一行:#include
式 在程序的开头增加一行:在程序的开头增加一行:#include
普通字符等它的作用是将输出的数据转换成指定的格式输出普通字符按原样输出,如:按原样输出,如:#include "stdio.h"void main(){int a = 10, b = 20;printf("%d, %d", a, b);}输出结果为:输出结果为:10,2024(2)%d 格式符格式符用来输出用来输出10进制整数,可以有长度修饰如:进制整数,可以有长度修饰如:#include "stdio.h"void main(){int a = 28, b = 38;long c = 123456;printf("%5d, %5d\n%ld\n", a, b, c);printf("%3ld\n%7ld\n%d\n", c, c, c);}输出结果为:输出结果为: 28, 38123456123456 123456123456%5d表示输出宽度为表示输出宽度为5,,%ld表示输出为长整型表示输出为长整型如果整数的位数多于指定宽度,则按实际位数输出如果整数的位数多于指定宽度,则按实际位数输出25(3)%o和和%x格式符格式符用来输出用来输出8进制、进制、16进制整数。
进制整数8进制和进制和16进制都是无符号整数,输进制都是无符号整数,输出时不带符号如:出时不带符号如:#include "stdio.h"void main(){int a = 1200;printf("%d, %o, %x, %X, %6x\n", a, a, a, a, a);}输出结果为:输出结果为: 1200, 2260, 4b0, 4B0, 4b026(4)%u 格式符格式符用来输出无符号用来输出无符号10进制整数进制整数5)%c 格式符格式符用来输出一个字符如果一个整数,其值在用来输出一个字符如果一个整数,其值在0~255之间,也可以字之间,也可以字符方式输出它们都可以指定格式宽度例如:符方式输出它们都可以指定格式宽度例如:char ch = 'a';int a = 65;printf("%c, %d, %3c\n", ch, ch, ch);printf("%c, %d, %3d\n", a , a, a);输出结果为:输出结果为:a, 97, aA, 65, 6527(6)%s 格式符格式符用来输出字符串可以指定格式宽度,如果字符串长小于指定的宽度时,用来输出字符串。
可以指定格式宽度,如果字符串长小于指定的宽度时,可以选择左对齐或右对齐另外,还可以选择输出字符中的前可以选择左对齐或右对齐另外,还可以选择输出字符中的前n个字符例个字符例如:如:printf("%s", "Hello\n");printf("Hello\n");printf("%3s, %-5.3s, %5.2s\n", "Hello", "Hello", "Hello");输出结果为:输出结果为:HelloHelloHello, Hel , He如果输出的只有一个字符串,可以省略格式参数,因为格式参数本身可以如果输出的只有一个字符串,可以省略格式参数,因为格式参数本身可以是原样输出的普通字符串是原样输出的普通字符串5.3s”中的负号表示左对齐,如果没有负号,则默认为右对齐中的负号表示左对齐,如果没有负号,则默认为右对齐5表示表示格式宽度,格式宽度,3表示截取字符串中表示截取字符串中3个字符28(7)%f 格式符格式符用来以小数方式输出可指定格式宽度,也可以指定小数位数,还用来以小数方式输出可指定格式宽度,也可以指定小数位数,还可以规定左对齐或右对齐如:可以规定左对齐或右对齐。
如:float x = 123.456;double y = 321.654321;printf("%f, %-7.2f, %10.4f\n", x, x, x);printf("%lf, %-7.2lf, %10.4lf\n", y, y, y); 输出结果为:输出结果为:123.456001, 123.46 , 123.4560321.654321, 321.65 , 321.6543以以%f 格式输出时,默认的小数位数是格式输出时,默认的小数位数是6位7.2f表示左对齐,总表示左对齐,总长度为长度为7位,小数位数为位,小数位数为2位29(8)%e,%E,%g,%G 格式符格式符用来以指数方式输出浮点数默认的小数位数为用来以指数方式输出浮点数默认的小数位数为6,, 指数位数为指数位数为3(不包括不包括e+和和e-)::float x = 123.456;double y = 321.654321;printf("%e, %-7.2e, %10.4e\n", x, x, x);printf("%e, %-7.2e, %10.4e\n", y, y, y);输出结果为:输出结果为:1.234560e+002, 1.23e+002, 1.2346e+0023.216543e+002, 3.22e+002, 3.2165e+002%E 格式同格式同%e ,只是将输出的小写,只是将输出的小写 e 改为大写改为大写 E 。
g根据数值的大小,自动选取根据数值的大小,自动选取f格式或格式或e格式30(9)注意事项注意事项l除除X, E, G格式外,其他格式必须用小写字母,例如格式外,其他格式必须用小写字母,例如%d不能写成不能写成%Dl可以在可以在printf函数中的函数中的“格式控制格式控制”字符串内使用字符串内使用“转义字符转义字符”l“格式控制格式控制”字符串中,在字符串中,在%后的后的d、、o、、x、、u、、c、、s、、f、、e、、g做为格式符做为格式符,否则做为普通字符,如:否则做为普通字符,如:printf(“c=%c, f=%f, s=%s”, c, f, s);l如果想输出字符如果想输出字符%,则应该在,则应该在“格式控制格式控制”字符串中连续用两字符串中连续用两个个%表示表示,如:如:printf(“%f%%”, 1.0/3);31int i, j;scanf(“%3d%3d”, &i, &j);//输入输入123456scanf(“%2d_%*3d_%2d”, &i, &j); //输入输入12_345_67scanf(“%d,%d”, &i, &j);//输入输入3,432(3)注意事项注意事项lscanf函数中的函数中的“格式控制格式控制”后面应当是变量地址,而不是变量名。
后面应当是变量地址,而不是变量名l如果在如果在“格式控制格式控制”字符串中除了格式说明以外还有其他字符,则字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符在输入数据时在对应位置应输入与这些字符相同的字符l在使用在使用%c格式输入字符时,空格字符和格式输入字符时,空格字符和“转义字符转义字符”都作为有效都作为有效字符输入字符输入l在输入数据时,遇以下情况时该数据认为结束在输入数据时,遇以下情况时该数据认为结束–遇空格,或按遇空格,或按“回车回车”,或,或”Tab”键键–按指定的宽度结束,如按指定的宽度结束,如%3d,只取,只取3列列–遇非法输入遇非法输入33/*ch3_12.c*/#include
中较高的类型39if (表达式表达式) 语句语句例:例:if (x>y) cout<
来确定层次关系if if 语句语句 ——嵌套嵌套43int x=20;if(x>=0) if(x<50) cout<<“x is ok\n”; else cout<<“x is not ok\n”;If 语句的嵌套二义性语句的嵌套二义性 因为 因为 if 可以嵌套,所有在嵌套时有时会出可以嵌套,所有在嵌套时有时会出 歧义,例如上例中,歧义,例如上例中,else 是与第一个是与第一个 if 配对,配对,还是与第二个还是与第二个 if 配对?这种时候,系统就认配对?这种时候,系统就认为为 :else 与最近的一个与最近的一个 if 相对应相对应44 二义性 二义性: : (1) if(1) if(I%3==0)(I%3==0) ifif(I%7==0)(I%7==0) coutcout<<< <I<I< 输入两个整数,比较两个数的大小46#include
