C语言-第08章-数组课件_第1页
C语言-第08章-数组课件_第2页
C语言-第08章-数组课件_第3页
C语言-第08章-数组课件_第4页
C语言-第08章-数组课件_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章数组顾丽红计算机与通信工程学院计算机应用技术系本章学习内容对数组名特殊含义的理解数组类型,数组的定义和初始化排序、查找、求最大最小值等常用算法向函数传递一维数组为什么要使用数组

唉,有这么多不同主题的书。在哪里才能找到有关中国音乐的书呢?为什么要使用数组文学类计算机类西方音乐类中国音乐类为什么要使用数组数组内存12065984数组的元素容器中保存的物品

日常生活中的容器

程序中的数组为什么要使用数组如何处理一个班学生的学习成绩?一行文字怎样存储?一个矩阵怎样存储?......

问题:这些数据的特点:1.具有相同的数据类型

2.使用过程中需要保留原始数据

C语言为这些数据提供了一种构造数据类型:数组。为什么使用数组(Array)?【例8.1】要读入5人的成绩,然后求平均成绩需定义5个不同名整型变量,需要使用多个scanf()

intscore1,score2,score3,score4,score5;

scanf("%d",&score1); scanf("%d",&score2);......而用数组,可共用一个scanf()并利用循环语句读取

intscore[5],i; for(i=0;i<5;i++){scanf("%d",&score[i]);

}保存大量同类型的相关数据8.1一维数组的定义和初始化

一维数组的定义

存储类型数据类型数组名[整数];a[4]a[3]a[2]a[1]a[0]数组首地址inta[5];定义一个有5个int型元素的数组系统在内存分配连续的5个int空间给此数组直接对a的访问,就是访问此数组的首地址基类型下标从0开始8.1一维数组的定义和初始化a[4]a[3]a[2]a[1]a[0]inta[5];数组大小必须是值为正的常量,不能为变量(以c89为准,c99允许)一旦定义,不能改变大小数组大小最好用宏来定义,以适应未来可能的变化 #define

SIZE5 inta[SIZE];

一维数组的定义

存储类型数据类型数组名[整数];8.1一维数组的定义和初始化数组定义后的初值仍然是随机数一般需要进行初始化

inta[5]={12,34,56,78,9};

inta[]={11,22,33,44,55};在上面的写法中,花括号中有5个数,系统会据此自动定义a数组的长度为5。8.1一维数组的定义和初始化数组的引用数组名

[下标]数组下标(index)都是从0开始使用a[0]、a[1]、a[2]、a[3]、a[4]这样的形式访问每个元素下标既可是常量,也可是整型表达式,允许快速随机访问,如a[i]可以像使用普通变量一样使用它们如何使两个数组的值相等?main(){inta[5]={1,2,3,4,5},b[5];

b=a;

}解决方法方法1:逐个元素赋值

b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];方法2:通过循环赋值

inti;for(i=0;i<5;i++){

b[i]=a[i];}原因:数组名表示数组的首地址,其值不可改变!内存emp_code[0]emp_code[1]emp_code[2]emp_code[3]emp_code[4]12991499169918992099初始化一维数组intemp_code[5]={1299,1499,1699,1899,2099};

emp_code初始化一维数组其他的初始化情况:intarr[10]={10,9,8,7,6,5,4,3,2,1,0};

intarr[]={};

intarr[10]={9,8,7,5};intn=10,data[n];//错误!越界了//错误,到底是几个元素?//正确,后面的6个元素未初始化//错误,因为n是变量内存为一维数组动态赋值floatprice[4];printf(“Enterpricesof4books\n”);for(i=0;i<=3;i++){scanf(“%f”,&price[i]);}price[0]price[1]price[2]price[3]price12.341002.1017.511.12只能逐个对数组元素进行操作(字符数组例外)输入方法:inta[10],i;输入第i个数组元素:scanf("%d",&a[i]);输入整个数组元素:for(i=0;i<10;i++)scanf("%d",&a[i]);输出方法:输出第i个数组元素:printf("%d",a[i]);输出整个数组元素:for(i=0;i<10;i++)printf("%d",a[i]);一维数组的输入和输出一维数组示例#include<stdio.h>intmain(){ inti; floatitem_rate[5],total=0;printf("\n请输入商品价格:"); for(i=0;i<5;i++) { scanf("%f",&item_rate[i]); total=total+item_rate[i]; } printf(“\n所有商品的合计费用:%f\n",total);return0;}

内存循环执行5次请输入商品价格:35.5045.82340.780itotal00Item_rate35.5035.5045.82340.7805225.0所有商品的合计费用:225.0000008.1一维数组的定义和初始化【例8.2】编程实现显示用户输入的月份(不包括闰年的月份)拥有的天数8.1一维数组的定义和初始化下标越界是大忌!编译程序不检查是否越界下标越界,将访问数组以外的空间那里的数据是未知的,不受我们掌控,可能带来严重后果b[0]b[1]b[2]b[3]b[4]caib[8]

当下标值小于0或超过数组长度时

会出现什么情况?运行程序可以看到,变量c和a的值因数组越界而被悄悄破坏了1234560784044484c5054585c6064686c#include<stdio.h>#include<stdlib.h>intmain(){inta=1,c=2,b[5]={0},i;

printf("%p,%p,%p\n",b,&c,&a);

for(i=0;i<=8;i++){b[i]=i;printf("%d",b[i]);

system("pause");}printf("\nc=%d,a=%d,i=%d\n",c,a,i);return0;}

921数组类型一维数组二维数组三维数组8.2二维数组的定义和初始化一维数组用一个下标确定各元素在数组中的顺序可用排列成一行的元素组来表示如inta[5];二维数组用两个下标确定各元素在数组中的顺序可用排列成i行、j列的元素组来表示如intb[2][3];n维数组用n个下标来确定各元素在数组中的顺序如intc[3][2][4];n≥3时,n维数组无法在平面上表示其各元素的位置a[0]a[1]a[2]a[3]a[4]b[0][0]b[0][1]b[0][2]b[1][0]b[1][1]b[1][2]datatypearrayName[rowsize][colsize];intnum[4][2];内存numnum[0][0]num[0][1]num[1][0]num[1][1]num[2][0]num[2][1]num[3][0]num[3][1]4X2=88*sizeof(int)字节num[0][0]num[0][1]num[1][0]num[1][1]num[2][0]num[2][1]num[3][0]num[3][1]num为了便于理解,二维数组一般理解为几行几列的矩阵二维数组的定义和初始化二维数组intbooks[4][2]={{11,1294},{22,450},{33,4000},{44,79}};

intarr[][3]={{1,2,3},{4,5,6}

};

intarr[2][]={{1,2,3},{4,5,6}

};

错误【例】以下程序的运行结果是什么?intmain(){inta[][3]={{1,2,3},{4,5},{6},{0}};printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]);return0;}123450600000结果:5,0,0【例】若inta[][3]={1,2,3,4,5,6,7},则a数组的第一维大小是多少?

123456700二维数组的初始化二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)inta[2][3],i,j;输入方法:输入第i行第j列元素:scanf(“%d”,&a[i][j]);输入整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)scanf(“%d”,&a[i][j]);输出方法:输出第i行第j列元素:printf(“%d”,a[i][j]);输出整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)printf(“%d”,a[i][j]);数组的数据类型和存储类型根据数组的数据类型,为每一元素安排相同长度的存储单元根据数组的存储类型,将其安排在内存的动态存储区、静态存储区或寄存器区用sizeof(a)来获得数组a所占字节数shortshortinta[2][3];a[0]a[1]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放顺序:按行存放先顺序存放第0行元素,再存放第1行元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]需知道数组每行列数才能从起始地址开始正确读出数组元素二维数组的存储结构二维数组实例【例8.4】从键盘输入某年某月(包括闰年),编程输出该年的该月拥有的天数数组应用从键盘上输入一个数组(10个元素),按逆序输出。方法一#include<stdio.h>#defineN10intmain(){ inti,j,t,a[N];for(i=0;i<N;i++)scanf("%d",&a[i]);

for(i=0,j=N-1;i<j;i++,j--){t=a[i]; a[i]=a[j]; a[j]=t; }

for(i=0;i<N;i++){

printf("%d",a[i]);} printf("\n");return0;}#include<stdio.h>intmain(){ inta[10],i; for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=9;i>=0;i--) printf("%d",a[i]); printf("\n");return0;}方法二问题描述:从键盘输入5个数,求这组数中的最大值和最小值。数组应用max(i=0)max(i=2)max(i=3)数组应用#include<stdio.h>#defineN5intmain(){ intnum[N],max,min,i; for(i=0;i<N;i++) scanf("%d",&num[i]); max=num[0]; min=num[0]; for(i=1;i<N;i++) { if(max<num[i]) max=num[i]; if(min>num[i]) min=num[i]; }printf("\n最大值为:%d",max); printf("\n最小值为:

%d\n",min);return0;}读入5个值保存在数组中求最大值和最小值问题描述:输入10个数,保存在一个数组中,在数组中查找某个数,给出是否找到的信息。如果找到了,要求输出该数在数组中所处的位置;如果找不到,输出“没有找到!”。#defineN10……for(i=0;i<N;i++)scanf("%d",&num[i]);printf("\n请输入要查找的数:");scanf("%d",&search);for(i=0;i<N;i++){if(num[i]==search) break;}if(i<N)printf("\n在数组的第

%d

个位置找到了数字

%d!\n",i+1,search);elseprintf("\n没有找到!\n");……读入10个值保存在数组中在数组中查找,一旦找到,通过break语句跳出循环数组应用

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即在第一趟:首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后。至此第一趟结束,将最小的数放到了最后。在第二趟:仍从第一对数开始比较,将大数放前,小数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最小的),第二趟结束,在倒数第二的位置上得到一个新的最小数(其实在整个数列中是第二小的数)。如此下去,重复以上过程,直至最终完成排序。

由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以称作冒泡排序。冒泡法排序(降序)问题描述:编写C程序实现冒泡排序算法,按照降序排列一组数。冒泡法排序1625990231625909923169016232590问题描述:编写C程序实现冒泡排序算法,按照降序排列一组数。冒泡法排序#defineN5……intgrade[N],temp,i,j;for(i=0;i<N;i++)scanf("%d",&grade[i]);for(i=0;i<N-1;i++){for(j=0;j<N-i-1;j++){ if(grade[j]<grade[j+1]) { temp=grade[j+1]; grade[j+1]=grade[j]; grade[j]=temp; }}}……读入5个值保存在数组中1625990231625909923169016232590如果一个数组中保存的元素是有序的(由小到大),向这个数组中插入一个数,使得插入后的数组元素依然保持有序。

定义一个数组,长度为11,初始元素为10个,按照从小到大的方式输入,然后输入一个要插入的元素,使得插入后仍然有序。插入法排序#defineN10#include<stdio.h>intmain(){intnum[N+1],in,i,j;for(i=0;i<N;i++)scanf("%d",&num[i]);//printf("\n请输入一个要插入的数:");scanf("%d",&in);for(i=0;i<N;i++){if(num[i]>in) break; }for(j=N;j>i;j--)num[j]=num[j-1];num[i]=in;for(i=0;i<N+1;i++)printf("%d",num[i]);printf("\n");return0;}兔子繁殖问题打印每个月和年底时的总的兔子对数Fibonacci数列1123581321345589144233,…f0=1(n=0)#include<stdio.h>#defineYEAR_MONTH12intmain(){ intf[YEAR_MONTH]={1,1,2}; intmonth; for(month=3;month<YEAR_MONTH;month++) { f[month]=f[month-1]+f[month-2]; } for(month=0;month<YEAR_MONTH;month++) { printf("%d\t",f[month]); } printf("\nsum=%d\n",f[YEAR_MONTH-1]);return0;}兔子繁殖问题f0=1(n=0)求二维数组的最大值所在的行和列二维数组应用#include<stdio.h>voidmain(){ inti,j,max,x,y; inta[3][4]={{1,4,7,2},{1,2,5,0},{8,1,3,1}};

max=a[0][0]; x=y=0; for(i=0;i<3;i++) for(j=0;j<4;j++) if(max<a[i][j]) {max=a[i][j]; x=i; y=j; } printf("最大值在第%d行第%d列",x+1,y+1);}二维数组应用定义

4的二维数组,请编写程序,给二维数组赋值,并使数组下半三角元素中的值乘以n。例如:

数组中的值为

假设n为10,则输出结果如下:(输出的数按照4位宽度来输出,即%4d)注意:输出时每行最后不能有空格#include

<stdio.h>

int

main()

{int

i,j,n;

int

a[4][4];

for(i=0;i<4;i++)

for(j=0;j<4;j++)

scanf("%d",&a[i][j]);

scanf("%d",&n);

for(i=0;i<4;i++)

for(j=0;j<=i;j++)

a[i][j]*=n;

for(i=0;i<4;i++)

for(j=0;j<=3;j++)

{

if(j==3)

printf("%4d\n",a[i][j]);

else

printf("%4d",a[i][j]);}

return

0;

}

for(i=0;i<4;i++){

for(j=0;j<4;j++)

printf("%4d",a[i][j]);

printf("\n");

}

50矩阵转置求N阶方阵A的转置方阵。如:

10002300456078910

转置矩阵为:

12470358006900010

矩阵转置算法:把方阵A的行和列互换得到A的转置矩阵#include<stdio.h>#defineN4intmain(){inta[N][N],t;inti,j;for(i=0;i<N;i++) for(j=0;j<N;j++) scanf("%d",&a[i][j]);for(i=0;i<N;i++) for(j=i;j<N;j++) {t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t; }for(i=0;i<N;i++){for(j=0;j<N;j++) printf("%2d\t",a[i][j]);printf("\n");}return0;}

8.3向函数传递一维数组传递整个数组给另一个函数,可将数组的首地址作为参数传过去用数组名作函数参数只复制一个地址自然比复制全部数据效率高由于首地址相同,故实参数组与形参数组占用同一段内存在该函数内,不仅可以读这个数组的元素,还可以修改它们简单变量和数组作函数参数的区别计算平均分计数控制的循环计算平均分计数控制的循环计算最高分#include<stdio.h>#defineN40voidReadScore(intscore[],intn);intFindMax(intscore[],intn);intmain(){ intscore[N],max,n;scanf("%d",&n); ReadScore(score,n); max=FindMax(score,n);

printf("Thehighestscoreis%d\n",max);

return0;}max(i=0)max(i=2)max(i=3)计算最大值算法假设其中的一个学生成绩为最高

max=score[0]; 对所有学生成绩进行比较,即

for(i=1;i<n;i++){

若score[i]>max 则修改max值为score[i]

}打印最高分max计算最高分计算最高分选择法排序k=1k=2k=0k=1选择法排序k=3k=4k=3k=4选择法排序选择法排序

for(i=0;i<n-1;i++){

k=i;

for(j=i+1;j<n;j++){

if(score[j]>score[k])

记录此轮比较中最高分的元素下标k=j;

}

若k中记录的最大数不在位置i,则

"交换成绩score[k]和score[i]“;

}成绩从高到低顺序#include<stdio.h>#defineN40voidReadScore(intscore[],intn);voidPrintScore(intscore[],intn);voidDataSort(intscore[],intn);intmain(){ intscore[N],n;scanf("%d",&n);

ReadScore(score,n); DataSort(score,n);

printf(“Sortedscores:");

PrintScore(score,n); return0;}voidReadScore(intscore[],intn){inti;for(i=0;i<n;i++) {

scanf(“%d”,&score[i]);}}voidPrintScore(intscore[],intn){inti;for(i=0;i<n;i++) {

printf(“%d”,score[i]);}}voidDataSort(intscore[],

intn)/*选择法*/{

inti,j,k,temp1;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){if(score[j]>score[k]){k=j;/*记录最大数下标位置*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论