




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计吉林大学珠海学院计算机系第4章 数组 一维数组的定义和引用 二维数组的定义和引用 字符数组和字符串 数组元素的查找和排序 4123本章内容数组的基本概念所谓数组,是用一个名字去代表相同数据类型元素的有序集合,用对应的序号来区分这个集合中的一个个元素。所起的名字称为数组名,序号称为数组元素的下标用一个下标来区分其元素的数组,称为一维数组;用两个或多个下标来区分其元素的数组,称为二维数组或多维数组一维数组一维数组的定义数据类型 数组名常量表达式;例如: int sum3;说明一个整型数组,数组名称sum,共有3个int型变量元素:sum0,sum1,sum2C语言数组元素下标从0开始
2、C语言规定,数组名就是分配给该数组存储区的首地址,即数组第一个元素存放的地址一维数组一维数组在内存的存放编译时分配连续内存,例如:int a6 如图内存字节数=数组大小*sizeof(元素数据类型)6 * sizeof(int) = 6 * 4 = 24 字节a00145a1a2a3a4a523a一维数组例:输出数组num3中各元素的地址和值#include void main ()int num3,i;num0=1;num1=2;num2=3;for(i=0;i=2;i+)printf(num%d=%dn,i,numi);for(i=0;i=2;i+)printf(num%d的地址是%pn,
3、i,&numi); #include void main ()int num3;printf(num的首地址是%pn,num); 一维数组一维数组的引用数组名下标数组必须先定义,后使用只能逐个引用各元素,不能一次引用整个数组例 int a10; printf (“%d”, a); 引用错误而 for ( j = 0; j 10; j+ ) printf (“%d t ”, aj); 引用正确一维数组一维数组的初始化赋值1. 在定义数组时,对数组全部元素赋初值int a3=1,2,3; 等价于下面形式int a3;a0=1; a1=2; a2=3; 2. 在定义数组时,对数组部分元素赋初值,系统
4、为其余元素赋 0 int a3=1,2; a0=1; a1=2; a2=0;一维数组3. 当初值个数多于数组元素个数时,编译出错int a3=1,2,3,4;4. 绝不能用如下方式为数组元素赋值int a3; /* 说明时,没对元素赋值 */a = 1, 2, 3; /* 错误的语句 */一维数组例:输入5个字符,然后按相反的次序输出 #include void main() char ch5; int i; for (i=0; i = 0; i-) printf (%c, chi); printf (n);一维数组例:求一维数组中所有元素的平均值#include #define NUM 10
5、void main() int aNUM=9,8,7,6,5,4,3,2, i; float average=0; for( i=0; i NUM; i+ ) average = average + ai; average = average / NUM; printf(“The average is:%fn, average);一维数组例:用一维数组求Fibonacci数列前20个数#include #define NUM 20void main() int i; int fNUM=1,1; for(i = 2; i NUM; i+) fi = fi-2+fi-1; for(i = 0; i
6、 NUM; i+) printf(%6d n, fi); 二维数组二维数组的定义 类型说明符 数组名常量表达式1常量表达式2;例如:int a23;一个名为a的二维整型数组:共有3*2=6个元素,每个都是int型变量。第1维下标从0变到1,第2维下标从0变到2。这6个元素的名称分别是: a0a00a01a02a1a10a11a12二维数组可以把a数组看作是包含2个元素的一维数组,每个元素又是一个含有三个元素的一维数组a0- a00,a01, a02a0是数组名,是元素a00的地址a1- a10,a11,a12a1是数组名,是元素a10的地址二维数组二维数组元素在内存中的存放按行连续存放int
7、a23地址值数组元素2000HA002004HA012008HA02200CHA102010HA112014HA12二维数组对于数组amn,元素aij的位置:Loc( aij)=Loc(a00)+i*n+j*sizeof(元素数据类型) 二维数组例4.5:输出数组a2 3的首地址和各元素地址 #include void main() int j, k, a23; printf (a=%p n, a); for (j=0; j2; j+) printf(a%d=%p , j, aj); printf (n); for (j=0; j2; j+) for (k=0; k3; k+) printf(
8、&a%d%d=%pn, j, k, &ajk); 二维数组二维数组的初始化赋值分行对二维数组进行初始化int a23=1, 2, 3, 4, 5, 6; 等价于int a23;a00=1; a01=2; a02=3;a10=4; a11=5; a12=6;不分行将所有数据依次列在一个花括号中int a23=1, 2, 3, 4, 5, 6;分行进行初始化时,可只对部分元素赋初值int a23=1, 4; a00=1,a10=4,其它元素都为0二维数组二维数组的的引用数组名行下标表达式列下标表达式int a34;a00=3; a01=a00+10;二维数组例:将数组a33行列转置后保存到数组b
9、数组a行列转置后保存到数组b中,就是将数组a的第i 行元素作为数组b第i列元素 bji = aij 1 2 3 1 4 7 例如:a = 4 5 6 b = 2 5 8 7 8 9 3 6 9 二维数组例4.6:将数组a3 3行列互换后输出 #include void main() int i,j; int a33=1,2,3,4,5,6,7,8,9; int b33; for(i=0; i 3; i+) /将输出aij,依次存到bji for(j=0; j 3; j+) printf(%5d , aij); bji = aij; printf(n); printf(-n); for(i=0;
10、 i 3; i+) for(j=0; j 3; j+) printf(%5d , bij); printf(n); 二维数组例4.7:输入多名学生多门课程的成绩,分别求每个学生的平均成绩和每门课程的平均成绩定义一个二维数组,用来保存学生各门课成绩。每一行表示某个学生的各门课成绩、平均成绩,每一列表示某门课所有学生成绩、课程平均成绩因此,在定义这个学生成绩的二维数组时行数和列数要比学生人数及课程门数多1二维数组例4.7:输入多个学生多门课程的成绩,分别求每个学生的平均成绩和每门课程的平均成绩#include #define NUM_std 5 /定义符号常量学生人数为5#define NUM_c
11、ourse 4 /定义符号常量课程门数为4void main ( ) int i, j; /定义成绩数组,各元素初值为0 float scoreNUM_std+1NUM_course+1 = 0; for (i = 0; i NUM_std; i+) for (j = 0; j NUM_course; j+) printf (input the mark of %dth course of %dth student: , j+1, i+1); scanf (“%f”, &scoreij); /输入第i个学生的第j门课成绩 for (i = 0; i NUM_std; i+) for (j =
12、0; j NUM_course; j+) scoreiNUM_course += scoreij; /第i个学生的总成绩 scoreNUM_stdj += scoreij; /第j门课的总成绩 scoreiNUM_course /= NUM_course; /第i个人的平均成绩 二维数组例4.7:输入多个学生多门课程的成绩,分别求每个学生的平均成绩和每门课程的平均成绩 for (j = 0; j NUM_course; j+) scoreNUM_stdj /= NUM_std; /求第j门课的平均成绩 printf (“ NO. C1 C2 C3 C4 AVER n”); /输出每个学生的各科
13、成绩和平均成绩 for (i = 0; i NUM_std; i+) printf (STU%dt, i+1); for (j = 0; j NUM_course+1; j+) printf (%6.1ft, scoreij); printf (n); printf (-); /输出1条短划线 printf (n AVER_C ); for (j = 0; j NUM_course; j+) /输出每门课程的平均成绩 printf (%6.1ft, scoreNUM_stdj); printf (n);字符数组与字符串字符数组的定义char 数组名常量表达式char a 15;a数组是一维字符
14、数组,它可以存放15个字符或一个长度不大于14的字符串char 数组名常量表达式1 常量表达式2char b35;b数组是一个二维的字符数组,可以存放15个字符或3个长度不大于4的字符串字符数组与字符串字符数组的初始化赋值1. 用字符常量赋初值char c5=C,h, i, n, a ;char c6=C,h, i, n, a , 0;ChinaChina0字符串长度等于0的下标字符数组与字符串2. 用字符串常量赋初值char str10= a string; char str10= a string;char a310=basic,pascal,c;astring00basic00000pa
15、scal0000c000000000字符数组与字符串区分0与00 = 0逻辑假0 = 48逻辑真0与0字符数组与字符串区分A与AAA1.占1个字节;2.是一个字符;3.格式符%c;4.赋值方式:char ch;ch = A; 或char ch = A;1.占2个字节;2.是一个字符串;3.格式符%s;4.赋值方式:char s2;strcpy(s,A);或char s2=A;字符数组与字符串例:将字符串的大写字母转换成小写字母#include void main() char str80; int i; for ( i=0; i= A & stri = Z) stri += 32; stri=
16、0; for (i=0; stri != 0; i+) printf(%c, stri); printf (n%sn“, str); 字符数组与字符串对字符数组中的字符串进行逐个字符处理:for (i=0;stri != 0;i+) for(i=0; stri; i+)stri != 0功能是从第一个字符开始,逐个验证其是否为字符结束标志0用格式符%c和%s对字符数组进行输入或输出字符数组与字符串gets( )函数格式:gets(字符数组)功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加0说明:输入串长度应小于字符数组维数例:char str80; gets (str);输入hel
17、lo china时,str将是 hello china!字符数组与字符串scanf()函数格式:scanf(“%s”, 字符数组) 功能:从键盘输入一以空格或回车结束的字符串放入字符数组中,并自动加0说明:输入串长度应小于字符数组维数例:char str80; scanf (%s, str);输入hello china时, str将是hello字符数组与字符串scanf()函数scanf函数可以连续输入多个字符串,输入时,字符串间用空格分隔 char str140, str240, str40;scanf (%s%s%s, str1, str2, str3); 输入:I love china
18、str1:I,str2:love,str3:china字符数组与字符串scanf()函数使用%ns限制输入的字符个数 char str10; scanf (%9s, str); 最多可读入9个非空格字符到str中 字符数组与字符串gets( )函数 和scanf()函数的区别gets()scanf( )输入的字符串中可包含空格输入的字符串中不可包含空格只能输入一个字符串可连续输入多个字符串不可限定字符串的长度可限定字符串的长度遇到回车符结束遇到空格符或回车符结束字符数组与字符串puts( )函数格式:puts(字符串地址) 功能:向显示器输出字符串(输出完,换行)说明:如果是字符数组,则必须以
19、0结束char str = I love china! ;puts (str); puts (I love zhuhai! );输出结果: I love china! I love zhuai!字符数组与字符串printf()函数格式:printf(%s, 字符串地址)功能:依次输出字符串中的每个字符直到遇到字符0(0不会被输出)char str = John Smith;printf (“%s , str); printf (%s , &str5); 输出结果 John Smith Smith#include void main()char str80=a,b,c,0,d,e,0; puts
20、(str);printf (%sn, str); 字符数组与字符串例:输入一行字符,统计单词个数(空格分隔)#include #define TRUE 1#define FALSE 0void main() char str80; int i, num = 0, word = FALSE; gets (str); for (i = 0; stri != 0; i+) if (stri = ) word = FALSE; else if ( word = FALSE ) word = TRUE; num+; printf (There are %d words in the line.n, nu
21、m);字符串处理函数字符串头文件 string.hstrcatstrcpystrcmpstrlwrstrlenstrupr字符串处理函数char str1100=“hello”;char str2100=“world”;字符串连接函数 :strcat(str1, str2)把str2中的字符串连接到str1字符串的后面,结果放在str1数组中,函数值是str1的值字符串复制函数 :strcpy(str1, str2)将str2中的字符串复制到str1数组中不能使用 str1=str2 来给str1赋值字符串长度函数 :strlen(str1)功能:测试字符串长度(即str1中字符的个数)字符串
22、处理函数字符串比较函数 :strcmp(str1, str2)abcde0str1str2abcde0abc0 str1str2str1str2strcmp(str1,str2)=0strcmp(str1,str2)0strcmp(str1,str2)0abcde0abcd0 Abcde0字符串处理函数字符串比较函数 :strcmp(str1,str2)不能使用“ str1 = str2 ”对两个字符串str1和str2进行比较,只能用strcmp()函数及其返回值,来判定它们之间的关系字符串处理函数char str1100=“HELLO”;char str2100=“world”;大写字母转
23、换成小写字母函数 :strlwr(str1)将str1字符串中的大写字母转换成小写字母小写字母转换成大写字母函数 :strupr(str2)将str2字符串中的小写字母转换成大写字母字符串处理函数例:编程实现strlen( )函数的功能#include void main() char ch80; int j = 0, len = 0; gets(ch); while ( chj+ != 0) len+; printf (Length of %s = %d n, ch, len );字符串处理函数例:编程实现strlen( )函数的功能#include void main() char ch8
24、0; int j = 0, len = 0; scanf(“%s”,ch); while ( chj+ != 0) len+; printf (Length of %s = %d n, ch, len );字符串处理函数例:编程实现strcat( )函数的功能进行连接,须先找第1个字符串的结尾 (即字符串结束符所在位置)。从那开始,将另一个字符串内容复制过来。while循环就是顺着数组str1往后找字符串结束符所在的位置(由变量j记录)然后由dowhile循环,让str1从j+k开始顺序存放str2里的字符,直到遇见字符串结束符。最后,不要忘记在str1的最后添加字符串结束符字符串处理函数例4
25、.11:编程实现strcat()函数的功能#include void main() char str180, str280; int j = 0, len = 0, k = 0; printf (Please enter first string: ); gets(str1); printf (Please enter second string: ); gets(str2); while (str1j+ !=0) len+; do str1len+k = str2k; k+; while( str2k != 0); str1len+k = 0; printf (The result stri
26、ng str1 is:n%s n, str1);字符串处理函数例:编写检验密码程序,用户输入密码后,若正确则显示信息:Now you can do something!若输入错误,则显示信息:Invalid password. Try again!,并控制至多重复3次。如3次出错,再给出信息:I am sorry, bye-bye!。 假定我的密码是admin字符串处理函数例4.12:编写检验密码程序#include #include main()char password20; int k; for ( k=1; k=3; k+ ) printf (Please enter your pas
27、sword:); gets(password); if (strcmp (password, admin) != 0) if(k3) printf (Invalid password. Try again!n); else printf (Invalid password. ); else break; if (k a1,则交换;然后比较第2个数与第3个数;依次类推,直至第n-1个数和第n个数比较为止 第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上 2. 对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置数组元素的排序和查找3. 重复上述过程,经过n-1趟冒泡排
28、序后结束4. 在第j趟比较中,要进行n-j次两两比较for (i=0; iN; i+) 输入ai for (j=1; jN; j+) for (i=0; iai+1 T F ai与ai+1交换输出a0aN-1数组元素的排序和查找38 49 65 76 13 27 30 第二趟38 49 65 13 27 30 第三趟38 49 13 27 30 第四趟38 13 27 30 第五趟13 27 30 第六趟13 27 第七趟49 38 65 97 76 13 27 30 第一趟384976971397279730971376767627301365276530651313494930492738
29、2738303813 每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其它元素;数组元素的排序和查找例4.13:将10个整数按照从小到大的顺序排序#include #define NUM 10void main () int aNUM, i, j, temp; printf (input %d numbers: n, NUM); for (i=0; iNUM; i+) scanf (%d, &ai); for (i=1; iNUM; i+) /趟数,共NUM-1趟 for (j=0; jaj+1) /交换aj和aj+1 temp=aj; aj=aj+1; aj+1=temp; p
30、rintf (the sorted numbers:n); for (i=0; iNUM; i+) printf(%d , ai);数组元素的排序和查找对冒泡排序的改进: 在一次冒泡排序过程中如果发现没有交换操作时,表明序列已经排好序了,便终止冒泡操作为了标记在比较过程中是否发生了数据交换,在程序中设立一个标志变量flag。在每趟比较前,把flag变量置为0;如果在这趟比较过程中发生了交换,把变量flag的值置为1。在这一趟比较结束后判断:如果flag变量取值等于0,表示可以结束排序过程,否则进行下一趟比较数组元素的排序和查找例4.13:将10个整数按照从小到大的顺序排序#include #d
31、efine NUM 10void main ()int aNUM, i, j, temp, flag, num=0; printf (请输入%d个数: n, NUM); for (i=0; iNUM; i+) scanf (%d, &ai); for (i=1; iNUM; i+) /趟数,共NUM-1趟 for (j=0; jaj+1) /交换aj和aj+1 temp=aj; aj=aj+1; aj+1=temp; flag = 1; num+; if (flag = 0) break; printf (共比较%d趟n,num); printf (排序后结果是:n); for (i=0; i
32、ai,则交换。第一趟选择排序的结果,最小的数被安置在第一个元素位置上 2.将第2个数依次与第3个数、第4个数 第n个数进行选择排序。第二趟选择排序的结果,次小的数被安置在第二个元素位置上数组元素的排序和查找3. 重复上述过程,经过n-1趟选择排序后结束4. 在第j趟比较中,要进行n-j次两两比较for (i=0; iN; i+) 输入ai for (j=0; jN-1; j+) for (i=j+1; iai T F aj与ai交换输出a0aN-1数组元素的排序和查找例4.14:将10个整数按照从小到大的顺序排序#include #define NUM 10void main ( )int a
33、NUM, i, j, temp; printf (input %d numbers: n, NUM); for (i = 0; i NUM; i+) /输入NUM个整数 scanf (%d, &ai); for (j=0; j NUM-1; j+) /确定基准位置 for(i = j+1; i ai) temp = aj; aj = ai; ai = temp; printf (the sorted numbers:n); for (i = 0; i NUM; i+) /输出排好序的数据 printf (%d , ai); printf (n); 数组元素的排序和查找所谓查找(search)是
34、指在数组中查找与给定值相同的数组元素查找算法顺序查找法二分查找法数组元素的查找和排序顺序查找法顺序查找法是最简单的查找方法。若在一个一维数组an中查找给定值x,其过程是:先从数组的第一个元素a0查起,看是否等于x,若等于x,即找到了,否则,接着查找第二个元素a1,第三个元素a2,直到an-1顺序查找法不要求被操作的数组是否排序数组元素的查找和排序例:在a10查找元素值x#include void main() int a10=12,8,54,11,22,55,61,74,24,35; int x,i,flag=0; printf(Please input a decimal number n); scanf(%d,&x); for(i=0; i10; i+) if(ai = x) flag=1; break; if (flag = 0 ) printf(Not foundn); else printf(a%d = %dn, i, ai);数组元素的查找
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业科技园区用地购置居间
- 项目立项和可行性研究报告顺序
- 新能源汽车充电桩的公司
- 公司日常行为规范及管理办法
- 心电监护仪的使用与维护指南
- 游戏开发引擎跨平台移植指南
- 智能仓储物流项目
- 雨水如何收集系统
- MES系统:制造业智能化管理与流程优化的关键
- 美容师中级考试复习测试卷附答案
- 娃哈哈公司员工手册
- 2024年新大象版四年级下册科学全册精编知识点总结
- 风险管理组织架构课件
- 社会主义核心价值观和谐课件
- 新概念二-第24课课件
- 17、18世纪欧洲美术
- 明天版幼儿园大班语言领域《尖嘴巴和短尾巴》课件
- AC800M特点优势课件
- 脑出血完整分
- 电气工程及其自动化的发展趋势
- 人教版 七年级下册 历史 期中测试(一)
评论
0/150
提交评论