承办单位教科办计算机中心

上传人:汽*** 文档编号:568575322 上传时间:2024-07-25 格式:PPT 页数:209 大小:1.90MB
返回 下载 相关 举报
承办单位教科办计算机中心_第1页
第1页 / 共209页
承办单位教科办计算机中心_第2页
第2页 / 共209页
承办单位教科办计算机中心_第3页
第3页 / 共209页
承办单位教科办计算机中心_第4页
第4页 / 共209页
承办单位教科办计算机中心_第5页
第5页 / 共209页
点击查看更多>>
资源描述

《承办单位教科办计算机中心》由会员分享,可在线阅读,更多相关《承办单位教科办计算机中心(209页珍藏版)》请在金锄头文库上搜索。

1、 C语言二级辅导 欢迎和感谢大家的踊跃参加!欢迎和感谢大家的踊跃参加!努力辅导努力辅导及格及格oror优秀!优秀!一起加油吧!时间安排时间安排 日期日期星期星期授课时间授课时间10.10星期一星期一17.3020.4510.17星期一星期一17.3020.4510.24星期一星期一17.3020.4510.31星期一星期一17.3020.4511.5周六周六13.3016.20答疑:每周答疑:每周五五 15.0017.00,机房,机房内容安排内容安排1.基本数据类型及其基本运算:基本数据类型及其基本运算:2. 输入和数出输入和数出3.选择结构:选择结构: *4.循环结构循环结构: 设计、阅读(

2、素数、最大公约数、级数)设计、阅读(素数、最大公约数、级数)*5.数组:设计、阅读、填充数组:设计、阅读、填充 、改错(排序、查找)、改错(排序、查找)*6.函数:设计、阅读、填充函数:设计、阅读、填充 、改错、改错*7.指针:阅读、简答题指针:阅读、简答题*8.结构体:单链表建立、插入、删除、输出。结构体:单链表建立、插入、删除、输出。 填充填充 *9.文件文件: 建立和使用建立和使用*讲课思路讲课思路通过例题,说明概念和应用通过例题,说明概念和应用重在重在基本知识基本知识,解析,解析二级考题二级考题编辑编辑编译编译有错?连接连接执行执行结果正确?结束源程序f.c目标程序f.obj库函数和其

3、它目标程序可执行目标程序f.exe开始正确不正确有无C 程程序序的的上上机机调调试试步步骤骤F9,ctrl+f9,alt+f5,f108 分分1.1 数据类型数据类型数据类型基本类型 *构造类型单精度型双精度型指针*枚举数组*结构体*共用体整型字符型实型(浮点型) 1.2 标识符、常量与变量标识符、常量与变量1.2.1 标识符标识符概念:概念: 用用来来对对常常量量、变变量量、及及用用户户自自定定义义函函数数的的名称进行标识的符号进行标识的符号.定义规则定义规则:以:以字母字母(az,AZ)或下划线下划线_开头其其后可跟字母、数字或下划线后可跟字母、数字或下划线_三种字符、长度不超三种字符、长

4、度不超过过32的字符串。的字符串。例如例如: A,X2,MAX,stu_list,_day1;3a 大、小写字母表示不同意义大、小写字母表示不同意义。不能与C关键字同名。关键字:被关键字:被C语言使用的字。如:语言使用的字。如:int while1.2.2 常量常量1.整型常量整型常量: 三种形式三种形式十进制整数十进制整数:以非0开头的数开头的数.如如:456,-789,0。八进制整数八进制整数: 以数字以数字0打头的数打头的数.如:如:06,0345,-027。十六进制整数十六进制整数:以数字:以数字0后跟x(或或X)打头的数。打头的数。 如:如:0x132,-0x15f,0X67例例1:

5、修改:修改2002 1.6设设 main()int x1,x2,x3,x4;x1=12&7;x2=69;x3=012|5;x4=0x12&3|5;Printf(“%d,%d,%o,%x”,x1,x2,x3,x4);4 (1100 &0111=0100)15 (00110 01001=1111)15 (001010 |000101=1111)7 (00010010 &011|101=111)4,15,17,7长整数长整数长整数:用以扩大整数的取值范围。:用以扩大整数的取值范围。表示方法:在整数后面加一个:在整数后面加一个L或或l。 例如:例如: 50l -十进制长整数十进制长整数 050L- 八

6、进制长整数八进制长整数 0x12l- 十六进制长整数十六进制长整数2.实型常量实型常量两种方式表示两种方式表示:十进制形式:如如:87.45 , - 87.0, 87. , 0.87, .87 , 0.0(必须有小数点必须有小数点)指数形式: 由由正正负负号号、整整数数部部分分、小小数数点点、小小数数部部分分和和字字母母E(e)后后带带或或不不带带正正负负号号的的整整数数组组成成。E之之前前必必须须有有数数字字.(表表示示太太大大或或太太小的数小的数)如如10-50.00001 1e-5 (精度控制)(精度控制)3.字符常量字符常量如如: a,F,8;字字符符常常量量具具有有数数值值,其其值值

7、就就是是该该字字符符的的ASCII代码值代码值. a:97,A:65, 32数字字符和数字的数字字符和数字的关系关系: 848+8 =0+8转义字符转义字符:p131.Print(“%s”,”wang isnot a studentn”);2.Print(“%s”,”x41 is”A”n”);3.Print(“%s”,”abcnefg0xyzn”);1.Wang isnot a student2.A is A3.abc efg (%S:遇遇0输出结束输出结束)4.字符串常量字符串常量字字符符串串常常量量在在内内存存中中存存储储时时自自动动在在尾尾部部追追加加一一个个0字符字符,以便系统据此以便

8、系统据此判断字符串是否结束.如:“abc” 9798 99 0字符串长度测试字符串长度测试: sizeof(“abc”); strlen(“abc”);长度为n的字符串常量,在内存占n+1个字节43(不包含不包含0)测试存储空间测试存储空间长度函数长度函数sizeof(int);5.符号常量符号常量#define R 5.1789 #define X 10 #define Y 20 #define Z X*Y宏定义有参和无参举例:#define F “r=%fn area=%.2fn”#define PI 3.14159 #define S(R) PI*R*R #define N printf

9、(“n”) Main() float a,area; a=3.6;b=1.4; area=S(a); N; printf(F,area);运行结果r=3.600000area=40.715038S(a+b);3.14*a*a()PI*(R)*(R)无参宏定义宏展开3.14159*a+b*a+b ( )有参宏定义1.2.3 变量变量C中的变量有中的变量有普通变量普通变量和和指针变量指针变量.普通变量普通变量: 用来存放普通的数据变量用来存放普通的数据变量, 包括整型、实型和字符型包括整型、实型和字符型.指针变量指针变量: 用来存放地址的变量用来存放地址的变量 。都必须都必须“先定义,后使用”.掌

10、掌握握数数据据类类型型的的标标识识符符、长长度度、范范围围和和存存放放格格式式。见见P12表表2.3,表,表2.4内存中以内存中以补码形式补码形式存放。存放。类型及其特性类型及其特性类型标识符类型标识符长长度度数据范围数据范围存放格式存放格式符号位符号位数据位数据位int2-3276832767(215-1)115short2-3276832767115long4-21474836487131unsigned int2065535016unsigned short2065535016unsigned long404294967295032float(7位位)43.4e-38 3.4e+381+

11、231+7double(15位位有效数字)有效数字)81.7e-308 1.7e+3081+481+14例例2001_1.4Main()int a= -1;printf(“%d,%u,%x,%on”,a,a,a,a);运行结果:-1, 65535, ffff, 177777-1原码:10000-1补码:原码取反111111111 11111111改为:a=-2输出如何?运行结果2:-2, 65534, fffe, 177776例如例如Main() float x,y;x=111111.111;y=222222.222;printf(“%fn”,x+y);运行结果运行结果:333333.3281

12、25可见x,y只有前7位位为有效数字为有效数字,后两位小数不起作用.若改为:若改为:double x,y运行结果运行结果:333333.3330003.字符字符变量变量一个字符变量只能存放一个字符一个字符变量只能存放一个字符标识符标识符: char ,占占1个字节,内存中存放的是该字符二进制形式的内存中存放的是该字符二进制形式的ASCII代码值代码值.Char型和型和int 型数据可以互换型数据可以互换.例:例:Main() int c1;char c2;c1=a; c2=98; printf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); 运行结果:a b9

13、7 984 .指针变量指针变量存放变量的地址。例:存放变量的地址。例: 2003 二级二级 1.4执行下列程序后执行下列程序后,b和和c的值各为多少的值各为多少?main( ) int b,c,*a; a=&b ; *a=5 ; c=(*a)+; printf(“ %d %dn”, b,c);6 5bc a 100010005a561.3 运算符和表达式运算符和表达式根据运算符在表达式中的作用根据运算符在表达式中的作用分类分类: 算术运算算术运算符:符: +、-、*、/、%、+、- - 赋值运算符:赋值运算符:= += /= 位运算符:位运算符: & | 关系运算关系运算符:符: = = 0)

14、个)个学生,最后一个班若不足学生,最后一个班若不足k人也单独编成一个班。人也单独编成一个班。写出条件表达式表示编班个数。写出条件表达式表示编班个数。例例1:n%k= =0 ? n/k : n/k+1例例3:0,100) x=0&xx=0 例例4:写一个布尔表达式写一个布尔表达式, ,当整数当整数n n的值大于零、且的值大于零、且个位数为个位数为2 2或或7 7时时, ,该布尔表达式的值为真该布尔表达式的值为真. .n0 &( n%10= =2 or n%10= =7)3.逻辑运算:在逻辑表达式的求解中逻辑运算:在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符

15、才能求出表达式的只是在必须执行下一个逻辑运算符才能求出表达式的解时解时,才执行该运算符才执行该运算符.1.a&b&c 只有只有a为真时为真时,才需要判别才需要判别b的值的值,只有只有a和和b都为真时都为真时,才需要判别才需要判别c的值的值.只要只要a为假为假,就不必判别就不必判别b和和c的值的值.若若a为真为真, b为假为假,不判别不判别c.2. A|b|c 只要只要a为真为真,就不必判断就不必判断b和和c;只有只有a为假为假,才才需要判别需要判别b, a和和b都为假才判别都为假才判别c.如如:a=1,b=2,c=3,d=4,m和和n的原值是的原值是1,执行执行: (m=ab)&(n=cd)

16、后后m=? n=?01例例2001_1.3求运行结果求运行结果Main() Int a=0,b=0,c=0,x;x=(a=50)&(b=0)&(c=100);printf(“%d,%d,%d,%dn”,x,a,b,c); 运行结果:0,50,0,04.关系运算关系运算 例例2003 1.1Int a=5,b=4,c=3,r1,r2;执行执行 r1=abc; r2=ab&bc;r1=?r2=?01自左至右自左至右右结合性右结合性5.条件运算练习题条件运算练习题设设int a=1,b=3,c=4,d=8; 表表达达式式(ab? c b ? a : c d ? c : d 等同于:a b ? a :

17、 ( c d ? c : d )例2:main( ) /* 求程序执行结果 94年等级考 */ l3_2.c int a =1 , b =2 , c = 3 ; a+ ? b+ : c+ ; /没算 c + printf ( “ n a = %d , b = %d , c = %d ” , a , b , c ) ; / CRT : a = 2 , b = 3 , c = 3 例3:main ( ) / * 执行结果?95 年等级考 */ l3_3.c int i = 6 , j = 6 , k = 3 ; k += i j ? i+ : - j ; /没算i + k+= 5 ; printf

18、 ( “ i=%d , j = %d , k = %d ” , i , j , k ); / CRT : i = 6 , j = 5 , k = 8例4 main() int a=1,b=2,c=3; a+=b+=c; printf(“%dn”,ab?a+:b+); a=3;b=c=4; printf(“%dn”,c=b&b=a); 591例例5:设有变量定义设有变量定义 int a=5,b=4,c=3,d=2;试写出计算表达式试写出计算表达式(-a=b+)?c-:+d后后,a,b,c,d的值的值.a=4,b=5,c=2,d=2; 99年1.16.逗号运算符和逗号表达式逗号运算符和逗号表达式

19、例如:int test ( ) int x = 0 ; static int y = 2 ; y + = +x ; return x+y ; main( ) printf( “%dn” , ( test( ) , test ( ) ) ) ; 逗号表达式: 表达式1 , 表达式2,表达式n求解过程: 先求表达式1,再求表达式2.最后求表达式n.逗号表达式的值逗号表达式的值: 表达式n的值.例如:int j=5; a=(a=j+1,a+2,a+3);5结果: a=9若去掉括号 a=67 位运算符和位表达式位运算符和位表达式 & | 位运算符的优先级位运算符的优先级 & |高低例例1:2002 1

20、.6计算计算设设 int xx=12&7=?x=69=?x=012|5=?x=7&3|5=?4 (1100 &0111=0100)15 (00110 01001=1111)15 (001010 |000101=1111)7 (111 &011|101=111)例2:写出 printf(“n%dt%d”,(52),(5&2); 的输出结果 解: 00000101 00000101 & 00000111 00000000 结果 7 02001年等级考年等级考输输入入两两个个整整数数,存存入入a a、b b变变量量中中,并并由由a a、b b两两个个数数生生成成新新的的数数c,c,其其生成规则是是:

21、将将a a的的低低字字节节作作为为c c的的高高字字节节,将将b b的的低低字字节节作作为为c c的低字节,并显示出来。的低字节,并显示出来。将整数b的低字节取出,高字节置零. b&0x00ff将整数a的低字节取出移至高字节,低字节再置零. (b&0x00ff)8两者的结果进行合并. b&0x00ff | (a&0377)8#include main( ) int a,b,c; printf(“Input a,b:”); scanf(“%d%d”,&a,&b);c=(a&0x00ff)8| |(b&0x00ff); printf(“c=%d”,c); 例3&运算可取一个数中某些指定位2.1 输

22、出函数 printf( )1.格式: printf ( “输出格式” , 输出表列);如: printf ( “ a = %d , b = %f n ” , a , 3.14*a*a ) ;(a)输出格式:由格式说明、按原样输出的字符和转义字符组成。 %d 以十进整数的实际长度输出。 %x 以16进制无符号形式输出整数。 %o 以八进制无符号形式输出整数。 %u 以十进制无符号形式输出整数。 %c 输出单一字符。 %s 输出一个字符串。 %f 以小数形式输出实数。整数部分全部输出,小数 部分输出 6位小数。 %e 以指数形式输出实数。指数部分5位(如e+002), 尾数的小数点前只能有1位非0

23、数字,小数为6位。 %g 选用%f和%e中输出宽度较短的一种格式,不输 出无意义的0。p282.Printf() 的输出格式选择项格式选择项例:%5d , %-7c , %8.2f , %ld 放在%和格式字符之间,表示附加要求。 、:号时,结果右对齐,号时,结果左对齐。 0 : 输出数值时,有0时,不用位置填0。例:%05d m . n : m是实数或字符串的总长度,n是小数部分或实际 字符的长度。例:%-5.3s , %8.3f 注 如实际位数超过m,则按实际长度输出。 l : 用于输出长整型或无符号长整型。 l : 长双精度型。(e,f,g) h: 用于输出短整型或无符号短整型。 #:

24、用于o和x格式输出0或0x;3.Printf()使用注意几点使用注意几点1、变量定义为long,输出时必须%ld,否则仅将后16位输出。2、如要输出%,则在格式字符串中应输入%。3、printf(“%d”,3.5) 输出不是3而是0! 取低2个字节输出。 Print(“%f”,3.5) 输出3.500000 例1:main()printf ( “ %5s,%6s,%5.2sn”,“abc” , “def” , “abcde” ) ; 结果 : abc , def , ab4、printf ( )处理表项时遵循处理表项时遵循 “自右向左” 的原则。不是的原则。不是“自左向右自左向右”例2: ma

25、in ( ) int a =4 ; printf ( “ %d , %d ” , a = a + 5 , a ) ; /显示显示9, 4不是不是9, 9 printf ( “ a = %d ” , a ) ; /显示显示 a = 9 printf ( “ %d , %d ” , a , a = a + 5 ) ; /显示显示14 ,14不是不是9,14 printf ( “ a = %d ” , a ) ; / 显示显示 14 2.2 输入函数输入函数scanf()()使用形式使用形式: scanf(“输入格式输入格式”,地址表列表列);输输入入格格式式:由格式说明和按原样输入的字符二部分组成

26、。从键盘输入 的数据 按照格式说明转换为指定的格式存放到内存中。(%d %x %o %f %c %s )地址表列: 变量的地址或字符串首地址组成变量的地址或字符串首地址组成.例1: Scanf(“%d%d”,&a,&b);Scanf(“%d,%d”,&a,&b);Scanf(“a=%d,b=%d”,&a,&b);输入:12 234 12,234 a=12,b=234 p312.Scanf()使用注意点:1 、输入格式字符串中的、输入格式字符串中的非格式字符非格式字符,输入时必须,输入时必须原样输入原样输入2、在用、在用%c 格式输入字符时,空格、转义字符都作为有效字格式输入字符时,空格、转义字

27、符都作为有效字符输入符输入3、实数实数输入时不能规定输入时不能规定精度精度。4、格式字符格式字符不能有不能有n。5、变量前变量前勿忘勿忘&。6 、 * :指定输入项在读入后:指定输入项在读入后不赋给不赋给相应的相应的变量变量。( 跳过跳过)例例1: scanf ( “%c%c%c” , &a ,&b, &c ) ; xyz 结果结果 x 赋给赋给a , 空格空格 赋给赋给b , y 赋给赋给c。例例2:scanf ( “ %7.2f ” , &a ) ; 是不允许的是不允许的。例例3:scanf ( “ %2d%4d%2d ” , &a, &b, &c ) ; 19900125 则则 a =

28、19 ; b = 9001 ; c = 25例例4:scanf ( “ %2d %*3d %2d ” , &x ,&y ) ; 1234567 则则 x =12 ; y = 67例例 2003 二级二级1.5main( ) int a; float f; char *c; scanf(“%4d%f%s”,&a,&f, c);printf(“a=%d, f=%.0f,c=%sn”,a,f,c); 键入200015.0 p4 is GOOD!执行后的输出结果。a=2000,b=15,c=p4 在输入数据时,遇以下情况时该数据认为结束结束:遇空格,或回车或跳格键;遇宽度结束;遇非法输入;3.选择结构

29、选择结构关系运算、逻辑运算、条件运算:关系运算、逻辑运算、条件运算:P38表表4.1 表表4.2 表表4.3注意事项:注意事项:p40If的三种形式:的三种形式:格式、执行过程格式、执行过程Switch语句:格式、执行过程语句:格式、执行过程p46X 当(x0); if(x0) y=x 例例1: 用用if和和switch语句实现下面运算:语句实现下面运算:Y=X 当(x0) if(x0) y=x;x*x 当0x else y=x*x x*x 当当0 x1 if(x=4) x*x-5 当当1 x2 else if(x1) y=x*x x*x-2*x-1 当当2 x3 else if(x2) x*

30、x+6*x-18 当当3 x4 else if(xc&c+ba&b+ca三角形类型类型:等边:a=b&b=c等腰: a=b| b=c|a=c直角:a*a+b*b=c*c|a*a+c*c=b*b|b*b+c*c=a*a面积公式公式:s=(a+b+c)/2 area=sqrt(s*(s-s)*(s-b)*(s-c)程序结构:If() 计算面积计算面积 if() else if() else else例4.9p48Main()int I,j,a,b,c ;scanf(“%d,%d,%d”,&a,&b,&c); ;if( ) j=0;if(a*a+b*b=c*c|a*a+c*c=b*b|c*c +b*

31、b= a*a) j=1;switch( )case 0: printf(“不能构成三角形不能构成三角形!n”) ; ; case 1: printf(“能构成直角能构成直角!n”) ; case 2: printf(“三角形三角形!n”);例2.这是一个检验输入的三条边值能否构成三角形的程序.(完善程序)!(a+bc&b+ca&a+cb)jbreakJ=2循环结构循环结构C语言有三种循环结构:语言有三种循环结构: (1) while结构结构 (2) do while 结构结构 (3) for 结构结构goto和和if语句构成循环语句构成循环.(不提倡应用不提倡应用)执行过程:执行过程:多重循环

32、多重循环阅读程序阅读程序main() int a33,i,j; for ( i=0; i3; i+) for ( j=0; j3; j+) aij= i= = j ? 0: i+j ; for ( i=0; i3; i+) for ( j=0; j3; j+) printf ( “%4d”,a i j ) ; printf ( “n” ) ; 0 1 21 0 32 3 0阅读程序阅读程序(99-2-2)void p(int k)int i,m;for(m=2;m=k;m+) for(i=2; i=m ; i+) if(!(m%i) break;if(i=m) printf(%4d,m);pr

33、intf(n); main() p(15);2 3 5 7 11 13求求15的素数的素数判断素数判断素数的方法的方法阅读程序阅读程序(99-2-1)void s(int a,int n) int i,j,t;for(i=0;i=0& taj ;j-) aj+1=aj; aj+1=t; main() int i,b6=24,12,14,32,22,34; S(b,6); for ( i=0; i6; i+) printf(“%4d”,bj); printf(“n”);12 14 22 24 32 34右移右移比较趟数比较趟数寻找寻找t的排序位置的排序位置找到位置并置数找到位置并置数t2004.

34、1.3main( ) char s=“2473”,c,i; for(i=0 ; c=si ; i+) switch( (c-0 ) case 2: case 3:putchar(c+4); continu; case 4: putchar(c+4); break; case 5: putchar(c+3); default: putchar(c+2); putchar(n); 6897对对switch对对for本次循环结束2003.1.6main( ) int c1=0,c2=0,c3=0,c4=0; char *p=“12395632123378”; while(*p) switch( *p

35、 ) case 1: c1+; break; case 2: c2+; case 3: c3+; break; default: c4+; p+; printf(“c1=%d c2=%d c3=%d c4=%dn ”, c1,c2,c3,c4) ; c1=2,c2=3,c3=7,c4=5例1 用下列公式求用下列公式求的近似值,直到最后的近似值,直到最后一项的绝对值小于一项的绝对值小于10-4为止。为止。sum=sum+psum=sum+p; p=p=1.0/i*s;/i*s;i=i+2i=i+2; /*/*加加2 2得到下一个奇数得到下一个奇数* */ /s=-s; s=-s; /*相邻项符号

36、取反相邻项符号取反*/.循环体控制结束控制结束:fabs(1.0/i)=1e-41e-4);); printf(“pi=%fn”, printf(“pi=%fn”,sum*4););运行结果:运行结果:pi=3.141397a=bb=cc=a%b例例2:求求两两整整数数的的最最大大公公约约数数和最小公倍数。和最小公倍数。1. 求最大公约数算法:求最大公约数算法: 若有两整数若有两整数a,b, 且且ab时:时:a除以b取余取余得c, 若c=0,则b为两数的最大公约数。 若c0,则a=b,b=c,回去执行。2.求最小公倍数算法: 最小公倍数=两数乘积除以最大公约数。例:15 , 1215%12=3

37、12%3=0最大公约数:3例如:M=15,n=615%6=3,6%3=0(15*6)/3=30main( ) int m,n,a,b,t,c;printf(“Input two integer numbers: n); scanf(“%d%d”,&a,&b); m=a; n=b; if(ab) t=a; a=b; b=t; c=a%b; while(c!=0) a=b; b=c; c=a%b; printf (“ The largest common divisor: %dn”, b); printf (“The least common multiple: %dn”, m*n/b); a大b

38、小程序例例3: 打印出以下图案打印出以下图案: * * * * * * * * * * * * * * * * * * * * * * * * *算法分析:(前4行)行号 *的个数 *的起始位置1 1 3 2 3 2 3 5 14 7 0i 2i-1 4-i 1.确定起始位置(打几个空格):2.打印*的个数:For(j=1; j=4-i; j+)printf(“ ”);For(k=1;k=2i-1;k+) printf(“*”); printf(“n”); main( ) int i,j,k ; for(i=1;i=4;i+) for(j=1;j=4-i ; j+) printf(“ ”);

39、for(k=1;k=2*i-1 ;k+) printf(“* ”); printf(“n ”); 程序程序for(i=1;i=3;i+) for(j=1;j=i ; j+) printf(“ ”);for(k=1;k=7-2*i ;k+) printf(“* ”); printf(“n ”); 前4行程序后3行程序程序设计程序设计1.使用控制语句使用控制语句,计算下列公式的近似值计算下列公式的近似值(do while) s=1-x2/2*1!+x4/4*3!-x6/6*5!+(某项值某项值=1;i+) for(n=1;n=4-i ; n+) printf(“ ”); for(n=1;n=2*i

40、-1 ; n+) printf(“%c”,a); printf(“n ”); a+; 程序程序2main( ) char a; int n ; for(a=A;a=D;a+) printf(“n ”); for(n=1;n=a-A; n+) printf(“ ”);for(n=1;n=2*(D-a)+1 ; n+) printf(“%c”,a); 控制行控制空格控制打印符号2003.4.1求求m的素因子的素因子Main()int m,i,n;for(m=4;m=10000;m+)n=m;For(i=2;i=m;i+)while(n%i=0) printf(“%d”,i);n=n/i; whil

41、e(n%i=0&prime(i)Prime(int x)int i;for(i=2;x%i!=0;i+) ; return x= =i ? 1:0;2003.4.2打印打印 A B C D EMain() int i,j,t;Char a5=“ABCDE”;FOR(i=0;i5;i+) For(j=i; j4) printf(“%c”,aj-5); else printf(“%c”,aj); printf(“n”; B C D E A C D E A B D E A B C E A B C D1.数组说明数组说明:p69数组中第一个元素的下标从数组中第一个元素的下标从0开始开始.a0数组名表示

42、第一个元素的表示第一个元素的地址.即即&a0和和a的值相的值相同同.数组名数组名是地址常量,不能向它赋值和不能向它赋值和&运算运算.数组中各元素占一段连续的内存单元数组中各元素占一段连续的内存单元,数组名为首地址.引用数组元素时避免超界引用数组元素时避免超界.常量表达式只能是只能是常量和包含和包含符号常量或sizeof表达式,不能包含变量不能包含变量.可以可以 int a1020 , b30 同时定义多个数同时定义多个数组组例 : #define MAXNUMB 100 char textMAXNUMB *3; float arraysizeof(double); 例: Int n; scan

43、f(“%d”,&n); int bn !2.一维数组元素的引用一维数组元素的引用数组元素的引用方法有两种数组元素的引用方法有两种: 下标法和指针法.指针法1.指向数组元素的指针的定义与赋值. int *p, a20; p=&a0 ; (或或p=a) p指向数组第一个元素指向数组第一个元素 定义的同时赋初值定义的同时赋初值: int a20; int *P=&a0; (或或*p=a ;)2.通过指针引用数组元素C规定规定: a+i和和p+i 数组元素数组元素ai的的地址 *(a+i)和和*( p+i ) 表示所指向的元素表示所指向的元素 ai数组元素数组元素ai的的实际地址: a+i*d (d是

44、一个数组元素所占的字节数是一个数组元素所占的字节数) (d: 2 4 1 )例如:整型数组a的首地址为1000,a3地址为:1000+3*2=1006 即a+3和p+3都指向a3p+i ,a+ip+7,a+7(1014)a0a1a2a7 P+0,a+0 (1000)p+1,a+1 (1002)ai通通过过指指针针引引用用数数组组元元素素例例1用指针法进行数据处理用指针法进行数据处理Main()int a10,i,*p;for(i=0;i=9;i+)scanf(“%d”,&ai);printf(“n”);for(p=a;p=a+9;p+)printf(“%d”,*p) ;printf(“n”);

45、for(i=0;i=9;i+)printf(“%d”,*(a+i);运行结果:1 2 3 4 5 6 7 8 9 10 1234567891012345678910例例2 用指向字符数组的用指向字符数组的 指针进行字符处理指针进行字符处理.阅阅 读读 程程 序序Main()char a20,*p; int i;for(p=a;p=a+14;p+)scanf(“%c”,p); printf(“n”); p=a;for(i=0;i=14;i+)printf(“%c”,*(p+i) );运行结果:I am a student. I am a student.可见:对于字符串字符串的字符处理可通过字符

46、数组字符数组来实现.也可通过指向字符串的指针实现.例例3用指向字符串的指针用指向字符串的指针进行字符处理进行字符处理Main()char *p=“ I am a student.”for( ; *p!=0 ; p+)printf(“%c”,*p);运行结果:I am a student.直接把字符指针指向字符串的首地址3 数组的初始化数组的初始化定义数组的同时对数组中元素赋值定义数组的同时对数组中元素赋值.例如例如:一维数组一维数组 int a10=2,4,6,8,10,12,14,16,18,20;char ch5=c,h,i,n,a;(单个字符单个字符) char ch6=“china”;

47、 (字符串常量字符串常量) char ch6=“china” (省略花括号省略花括号) char ch6=c,h,i,n,a,0;(数组长度数组长度6) char ch = c,h,i,n,a,0; (不指定数组长度不指定数组长度) 二维数组的初始化二维数组的初始化例例1: int a23=5,8,1,6,0,2 ; char b23=w,o,r,k,e,r;例例2: int a23= 5,8,1,6,0,2;char b24=“wor”, “ker”; (由于由于0,下标不能用下标不能用3) char b24=w,o,r,0,k,e,r,0;例例3: int a 3=5,8,1,6,0,2

48、; char b 3=w,o,r,k,e,r; char b 4=“wor”, “ker”;等价用起泡法和选择法.4 8 6 15 10 7 3 20 16 12 3 4 6 7 8 10 12 15 16 20 1.选择法排序:选择法排序:(n=10个数个数)将将n个个数数中中最最小小的的数数找出出来来,同同第第一一个个数数对调,再再将将后后n-1个个数数中中最最小小的的数数同同第二个数对调第二个数对调.对对n(10)个数作个数作 n-1(9)轮轮比比较较,每每轮轮都都找找出出一一个个未未经经排排序序的的数数中中最最小小的数。的数。基基 本本 思思 想想算法分析:i=1(比较9次找最小) m

49、in=i;for( j= 2 ; j=10; j+) if(a(j )a(min ) min=j; t=a(i); a(i)=a(min); a(min)=t; i=2(比较8次找最小)For ( i=1; i=9; i+)比较找最小对调3;i+1;main( ) int i,j,k,t,*p; int a11=0,16,-5,9,3,1,27,81,-76,100,78; for(i=1,i= 9; i+) k=i; for(j=i+1;jaj) k=j; t=ai; ai=ak ; ak=t; for(i=1;iaj+1) 对调2.起泡法排序起泡法排序(由小到大由小到大)p74 6.5:程

50、序程序 结构结构:if main( ) int i,j,t ; int a11=0,16,-8,9,3,1,27,84,-76,100,54; for(i=1;ia(j+1) t=a(j); a(j)=a(j+1); a(j+1)=t;起泡法程序控制趟数控制次数if(*(p+j)*(p+j+1) t=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=t; for(i=1;i=9 ; i+) for(j=1;j = 10-i;j+)比较对调输出下标法for(p=a+1;p=a+10;p+) printf(“%5d”, *p); 指针法P=a ;,*p ;例例2把一个整数插入到由

51、小到大排序的数列中把一个整数插入到由小到大排序的数列中,插插入后仍然有序入后仍然有序.1.解题思路:2 4 7 9 13 16 23 28 46 87a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11X=112 4 7 9 11 13 16 23 28 4687a5-a10后移一个位置1).确定插入位置p: (xai) i+; p=i ; for(i=10;i=p;i-) ai+1=ai;ap=x; for(i=1;iend) a11=x; else#define N 10 main() int aN+2,p,x,i,end; for(i=1;i=N;t+) scanf(“%

52、d”,&ai) ; scanf(“%d”,&x);程程序序#define N 10 main() int a12,p,x,*t; for(t=a+1;t*(t+p)&p=a+p;t-) *(t+1)=*t; t=a+p; *t=x; for(t=a+1;ta(m) 换l=m+1 否则 h=m-1判断 X= =am?条件:l=h二分法流程图出口处理main ( ) int l , h , m , i , x , *p , a 11 ;for ( i = 1 ; i =10 ; i + ) printf ( “n a %d = ” , i ) ; scanf ( “%d” , &a i ) ; p

53、rintf (“n Input x : ”) ; scanf ( “%d” , &x ) ; l =1 ; h = 10 ; p = a ; while ( l *( p + m ) ) l = m + 1 ; else h = m - 1 ; if ( l = h )printf (“n %d is the position %d”,x,m ) ; else printf ( “n There is no %d ” , x ) ; 为数组赋值输入要查找的数二分法查找过程程序出口处理main ( ) int l , h , m , x ;int a 10 =2,5,7,8,11,13,24,2

54、6,45,50 ;scanf ( “%d” , x ) ; l =1 ; h = 10 ; while ( l a m ) h = m + 1 ; else l = m - 1 ; if ( l = h )printf (“n %d is the position %d”,x,m ) ; else printf ( “n There is no %d ” , x ) ; 练习题练习题1:程序为用二分法查找某程序为用二分法查找某个数个数.请改错请改错(3个个)02二级练习题二级练习题1. int a4=1,3,5,7; a3=-a0?+a1 : a2-;数组数组a各成员的各成员的值。值。2.#i

55、nclude string.hmain()char a20=”p4cpu;char b=dvd+17crt+56kmodem;b10=0;strcat(a,b+3);puts(a); 0,3,4,5p4cpu 17crt3.int a5=2,3,4,5,6; int *p=a+2求*(p+)*a3的值20#include #define M 3 #define N 4 main() int aMN,max, i,j ; int row,column;for(i=0;iM;i+)for(j=0,jN ; j+) scanf(“%d”,aij); max=0; for(i=0;iM;i+) for

56、(j=0,jN ; j+) if(maxaij) max=aij ;row=i;column=j;printf(“nmax=%d,row=%d,column=%dn”, max,row,column); 4.改错.求34矩阵中的最大元素及其所在行和列的位置.数组元素可能有等于零,大于零或小于零的值.&aijmax=a00int row=0,column=0例例5 p70#include “stdio.h” main() int c,i, nwhite=0, nother=0 , ndigit10;for(i=0; i=0)&c=9) +ndigitc-0;else if(c= |c=t) +n

57、white ;else +nother ;printf(“nndigits frequency”); for(i=0; i10; i+) printf(“n %d ” ,i,ndigiti;);printf(“n white: %d other: %d” ,nwhite,nother);编写程序,对输入的字符流统计每个数字字符数字字符、空空白白(含t)和其他字符其他字符出现的次数,假设字符流以回车符(n)告结束.10个数字使用10个计数器输入数据给数组a34P=0for(j=1;j=3;j+)For(i=0; iaipT FP=j ai0 aip输出数据 11 8 7 9 6 4 2 1 25

58、 3 19 10main( ) int i,j,p,t;int a34= 9,8,7,11, 4,6,2,1,25,3,19,10; for(i=0;i=2;i+) p=0; for(j=1;jaip) p=j; t=ai0; ai0=aip; aip=t; for(i=0;i=2;i+) for(j=0;js2,输出一个正数输出一个正数; s1=s2,输出输出0; s1s2,输出一个负数输出一个负数.算法输入字符串s1,s2while(s1i= =s2i)&(s1i!=0)i+s1i=0 &s1i=0输出s1i-s2i输出0例:“abc”和“abc”“abc”和“ab”“ab”和”abc”T

59、F#include main()int i,resu; char s1100,s2100;printf(“输入字符串输入字符串1:n”); gets(s1);printf(“n输入字符串输入字符串2:n”); gets(s2); i=0;while (s1i= =s2i)&(s1i!=0) i+;if(s1i= =0& s2i= =0) _else resu=_; printf(“%s与与%s比较结果是比较结果是%”,s1,s2,resu);resu=0;s1i-s2i;程序例例9 2002_3.1 改错。改错。16进制数可以由数字可以由数字0到到9和和大写字母大写字母A至至F组成的字符串表示

60、,以下函数的功能是组成的字符串表示,以下函数的功能是将用字符串表示的将用字符串表示的16进制数转化成进制数转化成十进制数,如,如:将将2A转化成转化成42,若字符串中出现其它符号则返回若字符串中出现其它符号则返回-1.int hexvalue(char *str) int data,i,n; for( i=0; stri!=0; i+) if(stri=0 ) n=stri0; else if (stri=A & stri=F) n=stri-A+10; else return 1; data=data*10 + n; return data; 按权展开求和权展开求和原则AF5=10*162+

61、15*161+5*160data=0if(stri=0 )data*105 常用的字符串处理函数常用的字符串处理函数 p83C没提供对字符串进行整体操作的运算符。如整没提供对字符串进行整体操作的运算符。如整体赋值、合并和比较等。体赋值、合并和比较等。提供了字符串处理函数。提供了字符串处理函数。原型在原型在string.h.使用时使用时:#include 1).strlen函数函数功能功能:计算并返回字符串计算并返回字符串str的长度的长度(0不计其内不计其内)形式:形式: strlen(str);例例1: 显示由键盘输入的字符串的长度。显示由键盘输入的字符串的长度。程序:程序:#include

62、 “stdio.h” #include “string.h” main() char c20; int i=0; printf(“input onestringn”); gets(c); printf(“%dn”, strlen(c)); 2). strcmp函数函数字符串比较函数字符串比较函数: 两个串自左至右逐个字符按两个串自左至右逐个字符按ASC码值大小比较码值大小比较,以以第一个不相同字符的比较结果为准的比较结果为准.形式:strcmp(STR1,STR2);函数值:函数值: STR1大于大于STR2: 0; STR1小于小于STR2: 0) if(lenmax) strcpy(out

63、,in); printf(“input a string: ”); gets(in); if(max0) puts(out);算法:Max=0, 输入串in 测试in长度len 判断lenmax: in拷入out 输入串in结束条件:输回车,len=0练习题练习题2003_3.1 3.2 6 2004_2.1 2.21999_5以以下下程程序序的的功功能能是是输输入入一一个个字字符符串串,并并将将其其中中的的字字符符a用用 字字 符符 串串 ”shu”替替 换换 后后 输输 出出 。 如如 输输 入入 为为”123abcaHello”,则输出为则输出为”123shubcshuHello”。 m

64、ain() int i ; char line81; scanf(“%s”,&line); for(i=0;linei!=n;i+) if(linei=a) printf(“shu”); else printf(“%s”,linei); 2003_3_1#04 : line#05: 0#09: %c定义,调用,说明;定义,调用,说明;参数传递:参数传递:虚实结合(类型、个数、顺序一致)值传递,地址传递返回一个值,多个值怎么办?(地址传递,全返回一个值,多个值怎么办?(地址传递,全局量)局量)函数函数1 函数的定义和调用函数的定义和调用先定义,后调用。先定义,后调用。例1 计算5!+8!+10!

65、mainN!N!N!1)算法: 2)程序:Main() int a,b,c ;long s; scanf(“%d%d%d”,&a,&b,&c);s=fact(a)+fact(b)+fact(c);printf(“%ld”,s); int i ; long f=1; for(i=1;i=n;i+) f=f*i; 主程序函数N!函数说明long fact(int n)return(f) ;long fact();函数的调用形式:函数名函数名(实参表列实参表列)在下列情况下在下列情况下,可不在调用之前对被调函数作类型说明可不在调用之前对被调函数作类型说明:函数的返回值是函数的返回值是整型整型或字符型

66、.自动按整型说明自动按整型说明.如果被调函数的定义出现在主如果被调函数的定义出现在主调函数调函数之前之前.如果已在所有被调函数定义之如果已在所有被调函数定义之前前,在在文件的开头文件的开头,在函数的外部在函数的外部已说明了函数类型已说明了函数类型,则在各个主则在各个主调函数中不必对所调用的函数再调函数中不必对所调用的函数再作类型说明作类型说明. 例如例如:char letter( ); float f ( ) ; int I( ) ;main() .char letter(c1,c2) char c1,c2 float f(float x,float y) #include “stdio.h”

67、 main( ) char r( ); int c; char ch5; gets(ch); c=r(ch); printf(“%cn”,c); char r(ch) char ch ; return (ch0); #include “stdio.h” main( ) /*char r( );*/ int c; char ch5; gets(ch); c=r(ch); printf(“%cn”,c); r(ch) char ch ; return (ch0); char int2 函数参数的传递函数参数的传递函数参数函数参数:实际参数和形式参数实际参数和形式参数函数参数传递过程函数参数传递过程

68、: 实参传递给形参实参传递给形参,执行函数体执行函数体; 运行结果通过运行结果通过return返回给被调函数返回给被调函数, 释放临时内存单元释放临时内存单元.实参和形参的传递实参和形参的传递: 值传递传递 单向单向 返回一个值返回一个值 地址传递传递 返回多个值返回多个值(指针指针)练习题练习题2 .输入三个整数输入三个整数,按从大到小的顺序输出按从大到小的顺序输出main() int a3,i,*p;void swap(int *p1,int *p2);printf(“input 3 numbers:n);for(i=0;i3;i+)scanf(“%d”,ai);if (a0a1) s0,

69、&a1);if (a0a2) s0,&a2);if (a1a2) s1,&a2);for(p=a;pa+3;p+) printf(“%6d”, p);void s p1,int p2) int t; t=*p1; *p1=*p2; *p2=t; 改错3处1.&ai2.*p3.int *p1,int *p22004 3.1 改错改错#include “stdio.h”int sum(int *b,int m) int s=0, prime(long); while(m-) if(prime(*b+) s+=*b; return s; int prime(long m) int k; if(m=1

70、) return 0; if(m=2|m =3) return 1; for(k=2;k*k=m;k+) if(m%k=0) return 0; else return 1; void main()int x10,I;for(i=0;i10;i+) scanf(“%d”,x+);printf(“sum=%dn”,sum(x,10);x+x+i (&xi)s+=*b s+=*(b-1) else return 1 return 12002_52.本程序为简易密码变换,输入字符串,将其中的小写英文字母替换为英本程序为简易密码变换,输入字符串,将其中的小写英文字母替换为英文字母表中该字母之后的第文字

71、母表中该字母之后的第5个字母。若替换的字母超过个字母。若替换的字母超过z,则循环到,则循环到a。例如,将。例如,将a替换为替换为f,w替换为替换为b。实例:实例: 字符串:字符串:Have*a*Good*Test! 变换结果:变换结果: Hfaj*f*Gtti*Tjxy!#include void code(char *src, char *dest) char ch; while ( ch= _(1)_) if ( _(2)_ _) ch+=5; if(chz) ch= _(3)_; *dest=ch; dest+; *dest= _(4)_; main() char buf100, inb

72、100; scanf(“%s”, inb); code( _ _(5)_); printf(“%s”, buf); ch=a&ch=z ch-z+a-1 *src+ 0 inb,bufvoid u ( int i , char *cp ) for ( ; i ; i- )printf ( “ %c” , *cp+ ) ; main ( ) char b 3 = “eof” , “EGF” , “AB” ; char (*q) 3 = b ; char *p ;L1: p = b0 ; u ( 1, p+) ; u ( 1 , p+ ) ; u ( 1 , p ) ; printf ( “n”)

73、 ;L2: p = b1 ; u ( 3, p+) ; u ( 2 , p+ ) ; u ( 1, p ) ; printf ( “n” ) ;L3: printf ( “ %s n” , b 1 ) ;L4: u ( 1 , q+) ; u ( 1, q+) ; u ( 1, q) ; printf ( “n”) ; 阅读程序1一级指针指向一维数组的指针,行指针程序产生的第一行输出是:程序产生的第一行输出是:eof。程序产生的第二行输出是:程序产生的第二行输出是:EGFGFF 程序产生的第三行输出是:程序产生的第三行输出是:EGFAB 程序产生的第四行输出是:程序产生的第四行输出是:eEA课

74、间练习:阅读程序课间练习:阅读程序#include int orderi(int *a,int i) return aiai+1; main()int a=3,8,6,2,18,9,12,14,i; for(i=0;i0)递归函数递归函数Fact(n)= 1 (n=0)n*fact(n-1) (n0)Main() long fact();printf(“5!=%ld”,fact(5);Long fact(int n)if(n0) return n*fact(n-1); else rerurn 1递归函数主程序递归过程:fact(5)=5*fact(4) 自 程 fact(5)=5* 24=12

75、0 fact(4)=4*fact(3) 调 过 fact(4)=4*6=24 fact(3)=3*fact(2) 过 回 fact(3)=3*2 =6 fact(2)=2*fact(1) 程 返 fact(2)=2* 1=2 fact(1)=1*fact(0) fact(1)=1*1=1 fact(0)=1注意:在编制递归函数时,应该使递归终止条件最终得到满足,否则程序将不能正常运行.例例2 编写递归函数,实现将输入的字符串以倒序编写递归函数,实现将输入的字符串以倒序输出。如输出。如I am a teacher#include viod revers()char c; if(c=getchar

76、()!=n) revers() ; if(c!=n) putchar(c);main()revers() ;所读入的字符并不能马上打印出来,而是被存储在一串特定的存储器存储器内(堆栈堆栈:后进先出次序)例例3 将整数转换成字符串输出将整数转换成字符串输出#include viod convert(n)long nlong i;if(i=n/10)!=0) convert(i);putchar(n%10+0); main( ) long number;scanf(“%ld”,&number);if(number0) putchar(-);number= - number; convert(num

77、ber ); 123“123”本次调用的nmain()int m;char s120,s220,*p1,*p2;scanf(“%s %s”,_)p1=&s10; p2=&s20; m=_;printf(“s1与与s2比较结果是比较结果是%d”,m);strcmp(p1,p2) int *p1,*p2;i=0; while(_) if(*(p1+i+)= =0) return 0; return(_); 例例1:编制函数:编制函数:实现字符串比较实现字符串比较strcmp(s1,s2)主函数子函数S1,s2;Strcmp(p1,p2)*(p1+i)= =*(p2+i)*(p1+i)-*(p2+i

78、)例例2 调用文件调用文件gcd.h中的函数中的函数:求两个数的最大公求两个数的最大公约数约数 Main()int i,j;scanf(“%d%d”,&i,&j);printf(“greatest common divisor is %d”,gcd(i,j););主程序f.cInt gcd(int a,int b)int t;while(b)t=a%b;a=b;b=t;return a;gcd.h文件#include “gcd.h”运行结果:24 15greatest common divisor is 3例例3:02年年 4.2定义一个函数,统计定义一个函数,统计3行行4列的整数二维数列的整

79、数二维数组中有多少个整数、多少个负数,多少个组中有多少个整数、多少个负数,多少个零,并返回统计结果。零,并返回统计结果。2002 4.2Int a,b,c;tj(int m34 )int i,j; for(i=0;i=2;i+) for(j=0;j0) a+; else if(mij=0) b+; else c+;main()int m34=1,-1,3,0,5,-7,0,4,-5,0,0,0; tj(m); printf(“%d %d %d”,a,b,c);(*m)4虚参和实参: 顺序一至;类型相同调用形式: tj(m34)指针型函数指针型函数的定义和说明的定义和说明例例4 输输入入一一个个

80、字字符符串串,将将字字符符串串中中的的小小写写字字母母变变成大写字母并输出成大写字母并输出。算法分析算法分析子函数子函数: 将小写字母变成大写字母。将小写字母变成大写字母。(库库函函数数int toupper(int ch) 将将ch字字符符转转换换成成大写字母,其大写字母,其 原形在原形在ctype.h中中 p258)主主函函数数: 输输入入字字符符串串和和输输出出转转换换(子子函函数数)后后的的大写字符串大写字符串#include #include main( ) char buffer80;char *stringupper(char *);printf(“nInput a string

81、:”); gets(buffer); printf(“n %s”, stringupper(buffer); char *stringupper(char*str) int i;for(i=0; *(str+i)!=0 ;i+) *(str+i)=toupper(*(str+i); return str; 地址量buffer作实参函数说明指针函数定义字符指针str作形参运行结果:Input a string: This is a book.THIS IS A BOOK.程序返回值是字符型指针例例5:2004_4.1/21+1/3+1/3*2/5+1/3*2/5*3/7#include “mat

82、h.h”#include “math.h”double compute_pi(double eps) int s ; int s ; double p=1, i,sum; p=1, i,sum; i=1.0; sum=0.0; i=1.0; sum=0.0; dodo sum=sum+p ; sum=sum+p ; p=p* p=p* i/(2*i+1);i/(2*i+1); i+; i+; whilewhile( (fabs(p(p=eps);); return sum*2; ;例例6: 2004_4.2 编写函数编写函数fun:对字符串对字符串s,逆序放于,逆序放于t,再将正序连接到,再将

83、正序连接到t后面。后面。#include “string.h”char t20=“ ”; (全局量)(全局量)Char *fun(char *s) int i,n ; n=strlen(s); for(i=0;i=2*n;i+) if(in) *(t+i)=*(s+n-i-1) ; else *(t+i)=*s+; return t;main()() char s=“abc”;printf(“%s”,fun(s); void fun(char *s) int i,n ; char t=“”; n=strlen(s); for(i=0;i=2*n;i+) if(istrlen(str1)prin

84、tf(“the value of position is error);elsecopysubstr(str1,str2,posi); printf(“str2=%sn”,str2); 例9.8 程序开辟80个字节内存空间用二维数组名二维数组名表示第i行j列元素的四种四种方法: aij , *(a+i)j ,*(ai+j), *(*(a+i)+j)也可用同二维数组名变化规律相同的也可用同二维数组名变化规律相同的指针指针表示: 指向一维数组的指针指向一维数组的指针;若定义: int a34, int (*p)4; p=a; pij , *(p+i)j ,*(pi+j), *(*(p+i)+j)阅

85、读:阅读:p142 9.47.2 指针与函数指针与函数指向函数的指针指向函数的指针:取值为函数入口地址取值为函数入口地址的指针变量的指针变量. 简称简称函数指针用函数指针调用函数用函数指针调用函数max(int x,int y) int z; if(xy) z=x; else z=y; return (z); 例3:有函数max(int x,int y),求x,y两数的大者。main( ) int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“a=%d,b=%d, max=%d”, a,b,c); main( ) int a,b,c; int

86、 (*p)( ); p=max; scanf(“%d,%d”,&a,&b); c=(*p)(a,b); printf(“a=%d,b=%d, max=%d”, a,b,c); 用(*p)代替函数名min1.设有函数说明和指针变量定义如下:设有函数说明和指针变量定义如下: int min(int x , int y ) ; int (*p) ( ) = min ; 写出以参数写出以参数 a和和 b ,利用利用 p 调用它所指的函数的代调用它所指的函数的代码码: _。Min(a,b);(*p) (a,b);#define NULL 0main( ) char *P=“China”; char c,

87、*search(); scanf(“%c”,&c); p=search(p,c); if(p=NULL) printf(“not find!n”); else printf(“%cn”,*p); 算法算法:主函数主函数 指定字符,数组定义赋值; 调用子函数 输出提示信息子函数子函数:寻找指定字符串 找到返回字符位置p(定义指 针型函数) 找不到返回0char *search(char *str,char c) char *p=str; while(*p!=0&*p!=c) p+; return(*p? p: NULL); 定义指针型函数search, 形参str为指针 *p非零,则找到,返回p

88、;否返回0(0:asc;0,p19)运行结果:输入:k 输出: not find!输入:C 输出:C9.5.1多级指针定义多级指针定义例例: char *nameSIZE; 定义指针数组定义指针数组 令令 p=name 则则p 指向指向 name0 (指针指针). 指向指针的指针,称称p为多级指针为多级指针. (二级二级)说明形式:说明形式: 数据类型数据类型 *指针名指针名 (二级指针(二级指针 *) 数据类型数据类型 *指针名指针名 (三级指针(三级指针 ) 数据类型数据类型 *指针名指针名 (n级指针级指针 ) 由此可得如下等式: *p4 p3; (四级指针) *p3 p2; (三级指针

89、) *p2 p1 ; (二级指针) *p1 x ; (一级指针)多级指针说明示意图P432103400P322203210P223102220P120002310x52000例: char *p, * ppp ;9.4.2 多字符串的表示多字符串的表示1)用用二维数组定义多字符串定义多字符串char name810= “con” poin”,”fun”,”var”,”add”,”stru”,”union”,”array”;特点:字符串数量固定、长度固定且相等。特点:字符串数量固定、长度固定且相等。 存储空间浪费。存储空间浪费。Name0name1name2name3Name4name5name

90、6name7Con0 poin0fun0var0add0stru0union0array02)用字符指针字符指针数组定义 多字符串: char *数组名长度如:char *name8特点特点:灵活; 动态增减动态增减字符串个数、动态伸缩动态伸缩字符串长度,排序:源串序列不做移动,仅改变指针9.5.2 二级指针与指针数组的联系二级指针与指针数组的联系char *nameSIZE=“constant” ,”pointer”, ”function”, ”variable”,”address”, ”structure”,”union”,”array” ;*p= name ;Name0name1name

91、2name3Name4name5name6name7“constant” “pointer”function”variable”address”structure”union”array”p见p154 表9.5p+i, name+i地址:*(p+i)+j name4+4值:*(*(p+i)+j)*(name4+4)Name0name1name2name3Name4name5name6name7“con” “poin”fun”var”add”stru”union”array”算法:(1)数据处理: 二维数组或指针数组(2)排序: 选择法(二重循环,比较,对调)例例9.10 将将8个字符串按词典顺

92、序排列。个字符串按词典顺序排列。#include “string.h”#define SIZE 8main( )char *namesize= “con”, “poin”,”fun”,”var”,”add”,”stru”,”union”,”array”; int i,j,k; char *temp; for(i=0;iSIZE-1;i+) k=i; for(j=i+1 ; j0) k=j; if( k!=i ) temp=namek; namek=namei; namei=temp; for(i=0;iSIZE;i+)printf(“%s ”,namei);运行结果: add array co

93、n fun poin stru union var 使用指针数组namesize10=strcpy(temp,namek); strcpy(namek,namei);strcpy( namei,temp); Char temp10使用二维数组1、设有变量定义如下:、设有变量定义如下: char *a = “Beijing” , “Shanghai” , “Wuhan” ; char *p = a ; 写出函数调用写出函数调用printf(“%sn”, *+p + 1) 输输出的结果。出的结果。运行c7-1.changhaia0P+0a1a1+1P+1 f( char *a) f( char *

94、a) a=“abc; a=“abc; printf(“%sn”,a); printf(“%sn”,a); main() main() char *a=xyz; char *a=xyz; printf(n%sn,a); printf(n%sn,a); f(a); printf(%s,%sn,a,a+1); printf(%s,%sn,a,a+1); 阅读程序2运行结果1:Xyzabcxyz,yz*a=d运行结果2:Xyzdyzdyz,yz改错:将字符串改错:将字符串a复制到字符串复制到字符串b。main( ) char a=”I am a boy”,b20,*p1,*p2; int I; p1=

95、a; p2=b; for(; *p1!=0;p1+) p2=p1; *p2=”0”; printf(“string a is: %cn”,a); printf(“string b is:”); for(I=0;bI!=0;I+) printf(“%c”,bI); printf(“n”); . 答案:答案:第第3行:行:char a=”I am a boy”,第第6行:行:for(;*p1!=0;p1+;p2+)第第7行:行:*p2=*p1;第第8行:行:*p2=0;第第9行:行:printf(“string a is: %sn”,a);改错:将数组中的元素颠倒次序存放。改错:将数组中的元素颠倒

96、次序存放。main( ) int a6=3,5,7,8,2,1,t,i; for(i=0;i=6;i+) printf(“%4d”,ai); printf(“n”); for(i=0;i6;i+); t=ai; ai=a5-i; a5-i=t; for(i=0;i=5;i+) printf(“%4d”,a+i ); printf(“n”); 答案:答案:第第3行:行:for(i=0;i=5;i+)或或 for(i=0;i6;i+) 第第6行:行:for(i=0;i3;i+)或或 for(i=0;i下下的的命命令令行行键键入入的实参的实参,传给传给mian()函数。函数。2.main( )的定义

97、:的定义: main(int argc,char *argv ) 函数体函数体 argc: 命令行上字符串命令行上字符串个数。指针数组指针数组argv长度长度: argc值。值。数组各元素分别指向数组各元素分别指向各字符串首地址。 如:如:c命令 参数1 参数2 例:test.c test.exemain(int argc, char agrv ) printf(“%d%s%s %sn”,argc,argv0, argv1,argv2); 运行时键入:ctest asd zxc则输出:3 test asd zxargv0argv1argv2argv“test” “asd” “zx” 定义 意义

98、 int i; i是整型变量 int *p p 是指向整型变量的指针指针 int an a是一个含有n个整型数据的数组int *pn p是一个含有n个整型指针指针的数组数组int(*p)n p是指向含有n个整型数据的一维数组的指针指针int f() f是一个返回值为整型数据的函数int *p() p是一个返回值为整型指针指针的函数函数int (*P)() p是函数指针函数指针,指向返回值为整型数据的函数int (*pn)() p是函数指针数组函数指针数组,它的元素指向整型函数int *P p是二级指针二级指针,它指向一个整型数据的指针struct f *p p是一个指向结构体类型的指针8.结构

99、体结构体类型,变量,数组定义,成员的调用(变量、数类型,变量,数组定义,成员的调用(变量、数组、指针)。组、指针)。输入,输出,排序,求和,求平均;输入,输出,排序,求和,求平均;什么样的数据应定义为结构体类型什么样的数据应定义为结构体类型? 例例:一个学生的情况记录:包括: 学号学号,姓名姓名,成绩等数据项成绩等数据项;结构体类型的定义结构体类型的定义: struct student int num; char name20; float score; ;结构体变量,指针,数组的定义?Stu1,stu4,*p;Stu1.numstu1.namestu1.scorestui . num stu

100、i . namestui . scoreP=&stu1; (*p).num p-nump=stu;stu1. Num结构体指针作为函数参数?结构体变量,指针,数组的引用?struct num int x,y ; sa = 2,32 , 8,6 ; struct num *p = sa ;计算表达式计算表达式 ( p- y / sa 1.x * +p - x ) 的值。的值。_.12算法:1定义结构体类型和数组及指针;2为数组各元素赋值;3比较 确定最高分的位置 max=stu0.score max stui.score ( stu1.score , stu2.score, stu3.score

101、(循环三次) temp=i;4输出 stui.score stui.name例例如如:有有四四个个学学生生,每每个个学学生生记记录录包包括括学学号号,姓姓名名,成成绩绩.要要求求找出成绩最高者的姓名和成绩。找出成绩最高者的姓名和成绩。main( ) struct student int num; char name20; float score; stu4,*p; int i,temp=0; float max; for(p=stu; pnum, p-name, &p-score); for(max=stu0.score,i=1;imax) max=stui.score; temp=i; p=

102、 _;printf(“nThe maximum score:n”);printf(“No:%dnname:%snscore:%4.1fn” , p-num,p-name,p-score);定义结构体数组和指针stu+temp9.链表链表建立(栈式链表和队列链表),插入,输出建立(栈式链表和队列链表),插入,输出(04年,年,02年二级题)的算法。年二级题)的算法。链表:是是把把存存放放在在内内存存中中不不同同地地方方的的元元素素向向“链链条条”那那样样连接起来连接起来,构成一种链式数据结构。构成一种链式数据结构。链表分类链表分类: 单链表和链表和双链表链表1 . 链表概述链表概述AB D nu

103、llChead0 A B D 0Chead单链表的一个结点结点: 数据数据 指针指针. 双链表的一个结点: 指针 数据 指针链表的结点是一个结构体变量头指针(首地址) 采用结构体类型,如:采用结构体类型,如: struct student int num; float score; struct student *next; ;指向自身结构体类型的指针变量建立建立新链表或在已知链表实行插入插入,删除删除结点的操作,所用函数: void *malloc(unsigned size); void *calloc(unsigned int num, unsigned int size);void f

104、ree(void *ptr)调用该函数后,将分配一块连续的存储区将分配一块连续的存储区,大小大小= num* size.(清零).其返回值是指向新分配的内存区的首地址的通用型指针.调用失败调用失败,返回空指针NullVoid:函数值类型,未规定指向何类数据,故设计者不能直接将函数的返回值赋给某一指针变量,必须先进行强强制类型转换制类型转换.这类指针称为通用型指针或无类型指针.3. 动态存储分配函数动态存储分配函数功功能能:根根据据存存储储数数据据的的多多少少,在在程程序序运行的的过过程程中中,动动态态分分配配内内存存区区供供数数据据存存储储,内内存存区区的的大大小小,可可根据需要来指定.不需要

105、已占有的内存时不需要已占有的内存时,可及时释放可及时释放.(1). 清零内存分配函数清零内存分配函数void * calloc(unsigned num,unsigned size)指针型函数单元数每个单元字节数函数值类型例如例如: main( ) float *p; p=(float *)calloc(100,sizeof(float); /* 分配分配 100个个float型单元,清零,返回首址型单元,清零,返回首址 */ if(p) printf(“Allocation is successful.n”); else printf(“Allocation is failed.n”); .

106、; /* 任何处理任何处理*/ free(p); /* 释放释放 */ 通用型指针(2). 内存分配函数内存分配函数void * malloc(unsigned size)调用该函数后调用该函数后,将分配一块连续size个字节的存储区,存储区中的内容存储区中的内容保持原数值.其返回值是指向新分配的内存区的其返回值是指向新分配的内存区的首地址的通用的通用型指针型指针. 例如: main( ) char *str; str=(char *)malloc(50) ;.; /* 分配50个字符单元。*/(3). 内存分配变更函数内存分配变更函数 void *realloc(void *buffer,

107、unsigned newsize)改变buffer所指存储区大小,改为newsize个字节,其其返回值是指向变更后的内存区的是指向变更后的内存区的首地址的通用型指针的通用型指针.调用后调用后,首地址可能变化首地址可能变化,但存储区的内容保持不变但存储区的内容保持不变. 例如 main( ) char *str; str=(char *) malloc(50) ;.; str=(char *) realloc(str,80); .; 分配50个字符单元(4). 内存释放函数内存释放函数 void free(void *buffer)释释放放由由buffer所所指指向向的的存存储储区区.(由由以以

108、上上三三个个函数产生函数产生)例如例如: free(p); 以上四个函数原型在以上四个函数原型在stdio.h(ANSI C)或或malloc.h(其它其它C)中中.建立存储7个整型数据区例例1用用动动态态分分配配函函数数建建立立一一个个存存储储7个随随机机整整数数的的存存储储区区,然然后后将存储区将存储区扩大可存储可存储10个整数个整数,并输出存储区中内容并输出存储区中内容. #include main( ) int i,*buffer; buffer =(int *)malloc(14); printf(“n”) ;for(i=0;i7;i+)*(buffer+i)=rand();prin

109、tf(“%6d”,*(buffer+i);printf(“n”);buffer =(int *) realloc(buffer,20); for(i=7;i10;i+)*(buffer+i)=i; for(i=0;i10;i+)printf(“%6d”, *(buffer+i); 存入数据并输出变更存储区数据输出存入数据 #include main( ) int i,n,*buffer1; int *buffer2;printf(“n input number of student:”);scanf(“%d”,&n) buffer1 =(int *)calloc(n,sizeof(int);

110、buffer2 =(int *)calloc(n,sizeof(int);printf(“n input N0.and scoren”);for(i=0;in;i+)scanf(“%d%d”, buffer1+i, buffer2+i);printf(“n No scoren”);for(i=0;inext= head ; head=p;4)重复重复2),),3)若干次)若干次。 head例例10.8 p179编写程序,建立一个存储编写程序,建立一个存储ascII码及其字符的码及其字符的链表,规定链表,规定ascII码的范围为码的范围为m,n(32mn=m;i-) p=(struct lett

111、er *)malloc(L); p-asc=p-x=i; ; head=p; return head;表头前移前后结 点连接起来输入结点数据开辟结点存储单元Main() struct letter *p,*first;printf(“input m and n:32-126”) scanf(“%d%d”,&m,&n);first = creat() ; p= first ; while( p!=NULL ) printf(“%d t%cn”, p-asc,p-x); (画图说明) 程序10.8p-next=head;输出链表?p=p-next;头头指指针针一一旦旦指指向向首首结结点点,就就不不

112、再再变变动动。 新新结结点点插入的位置在插入的位置在链尾。建立建立“队列”式单链表式单链表,先做好先做好三个准备工作: (1)定义链表的结点类型定义链表的结点类型; (2)定义链表的头指针定义链表的头指针head,并用并用NULL赋值赋值, 表表 示链表在建立之前是空的示链表在建立之前是空的. (3)定义两个工作指针:定义两个工作指针: p1,p2以及结点数以及结点数n ,并赋,并赋n的初始值的初始值1).建立第1结点: n=n+1; p1=(struct studnet *)malloc(sizeof(struct student); 输入结点数据输入结点数据 ; head=p1;p2=p1

113、; 2).建立第建立第2结点结点: n=n+1; 开辟第二结点存储单元 p1=(struct studnet *)malloc(sizeof(struct student); 将第一结点指针指向第二结点 p2-next=p1开辟第一结点存储单元 nextheadp2 next p1P1headp2head next P1p23).指针指针p2指向第二结点指向第二结点 p2=p14).重复2,3建立多个结点.5).结束链表结束链表 p2-next=null;建立队列链表过程示意图建立队列链表过程示意图: nextheadp2 next next p1P1headp2head next next

114、P1p21.建立第建立第1结点结点2.建立第建立第2结点结点,与第一结点连接与第一结点连接3.为建立第为建立第3结点做准备结点做准备Head=p1;p2=p1;P1=(struct stu *)malloc(sizeof(struct stu); P2-next=p1;NULLp2=p1;4.结束链表结束链表p2-next=null;#define NULL 0#define LEN sizeof(struct student)struct student long num; float score; struct student *next; ; int n;struct student *

115、creat( )struct student *head, *p1,*p2; head=NULL; n=0; p1=p2=(struct student *)malloc(LEN); scanf(“%ld,%f”, &p1-num,&p1-score);例例如如:建建立立一一个个有有五五名名学学生生数数据据的的单单链链表表,每每个个结结点点的成员包含学号和成绩的成员包含学号和成绩。函数功能为建立 单链表,返回表头指针开辟第一结点存储单元输入第一结点数据while(p1-num!=0) n=n+1; if(n= =1) head=p1; else p2-next=p1;p2=p1; p1=(st

116、ruct student *)malloc(LEN); /*开辟新结点*/scanf(“%ld,%f”,&p1-num,&p1-score); /*输入数据*/ p2-next=NULL; /*末尾结点指针置NULL*/return(head); p2紧跟p1指向新建结点头指针指向第一结点前后结 点连接起来p1-num=0结束标志后移:p=p-nextheadp next next p(3). 单链表的输出单链表的输出 例:输出学生链表。例:输出学生链表。 void printf(head) struct student *head; struct student *p; printf(“nN

117、ow,These %d records are:n”,n); p=head; /* p指向第一结点指向第一结点 */ if(head!=NULL) /* 链表非空则输出链表非空则输出*/do printf(“%ld %5.1fn”, p-num,p-score); p=p-next; /* p指针后移 */ while(p!=NULL); /* 尾结点指针域为空 */ return; 须已知head的值。设一指针p,从第一结点开始,边输出边后移,直至尾结点。Main() struct student *head ; head=create() ; printf(head);阅读阅读10.9p1

118、82 算法:算法:(1)查找待删除结点查找待删除结点num位置位置:(2)若位置找到若位置找到,则将其后一结点的指针值赋则将其后一结点的指针值赋 给其前一结点指针;给其前一结点指针;(3)找不到找不到,后移一结点后移一结点;(4)若后移到尾结点仍找不到则出错。若后移到尾结点仍找不到则出错。head 01 next next 05 next 06 NULL 02 next 04P2P11.查找P1=headWhile (num!=p1-num &P1-next!=NULL) 找不到:下移一个结点 P2=p1;p1=P1-next 2. 若num=p1-num 找到:head=p1-next(第一

119、结点)head P2-next=P1-next (中间或尾)head 01 next next 05 next 06 NULL 02 next 04P2P1 01 next next 05 next 06 NULL 02 next 04P1 01 next next 05 next 06 NULL 02 next 04P1headP2 p1指向当前结点, p2指向其前一结点struct student *del(head, num) struct student *head;long num; /*虚参虚参:头指针值和待删结点头指针值和待删结点num域值域值*/ struct student

120、*p1,*p2; if(head= =NULL) printf(“nList null!n”); goto end; /*链表空则出错,返回链表空则出错,返回*/while(num!=p1-num&p1-next!=NULL) ; if(num= =p1-num) /*找到找到*/ if(p1= =head) head = p1-next else printf(“delete:%ldn”,num); n=n-1; else printf(“%ld not been found!n”,num); end: return(head); p1当前结点, p2其前一结点寻找删除结点,当num值不等且

121、未到尾结点,循环若找不到则出错删除头结点, head重赋值p2-next= p1-next;p2=p1; P1=P1-next算法算法: 寻找插入位置p0-num p1-num,插入。,插入。插入新结点,首先要开辟新结点首先要开辟新结点内存单元内存单元.(p0,赋值赋值)设置三个指针:设置三个指针: p0-指向待插入结点;指向待插入结点; p1-指向当前结点;指向当前结点; p2-指向前一结点。指向前一结点。若原链表为若原链表为空,则,则新结点为第一结点,即:即: head=p0; p0-next=NULL; 若原链表若原链表非空,则,则寻找插入位置,可能:可能: 插在第一结点前插在第一结点前

122、,即:即:head=p0; p0-next=p1; 插在中间插在中间,即:即:p2-next=p0; p0-next=p1; 插在表尾插在表尾,即:即:p1-next=p0; p0-next=NULL; nextP0 next next next0P1 nextP0headhead=p0;p0-next=p1 next next next next0P1headp2P0 next next nexthead 0P0插入末尾p1-next=p0; p0-next=NULLp1P0 next next next0headp2 next2.插入中间:p1P2-next=p0; p0-next=p11

123、.插入头部: 函数insert( )的功能为向单链表插入一个结点。 struct student *insert(head,stud) struct student *head,*stud; struct student *p0,*p1,*p2; p1=head; /*p1指向第一结点指向第一结点*/ p0=stud; /*p0指向待插入结点指向待插入结点*/ if(head= =NULL) /*若为空表若为空表*/ _(1)_; _(2)_;else /*寻找插入位置寻找插入位置*/ while(p0-nump1-num)&(p1-next!=NULL) p2=p1; p1=p1-next;

124、 传入head 和待插入结点指针studif(p0-numnum) if(head= =p1) _(3)_; _(4)_; else /*插在中间*/ _(5)_; _(6)_; else /*插在表尾*/ _(7)_; _(8)_; n=n+1; return(head); 插第一结点之前 p1-next=p0;p0-next=NULL;p2-next=p0;p0-next=p1;head=p0;p0-next=p1;head=p0;p0-next=NULL;填空:后移一结点阅读阅读10.10 10.11 p186本程序主函数通过调用本程序主函数通过调用create()create()函数函

125、数建立一个职工链表,每个结点的数据包括一个职工链表,每个结点的数据包括职工号和工资。链表建立后,主函数调用链表建立后,主函数调用list()list()函数函数打印输出链表的全部结点的数据链表的全部结点的数据。完善程序完善程序. . 2001等级考#include “stdio.h”#include “alloc.h”struct worker int num; float pay; struct worker *next; ;int n;main() struct worker *head, *create(void); void list(struct worker*); head=cre

126、ate(); list(head);定义节点类型函数说明struct worker struct worker *create(void)(void) struct worker *head,*p1,*p2; struct worker *head,*p1,*p2; printf(“Create a linked list:n”); printf(“Create a linked list:n”); head=0; n=0;p1=p2=(struct worker*)p1=p2=(struct worker*) malloc(sizeof(struct worker); malloc(size

127、of(struct worker); scanf(“%d%f”,&p1-num, &p1-pay);(“%d%f”,&p1-num, &p1-pay); 链表建立函数while(p1-num!=0) n+; if (n= =1) _; else _; p2=p1;p1=(struct worker*) _; scanf(“%d%f”,&p1-num, &p1-pay); p2-next=0; free(p1); return head; Malloc ( sizeof( struct worker ) )head=p1p2-next=p1void list(struct worker *p)

128、printf(“The linked list:n”); while( _ ) printf(“n%dt%f”,p-num,p-pay); _; p!=0p!=0p=p-nextp=p-next链表输出函数读入两个十进制正整数读入两个十进制正整数n和base,将将n转化成转化成base进制的数进制的数( 2base 16 ).例如例如:若输入若输入 9 2, 则输出则输出 9(10)=1101(2);若输入若输入 94 16, 则输出则输出 94(10)=5e(16);若输入若输入 200 8, 则输出则输出 200(10)=310(8);若输入若输入 100 5, 则输出则输出 100(10

129、)=400(5);若输入若输入 107 12, 则输出则输出 107(10)=8b(12);1next0next1null1nextp#include “stdio.h”struct node int num; struct node *next; ;main()struct node *p,*b=NULL; int m,n,base,c;printf(“input n and base:n”);scanf(“%d%d”,&n,&base);m=n; while(n) c= (1); n=n/base; if(cnum=c; p-next=b; b=p;printf(“outputn”);pr

130、intf(“%d(10)=”, (4) );while(p) printf(“%c”,p-num); p= (5) ; printf(“(%d)n”,base);free(p);(3) p=(struct node *)malloc (sizeof(struct node );(1) c=n%base (2) c=c+0;(4) m; (5) p=p-next;除基取余P为首地址开辟空间化成16进制倒序建立链表后移输出格式要求1nullpP-num=c; p-next=b ; b=p;1nullpb1nextp1nullbP-num=c; p-next=b ; b=p;建立堆栈式链表2004二

131、级考题二级考题给给出出两两个个链链表表,按按交替的顺序轮轮流流从从这这两两个个链链表表中中取取其其成成员员归并成成为为一一个个新新的的链链表表,如如其其中中一一个个链链表表的的成成员员取取完完,另另一一个个链链表表的的多多余余成成员员依依次次接接到到新新链链表表的的尾尾部部,并并把把指指向向新新链链表表的的指指针针作作为为函函数值返回。数值返回。例例如如,若若两两个个链链表表成成员员分分别别是是1,2,3,8,10,15和和 7,13,1, 则则 链链 接接 成成 的的 新新 链链 表表 是是1,7,2,13,3,1,8,10,15。程序程序void main ( ) int x; struc

132、t node *alist=NULL, *blist=NULL, *list=NULL; do scanf(“%d”,&x); /* 建立建立alist链表链表 */ If (x0); do scanf(“%d”,&x); /* 建立建立blist链表链表 */ if (x0); list=shuffleMerge(alist, blist);程序程序includetypedef struct node int data; struct node *next; ;struct node *createlink(struct node *list,int x) struct node *u=li

133、st,*p; p= (1) ; (2) ; p-next=NULL; if(list=NULL) list=p; else while (u-next!=NULL) u=u-next; u-next=p; return list;(1)P= (struct node *)malloc(struct nde )(2)P-data= xstruct node *ShuffleMerge(struct node* a,struct node* b) struct node dummy; struct node* tail=&dummy; dummy.next=NULL; while ( (3) )

134、if ( (4) ) Tail-next=b; Break; else if (b=NULL) tail-next=a; break; else /* 轮流从两个链表中取其成员链接到新链表的尾部轮流从两个链表中取其成员链接到新链表的尾部 */ tail-next=a;tail=a;a=a-next; tail-next=b;tail=b;b=b-next; return ( (5) ); 程序程序(3) !(a=NULL&b=NULL)(4) a=NULL(5) dummy.next(3) Tail != NULLincludestruct node int val; struct node

135、*next; ;/*若若x不在链表中,则生成值为不在链表中,则生成值为x的新表元,并将它的新表元,并将它插入插入链表;链表;否则忽略否则忽略x */insert (struct node *list,int x) struct node *u,*v; u=list; v=u-next; While( (1) ) /*寻找值为寻找值为x的表元,或插入点的表元,或插入点 */ u=v ; v=v-next; If( (2) )/* 没有值为没有值为x的表元,生成新表元查在表元的表元,生成新表元查在表元*之后之后/u-next= (struct node *)malloc(sizeof(struct

136、 node ) ; (3) =x; (4) 99年二级考题年二级考题6u-val!=x&v!=NULL u=NULL(u-next)-val=x(u-next)-next=nullWrite(struct node *pt)for (;pt!=NULL;pt=pt-next)printf(“%dt”,pt-val);#define file “int.dat”main() FILEFILE *fpt;int x; *fpt;int x;struct node *head;fpt= (5) ; If(fpt=NULL); printf(“cant open n”,(0);head=(struct

137、 node *)malloc(sizeof(struct node );head - next= NULL;while(fscanf(fpt,”%d”,&x)=1) inser(head,x);write(head-next) ; printf(“nn”);(5) fopen(file,”r”);辅助表元辅助表元10.文件文件文件操作步骤:文件操作步骤: 定义文件类型指针,打开,读写,关闭。定义文件类型指针,打开,读写,关闭。文件读写语句:四对;文件读写语句:四对; fgetc, fputc * 例例3 fread, fwrite * 例例3,例,例4 ,练习题,练习题1 fscanf,fpr

138、int写出运行结果写出运行结果 # #include “stdio.h”include “stdio.h”main()main() FILEFILE *fp1; *fp1;if(fp1=if(fp1=fopenfopen(“”,”r”)= =NULL)(“”,”r”)= =NULL) printf(“cant open the file”); printf(“cant open the file”); exit(0); exit(0);while (!while (!feoffeof(fp1)(fp1) printf(“%c”, printf(“%c”,fgetcfgetc(fp1)+3);(

139、fp1)+3); fclose(fp1); fclose(fp1); /* /*其中文件的内容为其中文件的内容为”hijkHIJK”*/hijkHIJK”*/ 运行结果:klmnKLMNklmnKLMN#include “stdio.h”main()if(fp1=fopen(“”,”r”)= =NULL) printf(“cant open the file”);exit(0);while (!feof(fp1) printf(“%c”,fgetc(fp1)+3); fclose(fp1); /*其中文件的内容为”hijkHIJK”*/运行结果:FILE *fp1;THANK YOU VERY MUCH !欢迎指正!欢迎指正! 发展学院发展学院 计算机专业实验室计算机专业实验室

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号