C语言第六章-数组.ppt
类型说明符 数组名数组名常量;内存内存映象:映象:编译时分配一片连续的内存空间,数组名为该空间的首地址数组名为该空间的首地址常量地址常量地址。aa55a44a33a22a11a00例如:int a6;一一.一维数组定义一维数组定义数数组组是是具具有有一一定定顺顺序序的的若若干干同同数数据据类类型型变变量量的的集合体集合体。数组要有名称,要有规模数组要有名称,要有规模。a=&a0 数组元素变量表示形式:数组元素变量表示形式:数组名数组名 下标下标 其中:下标可以是其中:下标可以是整型常量或整型整型常量或整型表达式表达式表达式表达式二二.一维数组的引用一维数组的引用 只能逐个引用只能逐个引用数组元素变量数组元素变量,不能一次引用整个数组,不能一次引用整个数组例:int a10;printf(“%d”,a);例:a0=a5+a7-a2*3;/*常量做下标常量做下标*/ai=ai+1;/*表达式做下标表达式做下标*/数组必须数组必须先定义,后使用先定义,后使用例1:读程序。main()int i,a10;for(i=0;i=0;i-)printf(“%d ”,ai);9 8 7 6 5 4 3 2 1 0定义数组定义数组引用数组引用数组例2:读程序,写结果。main()int i,a10,k=0;for(i=0;i10;i+)ai=i;for(i=1;i4;i+)k+=ai+i;printf(“%d ”,k);定义数组的同时,给数组元素变量赋初值。定义数组的同时,给数组元素变量赋初值。例:int a5=2,4,6,8,10;(1)初始数据多于数组规模时语法错误。初始数据多于数组规模时语法错误。例:int a5=2,4,6,8,10,12;()()(2)初始数据少于数组元素个数时初始数据少于数组元素个数时,多出的数组元素赋零零值。例1:int a5=2,4,6;例2:int a10=;区别于区别于:int a10;(3)对对 中的数字可以省,数组元素个数由初始中的数字可以省,数组元素个数由初始值个数决定。值个数决定。int b =8,21,13,7;注注:三三.一维数组初始化一维数组初始化#include void main(void)int a10,k,sum=0;for(k=0;k10;k+)scanf(“%d”,&ak);for(k=0;k10;k+)sum+=ak;printf(“Average is%f n”,sum/10.0);92 85 68 75 54 88 98 45 61 79928568548898457561790123456789a例例1:读入:读入10个学生的成绩存于数组个学生的成绩存于数组,求平均成绩。求平均成绩。四四.一维数组的应用一维数组的应用for(i=0,j=n-1;ij;i+,j-)t=ai;ai=aj;aj=t;分析分析:1.a0 与a9交换,a1 交换 a8,依此类推。例例2:读入:读入10个整数存于数组并输出;将数组中个整数存于数组并输出;将数组中的元素颠倒顺序排放后再输出。的元素颠倒顺序排放后再输出。2.如何控制循环如何控制循环?92856854889845756179a79614588547568988592或或:n=10;for(i=0;in/2;i+)t=ai;ai=an-i-1;an-i-1=t;ijijij只需循环到一半.ijij#include main()int i,j,a10,t;for(i=0;i=9;i+)scanf(“%d”,&ai);for(i=0;i=9;i+)printf(“%d,”,ai);for(i=0,j=9;ij;i+,j-)t=ai;ai=aj;aj=t;for(i=0;i=9;i+)printf(“%d,”,ai);f0=1 (n=0)f1=1 (n=1)fn=fn-1+fn-2 (n2)f0f1f2f3f4f5f19.11f1901452319235#include main()int i;long f 20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)if(i%4=0)printf(n);printf(%12ld,fi);例3:用数组求Fibonacci数列前20个数步骤步骤:1.输入输入:用用for循环输入循环输入10个整数存于数组个整数存于数组2.处理处理:(a)先令先令max=min=a0(b)依次用依次用ai和和max,min比较比较(循环循环)若若maxai,令令min=ai 3.输出输出:max和和min 例4:读10个整数存入数组,找出其中最大值和最小值。#include void main(void)int a10,max,min,i;printf(“输入10个整数:n);for(i=0;i10;i+)scanf(“%d”,&ai);max=min=a0;for(i=1;i10;i+)if(maxai)min=ai;printf(“最大值为:%dn”,max);printf(“最小值为:%dn”,min);例例5:读入:读入10个整数给数组,找出个整数给数组,找出10个数中最大值个数中最大值所在的所在的位置位置。#include main()int a10,i,k;for(i=0;i=9;i+)scanf(“%d”,&ai);k=0;for(i=1;iak)k=i;for(i=0;i=9;i+)printf(“%dt”,ai);printf(“max=%d,locate=%dn”,ak,k);排序过程:排序过程:(对对n个整数排序个整数排序)1)比较第一个数与第二个数,把较大的数放后面;然后比较第二个数与第三个数,仍把较大的数放后面;依次类推,直至第n-1个数和第n个数比较完为止结果最大的数被安置在最后的位置上,这就完成了第一趟冒泡排序第一趟冒泡排序。2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置。3)重复上述过程,共经过n-1趟冒泡排序后,排序结束。例例6:用起泡法对:用起泡法对8个整数按从小到大的顺序个整数按从小到大的顺序排序排序.4938659776132730第一趟k=13849657613273097第二趟k=23849651327307697第三趟k=33849132730657697第四趟k=43813273049657697第五趟k=51327303849657697第六趟k=61327303849657697第七趟k=73849769713972797137627761365276513492749133827384938659776132730初始值N=8a0a1a2a3a4a5a6a79730a77630a66530a54930a43830a330a227a1第第1趟排序趟排序(k=1):从第1个元素开始两两比较,最大的数被放在最后for(i=0;iai+1)temp=ai;ai=ai+1;ai+1=temp;第一次循环后,a7是最大的。第第2趟排序趟排序(k=2):for(i=0;iai+1)temp=ai;ai=ai+1;ai+1=temp;i=8-1-1;i=8-1-2;在第k 趟排序比较时:i=8-1-k8个数组元素排序:个数组元素排序:#include main()/*对对10个整数排序个整数排序*/int a10=9,8,5,4,2,0,6,1,3,7,i,k;for(k=1;k10;k+)for(i=0;iai+1)temp=ai;ai=ai+1;ai+1=temp;for(i=0;i10;i+)printf(“%3d”,ai);例例7:100名同学被学校食堂邀请来为某一种食品打名同学被学校食堂邀请来为某一种食品打分,分数分为从分,分数分为从1到到10的的10个等级个等级(1分最低分分最低分,10表表示最高分示最高分),统计调查结果并输出。,统计调查结果并输出。分析:(1)需要10个计数器用于统计:int count11=0;(2)循环100次(i从1100),第i次读一个整数整数n作为第i个同学打的分数,之后将该分数对应下标的数组元素加1。countn+n=1 count1+n=2 count2+n=10 count10+33 3 3 33 3 3333331 1 1111133 3 3 33 3 3333c1 c2 c3 c10main()int count11=0;int i,n;for(i=1;i=100;i+)scanf(“%d”,&n);countn+;for(i=1;i=10;i+)printf(“%d:%dn”,i,counti);问问:如何实现读入一串大写字符如何实现读入一串大写字符,以字符以字符?结束结束,统计每个字母出现的次数。统计每个字母出现的次数。int count26=0;int n;char ch;while(ch=getchar()!=?)n=ch-A;for(ch=A;ch=Z;ch+)printf(“%c:%dn”,ch,countch-A);在数学中我们常常会用到矩阵 ,它的结构如下:怎样用一种数据结构来表示矩阵呢?思考问题?2.二维数组元素变量的引用二维数组元素变量的引用:数组名数组名行表达式行表达式列表达式列表达式1.定义方式:定义方式:数据类型数据类型 数组名数组名整型常量整型常量1整型常量整型常量2;例:float f34;int myarray59;一一.二维数组的定义和引用二维数组的定义和引用行数行数列数列数元素个数元素个数=行数行数*列数列数下标从下标从0 0开始开始下标从下标从0 0开始开始内存内存映象:映象:编译时为二维数组分配一片连续的内存空间,一行一行地存储所有的数组元素,数组名为该空间的首数组名为该空间的首地址地址地址常量。地址常量。例例 int a34;a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23014523a01a00a2367101189aa02a03a10a11a13a20a21a22a12a与与&a00相同相同二二.二维数组元素的存放顺序二维数组元素的存放顺序 三三.二维数组的初始化二维数组的初始化按元素排列顺序初始化按元素排列顺序初始化 例例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部初始化全部初始化例例 int a23=1,2,4;a00 a01 a02 a10 a11 a12120400部分初始化部分初始化例例 int a3=1,4,5;a00 a01 a02 a10 a11 a12100450第一维第一维长度省略初始化长度省略初始化例例 int a23=1,2,3,4,5,6;a00 a01 a02 a10 a11 a12123456全部初始化全部初始化分行初始化分行初始化例例 int a3=1,2,3,4,5;a00a01a02a10a11a12123450第一维第一维长度省略初始化长度省略初始化 例例 int a23=1,2,4;a00 a01 a02 a10 a11 a12124000部分初始化部分初始化 k=1;for(i=0;i4;i+)for(j=0;j4;j+)aij=k+;四四.二维数组程序举例二维数组程序举例(3)由循环变量自动赋值由循环变量自动赋值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16如何读入如何读入6个数据?个数据?例例1:在程序中使数组获得值的方法。在程序中使数组获得值的方法。(1)初始化数组:初始化数组:int a23=1,2,3,4,5,6;(2)用用scanf语句由用户输入语句由用户输入 int a23 for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,&aij);缺点缺点:数据相对固定数据相对固定缺点缺点:当数组规模较大时,需当数组规模较大时,需要读入的数据会很多要读入的数据会很多例例例例1 1:在一个二维数组中,找出最大的元素值以及最大元:在一个二维数组中,找出最大的元素值以及最大元:在一个二维数组中,找出最大的元素值以及最大元:在一个二维数组中,找出最大的元素值以及最大元素的行下标和列下标,并输出该数组素的行下标和列下标,并输出该数组素的行下标和列下标,并输出该数组素的行下标和列下标,并输出该数组#inlcude main()int a32,row,col,i,j;for(i=0;i3;i+)for(j=0;j2;j+)scanf(“%d”,&aij);row=0;col=0;for(i=0;i3;i+)for(j=0;j2;j+)if(arowcolaij)row=i;col=j;printf(“最大值为最大值为a%d%d=%dn”,row,col,arowcol);例例2:输出一个二维数组。:输出一个二维数组。int a23=1,2,3,4,5,6;for(i=0;i2;i+)for(j=0;j3;j+)printf(“%5d”,aij);printf(“n”);例例3:将二维数组行列元素互换后存到另一个数:将二维数组行列元素互换后存到另一个数组中。组中。int a23=1,2,3,4,5,6;int b32,i,j;for(i=0;i2;i+)for(j=0;j3;j+)bji=aij;例例4:求求NN阶矩阵的主对角线元素之和阶矩阵的主对角线元素之和#include#include#define N 3#define N 3main()main()int aNN,sum=0,i,j;int aNN,sum=0,i,j;for(i=0;iN;i+)for(i=0;iN;i+)for(j=0;jN;j+)for(j=0;jN;j+)scanf(“%d”,&aij);scanf(“%d”,&aij);for(i=0;in;i+)for(i=0;in;i+)sum=sum+aii;sum=sum+aii;printf(“%dn”,sum);printf(“%dn”,sum);用户名:用户名:wu2010c 密密 码:码:201012345第第1章到第章到第5章单选题和填空题答案下载地址:章单选题和填空题答案下载地址:1.编程:读入编程:读入10个字符,将它们按降序的顺序个字符,将它们按降序的顺序用冒泡法排序后输出。用冒泡法排序后输出。2.编程:为比赛选手评分。读入编程:为比赛选手评分。读入 10 名评委的给名评委的给分分,从中扣除一个最高分从中扣除一个最高分,扣除一个最低分扣除一个最低分,输出输出这个选手的最后得分(打分采用百分制)。这个选手的最后得分(打分采用百分制)。3.编程:输入一个编程:输入一个5位自然数,输出该自然数的位自然数,输出该自然数的各位数字组成的最大数。例如,输入各位数字组成的最大数。例如,输入 15937,则输出为则输出为 97531。第六章上机补充题第六章上机补充题