版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章,信息学院计算机基础组,数组,1. 一维数组 2. 二维数组 3. 字符数组 4. 字符串处理函数 5. 用文件处理数据,本章主要内容:,5.1 引例,例5-1 从键盘输入十个整数,计算其和值。,方法一程序代码如下: #include void main() int a,sum,i; sum=0; /*计算前将和sum设为0*/ printf(Please input 10 integers:n); for(i=0;i10;i+) /*输入10个整数,依次相加*/ scanf(%d, /*输出和值*/ ,5.1 引例,#include void main() int i,sum; int
2、 a10; /*定义一个数组a,它包含10个整型元素*/ printf(“请输入10个整数:n”); for(i=0;i10;i+) /*输入10个整型数据*/ scanf(“%d”,方法二程序代码如下:,52 一维数组,定义:数组是指具有相同数据类型的数据的有序集合,数组中的一个数据项称为一个数组元素。,521 数组的概念,52 一维数组,522一维数组的定义,例如:float a10;,一维数组存储顺序示意图,关于数组定义的几点说明,类型名:用来指定数组中每一个数组元素的类型,可以是基本类型int,char,float,double,也可以是构造类型如结构体,枚举类型,或者是使用typed
3、ef定义的类型。 数组名:必须是一个合法的标识符。 常量表达式:可以是常量,符号常量或者常量表达式。 注意:不能使用变量动态定义数组的大小。下面定义数组的方法是错误的。 例如: int n; scanf(“%d”,52 一维数组,523一维数组的引用,下标可以是整型常量,整型表达式,也可以是整型变量。,无论下标是常量或变量,它的合理的取值范围为 0数组的长度1,一个数组元素的地位相当于一个普通变量,程序代码如下: #include void main() int max,max_loc,a10,i; /*定义一个数组a,它包含10个整型元素*/ printf(Enter 10 integers
4、:n); for(i=0;i10;i+) scanf(%d, /*假设第一个数即为最大值*/,例5-2从键盘输入十个整数,找出其中的最大值及其位置。,for(i=1;imax) /*当前值大于最大值*/ max=ai; /*用当前值替换最大值*/ max_loc=i; /*记录最大值位置*/ printf(The max data is %dnThe position is %d,max,max_loc); /*输出最大值及其所在位置*/ ,练 习,练习5-1:从键盘输入十个整数,找出其中的最小值及其位置。 练习5-2:从键盘输入十个整数,找出其中的最小值并将其和第一个整数对换。,52 一维数
5、组,524一维数组的初始化,2.对数组元素的初始化可以用以下方式来实现:,(1) 对数组的所有元素赋初值,此时可以省略数组长度。,例如:int a10=0,1,2,3,4,5,6,7,8,9;,2.对数组元素的初始化可以用以下方式来实现:,例如:int a =0,1,2,3,4,5,6,7,8,9;,(2) 对数组部分元素赋初值。,例如:int a10=1,2,3,4,5;,则元素a0a4的值分别为1,2,3,4,5,数组中的 其余元素a6a9的值是0。,52 一维数组,525一维数组的应用,例5-3 利用数组求Fibonacci数列前20个数,并按每行打印 5个数的格式输出。,分析:定义数组
6、f20,其值为Fibonacci数列的值,同使用 循环处理Fibonacci数列相比,使用数组可以保存Fibonacci 数列的值,并且处理变得简单,容易理解。,程序代码如下: #include void main() int i; int f20=1,1; /*定义Fibonacci数组f,前2个元素赋初值1*/ for(i=2;i20;i+) fi=fi-1+fi-2; /*按照Fibonacci数列的规则,给后续元素赋值*/ for(i=0;i20;i+) if(i%5=0) printf(n); printf(%14d,fi); /*按照输出要求,输出Fibonacci数列的前20项*
7、/ ,例5-3 利用数组求Fibonacci数列前20个数,并按每行打印5个数的格式输出。,52 一维数组,525一维数组的应用,例5-4 用“冒泡法”将从键盘输入的10个数据由小到大排序。,N个数冒泡法排序思路如下: 1将N个数,从前向后,将相邻的两个数进行比较 (共比较N1次),每次比较,将小数交换到前面,大数交换到后面,N1次后,最大的数将被移至数据最后。 2取前面N1个数,继续过程1,将N1个数中的最大值 移至最后(位于N个数最大值的前面)。 3取前面N2个数,继续过程1比较直到最后两个数比较 完成。,52 一维数组,525一维数组的应用,原始 数据,第一趟比较4次,第二趟比较 3次,
8、第三趟比较2次,第四 趟比 较1次,排序 后的 数据,程序代码如下: #include void main() int i,j,temp; int a10; printf(input 10 numbersn); for(i=0;i10;i+) scanf(%d,52 一维数组,525一维数组的应用,for(i=0;iaj+1) /*相邻两个数比较*/ temp=aj; aj=aj+1; aj+1=temp; printf(The sorted number:); for(i=0;i10;i+) printf(%8d,ai); ,52 一维数组,525一维数组的应用,例5-5 从键盘输入10个相
9、异的整数,将其存入数组a中,再输入一个随机值k,然后在数组中查找k,如果找到,输出相应的下标,否则输出Not Found。,程序代码如下: #include void main() int i,flag,k; int a10; printf(Enter 10 integersn); for(i=0;i10;i+) scanf(%d, /*flag作为是否找到的标志*/,52 一维数组,for(i=0;i10;i+) if(ai=k) /*找到*/ printf(Found:%d position is %d,k,i); flag=1; break; if(flag=0) /*未找到*/ pri
10、ntf(Not found %d,k); ,525一维数组的应用,练 习,练习5-3:从键盘输入10个整数,将其存入数组a中,再输入一个随机值k,然后在数组中查找k在数组a中出现的次数。 练习5-4: 从键盘输入10个整数,分别统计其中正数、负数和0的个数。,1、以下程序给数组所有的元素输入数据,空处应填入( ) main() int a10,i0; while(i10) scanf(“%d”,_); A) for(i0;imax) maxai;_; _; printf(“nthe position of min is :%3dn”,k); printf(“the position of ma
11、x is:%3dn”,j); for(i0;i5;i+) printf(“%5d”,ai); ,3、程序填空:以下程序的功能是求出数组a中各相邻两个元素的和,并将这些和存放在数组b中,按每行三个元素的形式输出。填空完善程序。 main() int a10,b10,i; for(i=0;i10;i+) scanf(“%d”, ,答案:(1)i=1(2)bi=ai+ai-1(3) (i%3),4、在有10个数的一维数组中,删除由键盘任意输入的数。,例: for(i=0; i10; i+) if (x=ai) k=i; break; if (k10) for(i=k; i10; i+) ai = a
12、i+1; else printf(“无此数!”);,53 二维数组,531二维数组的定义,类型名,数组名和常量表达式的形式均和一维数组相同。 常量表达式1指出了二维数组行长度,常量表达式2指出了 二维数组的列长度。,53 二维数组,531二维数组的定义,例如:int a22;,二维数组存储顺序示意图,53 二维数组,532 二维数组的引用和初始化,注意:行下标和列下标的范围 !行下标的范围为 0行长度-1,列下标的范围是0列长度-1。 二维数组也不能越界引用。,例如:定义了二维数组a33,在引用数组元素时, a23、a30等都是越界元素,不能引用。,引用,53 二维数组,532 二维数组的引用
13、和初始化,分行初始化,初始化的一般形式为: 类型名 数组名常量表达式1常量表达式2=第0行元素初值表, 第1行元素初值表;,例如:int a22=1,2,3,4;,初始化,按数组元素排列的顺序给各数组元素初始化,初始化的一般形式为: 类型名 数组名常量表达式1常量表达式2=初值表;,例如:int a22=1,2,3,4;,对部分数组元素初始化,例如: int a33=1,2,3,4,5;,该初始化方法中,没有给初值的元素的值自动为0。,53 二维数组,初始化时省略第一维长度,二维数组初始化时,如果对全部元素赋了初值。此时可以 省略第1维长度,但不能省略第2维的长度。,例如:int a 3=1,
14、2,3,4,5,6,7,8,9;,等价于 int a33= 1,2,3,4,5,6,7,8,9;,(2) 分行初始化时,在初值表中给出了所有行,此时也可以 省略第1维长度,但不能省略第2维的长度。,例如:int a 3= 1,2,4,5;,53 二维数组,534二维数组的应用,例5-6 从键盘输入12个整数,存入一个34的二维数组中, 编程找出其中的最大值,以及最大值所在的行和列。,图5-2 N-S流程图,程序代码如下: #include void main() int a34=9,18,-24,34,0,17,-76,67,83,48,100,23; int max,row,column,i
15、,j; for(i=0;i3;i+) /*按行输出二维数组*/ for(j=0;j4;j+) printf(%5d,aij); printf(n); max=a00; /*假设a00为最大值*/ row=0; column=0;,for(i=0;i3;i+) /*遍历二维数组,找出最大值*/ for(j=0;j4;j+) if(maxaij) /*如果aij大于假设的最大值,将最大值替换掉*/ max=aij; row=i; column=j; printf(max=%d,row=%d,column=%dn,max,row, column); ,例5-7 从键盘输入9个整型数据,形成33的矩阵
16、,编程将该矩阵转置后输出。,分析: 定义两个二维数组a和b,a是转置前数组,b是转置后数组。两个数组应满足转置后数组的行长度等于转置前数组的列长度,转置后数组的列长度等于转置前数组的行长度。显然,bij=aji。,程序代码如下: #include void main() int i,j, b33; int a33=1,2,3,4,5,6,7,8,9; printf(Origin array:n); for(i=0;i3;i+) /* 输出转置前矩阵*/ for(j=0;j3;j+) printf(%5d,aij); printf(n); for(i=0;i3;i+) /* 矩阵转置 */ fo
17、r(j=0;j3;j+) bij=aji; printf(the changed array:n); /* 输出转置后矩阵*/ for(i=0;i3;i+) for(j=0;j3;j+) printf(%5d,bij); printf(n); ,例5-8 输入5个学生3门课程高等数学,计算机,英语3门课程的成绩,计算每个同学的平均分。,程序代码如下: #include #define N 5 #define M 3 void main() int scoreNM; int i,j; float aver_stu,aver_course,sum; for(i=0;iN;i+) printf(pl
18、ease input 3 course of No %dn,i+1); for(j=0;jM;j+) scanf(%d, ,for(i=0;iN;i+) /*计算每个学生的平均成绩*/ sum=0; for(j=0;jM;j+) sum+=scoreij; aver_stu=sum/M; printf(The average score of No %d is %.1fn,i+1,aver_stu); ,练习5-5:输入两个33的矩阵,计算两个矩阵的和矩阵与差矩阵。 练习5-6:输入5个学生3门课程高等数学,计算机,英语3门课程的成绩,计算每门课程的平均分。,练 习,练 习,54 字符数组,5
19、41字符字符数组的定义,例如:char a10;,54 字符数组,542 字符数组的初始化和引用,1字符数组的初始化 逐个字符初始化时,字符数组初始化的一般形式为:,例如:char str11= H, e, l, l, o, ! ;,2字符数组的引用,引用方法为数组名加下标的方法。,54 字符数组,542 字符数组的初始化和引用,程序代码如下: #include #include void main() char str10; int i,digit; printf(Input 10 characters); for(i=0;i=0 /*输出数字字符个数*/ ,例5-9 从键盘输入一个字符串,
20、统计其中数字字符的个数。,54 字符数组,543字符数组和字符串,在C语言中,字符串是作为字符数组来处理的。字符串是用 双引号括起来的一串字符。,例如:Hello!,字符串结束标志:C语言规定字符0作为字符串结束标志, 0代表ASCII码为0的字符,ASCII码为0的字符是一个空 操作符,该字符既不能在显示器上显示,也不会产生任何 控制操作。,“Hello!”字符串在内存中占用7个字节存储单元。分别存放 H, e, l, l, o, !和0。,54 字符数组,1字符数组的初始化,543字符数组和字符串,例如:char s12= Hello!; char s12=Hello!;,图5-4 字符串
21、的存储,s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11,54 字符数组,2字符串的引用,543字符数组和字符串,引用整个字符串,采用数组名的形式。该引用形式多用于 字符串的输入输出操作中。,例5-10 从键盘输入一行字符,把其中的大写字母转换 成小写字母。,程序代码如下: #include void main() char str30; int i; printf(Input a string:n); scanf(“%s”,str); /*输入一个字符串*/ for(i=0;stri!=0;i+) /*遍历整个字符串*/ if(stri=A ,该例的几点说明:,1在
22、使用scanf时以%s格式输入字符串时,输入项列表中给出的是数组名,因为数组名本身就是字符数组在内存中的起始地址,不需要再加上取地址符号 int i,j; char c; printf(Input a string:n); gets(str); printf(Input a random character:n); c=getchar(); printf(Delete the input character from the string:n);,for(i=0,j=0;stri!=0;i+) if(stri!=c) /*当前字符不等于随机字符,赋给新串*/ new_strj+=stri; n
23、ew_strj=0; /*新串加字符串结束标志*/ printf(The new string is:n %sn,new_str); ,练习5-7: 输入一个字符串,再从键盘输入任意一个字符,统计字符串中包含键盘输入指定字符的个数。 练习5-8: 从键盘输入一个字符串送s1,编写程序将该字符串复制到字符数组s2。,练 习,54 字符数组,544 字符串处理函数,C库函数提供了一些用来处理字符串的函数,用户可以直接 调用,如果在程序中要调用字符串处理函数,在文件开头 要使用 #include 。,字符串的输入/输出函数,1)字符串输入函数gets( ),gets()函数调用的一般形式为:gets
24、(字符数组名);,例如: char str30; gets(str);,使用gets()函数,可以输入带空格的字符串。建议输入 字符串时,使用gets()函数。,54 字符数组,2)字符串输出函数puts() puts()函数调用的一般形式为:puts(字符数组名); 该函数从指定的起始地址(数组名)开始逐个输出字符串内的字符,遇到字符串结束标志0时结束。 例如: char str10= Hello!; puts(str);,544 字符串处理函数,54 字符数组,字符串连接函数strcat,544 字符串处理函数,strcat()函数调用的一般形式:strcat(字符数组1,字符数组2);
25、功能:将字符数组2连接到字符数组1的后面,新串存放在 字符数组1,函数调用后,得到一个地址,字符数组1的地址。 例如: char str130= Hello; char str210= World; strcat(str1,str2);,注意:连接后新的字符串存放在字符串1中,因此字符串1 必须定义得足够大,使其能存放连接后的字符串。,54 字符数组,字符串复制函数strcpy strcpy()函数调用的一般形式:strcpy(字符数组1,字符串2); 功能:将字符串2复制到字符数组1中,函数调用后,得到一个地址字符数组1的地址。 例如: char str110,str210= China;
26、strcpy(str1,str2);,544 字符串处理函数,注意: 字符数组1的长度足够长,以保证能够存放字符串2的 全部字符(包含字符串结束标志)。 字符串2也可以是字符串常量。,54 字符数组,字符串比较函数strcmp strcmp()函数调用的一般形式:strcmp(字符串1,字符串2); 功能:是将字符串1和字符串2自左向右逐个字符比较(按ASCII码比较),直到遇到不相同字符或者遇到字符串结束标志0,函数调用后,得到一个整数值。 如果字符串1等于字符串2,函数值为0; 如果字符串1大于字符串2,函数值为一个正整数; 如果字符串1小于字符串2,函数值为一个负整数。,544 字符串处
27、理函数,54 字符数组,例如: char str110= BOY,str10= DOG; strcmp(str1,str2);,544 字符串处理函数,54 字符数组,检测字符串长度函数strlen strlen()函数调用的一般形式:strlen(字符串); 功能:检测字符串的有效长度(不包含字符串结束标志0),函数调用后,得到一个整数值,即字符串中有效字符的个数。 例如: char str 10= BOY; strlen(str);,544 字符串处理函数,54 字符数组,字符串小写函数strlwr strlwr()函数调用的一般形式:strlwr(字符串); 功能:将字符串中的大写字母转
28、换为小写字母。 字符串大写函数strupr strupr()函数调用的一般形式:strupr(字符串); 功能:将字符串中的小写字母转换为大写字母。,544 字符串处理函数,main( ) char str20; char s120, s220, s320 ; gets(s1); gets(s2); gets(s3);,例:有三个字符串,要求找出其中最大者。,if(strcmp(s1,s2)0) strcpy(str, s1); else strcpy(str, s2); if(strcmp(s3,str)0) strcpy(str, s3); printf(“The largest stri
29、ng is: %sn”,str); ,数组一般数据和字符数据的输入输出在使用中的区别,int data4,i; for(i=0;i4;i+) scanf(“%d”,char str20; scanf(“%s”, str); printf(“%sn ”,str);,字符串的输入输出非常简单,错误 scanf(“%d”,data); printf(“%d”, data);,55 用文件处理数据,文件的操作有3步骤: 创建/打开文件; 从文件中读取数据或向文件中写入数据; 关闭文件。,例5-12 假设有5个学生3门课程的分数存放在名为student的文件中,要求计算5个学生的平均分,并且将计算的结果存入到stu_aver文件中。,#include #include #include void main() int i,j,score53; FILE *fp; /*定义指向文件类型的指针变量fp*/ float sum,stud_aver5; if(fp=fopen(student.txt,r)=NULL) /*以只读方式打开文件student.txt */ printf(cannot open the file); /*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年三亚理工职业学院单招综合素质考试题库附答案详细解析
- 广东深圳南山二外(集团)学府二小招聘小学体育教师1人笔试参考题库及答案解析
- 2026陕西师范大学生命科学学院教学科研人员招聘笔试模拟试题及答案解析
- 2026浙江事业单位统考柯桥区招聘75人考试备考题库及答案解析
- 2026青海海南州贵南县自然资源和林业草原局林业站招聘生态护林员2人笔试参考题库及答案解析
- 2026年中国人民解放军第五七二0工厂招聘笔试模拟试题及答案解析
- 2026浙江省对外服务有限公司丽水分公司招聘1人笔试模拟试题及答案解析
- 2026福建三明市教育局华东师范大学附属三明中学公开招聘专业技术人员13人 (河南师范大学专场)笔试备考试题及答案解析
- 2026年宜兴市事业单位公开招聘人员109人考试备考题库及答案解析
- 泸州市雁林高级中学2026年春期招聘笔试模拟试题及答案解析
- 2026浙江宁波报业传媒集团有限公司招聘编辑1人备考题库(典型题)附答案详解
- 2026年广东省广州市天河区高考地理二模试卷
- 2025年中级社会工作师考试真题+答案
- GA/T 414-2018道路交通危险警示灯
- GA/T 1019-2013视频中车辆图像检验技术规范
- QJZ-2×SF-双电源双风机说明书
- 2023年河南机电职业学院单招职业技能考试笔试题库及答案解析
- GB∕T 36419-2018 家用和类似用途皮肤美容器
- 房扑、房速的体表心电图诊断与鉴别诊断知识ppt
- 用户服务满意度评价表
- 综采工作面上窜下滑防治措施(正式)
评论
0/150
提交评论