C语言程序设计:第五章数组

上传人:壹****1 文档编号:592571098 上传时间:2024-09-21 格式:PPT 页数:58 大小:881KB
返回 下载 相关 举报
C语言程序设计:第五章数组_第1页
第1页 / 共58页
C语言程序设计:第五章数组_第2页
第2页 / 共58页
C语言程序设计:第五章数组_第3页
第3页 / 共58页
C语言程序设计:第五章数组_第4页
第4页 / 共58页
C语言程序设计:第五章数组_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《C语言程序设计:第五章数组》由会员分享,可在线阅读,更多相关《C语言程序设计:第五章数组(58页珍藏版)》请在金锄头文库上搜索。

1、1第五章 数组一维数组一维数组二维数组及多维数组二维数组及多维数组字符数组和字符串字符数组和字符串数组概念数组概念2数组概念数组概念构造数据类型之一。数组:有序的同类型数据的集合,用数组名标识。元素:属同一数据类型,用数组名和下标确定。3一维数组的定义v定义方式: 数据类型 数组名常量表达式; 合法标识符表示元素个数下标从0开始 :数组运算符单目运算符优先级(1)左结合不能用( )例 int a6;a00145a1a2a3a4a523a编译时分配连续内存内存字节数=数组维数* sizeof(元素数据类型)数组名表示内存首地址,是地址常量5.1 一维数组4v数组必须先定义,后使用v只能逐个引用数

2、组元素,不能一次引用整个数组v数组元素表示形式: 数组名下标其中:下标可以是常量或整型表达式例 int i=15; int datai; (不能用变量定义数组维数)例 int a10; printf(“%d”,a); ()必须 for(j=0;ja1,则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束例例 用冒泡法对用冒泡法对10个数排序个数排序一维数组应用一维数组应用7

3、例38 49 65 76 13 27 30 97 第一趟38 49 65 13 27 30 76 第二趟38 49 13 27 30 65 第三趟38 13 27 30 49 第四趟13 27 30 38 第五趟13 27 30 第六趟49 38 65 97 76 13 27 30 初始关键字n=838497697 139797273097137676762730136527653065131349493049273827383038 13 27 第七趟例 用冒泡法对10个数排序(图解)8排序过程:(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数 交换第一趟选择排序,结果最小

4、的数被安置在第一个元素位置上(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录, 将它与第二个数交换第二趟选择排序(3)重复上述过程,共经过n-1趟排序后,排序结束例 用简单选择法对10个数排序选选择择法法的的思思路路是从第一元素开始逐个元素进行比较,并记录下较小元素的下标,经过一轮的比较和记录后,记录的下标为最小元素的下标,将该元素与第一个元素交换。对剩下的数继续下一轮的比较和记录。如果n个数比较,这样n-1轮后,就完成了排序工作。910例初始: 49 38 65 97 76 13 27 kji=11349一趟: 13 38 65 97 76 49 27 i=22738二趟:

5、 13 27 65 97 76 49 38 三趟: 13 27 38 97 76 49 65 四趟: 13 27 38 49 76 97 65 五趟: 13 27 38 49 65 97 76 六趟: 13 27 38 49 65 76 97 kkkkjjjjjjjjjj例 用简单选择法对10个数排序11二维数组的定义v定义方式:数据类型数组名常量表达式常量表达式;v数组元素的存放顺序l原因:内存是一维的l二维数组:按行序优先l多维数组:最右下标变化最快例 int a34; float b25; int c234; int a3,4; ()行数列数元素个数=行数*列数int a32a01a10

6、a11a20a21014523a00a00 a01a10 a11a20 a21int c23401234567.20212223c000c001c002c003c010c011c012c013c020c021c022c023c100c101c102c103c110c111c112c113c120c121c122c1235.2 二维数组及多维数组12例 int a34;20161720181920202120222320089201011201213201415200012002320045200067a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23每个

7、元素ai由包含4个元素的一维数组组成二维数组a是由3个元素组成a0a1a2行名014523a01a02a03a10a11a00a13a20a21a22a23a1267101189a0a1a2二维数组理解13形式: 数组名下标下标二维数组元素的初始化l分行初始化: 例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部初始化l按元素排列顺序初始化 例 int a23=1,2,4;a00 a01 a02 a10 a11 a12120400部分初始化 例 int a3=1,4,5;a00 a01 a02 a10 a11 a12100450第一维长度

8、省略初始化 例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部初始化 例 int a23=1,2,4;a00 a01 a02 a10 a11 a12124000部分初始化 例 int a3=1,2,3,4,5;a00 a01 a02 a10 a11 a12123450第一维长度省略初始化二维数组元素的引用14例 将二维数组行列元素互换,存到另一个数组中a=1 2 34 5 6b=1 42 53 6#include main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for

9、(i=0;i=1;i+) for(j=0;j=2;j+) printf(%5d,aij); bji=aij;printf(n); printf(array b:n); for(i=0;i=2;i+) for(j=0;jmax真假max=aijrow=icolum=j输出:max和row,colum#include main() int a34=1,2,3,4, 9,8,7,6, -10,10,-5,2; int i,j,row=0,colum=0,max; max=a00; for(i=0;i=2;i+) for(j=0;jmax) max=aij; row=i; colum=j; print

10、f(max=%d,row=%d, colum=%dn,max,row,colum);例 求二维数组中最大元素值及其行列号16字符数组v定义 v字符数组的初始化l逐个字符赋值l用字符串常量v字符数组的引用例 char c10, ch34; 例 char ch5=H,e,l,l,o;ch0Hello逐个字符赋值ch1ch2ch3ch4有问题! 例 char ch5=H,e,l,l,o;ch0Hello逐个字符赋值ch1ch2ch3ch4 例 char ch5=B,o,y;ch0Boy00逐个字符赋值ch1ch2ch3ch4 例 char ch5=“Boy”;ch0Boy00用字符串常量ch1ch2

11、ch3ch4 例 char ch6=“Hello”; char ch6=“Hello”; char ch=“Hello”;用字符串常量ch0Helloch1ch2ch3ch40ch55.3 字符数组和字符串17 例 char diamond5=., .,*,.,*,.,*, *, ., ., . ,*,.,*, .,*,., .,*;二维字符数组初始化.*00.*.*0*.*.*.*0.*00diamond0diamond1diamond2diamond3diamond4 例 char fruit7=“Apple”,”Orange”, ”Grape”,”Pear”,”Peach”;二维字符数组

12、初始化fruit0fruit1fruit2fruit3fruit4Apple00Orange0Grape00Pear000Peach00例子例子18v字符串及其结束标志l无字符串变量,用字符数组处理字符串l字符串结束标志:0例 “hello”共5个字符,在内存占6个字节 字符串长度5 h e l l o 0104 101 108 108 111 0内存存放字符ASCII码字符串19l逐个字符I/O: %cl整个字符串I/O: %s例 用%c main() char str5; int i; for(i=0;i5;i+) scanf(“%c”, &stri); for(i=0;i5;i+) pr

13、intf(“%c”, stri);例 用%s main() char str5; scanf(“%s”, str); printf(“%s”, str);用字符数组名,不要加&输入串长度数组维数遇空格或回车结束自动加0用字符数组名,遇0结束字符串的输入输出20main() int i; char a5; scanf(%s,a); for(i=0;i5;i+) printf(%d,ai);运行情况:(1)若输入 hel , 正常(2)若输入 hell , 正常(3)若输入 hello , 用%s 输出时,会出现问题 h e l 0 h e l l 0 h e l l o输入字符串长度数组维数例子

14、例子21 H o w 0 a r e 0 y o u ? 0 #include main() char a15,b5,c5; scanf(%s%s%s,a,b,c); printf(a=%snb=%snc=%sn,a,b,c); scanf(%s,a); printf(a=%sn,a);运行情况:输入:How are you?输出:a=How b=are c=you?输入:How are you?输出:a=Howscanf中%s输入时,遇空格或回车结束运行情况:输入:How are you?例 字符串输入举例22包含在头文件 string.hu字符串输出函数puts(stdio.h)格式:pu

15、ts(字符数组)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以0结束u字符串输入函数gets(stdio.h)格式:gets(字符数组)功能:从键盘输入一以回车结束的字符串放入字符数组中, 并自动加0说明:输入串长度应小于字符数组维数例 #include main( ) char string80; printf(“Input a string:”); gets(string); puts(string); 输入: How are you?输出: How are you ? 常用的字符串处理函数23u字符串连接函数strcat格式:strcat(字符数组1,字符数组2)功能:把字

16、符数组2连到字符数组1后面返值:返回字符数组1的首地址说明:字符数组1必须足够大 连接前,两串均以0结束;连接后,串1的0取消, 新串最后加0u字符串拷贝函数strcpy格式:strcpy(字符数组1,字符串2)功能:将字符串2,拷贝到字符数组1中去返值:返回字符数组1的首地址说明:字符数组1必须足够大 拷贝时0一同拷贝 不能使用赋值语句为一个字符数组赋值例 char str120,str220; str1=“Hello!”; () str2=str1; ()常用的字符串处理函数(1)24u字符串比较函数strcmp格式:strcmp(字符串1,字符串2)功能:比较两个字符串比较规则:对两串从

17、左向右逐个字符比较(ASCII码), 直到遇到不同字符或0为止返值:返回int型整数,a. 若字符串1 字符串2, 返回正整数 c. 若字符串1= 字符串2, 返回零说明:字符串比较不能用“=”,必须用strcmpu字符串长度函数strlen格式:strlen(字符数组)功能:计算字符串长度返值:返回字符串实际长度,不包括0在内例 对于以下字符串,strlen(s)的值为:(1)char s10=A,0,B,C,0,D;(2)char s =“tv0willn”;(3)char s =“x69082n”; 答案:1 3 1常用的字符串处理函数(2)25#include #include mai

18、n() char str1 = ”Hello!, str2 = ”How are you?”,str20; int len1,len2,len3; len1=strlen(str1); len2=strlen(str2); if(strcmp(str1, str2)0) strcpy(str,str1); strcat(str,str2); else if (strcmp(str1, str2)0) strcpy(str,str2); strcat(str,str1); else strcpy(str,str1); len3=strlen(str); puts(str); printf(”Le

19、n1=%d,Len2=%d,Len3=%dn”,len1,len2,len3);How are you?Hello!Len1=6,Len2=12,Len3=18Ch6_23.c例例 strcmp与与strlen举例举例26例 输入一行字符,统计其中有多少个单词输入一字符串给 string i=0 num=0 flag=0当(c=stringi)!=0)c=空格真真假假flag=0flag=1num=num+1i=i+1输出:numflag=0#include main() char string81; int i,num=0,flag=0; char c; gets(string); for(

20、i=0;(c=stringi)!=0;i+) if(c= ) flag=0; else if(flag=0) flag=1; num+; printf(There are %d words in the linen,num);应用举例27当前字符=空格是否未出现新单词,使flag=0,num不累加前一字符为空格(flag=0),新单词出现,flag=1,num加1前一字符为非空格(flag=1),未出现新单词,num不变否0是11是1未01否0是12否1未12是1未02否0是13是1未03否0是14否1未14否1未14否1未14例 输入:I am a boy. 当前字符是否空格flag原值新单

21、词开始否flag新值num值Iamaboy.例子图解例子图解2892 85 68 75 54 88 98 45 61 7992856854889845756179a0a1a2a3a4a5a6a7a8a9a#include main() int k , a10; for(k=0;k10;k+) scanf(“%d”,&ak); for(k=0;k%sn,str1);31运行结果:Enter string No.1:abcdefghEnter string No.2:IJKLMNOPQRSstring No.1-abcdefghIJKLMNOPQRS32l题目:从键盘输入若干行文本,每行以回车结束

22、,从键盘输入若干行文本,每行以回车结束,以以 ctrl+z 作为输入结束符,统计其行数。作为输入结束符,统计其行数。l分析:数据结构:l由于只统计行数,所以不必使用数组存储文本内容,只须定义一个字符变量暂存读入的字符。算法要点:l读入字符可以用 getchar() 函数。l每读入一个字符,要判断是否输入结束l要判断读入的是否回车符,定义一个整型变量回车符进行计数,以实现统计行数的功能。33#includemain() int c,nl; nl=0; while(c=getchar()!=EOF) if(c=n) +nl; printf(%dn,nl);34运行结果:This supplemen

23、t is designed as a tutorialfor a student who uses Data Structureswith C+ without the language backgroundor who wishes for a quick review of basicC+ concepts.535l题目:把输入的字符串逆序排列,并显示。把输入的字符串逆序排列,并显示。l分析:数据结构:l输入的字符串用字符数组存放。算法要点:l逆序排列用交换算法,求出字符串最后一个字符的下标,然后将第一个和最后一个交换,第二个和倒数第二个交换,.。36main() char str80;

24、int c,i,j; printf(Enter a string:n); scanf(%s,str); for(i=0,j=strlen(str)-1;ij;i+,j-) c=stri; stri=strj; strj=c; printf(nReversed string:n%sn,str);37运行结果:Enter a string:abcdefghReversed string:hgfedcba38l题目:从键盘输入字符,以从键盘输入字符,以 ctrl+z 结束,统计输入结束,统计输入的数字的数字 09、空白符和其它字符的个数。、空白符和其它字符的个数。l分析:数据结构:l定义一个具有 1

25、0 个元素的整型数组来存放数字 09 的个数。l定义两个整型变量来存放空白符和其它字符的个数。算法要点:l计数用的数组和变量要初始化为0。l用循环结构处理字符读入,内嵌分支结构处理计数。39#includemain() int c,i,nwhite,nother,ndigit10; nwhite=nother=0; for(i=0;i=0&c=9) +ndigitc-0; else if(c= |c=n|c=t) +nwhite; else +nother; for(i=0;i=a&ai=z)? ai-a+A:ai; while(ai+!=0); printf(Copyed string:n%

26、sn,b);43运行结果:Enter a string:ProgrammerCopyed string:PROGRAMMER44l题目:从一个三行四列的整型二维数组中查找第一个出现从一个三行四列的整型二维数组中查找第一个出现的负数。的负数。l分析算法要点用两层嵌套的 for 循环来遍历数组元素,判断是否为负数。当找到第一个负数时就应该退出循环,为此,应定义一个标记变量,用于标记找到与否的状态,并将此标记加入循环控制条件中,以控制循环在适当时候退出。45main() int i,j,found,num34; printf(Enter 12 integers:n); for(i=0;i3;i+)

27、for(j=0;j4;j+)scanf(%d,&numij); found=0; for(i=0;i3 & !found;i+) for(j=0;j4 & !found;j+)found=numij0; if(!found) printf(not foundn); else printf(minus number num%d%d:%dn, i-1,j-1,numi-1j-1);46运行结果:Enter 12 integers:3 5 56 1 45 -6 43 -1 1 4 -8 15minus number num11:-647l题目用筛选法求用筛选法求100以内的素数以内的素数l分析数据结

28、构l定义一个具有 100 个元素的数组,用来标记整数 1100是否素数。0表示非素数,1表示素数。算法要点l本例使用筛选法:1不是素数,从不是素数,从2开始,每找到一个开始,每找到一个素数,便将其倍数全部标记为非素数,最后省下的便素数,便将其倍数全部标记为非素数,最后省下的便是素数。是素数。48N-S图定义及初始化变量定义及初始化变量将将 1 标记为非素数标记为非素数n=1; n=100; n+n=1; n=100; n+n是素数?是素数?YN输出输出 n将将 n 的所有倍数都标的所有倍数都标记为非记为非素素数数49#include#define SIZE 100#define PWIDTH

29、10main() char sieveSIZE; int i,n,printcol; for(i=0;iSIZE;i+) sievei=0; /0表示i为素数 sieve0=1; printcol=0;50 for(n=1;n=PWIDTH) /打印控制 putchar(n); printcol=0; for (i=n;i=6|select=0) /*输入功能号有误处理*/ printf(* * * 输入有误,请重新功能号1-5:* * *n); goto INPUT; aver=0;55switch(select) case 1: /*按学号查询功能*/ printf(请输入查询学生的学号n

30、); scanf(%d,&num); for(i=0;iN;i+)if(num=scorei0) for(j=1;jM;j+) printf(%d号课程成绩是%dn,j,scoreij); aver+=scoreij; printf(%d号学生的平均成绩为%dn,num,aver/(M-1); break; 56case 2:/*按课程查询功能*/ printf(请输入查询课程的代号(1-%d):n,M-1); scanf(%d,&j); for(i=0;iN;i+) printf(%d号学生的成绩为%dn,i+1,scoreij); aver+=scoreij; printf(%d号课程的平

31、均成绩为%dn,j,aver/N); break; 57case 3:/*按学号和课程查询功能*/ printf(请输入查询的学生学号和课程代号:n); scanf(%d%d,&num,&j); for(i=0;iN;i+) if(num=scorei0) printf(%d号 学 生 %d号 课 程 成 绩 为%dn,num,j,scoreij); break; case 4:/*输入学生原始数据*/ printf(请依次输入%d个学生的%d门成绩(学号、各门成绩)n,N,M-1); for(i=0;iN;i+) for(j=0;jM;j+) scanf(%d,&scoreij); break; default:break; 58运行结果: 运行程序后出现功能菜单,用户根据需要选择相应的功能序号( 15 )执行即可。

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

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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