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

下载本文档

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

文档简介

第四章数组Chapter4Array第四章数组Chapter4Array1数组必须先说明后使用。说明的目的如下:⒈说明数组的名字(标识)。⒉说明数组的类型。⒊说明数组的维数。⒋确定各维下标的变化范围。编译系统将根据说明,开辟内存单元按特有的顺序和相应的类型为各元素分配内存单元。数组必须先说明后使用。说明的目的如下:⒈说明数组的名字(标识24.2一维数组⒈一维数组的说明说明方式:

typearray1[常量表达式],…,arrayn[常量表达式];类型说明符,根据需要可加修饰说明。说明数组的类型。数组名,用标识符命名。用[]包含的常量表达式。数组的下标从0变化到常量达式的值减一。int

id[5],iyear[10];float

fScore[36];当说明数组后,编译时系统会根据定义的类型分配连续的一段内存单元给数组的各元素。id[0]id[1]id[2]id[3]id[4]系统为数组分配的连续内存单元,每个单元占两个BYTE。首地址用数组名id表示。4.2一维数组⒈一维数组的说明说明方式:3⒉一维数组的初始化数组的元素可以在说明数组时初始化。inta[10]={1,2,3,4,5,6,7,8,9,10};/*说明数组,同时初始化全部元素。*/

floatfValue[10]={1.0,2.0,3.0};/*说明数组,给部分元素初值,其余元素为0。*/unsigneda[]={0x0000,0x0001,0x0002};/*当数组元素全部赋初值时,可以不指定长度*/

⒉一维数组的初始化数组的元素可以在说明数组时初4⒊数组的引用原则:只能引用数组元素,而不能引用整个数组。引用方式:数组名[整型表达式]/*下标变量*/每个数组元素,可以出现在简单变量能够出现的任何地方。

a[1]=12;s=a[2]+a[1]*20;⒊数组的引用原则:只能引用数组元素,而不能引5⒋举例求10个学生一门课程的平均分,并输出低于平均成绩的分数。#include<stdio.h>voidmain(void){

float

fScore[10],aver=0;

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

scanf(“%f”,&fScore[i]);aver+=fScore[i];

}aver/=10;for(i=0;i<10;i++){

if(fScore[i]<aver)printf(“num=%d,score=%f”,i+1,fScore[i]);

}}说明数组。循环输入各元素的值并累加。循环判断条件,满足条件输出。⒋举例求10个学生一门课程的平均分,并输出低于平均成绩的分数64.2多维数组在实际应用中,经常会遇到一些用多维索引的数据。如:四个学生三门课的成绩。可以用下表表示:92.580.591.099.083.590.070.066.060.078.056.059.0显然,该表的每一项需要有两个索引项。表现为数组的两个下标。超过一个下标的数组称为多维数组。行:代表某个学生。列:代表某门课程。4.2多维数组在实际应用中,经常会遇到一些7⒈多维数组的说明说明方式:

typearray[常量表达式1]…[常量表达式n],…;n个整型常量表达式数组元素的个数?inta[2][3],b[4][5][2];⒉多维数组在内存中的顺序inta[3][3];二维结构:a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]排列顺序:先行后列。a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]下标为0的行总原则:最后一个下标先变化,变化一个周期后,倒数第二个开始变化,…如此类推。a为数组在内存中的首地址。intb[2][3][4];内存中的排列?⒈多维数组的说明说明方式:n个整型常量表达式数组元素的个数8⒊多维数组赋初值数组可以在说明时初始化。⑴全部赋初值inta[2][3]={{1,2,3},{4,5,6}};下标为0的一行下标为1的一行intb[2][3]={1,2,3,4,5,6};按内存顺序赋初值。⑵部分赋初值inta[2][3]={{1},{2}};0行的0列的元素赋初值。0行其余值为0。inta[2][3]={1,2};⑶对全体数组元素赋初值,第一维下标可以省略。inta[][3]={1,2,3,4,5,6};⒊多维数组赋初值数组可以在说明时初始化。⑴全部赋初值int9⒋数组元素的引用数组定义后,具备简单变量的一切性质,可以作为表达式的运算对象,也可以被赋值。引用时,只能引用数组元素,方式如下:array[exp1]…[expn]inta[10][10],y,i=2;a[i+2][6]=20;y=a[i+2][6]*100/30;a[10][11]=34;对4行6列的元素赋值。参加表达式运算。C语言不作下标检查,语法正确,但使用危险,可能造成程序的错误!整型表达式。⒋数组元素的引用数组定义后,具备简单变量的一104.4字符数组与字符串C语言没有字符串变量,可以定义字符数组,每个元素存放一个字符,从而达到存放字符串的目的。⒈字符数组的说明charcharray[constexp1]…[constexpn],…;char

a[10],b[2][12];⒉字符数组的初始化一维数组赋初值char

str1[6]={’h’,’e’,’l’,’l’,’o’,’\0’};char

str2[]={”hello”};用单个字符对每一个元素赋值。用字符串对数组赋初值。可以指定长度,也可不指定长度。

系统会在字串的结尾加\0,表示字符串结束。因此,说明数组时,长度指定应至少比实际长度大1,保证赋初值正确。\0存储结构:hello\04.4字符数组与字符串C语言没有字符串11二维数组赋初值二维数组的每一行可以存放一个字符串。char

str[3][6]={”wang”,”zhang”,”liu”};wang\0zhang\0liu\0str数组在内存中的首地址。存储结构二维数组赋初值二维数组的每一行可以存放一个字符串。char12⒊字符数组的输入输出⑴格式输入输出函数输出:

for(i=0;i<STRLEN;i++)printf(“%c”,str[i]);/*通过循环输出各元素*/

printf(”%s”,str);/*用字符串形式输出*/输入:scanf(”%s”,str);/*用字符串输入整个数组*/用scanf函数输入时space作为输入的分隔符,因此输入带空格的字符串,会造成输入不全。chara[20];scanf(”%s”,a);输入:ChinaAnhuiHefei

结果a数组的内容是:China\0为了解决这个问题,系统定义如下专用于字符数组的i/o函数。⒊字符数组的输入输出⑴格式输入输出函数输出:输入:s13⑴gets()字符串输入函数用法:charstr[80];gets(str);作用:读入一个以换行符为终结符的字符串到str中,用\0代替换行符。数组名作为函数的参数。⑵puts()字符串输出函数用法:charstring[]=”China”;puts(string);数组名作为函数的参数。作用:输出以NULL即\0结尾的字符串string,自动加上换行符。⑴gets()字符串输入函数用法:charstr[814字符输入输出举例#include<stdio.h>voidmain(void){charstr[80];inti;gets(str);for(i=0;str[i]!='\0';i++)if(str[i]>='a'&&str[i]<='z')str[i]-=32;puts(str);}chp4ex0判断字符串结束。字符输入输出举例#include<stdio.h>chp415⒋常用的字符处理函数C语言定义了一系列的字符处理函数用于字符串的处理,该类函数的原型定义在string.h中。因此,在使用该类函数时,应在程序的开始处,加#include<string.h>⑴字符串拷贝函数strcpy(str1,str2)作用:将str2拷贝到str1中。用法:charstr1[10],str2[]={”Computer”};strcpy(str1,str2);/*str1的内容是“Computer”*/strcpy(str2,”Program”);/*str2的内容是“Program”*/说明:①str1的长度要足够长;②str1只能是字符数组名,str2可以是字符数组或字符串常量。⒋常用的字符处理函数C语言定义了一系列的字符处16⑵字符串连接函数strcat(str1,str2)作用:将str2连接到str1后(去掉str1的\0)。用法:charstr1[15]={“Anhui”},str2[]={”Hefei”};strcat(str1,str2);puts(str1);/*输出结果为AnhuiHefei*/说明:①str1的长度要足够长;②str1只能是字符数组名,str2可以是字符数组或字符串常量。⑶测试字符串长度函数strlen(str)作用:测试字符串的实际长度。函数运算得到整型值,该值是字符串的长度!intiLenStr;charstr[]={“China”};iLenStr=strlen(str);printf(“%d”,iLenStr);结果?⑵字符串连接函数strcat(str1,str2)作用:将17⑷字符串的比较strcmp(str1,str2)作用:对str1和str2进行逐位无符号字符(ASCII码)比较,直到对应位字符能够确定关系或到串尾为止。返回整型比较结果。字符的数值关系也就是字符的ASCII码值的数值关系。比较结果如下:比较结果strcmp的值str1<str2<0str1==str2==0str1>str2>0charstr1[]={”abcd”};charstr2[]={“abcd”};intiRe1,iRe2,iRe3;iRe1=strcmp(str1,”abdc”);iRe2=strcmp(str1,str2);iRe3=strcmp(”abcde”,str2);abcdabdccd‘c’-’d’-1结果小于0。⑷字符串的比较strcmp(str1,str2)18⑸strlwr(str)将str中的大写字母转换成小写字母。⑹strupr(str)将str中的小写字母转换成大写字母#include<stdio.h>#include<string.h>voidmain(void){charstr1[]="cprogramming!123",str2[]="Computer";strlwr(str2);strupr(str1);puts(str1);puts(str2);}CPROGRAMMING!123computer⑸strlwr(str)将str中的大写字母转换成小写字母。19举例:统计三行文字中大写字母、小写字母及数字的个数。#include<stdio.h>#include<string.h>voidmain(void){charstr[80];inti,j,iAnum=0,ianum=0,i0num=0;for(i=0;i<3;i++){

gets(str);

for(j=0;j<strlen(str);j++)

{if(str[j]>=‘A’&&str[j]<=‘Z’)iAnum++;if(str[j]>=‘a’&&str[j]<=‘z’)ianum++;if(str[j]>=‘0’&&str[j]<=‘9’)i0num++;}

}

printf(“%6d,%6d,%6d”,iAnum,ianum,i0num);}行循环列循环chp4ex2举例:统计三行文字中大写字母、小写字母及数字的个数。#inc20数组的常用算法数组是同类型数据的集合。便于整体处理数据,数组操作的主要算法有:⒈求极值;⒉排序;⒊查找;数组的常用算法数组是同类型数据的集合。便于整21⒈求极值及其位置算法演示

⑴一维数组的极值#include<stdio.h>voidmain(void){inta[10]={1,6,-2,5,4,32,47,-66,13,14};intiMax,iPos,i;

iPos=0;iMax=a[0];

for(i=1;i<10;i++)

if(a[i]>iMax){iMax=a[i];iPos=i;}printf(“Max=%5dPosition=%5d”,iMax,iPos);}假定最大值及其位置。循环比较当前元素比最大值大,将其赋值为新的最大值并记录其位置。chp4ex3⒈求极值及其位置算法演示⑴一维数组的极值#inc22⑵二维数组求极值#include<stdio.h>voidmain(void){floata[3][4]={1.0,3.0,5.2,7.4,4.6,5.5,4.2,1.2,10.5,

0.23,1.3,0.5};

inti,j,iRow=0,iCol=0;for(i=0;i<3;i++)for(j=0;j<4;j++)

if(a[i][j]<a[iRow][iCol]){iRow=i;iCol=j;}printf(”%f7.2,iRow%5d,iCol%5d”,a[iRow][iCol],iRow,iCol);}假定最小值的位置。二重循环遍历所有元素比较求最小值,记录其位置。chp4ex4⑵二维数组求极值#include<stdio.h>假定最23⒉排序⑴排序的概念

排序是将一组随机排放的数按下标顺序从大到小或从小到大重新排列。1,5,4,6,7,99,7,6,5,4,11,4,5,6,7,9降序升序⑵冒泡排序算法冒泡排序算法演示⒉排序⑴排序的概念排序是将一组随机24冒泡排序程序如下:#include<stdio.h>voidmain(void){inti,j,a[10]={4,3,5,1,10,12,2,6,7,9},iTemp;

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

for(j=i+1;j<10;j++)

if(a[i]<a[j]){iTemp=a[i];a[i]=a[j];a[j]=iTemp;}for(i=0;i<10;i++)printf(”%4d”,a[i]);}外层循环i变化内层循环j变化比较交换chp4ex5冒泡排序程序如下:#include<stdio.h>外层25思考题⒈升序的条件如何构造?

⒉联合排序问题已知一个班有36个同学,a数组存放一门课的成绩,m数组存放其学号。要求将成绩从大到小排序。

提示:应考虑的问题是当a数组元素比较交换时,m数组如何处理?a[5]89.5

m[5]1005a[7]90.0

m[7]1007被动排序方。思考题⒈升序的条件如何构造?⒉26⑶选择排序冒泡排序在内层循环的比较中,满足条件的每次都需要交换。其中一些交换是无效的,交换算法会占用系统时间,从而降低算法效率。选择排序算法的基本思路,每轮排序将a[i]假定为极值,每次在a[i]到a[MAX]中找出个极值,记录其位置,最后让极值位置的元素与a[i]交换。

选择排序保证每轮排序只有一次交换,且为有效的交换!选择排序算法演示⑶选择排序冒泡排序在内层循环的比较中,满足条27选择排序程序#include<stdio.h>voidmain(void){inti,j,iMax,a[10]={4,3,5,1,10,12,2,6,7,9},iTemp;

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

{

iMax=i;

for(j=i+1;j<10;j++)

if(a[iMax]<a[j])iMax=j;

if(iMax!=i){iTemp=a[i];a[i]=a[iMax];a[iMax]=iTemp;}

}

for(i=0;i<10;i++)printf(”%4d”,a[i]);}排序循环假定最大值位置。循环比较找出最大值的位置。与本次比较的第一个元素交换。chp4ex6升序如何构造?选择排序程序#include<stdio.h>排序循环假28⒊查找查找是在一组数中,寻找一个特定的数,并显示结果。⑴顺序查找

顺序查找算法:构造循环,使循环的变量遍历数组每个元素的下标。循环的过程中让特定的数和每个元素比较,相等则表示找到该数,并输出其下标(位置)。程序设计中标志的设置和应用:

在程序设计中,经常要记录一些状态,作为判断的条件。因此需要在程序中设置一些标志,通常标志是整型变量。如查找问题,可以先设置一个整型变量iFlag=0表示没有找到,在查找的过程中一旦找到后,将iFlag赋值为1,结束查找后,可以由iFlag值所代表的逻辑状态,确定是否已找到特定的数。⒊查找查找是在一组数中,寻找一个特定的数,并显示结果29标志设置框图intiFlag;iFlag=0;是否找到?iFlag=1;yesno标志设置框图intiFlag;iFlag=0;是否找到?30顺序查找程序#include<stdio.h>voidmain(void){inti,j,iFlag,a[10]={4,3,5,1,10,12,2,6,7,9};

iFlag=0;scanf(“%d”,&j);

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

if(j==a[i]){iFlag=1;printf(“Thepositionis%d\n”,i);}if(iFlag==1)printf(“Found!%d”,j);elseprintf(“Notfound!);}设置标志为没找到。循环遍历所有元素比较设置标志输出位置。chp4ex7顺序查找程序#include<stdio.h>设置标志为31⑵折半查找——适用于在有序数组中查找在一个有序的一维数组中查找某一个数。已知某数组按升序排列,给定一个数,找出该数在数组中的位置。

可以通过将区间折半,快速缩小查找区间,提高效率!折半查找算法演示⑵折半查找——适用于在有序数组中查找在一个有32折半查找程序#include<stdio.h>voidmain(void){intiTop,iBot,iMid,iS,iFlag,a[10]={1,2,3,5,6,8,9,10,11,12};

iFlag=0;iTop=0;iBot=9;

scanf(“%d”,&iS);

do{

iMid=(iTop+iBot)/2;

if(iS==a[iMid]){iFlag=1;printf(“iShasbefound:a[%d]”,iMid);}

elseif(iS<a[iMid])iBot=iMid-1;elseiTop=iMid+1;

}while(iTop<=iBot&&iFlag==0);if(iFlag==0)printf(“Notfound!\n”);}初始化查找标志及顶、底。查找循环折半。找到。没找到,调整iTop或iBotchp4ex8折半查找程序#include<stdio.h>初始化查找33字符数组字符数组34⑴统计字符串中的各元音字母的个数#include<stdio.h>voidmain(void){charstr[80],ch[6]={‘a’,’e’,’i’,’o’,’u’,’\0’};inti,iCount[5]={0,0,0,0,0};gets(str);

for(i=0;str[i]!=‘\0’;i++){

switch(str[i]){case‘a’:case‘A’:iCount[0]++;break;case‘e’:case‘E’:iCount[1]++;break;case‘i’:case‘I’:iCount[2]++;break;case‘o’:case‘O’:iCount[3]++;break;case‘u’:case‘U’:iCount[4]++;}

}for(i=0;i<5;i++)printf(“Numof%c:%5d”,ch[i],iCount[i]);}循环遍历数组元素判断字母。chp4ex9判断字符串是否结束的方法。i<strlen(str)⑴统计字符串中的各元音字母的个数#include<stdi35⑵字符的加密解密

将字符串中的字母加密,密钥为循环平移两个字母。如A加密成C...,Z加密成B。如:Iamastudent.Zip230009加密后:

Kcocuvwfgpw.Bkr230009加密算法可以描述为:如果str[i]是字母循环平移两个字符;以大写字母为例,循环平移两个字符的加密算法:

str[i]=(str[i]-’A’+2)%26+’A’⑵字符的加密解密将字符串中的字母加密,密钥为循36程序如下:#include<stdio.h>#include<string.h>voidmain(void){inti;charstr[80],chKey=2;

gets(str);

for(i=0;i<strlen(str);i++){

if(str[i]>='a'&&str[i]<='z')str[i]=(str[i]-'a'+chKey)%26+'a'; elseif(str[i]>='A'&&str[i]<='Z') str[i]=(str[i]-'A'+chKey)%26+'A';

}

puts(str);}密钥。输入待加密的字符串。循环遍历字符。是字母,则加密!chp4exa设计解密算法!程序如下:#include<stdio.h>密钥。输入待加37数组与矩阵inta[3][3]a[0][0]a[0][1]a[0][2]

a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]该表示方法,在数学上称为“矩阵”,当行、列数相同时,称为“方阵”,也称为“行列式”。

数组与矩阵inta[3][3]a[0][0]38矩阵的相关算法⒈生成特殊矩阵⑴生成单位方阵单位方阵:1

0000

1

0000

1

0000

1主对角线元素为1,其余为0。if(i==j)a[i][j]=1,其余为0。#include<stdio.h>voidmain(void){inta[4][4]=,i,j;

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

{if(i==j)a[i][j]=1;elsea[i][j]=0;

}

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

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

printf(“\n”);}}chp4exb矩阵的相关算法⒈生成特殊矩阵⑴生成单位方阵单39⑵生成三角阵三角阵的概念,以对角线为界,一半元素为0的方阵。123405670091000011

上三角阵。当i<=j时值非0为上三角阵当i>=j值非0为下三角阵ij如何生成元素为行、列下标和的下三角阵?⑵生成三角阵三角阵的概念,以对角线为界,一半元素为0的方阵。40⑶与下标相关矩阵形成如下矩阵:

147 258 3690123012在列方向上每跨一列,要走三步;在行方向上每跨一行,要走一步,只能横向或纵向行走,且不走远路,确定从一行一列走到任意行列所走的步数。18显然,所走的步数和当前行列的位置有关。s=i*1+j*3⑶与下标相关矩阵形成如下矩阵:041147

258

369a[i][j]=i*1+j*3+1#include<stdio.h>voidmain(void){inta[3][3],i,j;

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

a[i][j]=i+j*3+1;

for(i=0;i<3;i++){for(j=0;j<3;j++)printf(“%4d”,a[i][j]);printf(“\n”);}}chp4exc生成如下矩阵: 15913 591317 9131721147

258

3642⒉矩阵及元素求和⑴求方阵主、辅对角线之和。

1

52

6

-9

8

7

3

5

4

0

1

9

84

2主对角线:满足下标为[i][i]的元素和。辅对角线:满足下标为[i][jMAX-i]的所有元素之和。如何构造程序?⒉矩阵及元素求和⑴求方阵主、辅对角线之和。1543⑵求两个矩阵之和c[i][j]=a[i][j]+b[i][j]对应元素之和,要求a、b行列数相同。#include<stdio.h>voidmain(void){inta[2][3]={1,2,3,4,5,6};intb[2][3]={1,3,5,2,4,6},c[2][3],i,j;

for(i=0;i<2;i++)for(j=0;j<3;j++)c[i][j]=a[i][j]+b[i][j];for(i=0;i<2;i++){for(j=0;j<3;j++)printf(“%4d”,c[i][j]);printf(“\n”);}}chp4exd对应元素和。⑵求两个矩阵之和c[i][j]=a[i][j]+b[i][j44⒊矩阵的转置运算转置阵的概念:123456a142536b

矩阵a的转置阵b,b矩阵行、列的最大下标应和矩阵a列、行的最大下标相同。遍历所有下标,赋值:b[i][j]=a[j][

i

]⑴求非方阵的转置阵a、b互为转置阵。⒊矩阵的转置运算转置阵的概念:123145⑵求方阵的转置阵如果求方阵的转置阵,行、列相同不需要定义新的数组。1591326101437111548121612345678910111213141516算法:对角线两边的对称元素交换。chp4exe#include<stdio.h>voidmain(void){inta[3][3]={1,2,3,4,5,6,7,8,9},i,j,iTemp;for(i=0;i<3;i++)for(j=0;j<i;j++)

{iTemp=a[i][j];a[i][j]=a[j][i]; a[j][i]=iTemp;}for(i=0;i<3;i++){for(j=0;j<3;j++)printf(“%4d”,a[i][j]);printf(“\n”);}}Why?⑵求方阵的转置阵如果求方阵的转置阵,行、列相同不需要定义新的46第四章数组Chapter4Array第四章数组Chapter4Array47数组必须先说明后使用。说明的目的如下:⒈说明数组的名字(标识)。⒉说明数组的类型。⒊说明数组的维数。⒋确定各维下标的变化范围。编译系统将根据说明,开辟内存单元按特有的顺序和相应的类型为各元素分配内存单元。数组必须先说明后使用。说明的目的如下:⒈说明数组的名字(标识484.2一维数组⒈一维数组的说明说明方式:

typearray1[常量表达式],…,arrayn[常量表达式];类型说明符,根据需要可加修饰说明。说明数组的类型。数组名,用标识符命名。用[]包含的常量表达式。数组的下标从0变化到常量达式的值减一。int

id[5],iyear[10];float

fScore[36];当说明数组后,编译时系统会根据定义的类型分配连续的一段内存单元给数组的各元素。id[0]id[1]id[2]id[3]id[4]系统为数组分配的连续内存单元,每个单元占两个BYTE。首地址用数组名id表示。4.2一维数组⒈一维数组的说明说明方式:49⒉一维数组的初始化数组的元素可以在说明数组时初始化。inta[10]={1,2,3,4,5,6,7,8,9,10};/*说明数组,同时初始化全部元素。*/

floatfValue[10]={1.0,2.0,3.0};/*说明数组,给部分元素初值,其余元素为0。*/unsigneda[]={0x0000,0x0001,0x0002};/*当数组元素全部赋初值时,可以不指定长度*/

⒉一维数组的初始化数组的元素可以在说明数组时初50⒊数组的引用原则:只能引用数组元素,而不能引用整个数组。引用方式:数组名[整型表达式]/*下标变量*/每个数组元素,可以出现在简单变量能够出现的任何地方。

a[1]=12;s=a[2]+a[1]*20;⒊数组的引用原则:只能引用数组元素,而不能引51⒋举例求10个学生一门课程的平均分,并输出低于平均成绩的分数。#include<stdio.h>voidmain(void){

float

fScore[10],aver=0;

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

scanf(“%f”,&fScore[i]);aver+=fScore[i];

}aver/=10;for(i=0;i<10;i++){

if(fScore[i]<aver)printf(“num=%d,score=%f”,i+1,fScore[i]);

}}说明数组。循环输入各元素的值并累加。循环判断条件,满足条件输出。⒋举例求10个学生一门课程的平均分,并输出低于平均成绩的分数524.2多维数组在实际应用中,经常会遇到一些用多维索引的数据。如:四个学生三门课的成绩。可以用下表表示:92.580.591.099.083.590.070.066.060.078.056.059.0显然,该表的每一项需要有两个索引项。表现为数组的两个下标。超过一个下标的数组称为多维数组。行:代表某个学生。列:代表某门课程。4.2多维数组在实际应用中,经常会遇到一些53⒈多维数组的说明说明方式:

typearray[常量表达式1]…[常量表达式n],…;n个整型常量表达式数组元素的个数?inta[2][3],b[4][5][2];⒉多维数组在内存中的顺序inta[3][3];二维结构:a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]排列顺序:先行后列。a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]下标为0的行总原则:最后一个下标先变化,变化一个周期后,倒数第二个开始变化,…如此类推。a为数组在内存中的首地址。intb[2][3][4];内存中的排列?⒈多维数组的说明说明方式:n个整型常量表达式数组元素的个数54⒊多维数组赋初值数组可以在说明时初始化。⑴全部赋初值inta[2][3]={{1,2,3},{4,5,6}};下标为0的一行下标为1的一行intb[2][3]={1,2,3,4,5,6};按内存顺序赋初值。⑵部分赋初值inta[2][3]={{1},{2}};0行的0列的元素赋初值。0行其余值为0。inta[2][3]={1,2};⑶对全体数组元素赋初值,第一维下标可以省略。inta[][3]={1,2,3,4,5,6};⒊多维数组赋初值数组可以在说明时初始化。⑴全部赋初值int55⒋数组元素的引用数组定义后,具备简单变量的一切性质,可以作为表达式的运算对象,也可以被赋值。引用时,只能引用数组元素,方式如下:array[exp1]…[expn]inta[10][10],y,i=2;a[i+2][6]=20;y=a[i+2][6]*100/30;a[10][11]=34;对4行6列的元素赋值。参加表达式运算。C语言不作下标检查,语法正确,但使用危险,可能造成程序的错误!整型表达式。⒋数组元素的引用数组定义后,具备简单变量的一564.4字符数组与字符串C语言没有字符串变量,可以定义字符数组,每个元素存放一个字符,从而达到存放字符串的目的。⒈字符数组的说明charcharray[constexp1]…[constexpn],…;char

a[10],b[2][12];⒉字符数组的初始化一维数组赋初值char

str1[6]={’h’,’e’,’l’,’l’,’o’,’\0’};char

str2[]={”hello”};用单个字符对每一个元素赋值。用字符串对数组赋初值。可以指定长度,也可不指定长度。

系统会在字串的结尾加\0,表示字符串结束。因此,说明数组时,长度指定应至少比实际长度大1,保证赋初值正确。\0存储结构:hello\04.4字符数组与字符串C语言没有字符串57二维数组赋初值二维数组的每一行可以存放一个字符串。char

str[3][6]={”wang”,”zhang”,”liu”};wang\0zhang\0liu\0str数组在内存中的首地址。存储结构二维数组赋初值二维数组的每一行可以存放一个字符串。char58⒊字符数组的输入输出⑴格式输入输出函数输出:

for(i=0;i<STRLEN;i++)printf(“%c”,str[i]);/*通过循环输出各元素*/

printf(”%s”,str);/*用字符串形式输出*/输入:scanf(”%s”,str);/*用字符串输入整个数组*/用scanf函数输入时space作为输入的分隔符,因此输入带空格的字符串,会造成输入不全。chara[20];scanf(”%s”,a);输入:ChinaAnhuiHefei

结果a数组的内容是:China\0为了解决这个问题,系统定义如下专用于字符数组的i/o函数。⒊字符数组的输入输出⑴格式输入输出函数输出:输入:s59⑴gets()字符串输入函数用法:charstr[80];gets(str);作用:读入一个以换行符为终结符的字符串到str中,用\0代替换行符。数组名作为函数的参数。⑵puts()字符串输出函数用法:charstring[]=”China”;puts(string);数组名作为函数的参数。作用:输出以NULL即\0结尾的字符串string,自动加上换行符。⑴gets()字符串输入函数用法:charstr[860字符输入输出举例#include<stdio.h>voidmain(void){charstr[80];inti;gets(str);for(i=0;str[i]!='\0';i++)if(str[i]>='a'&&str[i]<='z')str[i]-=32;puts(str);}chp4ex0判断字符串结束。字符输入输出举例#include<stdio.h>chp461⒋常用的字符处理函数C语言定义了一系列的字符处理函数用于字符串的处理,该类函数的原型定义在string.h中。因此,在使用该类函数时,应在程序的开始处,加#include<string.h>⑴字符串拷贝函数strcpy(str1,str2)作用:将str2拷贝到str1中。用法:charstr1[10],str2[]={”Computer”};strcpy(str1,str2);/*str1的内容是“Computer”*/strcpy(str2,”Program”);/*str2的内容是“Program”*/说明:①str1的长度要足够长;②str1只能是字符数组名,str2可以是字符数组或字符串常量。⒋常用的字符处理函数C语言定义了一系列的字符处62⑵字符串连接函数strcat(str1,str2)作用:将str2连接到str1后(去掉str1的\0)。用法:charstr1[15]={“Anhui”},str2[]={”Hefei”};strcat(str1,str2);puts(str1);/*输出结果为AnhuiHefei*/说明:①str1的长度要足够长;②str1只能是字符数组名,str2可以是字符数组或字符串常量。⑶测试字符串长度函数strlen(str)作用:测试字符串的实际长度。函数运算得到整型值,该值是字符串的长度!intiLenStr;charstr[]={“China”};iLenStr=strlen(str);printf(“%d”,iLenStr);结果?⑵字符串连接函数strcat(str1,str2)作用:将63⑷字符串的比较strcmp(str1,str2)作用:对str1和str2进行逐位无符号字符(ASCII码)比较,直到对应位字符能够确定关系或到串尾为止。返回整型比较结果。字符的数值关系也就是字符的ASCII码值的数值关系。比较结果如下:比较结果strcmp的值str1<str2<0str1==str2==0str1>str2>0charstr1[]={”abcd”};charstr2[]={“abcd”};intiRe1,iRe2,iRe3;iRe1=strcmp(str1,”abdc”);iRe2=strcmp(str1,str2);iRe3=strcmp(”abcde”,str2);abcdabdccd‘c’-’d’-1结果小于0。⑷字符串的比较strcmp(str1,str2)64⑸strlwr(str)将str中的大写字母转换成小写字母。⑹strupr(str)将str中的小写字母转换成大写字母#include<stdio.h>#include<string.h>voidmain(void){charstr1[]="cprogramming!123",str2[]="Computer";strlwr(str2);strupr(str1);puts(str1);puts(str2);}CPROGRAMMING!123computer⑸strlwr(str)将str中的大写字母转换成小写字母。65举例:统计三行文字中大写字母、小写字母及数字的个数。#include<stdio.h>#include<string.h>voidmain(void){charstr[80];inti,j,iAnum=0,ianum=0,i0num=0;for(i=0;i<3;i++){

gets(str);

for(j=0;j<strlen(str);j++)

{if(str[j]>=‘A’&&str[j]<=‘Z’)iAnum++;if(str[j]>=‘a’&&str[j]<=‘z’)ianum++;if(str[j]>=‘0’&&str[j]<=‘9’)i0num++;}

}

printf(“%6d,%6d,%6d”,iAnum,ianum,i0num);}行循环列循环chp4ex2举例:统计三行文字中大写字母、小写字母及数字的个数。#inc66数组的常用算法数组是同类型数据的集合。便于整体处理数据,数组操作的主要算法有:⒈求极值;⒉排序;⒊查找;数组的常用算法数组是同类型数据的集合。便于整67⒈求极值及其位置算法演示

⑴一维数组的极值#include<stdio.h>voidmain(void){inta[10]={1,6,-2,5,4,32,47,-66,13,14};intiMax,iPos,i;

iPos=0;iMax=a[0];

for(i=1;i<10;i++)

if(a[i]>iMax){iMax=a[i];iPos=i;}printf(“Max=%5dPosition=%5d”,iMax,iPos);}假定最大值及其位置。循环比较当前元素比最大值大,将其赋值为新的最大值并记录其位置。chp4ex3⒈求极值及其位置算法演示⑴一维数组的极值#inc68⑵二维数组求极值#include<stdio.h>voidmain(void){floata[3][4]={1.0,3.0,5.2,7.4,4.6,5.5,4.2,1.2,10.5,

0.23,1.3,0.5};

inti,j,iRow=0,iCol=0;for(i=0;i<3;i++)for(j=0;j<4;j++)

if(a[i][j]<a[iRow][iCol]){iRow=i;iCol=j;}printf(”%f7.2,iRow%5d,iCol%5d”,a[iRow][iCol],iRow,iCol);}假定最小值的位置。二重循环遍历所有元素比较求最小值,记录其位置。chp4ex4⑵二维数组求极值#include<stdio.h>假定最69⒉排序⑴排序的概念

排序是将一组随机排放的数按下标顺序从大到小或从小到大重新排列。1,5,4,6,7,99,7,6,5,4,11,4,5,6,7,9降序升序⑵冒泡排序算法冒泡排序算法演示⒉排序⑴排序的概念排序是将一组随机70冒泡排序程序如下:#include<stdio.h>voidmain(void){inti,j,a[10]={4,3,5,1,10,12,2,6,7,9},iTemp;

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

for(j=i+1;j<10;j++)

if(a[i]<a[j]){iTemp=a[i];a[i]=a[j];a[j]=iTemp;}for(i=0;i<10;i++)printf(”%4d”,a[i]);}外层循环i变化内层循环j变化比较交换chp4ex5冒泡排序程序如下:#include<stdio.h>外层71思考题⒈升序的条件如何构造?

⒉联合排序问题已知一个班有36个同学,a数组存放一门课的成绩,m数组存放其学号。要求将成绩从大到小排序。

提示:应考虑的问题是当a数组元素比较交换时,m数组如何处理?a[5]89.5

m[5]1005a[7]90.0

m[7]1007被动排序方。思考题⒈升序的条件如何构造?⒉72⑶选择排序冒泡排序在内层循环的比较中,满足条件的每次都需要交换。其中一些交换是无效的,交换算法会占用系统时间,从而降低算法效率。选择排序算法的基本思路,每轮排序将a[i]假定为极值,每次在a[i]到a[MAX]中找出个极值,记录其位置,最后让极值位置的元素与a[i]交换。

选择排序保证每轮排序只有一次交换,且为有效的交换!选择排序算法演示⑶选择排序冒泡排序在内层循环的比较中,满足条73选择排序程序#include<stdio.h>voidmain(void){inti,j,iMax,a[10]={4,3,5,1,10,12,2,6,7,9},iTemp;

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

{

iMax=i;

for(j=i+1;j<10;j++)

if(a[iMax]<a[j])iMax=j;

if(iMax!=i){iTemp=a[i];a[i]=a[iMax];a[iMax]=iTemp;}

}

for(i=0;i<10;i++)printf(”%4d”,a[i]);}排序循环假定最大值位置。循环比较找出最大值的位置。与本次比较的第一个元素交换。chp4ex6升序如何构造?选择排序程序#include<stdio.h>排序循环假74⒊查找查找是在一组数中,寻找一个特定的数,并显示结果。⑴顺序查找

顺序查找算法:构造循环,使循环的变量遍历数组每个元素的下标。循环的过程中让特定的数和每个元素比较,相等则表示找到该数,并输出其下标(位置)。程序设计中标志的设置和应用:

在程序设计中,经常要记录一些状态,作为判断的条件。因此需要在程序中设置一些标志,通常标志是整型变量。如查找问题,可以先设置一个整型变量iFlag=0表示没有找到,在查找的过程中一旦找到后,将iFlag赋值为1,结束查找后,可以由iFlag值所代表的逻辑状态,确定是否已找到特定的数。⒊查找查找是在一组数中,寻找一个特定的数,并显示结果75标志设置框图intiFlag;iFlag=0;是否找到?iFlag=1;yesno标志设置框图intiFlag;iFlag=0;是否找到?76顺序查找程序#include<stdio.h>voidmain(void){inti,j,iFlag,a[10]={4,3,5,1,10,12,2,6,7,9};

iFlag=0;scanf(“%d”,&j);

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

if(j==a[i]){iFlag=1;printf(“Thepositionis%d\n”,i);}if(iFlag==1)printf(“Found!%d”,j);elseprintf(“Notfound!);}设置标志为没找到。循环遍历所有元素比较设置标志输出位置。chp4ex7顺序查找程序#include<stdio.h>设置标志为77⑵折半查找——适用于在有序数组中查找在一个有序的一维数组中查找某一个数。已知某数组按升序排列,给定一个数,找出该数在数组中的位置。

可以通过将区间折半,快速缩小查找区间,提高效率!折半查找算法演示⑵折半查找——适用于在有序数组中查找在一个有78折半查找程序#include<stdio.h>voidmain(void){intiTop,iBot,iMid,iS,iFlag,a[10]={1,2,3,5,6,8,9,10,11,12};

iFlag=0;iTop=0;iBot=9;

scanf(“%d”,&iS);

do{

iMid=(iTop+iBot)/2;

if(iS==a[iMid]){iFlag=1;printf(“iShasbefound:a[%d]”,iMid);}

elseif(iS<a[iMid])iBot=iMid-1;elseiTop=iMid+1;

}while(iTop<=iBot&&iFlag==0);if(iFlag==0)printf(“Notfound!\n”);}初始化查找标志及顶、底。查找循环折半。找到。没找到,调整iTop或iBotchp4ex8折半查找程序#include<stdio.h>初始化查找79字符数组字符数组80⑴统计字符串中的各元音字母的个数#include<stdio.h>voidmain(void){charstr[80],ch[6]={‘a’,’e’,’i’,’o’,’u’,’\0’};inti,iCount[5]={0,0,0,0,0};gets(str);

for(i=0;str[i]!=‘\0’;i++){

switch(str[i]){case‘a’:case‘A’:iCount[0]++;break;case‘e’:case‘E’:iCount[1]++;break;case‘i’:case‘I’:iCount[2]++;break;case‘o’:case‘O’:iCount[3]++;break;case‘u’:case‘U’:iCount[4]++;}

}for(i=0;i<5;i++)printf(“Numof%c:%5d”,ch[i],iCount[i]);}循环遍历数组元素判断字母。chp4ex9判断字符串是否结束的方法。i<strlen(str)⑴统计字符串中的各元音字母的个数#include<stdi81⑵字符的加密解密

将字符串中的字母加密,密钥为循环平移两个字母。如A加密成C...,Z加密成B。如:Iamastudent.Zip230009加密后:

Kcocuvwfgpw.Bkr230009加密算法可以描述为:如果str[i]是字母循环平移两个字符;以大写字母为例,循环平移两个字符的加密算法:

str[i]=(str[i]-’A’+2)%26+’A’⑵字符的加密解密将字符串中的字母加密,密钥为循82程序如下:#include<stdio.h>#include<string.h>voidmain(void){inti;charstr[80],chKey=2;

gets(str);

for(i=0;i<strlen(str);i++){

if(str[i]>='a'&&str[i]<='z')str[i]=(str[i]-'a'+chKey)%26+'a'; elseif(str[i]>='A'&&str[i]<='Z') str[i]=(str[i]-'A'+chKey)%26+'A';

}

puts(str);}密钥。输入待加密的字符串。循环遍历字符。是字母,则加密!chp4exa设计解密算法!程序如下:#include<stdio.h>密钥。输入待加83数组与矩阵inta[3][3]a[0][0]a[0][1]

温馨提示

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

评论

0/150

提交评论