C语言程序设计-基于计算思维的培养 课件 第7章 数组_第1页
C语言程序设计-基于计算思维的培养 课件 第7章 数组_第2页
C语言程序设计-基于计算思维的培养 课件 第7章 数组_第3页
C语言程序设计-基于计算思维的培养 课件 第7章 数组_第4页
C语言程序设计-基于计算思维的培养 课件 第7章 数组_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

第七章数组目录/Contents数组类型、定义、初始化数组作函数参数排序、查找等常用算法问题的提出【例7.1】

从键盘输入10个学生的某门课成绩,然后输出他们的平均分。按照已学知识,需定义10个不同名整型变量,需要使用10个scanf()

intscore1,score2,score3,score4,score5,score6,score7,score8,score9,score10;

scanf("%d",&score1);scanf("%d",&score2);......如果有100个学生呢?数百个学生呢?一维数组的定义和初始化一维数组的定义:存储类型数据类型

数组名[常量表达式];inta[10];■定义1个有10个int型元素的数组。系统在内存分配连续的10int空间给此数组。基类型下标从0开始■直接对a的访问,就是访问数组的首地址。■数组的大小必须是正的常量,不能是变量。■数组大小最好用宏来定义,以方便未来的变化。#defineM10inta[M];一维数组的定义和初始化一旦定义,不能改变大小■数组定义后其元素的值依然是随机数。■数组定义后一般要立即进行初始化。inta[10]={56,23,78,98,89,86,67,100,72,63};inta[10]={0};inta[]={56,23,78,98,89,86,67,100,72,63};■常用for循环对数组进行初始化。for(i=0;i<10;i++) scanf("%d",&a[i]);或for(i=0;i<10;i++) a[i]=i;一维数组的定义和初始化一维数组的定义和初始化数组的引用数组名

[下标]数组下标都是从0开始使用a[0]、a[1]、a[2]、a[3]等这样的形式访问每个元素下标既可是常量,也可是整型表达式,允许快速随机访问,如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];}原因:数组名表示数组的首地址,其值不可改变!【例7.2】

编写程序,从键盘输入10个学生的某门课成绩,然后输出他们的平均分。一维数组的定义和初始化#include<stdio.h>intmain(){ inta[10]; inti,sum=0; printf("inputthescoresof10students:\n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); sum=sum+a[i]; } printf("average=%.2f\n",sum/10.0); return0;}数组定义数组初始化数组运算一维数组的定义和初始化数组下标越界是大忌!编译程序不检查是否越界下标越界,将访问数组以外的空间那里的数据是未知的,不受我们掌控,可能带来严重后果一维数组的定义和初始化【例7.3】

分析下面程序的输出结果是否正确。#include<stdio.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]); } printf("\nc=%d,a=%d,i=%d\n",c,a,i); return0;}一维数组的定义和初始化运行程序或单步执行观察变量变化情况可以看到,变量c和a的值因数组越界而被悄悄破坏了一维数组应用【例7.4】

编写程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束。#include<stdio.h>intmain(){ intx; intcount[10]; inti; scanf("%d",&x); for(i=0;i<10;i++) { count[i]=0; }

while(x!=-1){ if(x>=0&&x<=9) { count[x]++; } scanf("%d",&x);}for(i=0;i<10;i++){printf("%d:%d\n",i,count[i]);}}数组定义数组初始化数组运算数组遍历二维数组的定义和初始化一维数组用一个下标确定各元素在数组中的顺序可用排列成一行的元素组来表示如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]二维数组的定义和初始化■二维数组可以按元素初始化,例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};■按行初始化,例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};■当数组初始化列表提供全部元素的初值时,第一维长度的声明可以忽略inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};■在按行初始化时,即使初始化列表提供的初值个数小于数组元素的个数,第一维长度的声明也可以忽略,此时系统自动给后面的元素赋初值0。inta[][4]={{1,2,3},{5},{9,10}};相当于inta[3][4]={{1,2,3,0},{5,0,0,0},{9,10,0,0}};■也可以通过for循环初始化for(i=0;i<3;i++){ for(j=0;j<4;j++) scanf("%d",&a[i][j]);}数组的数据类型和存储类型根据数组的数据类型,为每一元素安排相同长度的存储单元根据数组的存储类型,将其安排在内存的动态存储区、静态存储区或寄存器区用sizeof(a)来获得数组a所占字节数short二维数组的存储结构二维数组a的逻辑存储结构a[0][0]a[0][1]a[0][2]A[0][3]a[1][0]a[1][1]●●●需知道数组每行列数才能从起始地址开始正确读出数组元素二维数组的定义和初始化【例7.4】

编写程序,从键盘输入整数到一个4行5列的二维数组中,显示所有数组元素,并计算所有数组元素之和。#include<stdio.h>#defineM4/*用宏常量定义数组行/列的长度*/#defineN5intmain(){ inta[M][N],i,j,sum=0; for(i=0;i<M;i++) { for(j=0;j<N;j++) { scanf("%d",&a[i][j]);/*从键盘初始化二维数组*/ } }数组定义数组初始化二维数组的定义和初始化for(i=0;i<M;i++){for(j=0;j<N;j++){printf("a[%d][%j]=%d",i,j,a[i][j]); /*显示二维数组中的元素*/}printf(“\n”);}for(i=0;i<M;i++){for(j=0;j<N;j++){ sum=sum+a[i][j]; /*二维数组元素求和*/}}printf(“sum=%d”,sum);return0;}数组运算数组遍历向函数传递一维数组传递整个数组给另一个函数,可将数组的首地址作为参数传过去用数组名作函数参数只复制一个地址自然比复制全部数据效率高由于首地址相同,故实参数组与形参数组占用同一段内存在该函数内,不仅可以读这个数组的元素,还可以修改它们向函数传递一维数组向函数传递一维数组【例7.5】

编写程序,从键盘输入某班全部学生某门课的成绩,并计算其平均分、最高分、最低分。max=GetMax(score,n);min=GetMin(score,n);printf("Average=%.2f\n",aver);printf("max=%2d\n",max);printf("min=%2d\n",min);return0;}#include<stdio.h>#defineN40floatGetAverage(inta[],intn);intReadScore(inta[]);intGetMax(inta[],intn);intGetMin(inta[],intn);intmain(){intscore[N],n,max,min;floataver;n=ReadScore(score);printf("Totalstudentsare:%d\n",n);aver=GetAverage(score,n);向函数传递一维数组returnn>0?sum/n:-1;更安全

向函数传递一维数组/*函数功能:输入n个学生某门课的成绩*/intReadScore(inta[]){ inti=-1; /*i初始化为-1,在循环体内增1后可保证数组下标从0开始*/ printf("Inputscores:\n"); do { i++; scanf("%d",&a[i]); }while(a[i]>=0); returni;}标记控制的循环——负值作为输入结束标记/*函数功能:计算n个学生某门课成绩的最低分*/intGetMin(inta[],intn){ intmin,i; min=a[0]; for(i=1;i<n;i++) { if(a[i]<min) min=a[i]; } returnmin;}/*函数功能:计算n个学生某门课成绩的最高分*/intGetMax(inta[],intn){ intmax,i; max=a[0]; for(i=1;i<n;i++) { if(a[i]>max) max=a[i]; } returnmax;}向函数传递一维数组冒泡排序985420895420859420854920854290854209a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<5;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}大数沉淀,小数起泡如何实现两数交换?冒泡排序854209584209548209542809542089a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<4;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}冒泡排序542089452089425089420589a[0]a[1]a[2]a[3]a[4]a[5]冒泡排序420589240589204589a[0]a[1]a[2]a[3]a[4]a[5]冒泡排序204589024589a[0]a[1]a[2]a[3]a[4]a[5]冒泡排序inta[10];inti,j,t;printf("input10numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("thesortednumbers:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf(“\n”);选择排序选择排序voidSortScore(inta[],intn){ inti,j,k,temp; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if(a[j]>a[k]) k=j; } if(k!=i) { temp=a[k]; a[k]=a[i]; a[i]=temp; } }}线性查找/*函数功能:用线性查找法查找值为x的数组元素*/intLinearSearch(longnum[],longx,intn){ inti; for(i=0;i<n;i++) { if(num[i]==x) { returni;/*若找到,则返回x在数组中的下标*/ } } return-1;/*若循环结束仍未找到,则返回-1*/}事先不必排序折半查找选择排序intBinarySearch(longnum[],longx,intn){ intlow=0,high=n-1,mid; while(low<high) { mid=(low+high)/2; if(num[mid]<x) { low=mid+1; } elseif(num[mid]>x) { high=mid-1; } else { returnmid; } } return-1;}若未按学号排序,则如何修改程序?找到时返回下标位置找不到时返回-1事先必须先排序向函数传递二维数组a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]inta[2][3];实际传送的是数组第一个元素的地址偏移1*3+2元素a[i][j]在数组a中的位置是:i*N+j元素地址:首地址+偏移量向函数传递二维数组#include<stdio.h>#defineM50#defineN5voidReadScore(inta[][N],longnum[],intn);/*读取学生的成绩和学号*/voidAverforStud(inta[][N],intsum[],floataver[],intn);/*计算每个学生的总分和平均分*/voidAverforCourse(inta[][N],intsum[],floataver[],intn);/*计算每门课的总分和平均分*/voidPrint(inta[][N],longnum[],intsum1[],floataver1[],intsum2[],floataver2[],intn);i

温馨提示

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

评论

0/150

提交评论