




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章数组华北电力大学控制与计算机高级语言程序设计(C
)1第6章数组
本章重点介绍:6.1一维数组6.2二维数组6.3字符数组与字符串2023/12/52问题:从键盘上输入某门功课的30个成绩,并且按照从小到大的顺序排序。分析:30个成绩是同一种类型,必须同时保存,再通过对它们比较大小实现排序问题:如何保存30个成绩,才方便使用解决方法1:定义30个变量(不可取)解决方法2:用一组存储空间连续的变量,并且变量名可用循环控制(可取)78608770905076…84x[0]x[1]x[2]x[29]2023/12/53第6章数组为了方便地使用一组具有相同数据类型的数据,C语言提供了一种构造数据类型:数组数组是一个相同数据类型变量的集合体。例如:存储30个成绩,定义一个具有30个实型变量的实型数组
float
score[30];其中:score是数组名。该数组有30个数组元素,
score[0],score[1],…score[29]。可以存放30个成绩。数组元素在数组中的位置,称为下标。数组元素也称为下标变量。2023/12/54数组在内存的存放数组元素的下标从0开始一维数组的数组元素在内存里按顺序存放。数组元素是带有下标的变量,可以存放数据;数组名不是变量,是一个地址常量,代表数组的首地址,即数组中第1个元素的地址。s与&s[0]相等,都表示第一个元素的地址s[0]s[1]s[2]s[3]s[4]9134677284低地址高地址s数组ints[5];数组元素地址的两种表示方法:&s[0],&s[1]…,&s[4]s,s+1,s+2,…,s+42023/12/556.1一维数组例如:
inta[10],b[20];charstr[80];
floatscore[5];
“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“整型常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。
6.1.1一维数组的定义数据类型
数组名[整型常量表达式];2023/12/56以下数组定义是正确的:#defineN10……floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);intn=5;floatscore[n];charstr[];6.1.1一维数组的定义(续)数组定义之后,不能整体使用,只能使用数组中的数组元素—下标变量2023/12/576.1.2数组元素的引用
格式:数组名[下标表达式]例如:intx[5];数组x中有5个数组元素,分别是x[0]、x[1]、x[2]、x[3]、x[4],可以存放5个int型整数。数组元素又称为下标变量。其中:(1)下标表达式的值必须是整型表达式(2)取值范围是:0--(数组的长度-1)2023/12/586.1.2数组元素的引用例如:输入5个学生成绩
for(i=0;i<5;i++)
scanf("%f",&score[i]);例如:intfib[20],n;fib[0]=fib[1]=1;for(n=2;n<=19;n++)
fib[n]=fib[n-1]+fib[n-2];
for(n=0;n<=19;n++)if(n%10==0)printf(“%8d\n”,fib[n]);elseprintf(“%8d”,fib[n]);1,1,2,3,5,8,13,…score+i用数组求斐波那契数列的前20项和2023/12/596.1.2数组元素的引用(续)inta[10];/*√,这里的[]是一个标记*/a[10]=90;/*下标越界*/a[3]=30;/*√,这里的[]是一个运算符*/
C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。两个10的意义不一样inta[10];该语句中的10表示数组a中有10个下标变量a[10]中的10越界2023/12/5106.1.2数组元素的引用(续)
[]是下标运算符,引用数组元素时,先根据数组的首地址和下标数,计算出该元素的实际地址,再取出该地址的内容进行操作。如引用score[2]:(1)计算
2000+2*4=2008(2)取出2008的内容2000H2004H2008H200CH2110Hscore[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0如:floatscore[5];...printf(“%6.1f\n”,score[2]);一维数组中的数组元素的地址计算公式:
数组首元素地址+下标或数组名+下标2023/12/5116.1.3一维数组的初始化初始化:在定义数组时给数组元素赋初值。1.在定义数组时,对全部数组元素赋初值例如:inta[5]={0,1,2,3,4};此时可以省略数组长度,例如:inta[]={0,1,2,3,4};
2.在定义数组时,对部分数组元素赋初值例如:inta[5]={1,2,3};系统为其余元素赋0。3.当初值的个数多于数组元素的个数时,编译出错例如:
inta[5]={0,1,2,3,4,5};
2023/12/5126.1.4一维数组应用举例【例6.1】将10个人的成绩输入计算机后按逆序显示。#defineN10#include<stdio.h>voidmain(){inti;floatscore[N];for(i=0;i<N;i++)scanf(“%f”,&score[i]);for(i=N-1;i>=0;i--)printf("%6.1f",score[i]);printf("\n");}运行情况如下:
67748992346783957378
78.073.095.083.067.034.092.089.074.067.0scanf(“%f”,score+i);2023/12/513【例6.2】输入5个整数,找出最大数和最小数所在位置,并把二者对调,然后输出。思路:求最大/小值采用打擂台的方法。定义一维数组a,读入被比较的数。定义变量max:存放最大值,min:存放最小值
k:存放最大值下标,j:存放最小值下标各数依次与擂主进行比较,
若a[i]>max则:max=a[i];k=i;若a[i]<min则:min=a[i];j=i;
当所有的数都比较完之后,将a[j]=max;a[k]=min;输出a数组。2023/12/514#include<stdio.h>voidmain(){inta[5],max,min,i,j,k;for(i=0;i<5;i++)scanf("%d",&a[i]);
min=a[0];max=a[0];
j=k=0;//这条语句必要吗?for(i=1;i<5;i++){if(a[i]<min){min=a[i];j=i;}if(a[i]>max){max=a[i];k=i;}}
a[j]=max;a[k]=min;for(i=0;i<5;i++)printf("%5d",a[i]);printf("\n");}程序运行情况如下:57231
512372023/12/515#include<stdio.h>voidmain()//用max记最大值的下标,min记最小值的下标{inta[5],max,min,i,t;for(i=0;i<5;i++)scanf("%d",&a[i]);
min=0;max=0;for(i=1;i<5;i++){if(a[i]<a[min])min=i;
if(a[i]>a[max])max=i;}
t=a[max];a[max]=a[min];a[min]=t;for(i=0;i<5;i++)printf("%5d",a[i]);printf("\n");}程序运行情况如下:57231
51237如果只要求出它们的最大值和最小值和平均值,程序如何修改?2023/12/516#include<stdio.h>voidmain(){inta[5],max,min,i,j;floataver;for(i=0;i<5;i++)scanf("%d",&a[i]);
min=a[0];max=a[0];aver=a[0];for(i=1;i<5;i++){if(a[i]<min)min=a[i];if(a[i]>max)max=a[i];aver+=a[i];}aver=aver/5;printf(“max=%5d,min=%5d,aver=%7.2f\n",max,min,aver);}2023/12/517【例6.4】冒泡法排序(从小到大)。
以6个数:3、7、5、6、8、0为例。第一趟排序(通过两两比较将最大的数放到最后)情况如下:
375680第一次3和7比较,不交换375680第二次7和5比较,交换357680第三次7和6比较,交换356780第四次7和8比较,不交换356780第五次8和0比较,交换356708在第一趟排序中,从前向后两两比较,6个数比较了5次,把6个数中的最大数8排在了最后。2023/12/518冒泡法排序(续)第二趟排序情况如下:
356708第一次3和5比较,不交换356708第二次5和6比较,不交换356708第三次6和7比较,不交换356708第四次7和0比较,交换356078
在第二趟排序中,最大数8不用参加比较,其余的5个数比较了4次,把其中的最大数7排在最后,排出78。
2023/12/519冒泡法排序(续)以此类推:第三趟比较3次,排出678第四趟比较2次,排出5678第五趟比较1次,排出35678最后还剩下1个数0,不需再比较,得到排序结果:035678冒泡法排序遵循两个规律:(1)外循环控制趟数j:n个数,需要n-1趟,j的范围[1,n-1](或[0,n-2])(2)内循环完成两两比较:在[0,n-1-j](或[0,n-2-j])范围内,从第1个数开始,相邻的两个数比较2023/12/520冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。
冒泡法排序for(i=0;i<N;i++)输入a[i]for(j=1;j<N;j++)for(i=0;i<N-j;i++)a[i]>a[i+1]TFa[i]与a[i+1]交换输出a[0]~a[N-1]2023/12/521#defineN100#include<stdio.h>voidmain(){inta[N];inti,j,t,n;printf(“请输入%d个整数,用空格隔开\n”,n);
for(i=0;i<n;i++)scanf("%d",&a[i]);for(j=1;j<=n-1;j++)
/*控制趟数*/
for(i=0;i<n-j;i++)
/*控制每趟两两比较的次数*/
if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(“从小到大的排序结果:\n");
for(i=0;i<n;i++)printf("%4d",a[i]);
printf(“\n”);}程序运行情况如下:请输入6个整数,用空格隔开375680
从小到大的排序结果:0356782023/12/522以6个数:3、7、5、6、8、0为例。思路:第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;……。【例6.5】交换法排序(从小到大)。2023/12/523【例6.5】交换法排序(续)交换法排序for(i=0;i<N;i++)输入a[i]for(j=0;j<N-1;j++)for(i=j+1;i<N;i++)a[j]>a[i]TFa[j]与a[i]交换输出a[0]~a[N-1]2023/12/524#defineN5#include<stdio.h>voidmain(){inta[N];inti,j,t;for(i=0;i<N;i++)scanf("%d",&a[i]);for(j=0;j<N-1;j++)/*确定趟数
*/for(i=j+1;i<N;i++)/*每一趟中比较的次数*/if(a[j]>a[i]){t=a[j];a[j]=a[i];a[i]=t;}printf("Thesortednumbers:\n");…}程序运行情况如下:9678658640
Thesortednumbers:40657886962023/12/525以6个数:3、7、5、6、8、0为例。思路:第一趟:通过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 马工学的职业道德与责任试题及答案
- 模具高级工理论试卷复习测试卷含答案
- 六年级品德与社会下册 春天的故事教学实录 科教版
- 9作息有规律 教学设计-2024-2025学年道德与法治一年级上册统编版
- 16 海上日出 教学设计-2023-2024学年统编版语文四年级下册
- 数学二-2022年全国硕士研究生入学考试《考研数学二》真题
- 五年级品德与社会上册 走进食品加工厂教学实录 鲁教版
- 零售管理(第3版)课件 曹湛 项目1-4 走进零售业-零售企业组织结构与人力资源
- 风险管理在企业中的应用试题及答案
- 机动车检测站管理制度12164
- 生命质量测定表(FACT-G)
- 中医基础理论·绪论课件
- JJF1101-2019环境试验设备温度、湿度校准规范-(高清现行)
- 新湘教(湖南美术)版小学美术六年级下册全册PPT课件(精心整理汇编)
- 上海教材高中数学知识点总结(最全)
- 苏教版五年级数学下册解方程五种类型50题
- Opera、绿云、西软、中软酒店管理系统对比分析
- 建设项目环评手续办理指南.ppt课件
- 脑动静脉畸形血管内介入诊治PPT课件
- 实验RNA提取方法及原理ppt课件
- 励志高三班高考冲刺百日誓师会主题班会课件下载(23P)
评论
0/150
提交评论