大一各专业汇总电气课件第5章数组_第1页
大一各专业汇总电气课件第5章数组_第2页
大一各专业汇总电气课件第5章数组_第3页
大一各专业汇总电气课件第5章数组_第4页
大一各专业汇总电气课件第5章数组_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

第章 数组记数器i=1、总分zf=0i<=10?读入一个分数到变量fs中zf=zf+fsavg=zf/10结束YN打印zf、avg问题的引入例:输入10个学生某门学科的成绩,求平均成绩。开始1、当读入下一分数时,前一分数值是否还能找到?2、如何将低于平均成绩的分数打印出来?在程序设计中存储单个数据时,需要根据数据的类型定义相应的变量来保存。如存储一个整数时需要定义一个整数变量来保存,存储一个实数时需要定义一个单精度或双精度变量来保存,存储含有多个成分的一个记录数据时,需要定义该类型的一个结构变量来保存。若在程序设计中需要存储同一数据类型的、彼此相关的多个数据时,如存储数学上使用的一个数列或一个矩阵中的全部数据时,显然采用定义简单变量的方法是不行的,这就要求定义出能够同时存储多个值的变量,这种变量在程序设计中称为数组(相同类型的若干个元素所组成的有序集合)。在实际应用中,一组相关的数据之间可能存在着一维关系,也可能存在着二维关系,等等。如下表:张三70李四80王五90学科姓名英语计算机张三7090李四8080王五9070一维数组模型二维数组模型如int

a[5];其中:[]表示a是个数组,而不是一个简单变量a5表示该数组共有5个元素元素编号即下标从0开始,a[0]表示第一个元素,a[4]表示第5个元素(最后一个)一般化:假设m和n是常量,则数组

a[m]的第一个元素是a[0],最后一个元素是a[m-1];数组a[m][n]的第一个元素是

a[0][0],最后一个元素是a[m-1][n-1],以此类推。定义的一般形式:存储属性

数据类型

数组名[常量表达式][常量表达式]…常量表达式:常量或符号常量,其值必须为正,不能为变量!如:intn=5;inta[n];这样定义是错误的,如下为正确的:inta[10],b[5][4];char

name[8],

ch[2][3];float

x[8*2+1],

table[2][3][4];#define

NUM

40inta[NUM],b[NUM+2];数组定义数组的初始化可以在定义数组的同时赋初值,如:int

a[5]={1,2,3,4,5};12345int

b[2][3]={{1,2,3},{4,5,6}};123456也可写成:int

b[2][3]={1,2,3,4,5,6};可以省略第一维数组大小,但必须初始化,如:int

a[]={1,2},

b[][3]={1,2,3,4,5,6};123400省略元素值,如:int

x[6]={1,2,3,4}; (x[4]、x[5]自动用0补足)int

a[5]={0};

int

b[3][2]={0};(全部元素初始化为0)

int

a[][3]={{1,2,3},{4,5},{6},{0}};123450600000int

a[

][3]={1,2,3,4,5,6,7}; (思考第一维的大小?)静态/外部数组未初始化,默认初值是0(数值)或‘\0’(字符). auto数组未初始化,初值为不可预料的数。只能逐个引用数组元素,不能一次引用整个数组.引用数组元素要注意下标不要越界(编译程序不检查是否“越界”).引用示例:a[2][3]a[2-1][2*3-1]a[x](x为整型表达式或整型变量)数组元素的引用int

a[5],i;for

(i=0;i<5;i++)cout<<a[i];int

a[3][4],i,j;for(i=0;i<3;i++){for(j=0;j<4;j++){cout<<a[i][j];}cout<<endl;}//注意下标不要越界//按行列方式输出二维数组//i用来控制行//j用来控制列数组元素的输出用一维数组来处理Fibonicci数列的前20项。f1=1n=1f2=1n=2fn=fn-1+fn-2n≥3#include

<iostream.h>#include

<iomanip.h>void

main(){inti;int

f[20]={1,1}; /*f1、f2已知*/for(i=2;

i<20;i++)f[i]

=

f[i-1]

+

f[i-2];for(i=0;

i<20;i++){if

(i%5

==

0)cout<<endl;cout<<setw(12)<<f[i];}}【例】以下程序的运行结果是什么?#include

<iostream.h>void

main(){inta[][3]={{1,2,3},{4,5},{6},{0}};cout<<a[1][1]<<a[2][1]<<a[3][1];}结果:500123450600000例:读入某班全体50位同学某科学习成绩,然后进行简单处理(求平均成绩、最高分、最低分……)#include

<iostream.h>#define

NUM

50void

main(){

int

i,score[NUM],highest,lowest;float

sum=0,average;for

(i=0;i<NUM;i++)

/*依次读入全班同学分数*/cin>>score[i];/*公布全班同学分数cout<<"全班同学成绩公布如下:\n";*/for

(i=0;i<NUM;i++){cout<<i+1<<"号同学:"<<score[i];if

(i%10==9)

cout<<'\n';}/*求平均成绩并显示出来*/for

(i=0;i<NUM;i++)sum+=score[i];average=sum/NUM;cout<<"全班平均成绩是:"<<average<<endl;例:找出一个二维数组的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点.#include

<iostream.h>#define

M

10#define

N

10void

main(){int

andian[M][N],m,n,i,j,flag=0,max,k;system("cls");cout<<"\nInput

row

number

m=";cin>>m;cout<<"Input

column

number

n=";cin>>n;for(i=0;i<m;i++){cout<<"\nthe

"<<i+1<<"line:";for(j=0;j<n;j++)cin>>andian[i][j];}【例】有一3×4矩阵,编程求其元素最大值并输出其行、列号。void

main(){int

i,j,x,y,max;int

a[

][4]={3,5,8,1,6,9,7,12,-6};max=a[0][0];for

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

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

(a[i][j]>max){max=a[i][j];

x=i;

y=j;}cout<<"max

is

a["

<<x<<

"]["

<<y<<

"]=

"<<max<<

\n’;}358169712-6000结果:max

is

a[1][3]=12数组作为函数参数用数组元素作函数实参此时可把数组元素看作普通变量(单向值传递).特点:主调函数中的实参——数组元素(带下标)被调函数中的形参——普通变量调用结果:形参值的变化对实参值无影响(二者分占不同内存)【例】void

main(){<b[i];int

a[]={1,2,3,4,5,6};int

b[6]={2,3,0,4};int

i;sum(int,int,int);for

(i=0;i<6;i++){sum(a[i],b[i],i);cout<<"a="<<a[i]<<",b="<}}void

sum(int

x,int

y,int

z){ x=z;y=z;

}结果:a=1,b=2a=2,b=3a=3,b=0a=4,b=4a=5,b=0a=6,b=0用数组名作函数实参若inta[6];则数组名a表示数组的起始地址.此时,是把实参数组的起始地址“传给”形参数组.本质:对应的数组元素(不是形参与实参)共享同一内存单元(所谓“双向的地址传送”).特点:主调函数中的实参——数组名(不带下标)被调函数中的形参——数组名或数组定义式调用结果:两数组同下标者为同值.数组作为函数参数【例】void

main(){int

a[]={1,2,3,4,5,6};int

b[6]={2,3,0,4};int

i;sum(int

[],int

[],int);for

(i=0;i<6;i++){sum(a,b,i);cout<<"a="<<a[i]<<",b="<}}void

sum(int

x[

],int

y[

],int

z){ x[z]=z+2;y[z]=z;

}y传址ax

aby

b<b[i];

x结果:a=2,b=0a=3,b=1a=4,b=2a=5,b=3a=6,b=4a=7,b=5例:下面的程序定义了一个3x4的数组,表示3个学生,每个学生有4门成绩,求所有学生中的最好成绩。int

maximum(int[][4],int,int);void

main(){int

sg[3][4]={{68,77,73,86},{87,96,78,86},{90,70,81,86}};cout<<“the

max

grade

is”<<maximum(sg,3,4)<<endl;}int

maximun(int

grade[][4],int

pupils,int

tests){

int

max=0;for(int

i=0;i<pupils;i++)for(int

j=0;j<tests;j++)if

(grade[i][j]>max)max=grade[i][j];return

max;}字符数组的初始化char

c[5]={‘a’,’b’,’c’};c[3]和c[4]自动定为‘\0’字符串在内存中以字符数组存放,因此可以用字符串直接初始化字符数组.char

c[5]=“abc”;思考:char

c[]=“abc”;数组c的数组长度?字符串以字符串结束标志‘\0’(即空字符)结束

(可以思考‘A’和“A”在内存中存放的区别),因此char

c[]=“abc”;等价于charc[]={‘a’,’b’,’c’,’\0’);既数组c的数组长度为4,当然char

c[5]=“abc”;的数组长度仍为

5.字符数组和字符串字符数组char

c[5];的输入法一(逐字符输入):int

i; for(i=0;i<5;i++)cin>>c[i];法二(字符串输入):cin>>c;注意:此法输入的字符串以空格或回车结束,即输入的字符串不可能包括空格!如输入:abcdef回车后,c对应的字符串为“abc”,而不是“abcdef”.另外此法输入的字符串串长有可能比数组长度要长,应引起注意!要想输入带空格的字符串,可使用函数cin.get或者cin.getline.此例对应cin.get(c,6,’\n’)或者cin.getline(c,6,’\n’)字符数组charc[5];的输出法一:inti;for(i=0;i<5;i++)cout<<c[i];法二:cout<<c;输出一个字符串,直到遇到’\0’为止,因此输出的字符串有可能和数组不一样。【例】比较以下字符数组长度是否相同:char

a[

]=”ABCD”;char

b[

]=

{“ABCD”};char

c[

]={‘A’,’B’,’C’,’D’};(5)(5)(4)【例】下列程序段的运行结果是:char

a[5]={‘a’,’b’,

’\0’,’d’,’\0’};cout<<a;

(ab)二维数组可以看成特殊的一维数组,这个特殊的一维数组的元素又是一个一维数组。即a[3][4]可看成数组长度为3的一维数组,而此一维数组的每个元素又是一个数组长度为4的一维数组。如下图所示:aa[0]a[1]a[2]a[0][0],a[0][1],a[0][2],a[0][3]所以a[0]对二维数组a来说是元素名,但对一维数组{a[0][0],a[0][1],a[0][2],a[0][3]}来说却是数组名.【例】分析以下程序的运行结果:void

main(){

char

word[3][10];int

i;for

(i=0;i<3;i++)cin>>word[i];cout<<word[i-2];}运行时,输入:

12345(回车)abcdef

(回车)ABCDEFG(回车)word[0]12345\0word[1]abcdef\0word[2]ABCDEFG\0结果:abcdef将一个字符串直接给一个字符数组只能够出现在初始化中,不能够出现在赋值语句中!也不能把一个字符数组直接赋值给另一个字符数组,如:

charc[5],d[5];c=“abc”;d=c;是错误的!要使用string.h的函数

strcpy(to字符数组1,from字符数组2)如:strcpy(c,”abc”);

strcpy(d,c);字符串处理函数HELLO\0\0\0\0\0hELLO\0\0\0\0\0hELLO\0!\0\0\0【例】以下程序的输出结果是

hELLO

。#include

“string.h”void

main(

){

char

s[10],sp[

]=”HELLO”;strcpy(s,sp);s[0]=’h’;s[6]=’!’;cout<<s;}strcat()字符串连接函数形式:strcat(目的字符数组,源字符串);作用:将源字符串连接到目的字符数组后面。函数返回值:目的字符数组的地址。

注意:目的字符数组要定义得足够大。【例】以下程序的输出结果是

abcde,12345abcde

。#include

"string.h"void

main(){char

a[

]="abcde";char

b[

]="12345";strcat(b,a);cout<<a<<

,’<<b;}【例】以下程序的输出结果是 LBLMNP

。#include

"string.h"void

main(){

char

a[80]=”AB”,b[80]=”LMNP”;int

i=0;strcat(a,b);while

(a[i++]!=’\0’)b[i]=a[i];cout<<b;}比较两个字符串(字符数组)的大小要使用

string.h的函数strcmp(字符数组1,字符数组2)不能直接使用关系运算符(><==>=<=!=)如:strcmp(“113”,”13”);strcmp(str1,str2);strcmp(str1,”abc”);strcmp函数返回值=0时,字符串1=字符串2;strcmp函数返回值>0时,字符串1>字符串2;strcmp函数返回值<0时,字符串1<字符串2;思考:如何判断str1是否等于str2?要写成if(strcmp(str1,str2)==0)...不可写成if(str1==str2)...trol”;<0)【

例】

运行以下程序时,

从键盘输入:BOOK<CR>CUT<CR>GAME<CR>PAGE<CR>(<CR>

表示回车),则运行结果是什么?#include

“string.h”void

main(){int

i;

charstr[10],temp[10]=”Confor

(

i=0;

i<4;

i++){cin>>str;if(strcmp(temp,str)strcpy(temp,str);变量跟i=0i=1i=2i=3踪:temp

str

比较Control

BOOK

>0Control

CUT

>0Control

GAME

<0GAMEGAME

PAGE

<0PAGE}cout<<temp;}求字符串实际长度可使用string.h的函数strlen(字符数组),它不包括字符串的结束符‘\0’.如:char

a[10]=“abcde”;则strlen(a)=5

,sizeof(a)=10【例】以下程序段的运行结果是什么?

char

a[]=”\t\r\\\0will\n”;cout<<sizeof(a)<<‘\t’<<strlen(a);结果:10

3数组元素的排序[一]输入10个数,用“冒泡法”对10个数排序(由小到大)。

“冒泡法”算法:以六个数9、8、5、4、2、0为例。第1趟比较第一次:8、9、5、4、2、0第二次:8、5、9、4、2、0第三次:8、5、4、9、2、0第四次:8、5、4、2、9、0第五次:8、5、4、2、0、9第1趟比较产生第一个最大数:9对剩下的五个数:8、5、4、2、0进行第2趟比较第一次:5、8、4、2、0第二次:5、4、8、2、0第三次:5、4、2、8、0第四次:5、4、2、0、8第2趟比较产生第二个最大数:8依此类推,便可实现排序。第1趟比较后,剩5个数未排好序;两两比较5次第2趟比较后,剩4个数未排好序;两两比较4次第3趟比较后,剩3个数未排好序;两两比较3次第4趟比较后,剩2个数未排好序;两两比较2次第5趟比较后,全部排好序;两两比较1次算法结论:对于n个数的排序,需进行

n-1趟比较,第i趟比较需进行n-i次两两比较。for(i=1;i<n;i++)for(j=0;j<n-i;j++)if(a[j]>a[j+1]){

t=a[j];a[j]=a[j+1];a[j+1]=t;}改进后的算法for(i=1;i<n;i++){

flag=0;for(j=0;j<n-i;j++)if(a[j]>a[j+1]){

t=a[j];a[j]=a[j+1];a[j+1]=t;flag=1;}if(flag==0)

break;}[二]输入10个数,用“选择法”对10个数排序(由小到大)。

“选择法”算法:以六个数9、8、5、4、2、0为例。第1趟比较第一次:8、9、5、4、2、0第二次:5、9、8、4、2、0第三次:4、9、8、5、2、0第四次:2、9、8、5、4、0第五次:0、9、8、5、4、2第1趟比较产生第一个最小数:0对剩下的五个数:9、8、5、4、2进行第2趟比较第一次:8、9、5、4、2第二次:5、9、8、4、2第三次:4、9、8、5、2第四次:2、9、8、5、4第2趟比较产生第二个最小数:2依此类推,便可实现排序。算法总结:对于n个数的排序,需进行

n-1趟比较,第i趟比较时要将第i+1个开始的元素依次与第i个元素进行两两比较,后者小于前者就进行交换。for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(a[j]<a[i]){

t=a[i];a[i]=a[j];a[j]=t;}改进后的选择排序算法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){

t=a[i];a[i]=a[k];a[k]=t;}}[三]插入排序基本思想:(假定从小到大排序)依次从后面拿一个数和前面已经排好序的数进行比较,比较的过程是从已经排好序的数中最后一个数开始比较,如果比这个数,继续往前面比较,直到找到比它大的数,然后就放在它的后面,如果一直没有找到,肯定这个数已经比较到了第一个数,那就放到第一个数的前面。那么一般情况下,对于采用插入排序法去排序的一组数,可以先选取第一个数做为已经排好序的一组数。然后把第二个放到正确位置void

main(){ int

i,j,t,a[]={12,11,2,3,6,67,89,0,1,3};for(i=1;i<10;i++){t=a[i];for(j=i-1;j>=0;j--)if(t<a[j])

a[j+1]=a[j];else

break;a[j+1]=t;}for(i=0;i<10;i++)cout<<a[i]<<'\t';}[四]合并排序

温馨提示

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

评论

0/150

提交评论