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

下载本文档

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

文档简介

数组第五章本章学习目标理解数组的基本概念熟练掌握一维数组的基本使用理解二维数组的基本使用掌握字符数组和字符串库函数的用法

学会编制对一批数据进行基本处理的程序试一试【例5-1】编写一个C程序,从键盘按顺序输入5个任意整数,将5个整数按逆序输出。测试数据如表5-1所示:表5-1例5-1中输入输出数据输入序号12345数值7853994667输出序号54321数值6746995378#include<stdio.h>voidmain(){intnum[5],i;for(i=0;i<5;i++){printf("请输入第%d个数:",i+1);scanf("%d",&num[i]);}printf("逆序输出:\n");for(i=4;i>=0;i--){printf("第%d个数:",i+1);printf("%d\n",num[i]);}}C语言中的数组score1.53.20.0945.39873210score[4]数组名下标标明了元素在数组中的位置

数组元素下标数组大小数组是可以在内存中连续存储多个元素的结构数组中的所有元素必须属于相同的数据类型数组类型一维数组多维数组899077…示例:学员单门课程的成绩2-D,3-D,4-D739033458087学号科目01012示例:学员两门课程的成绩一维数组类型标识符数组名[N];类型说明符int、char、float…数组名常量表达式:数组大小(元素的个数)intnum[50];charstring[20];floatsalary[100];intn;scanf(“%d”,&n);int

a[n];1、声明一维数组:X内存score[0]score[1]score[2]score[3]score[4]6734908855一维数组intscore[5]={67,34,90,88,55};

score其他的初始化情况:intarray[10]={10,9,8,7,6,5,4,3,2,1,0};

//错误!越界了intarray[10]={9,8,7,5};//正确,后面的6个元素未初始化intarray[]={9,8,7};

//正确:元素个数为3intarray[]={};

//错误,到底是几个元素?2、初始化一维数组:内存int

score[4];inti;printf(“Enterthe4numbers\n”);for(i=0;i<=3;i++){

scanf(“%d”,&score[i]);}score[0]score[1]score[2]score[3]score12100217113、为一维数组动态赋值:一维数组做一做

编写一个C程序,从键盘按顺序输入10个任意实型数,将10个实型数按输入顺序输出。试一试

【例5-2】学校举办歌咏比赛,共有10个评委评分,以下是某同学参赛后10个评委给出的分数:67、84、90、88、75、80、78、95、77、91,编写一个C程序,计算该同学的所得平均分(保留两位小数)。voidmain(){ intscore[10]={67,84,90,88,75,80,78,95,77,91},i,sum=0; floatave; for(i=0;i<10;i++) { sum=sum+score[i]; } ave=sum/10.0; printf("平均分为:%.2f\n",ave);}试一试编写程序实现下述功能:有10位学生的成绩:67,34,90,88,55,74,95,82,43,90,要求编写程序找出其中的最高分,及其在这批数中的位置。解题思路:用变量max保存“目前的最高记录”,用变量max_index保存这个最高记录在数组中的位置,max的初值就是第1个数据,这个数据存放在数组的第1号元素中,所以max_index的初值是1。#include<stdio.h>voidmain(){ intscores[11]={0,67,34,90,88,55,74,95,82,43,90}; intmax,max_index,i; max=scores[1]; max_index=1; for(i=2;i<=10;i++) { if(scores[i]>max) { max=scores[i]; max_index=i; } } printf("10个成绩:"); for(i=1;i<=10;i++) { printf("%d",scores[i]); } printf("\n最高分%d:",max); printf("\n第一个最高分的位置%d\n",max_index);}试一试【例5-4】编写程序实现下述功能:在成绩表中查找某个成绩,给出是否找到的信息。如果找到了要求输出该数在成绩表中所处的位置;如果找不到输出“没有找到!”#include<stdio.h>voidmain(){ intscores[11]={0,67,34,90,88,55,74,95,82,43,92}; //scores[0]不用

intx,i,find=0; printf("请输入要找的数:"); scanf("%d",&x); for(i=1;i<11;i++) if(scores[i]==x) { find=1; break; }if(find==1) printf("\n在成绩表第%d个位置找到了%d\n",i,x); else printf("\n没有找到\n");}讲一讲1.使用变量find用以判断查找是否成功,0表示未成功,1表示成功,初始为0。2.输入成绩与数组中数据一一对比,若找到所需的数即可退出循环,不必要搜索所有数组元素,并记录该数的位置。3.若找不到所需的数,将要查找的数依次和数组中所有元素比较,直到找遍整个数组为止。想一想

【例5-4】中,如果输入一个考分,但在成绩数组中有一个以上的考分与此相同,怎样处理?编写程序实现下述功能:对一个包含5个成绩的无序成绩表进行排序,使其成为降序排列的成绩表,最后输出结果。(1)选择排序,例如:待排序的5个数为:6734908855第1趟排序:第1次比较:6734908855

第2次比较:9034678855

第3次比较:9034678855第4次比较:9034678855第2趟排序之后的结果:9088673455第3趟排序之后的结果:9088673455第4躺排序之后的结果:9088675534试一试#include<stdio.h>voidmain(){ intscores[6]={0,67,34,90,88,55}; inti,j,temp;

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

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

if(scores[i]<scores[j])

{ temp=scores[i]; scores[i]=scores[j]; scores[j]=temp; } printf("排序结果:"); for(j=1;j<=5;j++) printf("%d",scores[j]); printf("\n");}(2)冒泡排序(从大到小)#include<stdio.h>voidmain(){

intscores[6]={0,67,34,90,88,55};

int

i,j,temp;

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

for(i=1;i<=5-j;i++)

if(scores[i]<scores[i+1])

{ temp=scores[i];

scores[i]=scores[i+1]; scores[i+1]=temp;}

printf("排序结果:"); for(j=1;j<=5;j++)

printf("%d",scores[j]);

printf("\n");}编写程序实现下述功能:从键盘输入一个学生成绩,然后将其插入到一个降序排列的成绩表中,插入后的成绩表仍然保持降序,最后输出结果。解题思路:假定成绩表存放在数组scores中,输入的成绩是x,首先要在成绩表中从头开始找到第一个比x小的成绩,x就应该插在这个成绩之前。为了空出x的存放位置,从这个成绩开始,直到最后一个成绩,都要向后移动一个位置。试一试#include<stdio.h>#defineN5voidmain(){ floatscores[N+2]={0,92,88,72,59,32}; floatx; intp,i; printf("原成绩表:"); for(i=1;i<=N;i++)printf("%.2f",scores[i]); printf("\n输入一个需插入的成绩:"); scanf("%f",&x); p=1; while((p<=N)&&(x<scores[p])) p++; for(i=N;i>=p;i--)

scores[i+1]=scores[i]; scores[p]=x;printf("\n新成绩表:"); for(i=1;i<=N+1;i++)printf("%.2f",scores[i]); printf("\n");}想一想

若老师要求你编写一个程序对一门课的考试成绩进行处理,要求具有查找、排序、插入和删除等功能,并可选择性地多次操作,该如何编写程序实现呢?字符串与字符数组chara='W';charb='a';charc='n';chard='g';chare='L';charf='i';如何让程序存储我的姓名?WangLicharname[15]={'W','a','n','g','L','i'};用若干个字符用字符数组用字符串字符串与字符数组字符串常量是双引号括起的任意字符序列"HelloWorld""WangPing""Pleaseenteryourfullname:""Hello\"World

\""字符串常量中可以包含转义序列HelloWorld\0字符串结束符字符串与字符数组在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串字符数组和字符串的区别是:字符串的末尾有一个空字符‘\0’字符串可按如下方式声明并初始化:charc[15]={‘C',‘H',‘I',‘N',‘A','\0'};charc[15]=“CHINA";charstr[]=“abcde";手工加入一个空字符系统将自动加入一个空字符省略数组大小,系统自动计算,大小为后面的字符总数加1,最后一个元素存入一个空字符。试一试【例5-7】编写程序实现下述功能:输入一字符串,计算并输出其中字母e(大小写不论)的个数。#include<stdio.h>voidmain(){ charstr[256]=""; intcount=0; inti=0; printf("请输入一字符串:"); gets(str);//输入字符串放入str字符数组中

while(str[i]!='\0') { if(str[i]=='e'||str[i]=='E') count++; i++; } printf("字符串中e或E的个数:%d\n",count);}

讲一讲1.用字符数组str[256]保存字符串,用整型变量count记录字母e的个数,初值为0。2.输入字符串到str。3.构造循环,将循环变量i取初值0;如果str[i]的值是字符e或E,count加1。如果不是字符e或E,则判断下一个。4.如果str[i]的值是'\0',输出count的值;做一做把【例5-7】源程序中gets(str)改为scanf(“%s”,str);看看结果如何?字符串I/0charc[10];scanf("%s",c);printf("%s",c);格式描述串中使用转换字符串“%s”ChinabaodingChina\0使用scanf

时,不能输入空格China字符串I/0charc[20];gets(c);puts(c);Ile

arn

TurboC.\0IlearnTurboC.IlearnTurboC.从键盘上读入一个完整的行,存入字符数组c。并用空字符'\0'取代行尾的换行符'\n'。把字符数组中的字符串输出到显示器。使用gets函数允许输入空格IlearnTurboC.

试一试【例5-8】以下程序段中当输入以下字符串“Howareyou?”时,输出结果是什么?#include<stdio.h>voidmain(){chara[15],b[5],c[5];printf("请输入Howareyou?\n");//提示信息

scanf("%s%s%s",a,b,c);printf("a=%s\nb=%s\nc=%s\n",a,b,c);printf("请再次输入Howareyou?\n");//提示信息

scanf("%s",a);printf("a=%s\n",a);}字符串处理函数与字符串有关的内置函数在头文件string.h中定义要使用标准库字符串处理函数,程序前应该包含:

#include<string.h>string.hstrlenstrcpystrcmpstrcatstrlwrstrpr试一试【例5-9】定义一字符数组用来存放用户输入的密码,如果用户输入的密码等于“123”,则输出欢迎登录的提示信息;否则提示重新输入密码,输入3次错误则结束程序。#include<stdio.h>#include<string.h>#include<stdlib.h>voidmain(){charpassword[30];/*定义字符数组password*/inti=0;printf("请输入密码:\n");while(1)/*检验密码*/{gets(password);/*输入密码*/

if(strcmp(password,"123")!=0) /*如果密码不等于123*/{ i++; if(i==3) { printf("你已输入3次错误密码,无权进入!\n"); exit(0); /*输入三次错误的密码,退出程序*/ } printf("请输入密码:\n");}elsebreak;/*输入正确的密码,中止循环*/}printf("欢迎登录");/*输入正确密码所进入的程序段*/getchar();}}字符串处理函数语法

strcat(dest,src)描述把字符串src中的字符串连接到字符串dest中字符串的后面。本函数返回值是字符数组dest的首地址。连接后字符串的总长度将是字符串src

的长度加上字符串dest的长度。目标字符串dest的大小应足够存储最终的字符串。strcat#include<stdio.h>#include<string.h>voidmain(){charstr1[30]="We";charstr2[]="study";

strcat(str1,str2);printf("%s\n",str1);

strcat(str1,"CLanguage.");

printf("%s\n",str1);}

WestudyWestudyCLanguage.字符串处理函数语法

strcpy(dest,src)描述其中,dest是目标字符串,src是源字符串。相当于把字符数组src中的字符串拷贝到字符数组dest中。结束标志'\0'也一同拷贝。src可以是一个字符串常量。字符数组dest应足够大,以保证字符串复制不越界。strcpy#include<stdio.h>#include<string.h>voidmain(){charstr1[20],str2[20];

strcpy(str1,”Hello”);printf(”%s\n”,str1);

strcpy(str2,str1);printf(”%s,%s\n”,str1,str2);}

Hello

Hello,Hello字符串处理函数语法

strcmp(str1,str2)描述 按照ASCII码顺序比较字符串str1和str2的大小,比较的结果由函数返回。在两个字符串str1和str2相同时返回0;字符串str1大于字符串str2时返回一个正值,否则就返回负值。strcmp#include<stdio.h>#include<string.h>voidmain(){charstr1[]={"abcde"};charstr2[]={"abcdef"};strcpy(str1,"Hello");

if(strcmp(str1,str2)==0)

printf("yes\n");elseprintf("no\n");}

no字符串处理函数语法

strlen(s);描述计算字符串s中字符的个数,并将字符的个数作为函数的返回值。在计算字符个数时不计表示字符串结束的空字符'\0'。strlen#include<stdio.h>#include<string.h>voidmain(){chara[20]="Verygood!";

intn1,n2;

n1=strlen("Goodbye.");

n2=strlen(a);printf("n1=%d,n2=%d\n",n1,n2);}

n1=9,n2=10二维数组类型标识符数组名[行数][列数];intscore[4][2];内存scorescore[0][0]score[0][1]score[1][0]score[1][1]score[2][0]score[2][1]score[3][0]score[3][1]4X2=88*sizeof(int)字节score[0][0]score[0][1]score[1][0]score[1][1]score[2][0]score[2][1]score[3][0]score[3][1]score为了便于理解,二维数组一般理解为几行几列的矩阵1、声明二维数组:二维数组inta[4][2]={{11,1294},{22,450},{33,4000},{44,79}};

inta[][3]={{1,2,3},{4,5,6}

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

};

错误2、访问与初始化二维数组:试一试【例5-10】编写程序实现下述功能:将下列3行3列矩阵的元素存入数组,然后找出每一行的最大值并输出。

257186976解题思路:用二维数组a[3][3]存放矩阵,max存放一行中目前的最大值。#include<stdio.h>voidmain(){

inta[3][3]={{2,5,7},{1,8,6},{9,7,6}};

int

i,j,max;

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

for(j=0;j<3;j++)printf("%d",a[i][j]);

printf("\n"); } for(i=0;i<3;i++) { max=a[i][0];

for(j=1;j<3;j++)if(a[i][j]>max)max=a[i][j];

printf("第%d行的最大值是%d:\n",i+1,max)

温馨提示

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

评论

0/150

提交评论