版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计
第五章数组
第五章数组数组的用处
保存大量同类型的相关数据如矩阵运算,表格数据等
C语言程序设计
第五章数组
inta[10];1、定义一个有10个元素的数组,每个元素的类型均为int2、使用a[0]、a[1]、a[2]、……、a[9]这样的形式访问每个元素。可以像使用普通变量一样使用他们。3、系统会在内存分配连续的10个int空间给此数组(存储结构)4、直接对数组名a的访问,就是访问此数组的首地址,数组名不能与其他变量名重名。一维数组的定义为:类型说明符数组名[长度常量表达式];
[]:数组运算符,不能用()一维数组的存储形式一维数组的元素在内存中依次连续存储inta[10];...a[4]a[3]a[2]a[1]a[0]...a数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。数组名的书写规则应符合标识符的书写规定。数组名不能与其它变量名相同。数组名表示数组首地址,是地址常量。编译时分配连续的内存字节数=数组元素个数*sizeof(元素数据类型)长度常量表达式可以包括常量和符号常量,不能使用变量来作为数组定义时的长度表达式。例如:
intn=100;charch[n];/*错误的定义方式*/
数组定义语句的使用应注意以下几点:
C语言程序设计
第五章数组
5.1.3一维数组的引用和初始化1.一维数组的引用
数组元素的引用形式如下:数组名[下标]其中方括号中的下标为整型表达式。例:a[0]=a[5]+a[j]*3;说明:下标越界是大忌!使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果可以用任意整形表达式作为下标,动态决定访问哪个元素
for(i=0;i<10;i++)
a[i]=2*i;在引用数组元素的时候,必须使用“[]”,称为下标运算符,它是优先级别最高的运算符之一。只能逐个对数组元素进行操作(字符数组例外)输入方法:inta[10],i;//i为指定下标位置的变量输入第i个数组元素:scanf("%d",&a[i]);输入整个数组元素:for(i=0;i<10;i++)scanf("%d",&a[i]);输出方法:输出第i个数组元素:printf("%d",a[i]);输出整个数组元素:for(i=0;i<10;i++)printf("%d",a[i]);一维数组的输入和输出【例5-1】
:数组元素的引用
#include<stdio.h>voidmain(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf(“%d”,a[i]);}
C语言程序设计
第五章数组
输出:9876543210数组元素的下标常用循环变量来控制!赋值输出例【例5-2】输入五个同学的成绩,计算其平均成绩。#include"stdio.h"main(){floatscore[6];/*定义单精度数组score,有6个元素*/inti;for(i=0;i<5;i++){printf("Pleaseinputthe%dscore:",i+1);/*提示输入5个人的成绩*/scanf("%f",&score[i]);}score[5]=0; /*score[5]中放平均成绩,所以先清0*/for(i=0;i<5;i++)score[5]+=score[i]; /*求成绩之和*/score[5]/=5; /*求平均成绩*/printf("Theaveris:%f",score[5]);}分析:如果按照以前的处理方式,可以使用5个变量分别存储5个学生的成绩,然后计算其平均成绩。现在可以使用一个含有5个元素的数组存储5个学生的成绩,然后求5个元素的平均值。
C语言程序设计
第五章数组
例
C语言程序设计
第五章数组
2.一维数组的初始化
数组的初始化:在定义数组的同时给出数组元素的初始赋值。因为数组定义后的初值仍然是随机数,一般需要我们来初始化。一维数组初始化赋值的一般形式为:数据类型数组名[长度常量表达式]={值,值…值};
1、在定义数组时对全部元素赋初值
inta[10]={0,1,2,3,4,5,6,7,8,9};2、可以只给一部分元素赋初值
inta[10]={0,1,2,3,4};3、如果想使一个数组中全部元素值相同(赋相同值),必须给元素逐个赋值,不能给数组整体赋值
inta[10]={1,1,1,1,1,1,1,1,1,1};而不能写成:
inta[10]=1;初始化的几种方法:
4、在对全部数组元素赋初值时,可以不指定数组长度
inta[]={0,1,2,3,4,5,6,7,8,9};初始化的几种方法:
【例5-3】在声明数组时初始化元素,并将所有元素进行输出
#include"stdio.h"main(){ inti,a[]={1,2,3,4,5,6,7,8,9,0}; printf("%s%10s\n","number","value"); for(i=0;i<10;i++) printf("%6d%10d\n",i,a[i]);}
C语言程序设计
第五章数组
例【例5-4】统计整型数组a中偶数和奇数的个数。本例只要将数组a中的元素按顺序取出,然后逐个判断其是奇数还是偶数,判断的方法是:能被2整除的数是偶数,不能被2整除的数是奇数。#include"stdio.h"main(){inta[10]={8,43,22,75,66,54,108,99,19,111};intnum_odd=0,num_even=0;//变量num_odd存放奇数的个数
//num_even存放偶数的个数inti;for(i=0;i<10;i++){if(a[i]%2==0)num_even++;elsenum_odd++;}printf("\nevennumber:%d,odd_number:%d",num_even,num_odd);}例【例5-5】用数组来求fibonacci数列问题
C语言程序设计
第五章数组
f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...1101452319235例#include"stdio.h"voidmain(){inti;intf[20]={1,1};for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++)printf("%9d",f[i]);}
求fibonacci数列问题程序:计算输出【例5-6】给出一个数组,从键盘上输入其每一个值,并且进行从小到大排序输出。
冒泡排序法:基本思想:设想被排序的数组R[0..n-1]垂直竖立,将每个元素看作一个气泡。每个元素的值即为气泡的重量,根据轻气泡不能在重气泡之下的原则,使轻气泡“漂浮”(即将相邻两个数比较,将小的调到前头),直到任何两个气泡都是轻者在上、重者在下为止。
C语言程序设计
第五章数组
第一趟比较
经过第一趟(共5次比较与交换)后,最大的数9已“沉底”。然后进行对余下的前面5个数第二趟比较第二趟比较如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。程序流程图如下:0[n-1]10-10[n-1]冒泡排序法程序#include<stdio.h>voidmain(){inta[6],i,j,t;printf("Input6numbers:\n");for(i=0;i<6;i++)scanf("%d",&a[i]);printf("\n");for(j=1;j<6;j++)//比较趟数
{for(i=0;i<6-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<6;i++) printf("%d",a[i]);}简单选择排序法简单选择排序法简单选择排序法for(i=0;i<5-1;i++){
}t=a[i];a[i]=a[j];a[j]=t;for(j=i+1;j<5;j++){
if(a[i]<a[j])
交换两数位置;
}#include"stdio.h"main(){inti,j,a[5];inttemp;for(i=0;i<5;i++){printf(“\n请输入第%d个数:”,i+1);scanf(“%d”,&a[i]);}printf(“\n排序前数组为\n”);for(i=0;i<5;i++)printf(“%5d”,a[i]);/*对数组中的元素进行交换法排序*/for(i=0;i<5-1;i++){for(j=i+1;j<5;j++){if(a[i]>a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}}printf(“\n排序后数组为:\n”);for(i=0;i<5;i++)printf(“%5d”,a[i]);}二维数组的定义数据类型数组名[常量表达式][常量表达式];inta[2][3];a[0]a[1]a----a[0][0]a[0][1]a[0][2]----a[1][0]a[1][1]a[1][2]5.2二维数组行数列数可以把二维数组看作一种特殊的一维数组定义时,行列数必须是常量表达式,不能是变量二维数组的存储结构inta[2][3];a[0]a[1]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放顺序:按行存放先顺序存放第0行的元素,再存放第1行的元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]aa[0]a[1]
C语言程序设计
第五章数组
二维数组元素的引用形式:数组名[行下标][列下标]
例:a[1][2]a[2-1][2*2-1]5.2.2二维数组的引用和初始化(1)在引用数组元素的时候,行下标和列下标必须使用下标运算符“[]”。(2)可以用任意整型表达式作为下标,动态决定访问哪个元素(3)二维数组的行下标从0开始(下界为0),到数组行数减1
(上界)结束;列下标从0开始(下界为0),到数组列数减1(上界)结束。C语言的编译器不对数组的越界问题进行检查,所以编程人员要特别注意。初始化的几种方法1、分行给二维数组赋初值inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};2、将所有数据写在一个花括号内,顺序赋值inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};3、可以对部分元素赋初值
inta[3][4]={{1},{5},{9}};inta[3][4]={1,5,9};★二维数组元素的初始化初始化的几种方法4、如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。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};在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值:
inta[][4]={{0,0,3},{},{0,10}};★二维数组元素的初始化二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)inta[2][3],i,j;输入方法:输入第i行第j列元素:scanf(“%d”,&a[i][j]);输入整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)
scanf(“%d”,&a[i][j]);输出方法:输出第i行第j列元素:printf(“%d”,a[i][j]);输出整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)
printf(“%d”,a[i][j]);【例5-8】定义一个二维数组,从键盘上输入其每一个值,并且从显示器上输出。
#include"stdio.h"main(){inti,j,a[3][2];/*定义了一个二维数组*/printf(“Pleaseinputthenumber:”);for(i=0;i<3;i++)for(j=0;j<2;j++)scanf(“%d”,&a[i][j]);/*从键盘上逐一输入该数组的元素*/printf(“thenumberis:\n”);for(i=0;i<3;i++)for(j=0;j<2;j++)printf(“%5d”,a[i][j]);/*逐一输出该数组的元素*/}【例5-9】
求二维数组a[3][4]中最大元素值及其行列号先用N-S流程图表示算法,如下:#include<stdio.h>voidmain(){inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};inti,j,row=0,colum=0,max;
max=a[0][0];
for(i=0;i<=2;i++)for(j=0;j<=3;j++)
if(a[i][j]>max)
{max=a[i][j]; row=i; colum=j; }
printf("max=%d,row=%d,colum=%d\n",max,row,colum);}运行结果如下:max=10,row=2,colum=1
【例5-10】定义一个二维数组,在二维数组中选出各行最大的元素组成一个一维数组,并将结果输出。#include"stdio.h"main(){inta[3][3];//定义了一个二维数组
intb[3],i,j,max;printf("Pleaseinputthenumber:\n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);//从键盘上逐一输入该数组的元素
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];b[i]=max;//选出二维数组中各行最大的元素组成一个一维数组
}printf("\narrayais:\n");for(i=0;i<3;i++)//逐一输出该二维数组的元素
{for(j=0;j<3;j++)printf("%5d",a[i][j]);printf("\n");}printf("\narraybis:\n");for(i=0;i<3;i++)//逐一输出该二维数组各行的最大值
printf("%5d",b[i]);printf("\n");}【例5-11】将二维数组行列元素互换,存到另一个数组中。
算法:①a数组初始化(或赋值)并输出②用二重循环进行转置:b[j][i]=a[i][j]③输出b数组#include<stdio.h>main(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++) {printf("%5d",a[i][j]);//输出a数组内容
b[j][i]=a[i][j];//将a数组转置后内容送到b数组
}printf("\n");}printf("arrayb:\n");//输出b数组内容
for(i=0;i<=2;i++){for(j=0;j<=1;j++) printf("%5d",b[i][j]);printf("\n");}}5.3字符数组与字符串(String)字符数组每个元素都是字符类型的数组chara[10];字符串用双引号括起的一串字符是字符串常量,C语言自动为其添加'\0'终结符C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理
C语言程序设计
第五章数组
5.3.2字符数组的引用和初始化字符数组的引用逐个字符引用:数组名[下标]对字符数组整体引用:%schara[10];a[0]=‘a’;charc[]=“windows”;printf(“%s”,c);字符数组的初始化和赋值用字符型数据对数组元素逐个进行初始化
①charc[5]={‘h’,’e’,’l’,’l’,’o’};②charc[5];c[0]=‘h’;c[1]=‘e’;c[2]=‘l’;c[3]=‘l’;c[4]=‘o’;用字符串直接对数组初始化和赋值
①charc[15]=“china”;
有时也写成charc[15]={“china”};②charc[15];scanf(“%s”,c);
5.3.2字符数组的引用和初始化注意:
字符串是以空字符‘\0’作为结束标志,下述两种初始化方式就有差别:charb1[]={'C','h','i','n','a'};charb2[]=“China”;例:chart[]=“abc”,s[3]=“abc”;它们等同于:chart[]={‘a’,‘b’,‘c’,‘\0’},s[]={'a','b','c'};
(2)对字符数组初始化时,初值表中提供的初值个数(即在一对花括号中的字符个数)不能大于给定数组的长度。初值的个数可以小于数组的长度。这时,只将提供的字符依次赋给字符数组中前面的相应元素,而其余的元素自动补0(即空字符'\0'的值)。(3)在字符串的初始化完成后,对字符数组的操作也是按单个元素进行的,以下的操作是错误的:chars[20];chars1[]={“VisualC++6.0”};chars2[]={“Thisisatest!”};s=s2;
/*不能用数组名对字符数组整体赋值*/if(s1>s2)/*不能使用数组名对字符数组进行整体比较*/……..(4)打印输出一个没有以’
\0’结尾的字符串,其执行结果是无法预知的,如:charstr[5]={‘a’,’b’,’c’,’d’,’e’};printf(“%s”,str);字符数组str没有元素是’\0’,printf将从字符‘a’开始显示,直到遇到字符’\0’为止。因此,printf函数在显示完’e’后,将继续显示存储在’e’后的字符,这样就会显示紊乱。【例5-13】字符数组的初始化和引用#include"stdio.h"main(){inti,j;chara[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};for(i=0;i<=1;i++){for(j=0;j<=4;j++)printf("%c",a[i][j]);printf("\n");}}例“hello”共5个字符,在内存占6个字节字符串长度5
h
ello
\01041011081081110内存存放字符ASCII码5.3.3字符串的定义
charc[]=“hello”;逐个字符I/O:%c整个字符串I/O:%s例用%cmain(){charstr[5];inti;for(i=0;i<5;i++)scanf(“%c”,&str[i]);for(i=0;i<5;i++)printf(“%c”,str[i]);}例用%smain(){charstr[15];scanf(“%s”,str);printf(“%s”,str);}5.3.4字符串的输入输出
C语言程序设计
第五章数组
说明:
输出字符不包括结束符‘\0’;(2)“%s”输出字符串时,printf函数中的输出项是字符数组名。“%s”输入字符串时,scanf函数的输入项即为数组名,不加&。(3)如果数组长度大于字符串实际长度,则遇到第一个‘\0’时输出结束。(4)在输入字符串时,字符串的长度必须至少比字符数组长度小1。(5)利用一个scanf函数输入多个字符串时,须以空格、回车或者Tab做分隔符。例字符串输入举例#include<stdio.h>main(){chara[15],b[5],c[5];
scanf("%s%s%s",a,b,c);printf("a=%s\nb=%s\nc=%s\n",a,b,c);
scanf("%s",a);printf("a=%s\n",a);}scanf中%s输入时,遇空格或回车结束运行情况:输入:Howareyou?输入:Howareyou?常用的字符串处理函数包含在头文件string.h字符串输出函数puts格式:puts(字符数组名/字符串)功能:向显示器输出字符串(输出完,换行)说明:字符数组必须以‘\0’结束字符串输入函数gets格式:gets(字符数组名)功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加‘\0’说明:输入串长度应小于字符数组的长度返回值:字符数组的首地址例#include<string.h>main(){charstring[80];printf(“Inputastring:”);gets(string);puts(string);}输入:Howareyou?输出:Howareyou?
5.3.5字符串的处理函数
C语言程序设计
第五章数组
字符串连接函数strcat格式:strcat(字符数组1,字符数组2)功能:把字符数组2串接到字符数组1后面,自动删去字符串1后的结束标志’\0’,但保留字符数组2后的结束标志返值:返回字符数组1的首地址说明:字符数组1必须足够大
本函数返回值是字符数组1的首地址字符串拷贝函数strcpy----字符串的整体赋值格式:strcpy(字符数组1,字符数组2)功能:将字符串2,覆盖拷贝到字符数组1中去。返值:返回字符数组1的首地址说明:拷贝时‘\0’一同拷贝字符数组1必须足够大
不能使用赋值语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学文化建设低效现象深度剖析与创新策略研究
- 小学信息技术兴趣小组:实践探索与素养培育
- 押题09 第15-17题 统计与概率(五大题型)(学生版)
- 代理投票2026年经纪合同协议
- 2026年建筑危机处理协议
- 2026年企业文化建设合作协议
- 智能物流系统开发协议
- 2026年客户满意度提升管理协议
- 2026年中心化大数据分析咨询服务
- 建设工程勘察合同2026年
- 挖机迁坟工程合同(2篇)
- 人教部编版八年级语文上册现代文阅读教学课件:记叙文阅读(含小说、散文)考点七-理解段落作用-答题模板
- 气管切开套管意外脱管处理
- Python数据分析与应用-从数据获取到可视化(第2版)课件 第2章 科学计算库NumPy
- 糖尿病核心信息知识讲座
- 美容外科临床诊疗指南诊疗规范2023版
- 【语文】西安高新一小小学四年级上册期末试题
- 英语课堂小游戏PPT(18个游戏模板)
- 临床微生物检验-脑脊液标本检验(微生物检验技术课件)
- 快感体验能力量表(TEPS)
- 八年级期末考试多项细目表语文
评论
0/150
提交评论