版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 构造数据类型 -数组和结构体,计算机与信息技术学院 靳小燕,内 容 提 要,数组类型; 常用算法:排序、查找等; 难点:二维数组应用 向函数传递一维数组和二维数组; 用字符数组存取字符串; 使用字符串处理函数处理字符串; 结构体,5.1 数组概述 5.2 一维数组 5.3 一维数组应用 5.4 二维数组 5.5 数组作函数的参数 5.6 字符数组与字符串 5.7 结构体,练习,数学黑洞问题,取任意一个4位数(4个数字均为同一个数的除外),把四个数字对调后组成一个最大的数和一个最小的数,两数相减得出一个新数,重复以上过程,至多7次,就会得到6174,且不再变化。 例子:以7642为例:7
2、642-24675175;7551-15575994;9954-45995355;5553-35551998;9981-18998082;8820-02888532;8532-23586174;7641-14676174,程序演示,运行结果,5.1 数组概述,构造数据类型之一 定义:数组是有序数据的集合 例如: int a30; 组成数组的数据称为数组的元素 数组的每个元素都属于同一个数据类型 每个数组要用一个统一的标识符标识 用处:保存大量同类型的相关数据 如矩阵运算,表格数据等,定义 引用 初始化 输入和输出 举例,5.2 一维数组,数据类型说明符 数组名常量表达式,合法标识符,例 int
3、 a6=1,3,5,7,9,11,编译时分配连续内存 内存字节数=数组元素的个数* sizeof(元素数据类型,数组名表示内存首地址,是地址常量,常量表达式中可以包括 符号常量和符号常量, 不能包括变量,定义,一维数组,引用,数组必须先定义,后使用 只能逐个引用数组元素 例如,定义数组 int a8,数组元素为: a2=1; ai+j;(i,j为整型变量,下标的值不要超过数组的范围,注意,一维数组,例5.2-1 #include void main() int a = 1, c = 2, b5, i; printf(%p,%p,%pn,b,初始化 初始化方式,在定义数组时,为数组元素赋初值(在
4、编译阶段使之得到初值,int a5=1,2,3,4,5;等价于:a0=1; a1=2; . a4=5,说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值,当全部数组元素赋初值时,可不指定数组长度,如 int a5=6,2,3; 等价于: a0=6; a1=2;a2=3; a3=0; a4=0,static int a5; 等价于:a0=0; a1=0; a2=0; a3=0; a4=0,只给部分数组元素赋初值,int a=1,2,3,4,5,6; 编译系统根据初值个数确定数组的大小,输入和输出,C语言规定,对数组的使用只能逐个引用数组元素,不能一次引用整
5、个数组。同样,对数组的输入和输出也是依次对每个元素进行的。 例 输入10个数,并将它们输出,printf(please enter the data:n); for(i=0;i10;i+) scanf(%d,printf(output the data:n); for(i=0;i10;i+) printf(%d ,arrayi); printf(n);,输入,输出,定义,printf(min=%dn,min);,include void main() int i,min,x10,printf(enter data:n); for(i=0;i10;i+) scanf(%d,min=x0; for
6、(i=1;i10;i+) if(ximin) min=xi,输入,处理,输出,例5.2-2输入10个数,找出最小的算法: 1. 输入:for循环输入10个整数 2. 处理: (a) 先令min=x0 (b) 依次用xi和min比较(循环) 若ximin,令min=xi 3. 输出:min,应用举例,printf(min=%d no=%dn,min,no); return 0;,include int main() int i,min,x10,no,printf(enter data:n); for(i=0;i10;i+) scanf(%d,min=x0; for(i=1;i10;i+) if(
7、ximin) min=xi;no=i,例5.2-3输入10个数,找出最小和下标,算法1,有没有错误,include int main(void) int i, index, n; int a10; printf(“enter n: ); scanf(%d,算法2,例5.2-4 用数组求Fibonacci数列前20个数,include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(n); printf(%12d,fi);,排序 数据查找 数据统计分析,5
8、.3 一维数组应用,排序 排序的方法很多,主要有: 冒泡法 选择法 比较交换法 希尔法 插入法 例5.3-1 用冒泡法对n个整数按从小到大的顺序排列,冒泡法,排序过程: 比较第一个数与第二个数,若a0a1,则交换;然后比较第二个数与第三个数,若a1a2,则交换;依次类推,直至第n-1个数和第n个数比较为止。第一轮结束时,结果最大的数被安置在最后一个位置上。 对前n-1个数进行第二轮排序,结果使次大的数被安置在第n-1个元素位置 重复上述过程,共经过n-1趟冒泡排序后,排序结束; 算法的整体思路是让大的数不断地往下沉,小的数不断地往上冒,所以叫“冒泡排序法,int a5 n=5 a0 a1 a2
9、 a3 a4 第一轮 21 13 90 32 -1,13 21 90 32 -1,13 21 32 90 -1,第二轮,13 21 90 32 -1,13 21 32 -1 90,include #define N 5 void main() int aN , i , j , temp; printf(请输入5个数:n); for( i = 0 ; i N ; i+) scanf(%d,for( i=1; i aj+1 ) temp=aj; aj=aj+1; aj+1=temp;,选择法,基本思想:将第一个元素与第二个到第n个中最小者ap交换(如果apa0),这时n个数中最小的数已调到最前面,
10、这是第一轮的处理结果。依次类推,int a5 n=5 a0 a1 a2 a3 a4 第一轮 21 13 90 32 -1,1 13 90 32 21,第二轮,1 13 90 32 21,for(i=0;iN-1;i+) p=i; for(j=i+1;jN;j+) if(ajap) p=j; if(p!=i) med=ap; ap=ai; ai=med;,include #define N 5 void main() int aN,i ,j ,med,p,temp; printf(请输入10个数:n); for( i = 0 ; i N ; i+) scanf(%d,例5.3-2,例5.3-3
11、输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。 输入:2 9 8 10 6 9 输出:1 输入:2 9 8 10 6 7 输出:Not Found,数据查找-线性查找,折半查找,include int main( ) int i, flag, x; int a5; printf(“Enter 5 integers: ); for(i = 0; i 5; i+) scanf(%d,例5.3-4 折半查找,基本思路是:对已排好序的数列, 先检索中间的一个数据,看它是 否为所需的数据,如果不是, 则判断要找的数据是在
12、中间数的 哪一边 ,然后继续查找,0,1,8,4,7,5,3,6,2,9,10,11,12,13,14,下标,include #define N 50 int main( ) void bi_search(int a,int n, int x); int i, x,n; int aN; printf(“Enter n: ); scanf(%d,void bi_search(int a,int n, int x) /函数定义 int mid, top, bot, find; top = 0; bot = n-1; find = 0; do mid =( top + bot ) / 2; if(
13、x = amid ) printf(找到了%3d,是 a%d,x,mid); printf(n); find = 1; else if( x amid ) top = mid + 1; while( top = bot,数据统计分析,在实际应用中,经常要对大量的数据进行统计、分析和分类等,下面将介绍用数组统计所搜集到的数据。 例5.3-5 在某一次歌唱比赛中,20名评委给某个参赛选手打分,分数等级从110共10个等级,1表示最低,10表示最高,统计打分结果,include #define N 20 void main() int i,j,k=0; int score20=1,2,6,4,10,
14、9,8,3,4,6,7,8,9,5,9,7,8,7,8,5; int frequency11=0; /*存放统计结果*/ for( i= 0; i N; i+) k= scorei; +frequencyk; /*进行统计*/ printf(“ 等级 频率”); for( j=1; j11;j+) printf(“%4d%12d n”, j, frequencyj”);,二维数组的定义 二维数组的初始化 二维数组的引用 二维数组元素在内存中的排列顺序 应用举例,5.4 二维数组,定义方式: 数据类型数组名常量表达式常量表达式,数组元素的存放顺序 内存是一维的 二维数组:按行存放,行数,列数,元
15、素个数=行数*列数,二维数组理解,每个元素ai由包含4个元素 的一维数组组成,二维数组a是由3个元素组成,1,3,5,7,9,二维数组元素的引用 形式: 数组名下标下标 二维数组元素的初始化 int a23=1,2,3,4,5,6; int a23=1,2,3,4,5,6; int a23=1,2,4; int a23=1,4,5,二维数组元素在内存中的排列顺序,按行存放 二维数组的元素在数组中的排列顺序可以计算出来,设一个mn的数组a,数组元素aij 在数组中的排列顺序为in+j+1。 例如: 34数组a,元素a22在数组的排列顺序为24+2+1=11即数组中的第11个元素,例 5.4-1将
16、一个2*3矩阵转置,应用举例,例5.4-2求二维数组中最大元素值及其行列号,include void main() int a34=1,2,3,4, 5,8,0,6, -1,2,-5,2; int i,j,row=0,colum=0,max,printf(max=%d,row=%d, colum=%dn,max,row,colum);,max=a00; for(i=0;imax) max=aij; row=i; colum=j;,include #define MONTHS 12 int main() int days2MONTHS = 31,28,31,30,31,30,31,31,30,3
17、1,30,31, 31,29,31,30,31,30,31,31,30,31,30,31; int year, month; doprintf(Input year,month:);scanf(%d,%d,例5.4-3 输入某年某月,输出该年的该月有多少天,练习 #include void main() int a55, i, j; for(i=0; ij) aij=i+j; else if (ij) aij=i-j; else aij=0,for(i=0;i5;i+) for(j=0;j5;j+) printf(“%4d”,aij); printf(“n”,0 -1 -2 -3 -4 0 -
18、1 -2 -3 3 0 -1 -2 4 5 0 -1 4 5 6 7 0,5.5 数组作函数的参数,数组元素作为函数的实参 数组名作为函数的参数,数组元素作为函数的实际参数,数组名表示数组在内存中存放的起始地址(首地址),即数组第一个元素的地址。 数组元素的引用与一般变量的引用是一样的,传递的是数组元素的值,属于“值传递”方式。 例5.5-1 设a4和b4分别保存了A班和B班四门课程的平均成绩,现要统计出A班有几门课程的平均成绩高于B班。(自学,int better(int ave1,int ave2) if(ave1ave2) return(1); else return(-1,值传递,in
19、lcude void main( ) int i,k=0; int a4=56,88,89,98,b4=60,55,66,77; for(i=0;i0) k=k+1; printf(A班有%d门课程的平均成绩高于B班n,k,C语言中的数组名表示数组在内存中存放的起始地址(首地址),也是第一个元素的地址。 数组名作为函数的参数传递的是数组的起始地址,属于“传地址”,是一种双向传递的方式。 例如: int a5; a 为首地址,数组名作为函数的实际参数,例5.5-2 编写函数,求5个学生英语课的平均成绩,float pj(int b,int n) float ave,sum=0.0; int i;
20、 for(i=0;in;i+) sum=sum+bi; ave=sum/n; return(ave,include void main( ) float pj(int b,int n); int i,a5; float aver; printf(“ enter the datan); for(i=0;i5;i+) scanf(%d,地址传递,65 93 74 82 81,a0 a1 a2 a3 a4,a0 a1 a2 a3 a4,b0 b1 b2 b3 b4,65 93 74 82 81,开始,调用,起始地址 2000,起始地址 2000,练习:编写函数bubble(int b,int n)对
21、n个整数进行从小到大排序,在主函数中输入n个数,调用函数bubble,将排序后的结果在主函数中输出,include #define N 20 void main() void bubble(int ,int) ; int aN,i; printf(tern:n); scanf(%d,for(i=0; in; i+) printf(%d ,ai); void bubble(int b,int n) for( i=1; i ;i+) for(j=0;j ;j+) if( ) temp=bj; bj=bj+1; bj+1=temp;,字符数组的定义及初始化 用字符数组存放字符串 字符串的输入输出 用
22、于字符串处理的函数 应用举例,5.6 字符数组,定义 char str20; 初始化 逐个为数组中各元素指定初值字符。 char str5 =w,e,l,l,0; 对一个字符数组指定一个字符串初值。 char str =morning; char str = morning,定义及初始化,什么是字符串? 字符串是用一对双引号括起来的字符序列,这些字符可以是一般的可显示字符,也可以是某些特殊的控制字符; 无字符串变量,用字符数组处理字符串; 字符串结束标志:0。 C语言中没有字符串变量,字符串存放在一个字符型数组中。因此为了存放字符串,常常在程序中定义字符数组。 例如: char c10,逐个字
23、符I/O: %c 整个字符串I/O: %s,include void main() char str10; gets(str); puts(str); /也可用scanf(),但有限制,include void main() char str10; int i; for(i=0;i5;i+) scanf(“%c”,scanf(,int i;scanf(%d, 不能读入带空格的字符串,gets()可以 这种用法很不安全。当用户的输入多于10个(含10个),str数组将越界。 scanf被公认为最易遭到黑客攻击的函数之一,演示,gets(,字符串输入函数gets()也没有提供限制输入字符串长度的方
24、法,容易引起缓冲区溢出,给黑客攻击以可乘之机。 对输入字符串长度有限制的函数调用 fgets(buf, sizeof (buf), stdin,在中定义了若干专门的字符串处理函数 strcpy(str1, str2): 串复制 strlen(str): 串长度 返回字符串的实际长度,不包括0 strcat(str1, str2): 串连接 strcmp(str1, str2): 串比较,字符串不能直接整体复制,str1=str2 /*错误*,例如: char str112=“Turbo ”; char str2=“c+”; printf(“%s”, strcpy(str1,str2); 输出结
25、果: c,例如: char str112=“Turbo ”; char str2=“c+”; printf(“%s”, strcat(str1,str2); 输出结果: Turbo c,例如: char str112=“Turbo C”; i=strlen(str1); printf(“%d”, i); 输出结果: 7,功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码), 直到遇到不同字符或0为止 返值:返回int型整数, a. 若字符串1 字符串2, 返回正整数 c. 若字符串1= 字符串2, 返回零 说明:字符串比较不能用“=”,必须用strcmp,字符串比较函数
26、strcmp (字符串1,字符串2,例5.6-1 统计一行字符中字母、空格、数字及其他字符的个数 #include void main() char str80; int alphabet=0,digit=0 ,space=0 , other=0, i=0; gets ( str ); for ( i = 0 ; stri != 0; i+ ) if (A= 0) +digit; else +other; printf(“有%d个字母,%d个空格,%d个数字,%d个其他字符:n”, alphabet, space, digit, other);,例5.6-2 #include void mai
27、n( ) char str36=“China”,”Japan”,”Korea”; str05= ; printf(“%sn”,str0);,str0,str1,str2,例5.6-3 按国名确定奥运会入场次序,问题分析: 一个国家名实际上就是一个字符串,可用一维数组来表示,而多个字符串就需要用二维字符数组来表示,因此为表示奥运参赛国的国名,可定义如下二维数组: char name15015,include #include #define MAX_LEN 15 /* 字符串最大长度 */ #define N 150 /* 字符串个数 */ void SortString(char strMAX
28、_LEN, int n); int main() int i, n; char nameNMAX_LEN; /* 定义二维字符数组 */ printf(How many countries?); scanf(%d,什么作用,* 函数功能:冒泡法实现字符串按字典顺序排序 */ void SortString(char strMAX_LEN, int n) int i, j; char tempMAX_LEN; for (i=0; i 0) strcpy(temp,strj); strcpy(strj,strj+1); strcpy(strj+1,temp);,结构体类型的定义 结构体变量的定义和
29、引用 结构体变量的初始化 应用举例,5.7 结构体类型,构造一个结构体类的数据类型的一般形式: struct 结构类型名 类型标识符 成员名; 类型标识符 成员名; : : 类型标识符 成员名;,例如: struct student char number10; char name20; char gender; int age; float score20; char addr30;,定义 先构造结构体类的数据类型,后定义具有这种构造的变量。 struct 结构体类型名 类型标识符 成员名; : 类型标识符 成员名; 变量名1,变量名2,例如: struct student char num
30、ber10; char name20; char gender; int age; float score20; char addr30; stud1,stud2,引用 对结构体变量的使用是通过对其成员的引用来实现的。引用结构体成员的一般形式如下: 结构体变量名成员名 例如 : stud1.age 其中的圆点符号称为成员运算符,它的运算级别最高,struct stud long num; char name20; char gender; char addr30; stud1=9708,”Liwei,F,144BeijingRoad,include struct student char na
31、me20; float s3; float ave; stu3=“li”, 70,80,90,0, “wang”,83,94,75,0, “zhang”,92,86,89,0; void main ( ) int i; for ( i=0; i3; i+) stui.ave=(stui.s0+ stui.s1+ stui.s2)/3; printf(“%s,%5.2fn”, , stui.ave); 输出结果是,li,80.00 wang,83.00 zhang,89.00,例5.7-1 输入3个学生的信息并输出。 #include #include struct stud
32、long num; char name20; char gender; int age; float score;,include #include void main() struct stud student3; int i; char ch; char numstr20; for( i = 0 ; i 3 ; i+) /*输入*/ printf(n输入第%d个学生的数据:n,i); gets(numstr);studenti.num = atol(numstr); gets(); studenti.gender = getchar(); ch = getchar(); gets(numstr); studenti.age = atoi(numstr); gets(numstr); studenti.score = atof(numstr);,printf(nnumtname gender age scoren); for( i = 0 ; i 3 ; i+) printf(%ld%-15s%3c%6d %6.2fn,studenti.num, ,studenti.gender,studenti.age, studenti.score);,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 下半造价师工程计价知识点缺陷责任期考试试题
- 公开课英语单词快速记忆
- 高中语文第3单元古思今赏第8课寡人之于国也课件新人教版必修
- 窗帘布艺:团队卓越之旅-项目管理能力与团队合作精进之路
- 独树一帜的中国画 课件 2024-2025学年人教版初中美术九年级上册
- 高中语文10蜀道难登高课件苏教版必修
- 2024至2030年中国控天线弹簧数据监测研究报告
- 2024至2030年中国引线式石英晶体振荡器行业投资前景及策略咨询研究报告
- 2024至2030年中国差速器十字轴行业投资前景及策略咨询研究报告
- 2024至2030年中国大小鼠灌胃针行业投资前景及策略咨询研究报告
- 食管癌手术配合
- 设备安装调试记录表格
- Brother-TC-S2A机器操作资料课件
- 提高急危重患者转运途中安全率(共40页).ppt
- 二十个大型新建铜矿的生产成本
- 加油站绩效考核方案
- Cr18Ni9Ti钢钨极氩弧焊接焊接工艺要点
- OA项目推进计划(甘特图)
- 错纳矿区Ⅰ号矿体铅锌矿800~1100td的露天开采最终开采境界设计说明
- 丰田A3报告示例
- 聚丙烯(等规)化学品安全技术说明书
评论
0/150
提交评论