C语言数组(一)课件_第1页
C语言数组(一)课件_第2页
C语言数组(一)课件_第3页
C语言数组(一)课件_第4页
C语言数组(一)课件_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

第四章

数组(一)1研究式学习—C程序设计(第四章)上讲主要内容什么是循环结构?循环语句语法练习编程练习2研究式学习—C程序设计(第四章)本章主要内容一维数组◆概念的引入◆一维数组的定义、引用及初始化程序举例二维数组3研究式学习—C程序设计(第四章)数组—问题的提出

在程序设计中,常常需要处理以整体形式出现的一批数据,比如求一个班级(或学院)学生的某科成绩的平均分,这样需要存储所有学生的成绩(90,85,67,77,…),这样的数据在程序中如何处理?如果仍然用简单变量来存放,那么当这批数据的数量较大时,程序将无法编写。c语言使用了一种新的数据类型——数组,来处理这种有一定顺序关系且以整体出现的一组数据。问题:求某班学生某科成绩高于平均分的人数。4研究式学习—C程序设计(第四章)数组-—问题分析(1)假设有n个学生,n个学生的学习成绩按学号顺序排列(成绩分只取到整数位数)。要完成题目要求,需要解决以下问题:如何存储n个学生的成绩(分数)在此基础上如何求出平均分如何求出高于平均分的人数5研究式学习—C程序设计(第四章)数组-—问题分析(2)1成绩存储形式n个学生的成绩分数可视为一组n个类型相同的数据。在C语言中,允许用一个名字来命名同类型的一组数据,并把这样的数据类型称为数组。例如score[0],score[1]……score[i](0<i<n),其中score为数组名,i为某个学生成绩数据存放数组score中的顺序号,也称为下标表达式。C语言规定下标从0开始计数,因此数组score的最大下标为n-1。1成绩存储形式与使用普通(基本类型)变量一样,使用数组存放数据之前,要对数组进行定义。存储n个成绩数据的数组score可以定义如下:

int

score[100];这里,score是数组名,而int表明数组类型,即所有数组元素的数据类型都是int型。方括号中的100是数组的大小(长度)。即数组score有100个元素。6研究式学习—C程序设计(第四章)数组-—问题分析(3)

2成绩数据的输入每一个数组元素可以存放一个成绩分数。要输入n个学生的成绩就应当执行n次输入函数:

for(i=0;i<100;i++) scanf(“%d”,&score[i]);

在上述语句中,scanf函数将被执行100次,score[i]表示下标为i的元素,当i从0变到99时,每次输入的数据(成绩分数)被依次存入score[0],score[1],……score[99]这100个数组元素中。

7研究式学习—C程序设计(第四章)数组-—问题分析(4)

3求出平均分首先需要把100个同学的分数累加来,也就是把100个数组元素的值相加后,再求平均值。

for(i=0;i<100;i++) sum=sum+score[i]; averange=sum/100;

i=0:sum=0+score[0]i=1:sum=score[0]+score[1]i=2:sum=+score[2]i=3:sum=+score[3]...i=99:sum=+score[99]4求出高于平均分的学生人数用平均分与各数组元素逐一比较,并记下大于平均分的数组元素的个数。

for(i=0;i<100;i++)if(score[i]>averange)count++;8研究式学习—C程序设计(第四章)数组—程序#defineN10main(){ inti,count,sum,average;intscore[N]; count=0;sum=0; printf("Input%dscores:"N); for(i=0;i<N;i++) {scanf("%d",&score[i]);/*输入N个学生的成绩*/ sum+=score[i]; } /*求总分*/ average=sum/N; /*求平均分*/ for(i=0;i<N;i++) if(score[i]>average)/*比较当前成绩是否高于平均分*/ count++; /*若高于平均分,计数器加1*/ printf("\naverage=%d,conut=%d",average,count);}Input10scores:70806892887696605690average=77,count=5程序9研究式学习—C程序设计(第四章)一维数组的概念数组用于组织具有顺序关系的一组同类型数据。数组是一种整体定义,个别使用的数据结构。数组中每个变量被称为数组元素,用数组名加写在分括号中的序号来标识。顺序号也称为下标。只需要一个下标便可识别一个数组元素的数组称一维数组。与使用普通(基本类型)变量一样,使用数组存放数据之前,要对数组进行定义。10研究式学习—C程序设计(第四章)一维数组的定义一维数组定义的一般形式为:

类型名

数组名[常量表达式]例如:int

a[10];其中:(1)数组名取名要符合标识符取名规则(2)数组名后只能用方括号(3)常量表达式表示元素个数,即数组长度。其中只可包含常量或符号常量,不可包含变量。

1、定义了一个名为a的一维数组。2、方括号中的10规定了a数组长度为10,即有10个元素,它们分别是a[0]、a[1]、a[2]、a[3]、……a[7]、a[8]、a[9]。3、类型名int规定了a数组中每个元素都是整型,在每个元素中只能存放整型数。4、每个元素只有一个下标,C语句规定数组第一个元素的下标为0(下标的下限),因此,a数组最后一个元素的下标是4(下标的上限)。5、C编译程序将为a数组在内存中开辟10个连续的存储单元,各元素按照下标递增的顺序存放,如下所示:a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a11研究式学习—C程序设计(第四章)一维数组的引用只能逐个引用数组元素,而不能一次引用整个数组(字符数组除外)。引用形式如下:

数组名[下标表达式]其中,下标可以是整型表达式。例如定义了b数组:int

b[100];则b[0]、b[i]、b[i+k]都是对b数组元素的合法引用,其中0,i,i+k,称为下标表达式。由于定义了b数组有100个元素,因此下标表达式必须大于等于零并小于100。注意:b[i+k]中,i+k只是一个下标表达式。要建立以下概念:1.一个数组元素实质上就是一个同类型变量。因此,对基本数据类型的变量能进行的运算或操作,也适用于同类型数组元素。2.一个数组不能整体引用。例如不能用b代表b[0]到b[99]这100个元素。C语言中,数组名是一地址常量。它代表整个数组的首地址。关于这方面的内容将在第六章指针中详细讨论。12研究式学习—C程序设计(第四章)一维数组的初始化在定义数组的同时给数组赋初值,称为初始化

。1、对数组的全部元素赋初值。如:

inta[5]={0,1,2,3,4}/*依次把花括弧中数据赋给a[0]到a[4]*/对数组全部元素赋初值时,可不指定长度。例如:

inta[]={1,2,3,4,5,6,7,8}编译系统按初值个数确定该数组长度。上数组等价于:

inta[8]={1,2,3,4,5,6,7,8}2、对数组的部分元素赋初值。如:inta[5]={1,2,3};初值个数为3少于数组元素个数5,表示只给数组前三个元素赋值,后两个元素a[3],a[4]编译系统给赋初值0。3、如果程序中没有为静态数组赋初值,则编译系统自动为其赋初值0。13研究式学习—C程序设计(第四章)一维数组—应用举例例1一维数组的定义和引用。

main(){inta[5]={9};/*定义整数型数组a并初始化*/inti;

a[1]=8;/*给数组a的第二个元素赋值*/

for(i=2;i<4;i++)/*对数组a的第3,4两个元素赋值*/

a[i]=9-i;printf(“输入数组第五个元素的值:”);scanf(“%d”,&a[4]);/*从键盘输入第5个元素的值*/printf(“该数组五个元素的值分别为:”);for(i=0;i<5;i++)printf(“%3d”,a[i]);}

程序运行结果为:

输入数组第五个元素的值:5该数组五个元素的值分别为:98765程序14研究式学习—C程序设计(第四章)一维数组—应用举例例2输入100个整型数据,找出其中最大值并显示出来。main(){intbuffer[100],max,i;

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

scanf(“%d”,&buffer[i]);max=buffer[0];

for(i=1;i<100;i++)if(max<buffer[i])max=buffer[i];

printf(“max=%d\n”,max);}输入数组元素找最大输出最大值max赋初值15研究式学习—C程序设计(第四章)一维数组—应用举例例2找出一维整型数组中具有最小值的元素及其所在位置。main(){inta[5]={9,8,11,6,22};inti,k,min;min=a[0]/*将数组中第一个元素的值作为比较基准*/k=0;/*将a[0]下标值赋给变量k*/for(i=1;i<5;i++)/*循环完成选出数组元素中*/if(min>a[i])/*的最小值和最小值对应下标*/{min=a[i];k=i;}

printf("数组中最小值的元素下标为%d,其值是:%4d",k,min);}

程序程序运行结果为:数组中最小值的元素下标为3,其值是:616研究式学习—C程序设计(第四章)一维数组—应用举例例3

将数组中数据按逆序存放后输出,不允许再另外开辟新数组。分析:逆序存放数组的算法为:假设数组有n个元素,则第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,依次类推直到交换n/2次后,逆序存放完成。当n为偶数时进行两两交换;当n为奇数时,中间那个数不用交换。如图所示。a[0],a[1],a[2],…a[n-3],a[n-2],a[n-1]交换for(i=0;i<n/2;i++){t=a[i];a[i]=a[n-i-1];a[n-i-1]=t;}程序清单看教科书例4.3程序17研究式学习—C程序设计(第四章)二维数组—问题的提出问题:某小组有3人,要求计算每人考试成绩总分,期末考试成绩如下:学号语文数学总分外语24001240022400397.287.578.687.792.381.993.690.791.918研究式学习—C程序设计(第四章)二维数组—问题分析学生成绩表是一个由3行和5列组成的表格或矩阵。其中每一行记录一个学生各科成绩及总分。而每一列是某门课成绩或总分。存储这样由3行5列共15个数据组成的表格,可以使用二维数组。所谓二维数组,是指数组中的每个元素都有两个下标。其中第一个下标为行下标。第二个下标为列下标。由于数组只能存储相同类型的数据,在本题中,把学号及各门课成绩定义为实型,都能兼顾。假设用二维数组a来存储数据:

floata[3][5];

floata[3][5];a数组的逻辑结构可视为具有如下形式的3行4列的矩阵(或表格): 第0列第1列第2列第3列第4列第0行a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]第1行 a[1][0]a[1][1]a[1][2]a[1][3]a[1][4]第2行 a[2][0]a[2][1]a[2][2]a[2][3]a[2][4]19研究式学习—C程序设计(第四章)main(){inti,j;

floats[3][5]={{24001,97.2,87.7,93.6,0}, {24002,87.5,91.3,90.7,0}, {24003,78.6,81.9,91.9,0}};printf(“\nNo.YWMTENTOTAL\n”);printf(“--------------------------------------------------\n”);for(i=0;i<3;i++){ printf(“\n%6.0f”,s[i][0]); /*输出学生学号*/

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

{

s[i][4]+=s[i][j]; /*求第i个学生总分*/ printf(“%6.1f”,s[i][j]);}/*输出单科成绩*/printf(“%6.1f”,s[i][4]); /*输出第i个学生总分*/ }}二维数组—程序运行结果为:No.YWMHENTOTAL2400197.287.793,6278.52400287.591.390.7269.52400378.681.991.9252.4程序20研究式学习—C程序设计(第四章)如果数组中每个元素都需要两个下标来标识,则称这样的数组为二维数组。在逻辑上可把二维数组看成是具有行和列的一张表格和一个矩阵。一.二维数组的定义在C语言中,二维数组的定义语句形式如下:

类型名

数据名[常量表达式1][常量表达是2]其中,常量表达式1(为第一维的大小)看为表格(或矩阵)的行数。常量表达式2(为第二维的大小)看为是表格(或矩阵)的列数。例如有下定义:

int

a[3][4]inta[3][4];定义了二维整型数组a,a数组中共有3*4(12)个元素。a数组的元素在内存中占12个连续的存储单元,元素存储的顺序是:按行存放,即在内存中先顺序存放第一行元素,在存放第二行……如下顺序:

a00a01a02a03a10a11a12a13a20a21a22a23二维数组—概念及定义21研究式学习—C程序设计(第四章)二维数组—概念及定义在C语言中,可以把一个二维数组看作是一种特殊的一维数组,它们每个元素又是一个一维数组。例如,以上数组可以看成是由a[0]、a[1]、a[2]三个元素组成的一维数组,其中每个元素又是由4个整型元素组成的一维数组。a[0]——a00a01a02a03a[1]——a10a11a12a13

a[2]——a20a21a22a23a可以理解为:建立起这样的概念是十分重要的,因为C编译系统确实是把二维数组a中的a[0]、a[1]、a[2]作为数组来处理的。这种处理方法在对数组初始化及用指针表示时显得很方便,这在以后会体会到。22研究式学习—C程序设计(第四章)二维数组元素的表示形式为:

类型名

数组名[下标表达式1][下标表达式2]例如,若有以下定义语句:

float

c[2][4];

则c[0][1],c[i][j],c[k+i][k+j]都是合法的数组元素引用形式。只是每个下标表达式的值都必须是整数,而且不能超越数组定义中的上、下限。与一维数组一样,二维数组中两个下标的下限为另,上限为其长度减1。上例中,c数组行、列下标各为1和3。与一维数组一样,二维数组也是一种整体定义,个别使用的数据结构,其每一个二维数组元素都是一个同类型变量,而二维数组的名字是一地址常量,代表整个数组的首地址。二维数组—引用23研究式学习—C程序设计(第四章)二维数组—初始化1

对全部元素赋初值,例如:intd[3][3]={{1,2,3},{4,5,6,},{7,8,9}}intd[3][3]={1,2,3,4,5,6,7,8,9};2对部分元素初始化,例如:intd[3][3]={{1,2},{4,5},{7,8};};

intd[2][3]={{1,2},{3,4}};

intd[3][3]={1,2,3,4,5};

3在对全部元素赋初值的情况下,可以省略第一维大小。

intd[][3]={{1,2,3},{4,5},{6,7}};intd[][3]={1,2,3,4,5,6,7};

详细内容参看教科书有关部分24研究式学习—C程序设计(第四章)二维数组—应用举例例4

从键盘上为一个3*3的整形数组赋值,然而找出其中最大值及其所在行和列。分析:要在程序执行过程中顺序为二维数组元素赋值,可使用二重循环来完成。要对3*3的9个数进行比较,可按行来进行,先比较第一行,再比较第二行,最后比较第三行,仍用二重循环来完成。二重循环中外层循环对行进行控制,内层循环对列进行控制。main(){intx[3][3],i,j,max,r,c;printf("\nInput3*3numbers:\n");

for(i=0;i<3;i++)/*用二重循环为数组赋值*/for(j=0;j<3;j++)scanf("%d",&x[i][j]);max=x[0][0];r=0;c=0;

for(i=0;i<3;i++)/*用二重循环寻找最大值*/for(j=0;j<3;j++)if(x[i][j]>max) {max=x[i][j];r=i;c=j;}printf("\nThemaxis:%d,rowis:

温馨提示

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

评论

0/150

提交评论