




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计基础(C语言)数组概念程序设计基础(C语言)数组概念2基本概念问题的提出?a,b从大到小排序输出?Programming1:if(a<b){temp=a;a=b;btemp;}printf(“%d%d\n”,a,b);
a,b,c从大到小排序输出?Programming1:if(a<b){temp=a;a=b;b=temp;}if(a<c){temp=a;a=c;c=temp;}if(b<c){temp=b;b=c;c=temp;}printf(“%d%d%d\n”,a,b,c);a,b,c,d从大到小排序输出?a,b,…,从大到小排序输出?利用数组可以进行数据的排序2基本概念问题的提出?a,b从大到小排序输出?Progra3基本概念问题的提出?用变量来解决:#include<stdio.h>main(){floatcj1,cj2,cj3,…cj10;/*定义10个变量*/floatpj;scanf(“%f”,&cj1);/*输入10个数据*/scanf(“%f”,&cj2);
…scanf(“%f”,&cj10);pj=cj1+cj2+…+cj10;pj=pj/10;/*求平均值*//*打印低于平均成绩的同学成绩*/if(cj1<pj)printf(“%f\n”,cj1);if(cj1<pj)printf(“%f\n”,cj2);
…if(cj1<pj)printf(“%f\n”,cj10);
}例2:计算10个同学的成绩:计算平均成绩、打印低于平均成绩的同学成绩如果增加1000个成绩?3基本概念问题的提出?用变量来解决:例2:计算10个同学的成4基本概念问题的提出?用数组来解决:#include<stdio.h>main(){floatcj[10];/*定义一个实型数组存放10个成绩*/floatpj;inti;for(i=0;i<10;i++)/*输入10个数据*/scanf("%f",&cj[i]);for(i=1,pj=0;i<10;i++)/*求平均值*/ pj=pj+cj[i];pj=pj/10;for(i=0;i<10;i++)/*打印低于平均成绩的同学成就*/if(cj[i]<pj) printf("cj=[%d]=%f\n",i+1,cj[i]);}例2:计算10个同学的成绩:计算平均成绩、打印低于平均成绩的同学成绩4基本概念问题的提出?用数组来解决:例2:计算10个同学的成5基本概念问题的提出?用数组解决此类问题在程序设计中,数组是十分有用的数据类型循环中使用数组能更好地发挥循环的作用例2:采用数组和循环相结合,循环变量的值改变某些问题不使用数组就难以解决例1:优点程序简洁、思路清楚明了书写简洁,通用性强5基本概念问题的提出?6基本概念什么是数组?是一组具有固定数目的、有序的、类型相同的数据的集合是同类型有序数据的集合可以为该数据集合起一个名字,称为数组名该数据集合中的各数据项称为数组元素,用数组名和下标表示根据数组下标的多少,数组可以分为一维数组和多维数组一维只有一个下标,例如:cj[10]二维有两个下标,例如:grade[3][4]6基本概念什么是数组?7基本概念什么是数组?一个数组就是一组连续的内存空间,用来保存数据,数组中的每一项称为一个元素C语言数组的特点数组的个数必须确定不允许变动,但数组元素的值可以改变数组元素的类型必须是相同的不允许混合的a[0]a[1]a[2]a[3]a[4]DFFODFF2DFF4DFF6DFF8a7基本概念什么是数组?a[0]a[1]a[2]a[3]a[48基本概念什么是数组?使用下标的优点?下标唯一确定了元素在数组中的位置(或者说是排列顺序)采用数组名+[下标]
可以准确访问到数组中的每一个元素提示C语言是一个有趣的语言,它从0开始计数,而不是从1开始,所以例题中10个元素的编号是从0到9a[10]a[0]a[1]a[2]……a[9]数组名数组元素名数组长度8基本概念什么是数组?a[10]a[0]a[1]程序设计基础(C语言)一维数组程序设计基础(C语言)一维数组10一维数组一维数组的定义格式:类型说明符数组名[常量表达式];说明:数据类型是数组全体数组元素的数据类型数组名用标识符表示符合表示服的命名规则整型常量表达式代表数组具有的数组元素个数必须是正的整型常量表达式,不能出现变量或非整型值提示编译程序为数组开辟连续的存储单元,用来顺序存放数组的各数组元素用数组名表示该数组存储区的首地址数组元素的下标一律从0开始一维数组元素按顺序存放,其所占字节数的计算公式:数组所占总字节数=sizeof(type)*size10一维数组一维数组的定义11一维数组一维数组的定义
inta[5],b[5];floatc[10];说明:定义了整型数组a和b以及实型数组ca和b的数组元素的类型都是intc的数组元素的类型都是floata数组有5个数组元素,b数组有5个数组元素,c数组有10个元素以a[5]为例a数组的数组元素是a[0],a[1],a[2],a[3]和a[4]共5个数组元素a数组元素的下标大于等于0,且小于5定义了int型数组a编译程序将为a数组在内存中开辟5个连续的存储单元(每个int存储单元占2个字节),用来存放a数组的5个数组元素a[0]代表这片存储区的第一个存储单元数组名a代表a数组的首地址,即a[0]存储单元的地址a[i]实际上代表这片存储区序号为i的存储单元a[i]就是一个带下标的int型变量a数组是这些int型下标变量的集合11一维数组一维数组的定义12一维数组一维数组的定义正确的定义方式#defineN5inta[N];/*N是符号常量,其值为5*/intb[2+3];/*2+3是常量表达式,其值为5*/intc[10];错误的数组定义inta[j];/*j不是常量*/intx=10,b[x];/*?*/intM(4);/*不能用圆括号定义数组*/intn[1.0];/*?*/
12一维数组一维数组的定义13一维数组一维数组初始化格式
说明可在{}中给出各数组元素的初值各初值之间用逗号分开把{}中的初值依次赋给各数组元素数据类型数组名[整型常量表达式]={初值1,初值2,……};13一维数组一维数组初始化数据类型数组名[整型常量表达式]14一维数组初始化例intnum[4]={1,2,3,4};表示把初值1,2,3,4依次赋给num[0],num[1],num[2],num[3]相当于执行如下语句
intnum[4];
num[0]=1;
num[1]=2;
num[2]=3;
num[3]=4;提示初始化的数据个数不能超过数组元素的个数,否则出错例如:inta[4]={1,2,3,4,5};是错误的一维数组14一维数组初始化一维数组15一维数组一维数组初始化对数组的部分元素赋初值例intnum[5]={1,2,3};numnum[0]num[1]num[2]num[3]num[4]
12300该语句执行:num[0]=1;num[1]=2;num[2]=3;num[3]=0;num[4]=0;
15一维数组一维数组初始化numnum[0]num[1]16一维数组一维数组初始化提示初始化的数据个数不能超过数组元素的个数,可以少于数组元素的个数数组的元素不能自动初始化采用语句intcj[10]={0};将数组cj的元素初始化为0若数组元素的个数定义省略,则系统根据初值的个数来确定数组元素的个数例如:inta[3]={1,2,3};数组有3个数组元素:a[0]=1,a[1]=2,a[2]=3若省略数组元素个数的定义,则初值必须完全给出C语言编译系统将自动根据初始化数据的个数来确定数组的长度16一维数组一维数组初始化17一维数组数组的引用数组引用两种形式对整个数组的引用只给出数组名即可对数组元素的引用需要给出数组名[下标]的形式形式:
数组名[下标表达式]
例如
inta[5],i=1,j=2,k=4;a[k],a[j-1],a[j+i]都是对a数组元素的合法引用a[k]=a[i-1]+a[0];表示a[0]的值与a[2]的值求和并赋给a[4]for(i=0;i<5;i++)scanf("%d",&a[i]);表示依次为a数组的5个元素输入数据17一维数组数组的引用18一维数组数组的引用提示定义时整型常量表达式与引用时的数组元素的下标表达式是完全不同的概念数组定义:inta[5];整型常量表达式5表示a数组有5个数组元素数组元素的引用a[2]=a[1]+a[5];下标表达式2和1均表示数组元素的下标a[5]是错误的数组元素引用,因为下标从0开始,所以数组元素的下标小于5,下标已经越界系统不检查数组元素下标是否越界只能由编程者自己掌握下标越界会破坏其它变量的值编程时一定要保证数组元素下标不越界18一维数组数组的引用19问题1:inta[2];scanf(“%d%d”,&a[1],&a[2]);——??错误:在C语言中数组元素的下标由0开始,一个数组的下标的合法范围在0~n-1,因此该题正确的写法是:
inta[2];
scanf(“%d%d”,&a[0],&a[1]);错误:
数组元素是通过数组名[下标]来访问的,其中下标必须是大于0的整数、整型变量或整型表达式,在这段程序中,i是浮点数,不能做数组元素的下标。问题2:inta[10];
floati=3;
a[i]=10;——??一维数组19问题1:inta[2];错误:错误:问题2:int20一维数组一维数组的操作数组只是一种便于实现算法的数据结构,如何使用它解决实际问题才是实质在程序设计中常使用数组,很多算法也是建立在数组和循环之上由于数组元素具有相同的性质处理他们往往需要重复操作,因此数组操作离不开循环结构数组与循环总是联系在一起的20一维数组一维数组的操作21一维数组一维数组的操作例:在数组中查找和X相同的元素的位置,如果找到打印元素的位置,如果未找到则打印信息(假定数组中的元素互不相同)。#include<stdio.h>#defineSIZE10main(){inta[SIZE]={1,2,35,6,39,47,53,4,5,10};
inti,x;
printf(“pleaseenterax:\n”);
scanf(“%d”,&x);
for(i=0;i<=SIZE-1;i++)
if(a[i]==x)break;
if(i<SIZE)
printf(“%d,posteris%d\n”,x,i);
elseprintf(“nofind%d\n”,x);
}21一维数组一维数组的操作例:在数组中查找和X相同的元素的位22一维数组一维数组的操作例:已知一维数组中存放10个互不相同的整数,从键盘输入一个数,并从数组中删除与该值相同的元素中的值。#include<stdio.h>#defineSIZE10main(){inta[SIZE]=1,2,35,6,39,47,53,4,5,10};
inti,j,x;
for(i=0;i<SIZE;i++)
printf(“%4d”,a[i]);
printf(“pleaseenterax:\n”);
scanf(“%d”,&x);
for(i=0;i<SIZE;i++)
if(a[i]==x)break;
for(j=i;j<SIZE-1;j++)
a[j]=a[j+1];
for(i=0;i<SIZE-1;i++)
printf(“%4d”;a[i]);
printf(“\n”);}说明:做删除操作时,首先要找到删除元素的位置,找到后,立即用break语句推出循环并进行删除操作,删除操作实质是把一些数组元素向前移动一位。最后一位的删除不必移位,直接输出前size-1位。22一维数组一维数组的操作例:已知一维数组中存放10个互不相23一维数组一维数组的操作
例:编写程序求10个数中的最大值和最小值以及求10个数中的最大值和最小值的位置#defineN10
main()
{inta[N],k,max,min;
for(k=0;k<N;k++)/*将N个数输入到a数组中*/
scanf("%d",&a[k]);
max=a[0];
for(k=1;k<N;k++)/*依次比较各数,找出最大值max*/
if(max<a[k])max=a[k];
min=a[0];
for(k=1;k<N;k++)/*依次比较各数,找出最小值min*/
if(min>a[k])min=a[k];
printf("max=%d,min=%d\n",max,min);
}求10个数中的最大值和最小值。
把以上求最大值的程序和求最小值的程序按串行方式写入一个程序中。程序中先求最大值,然后再求最小值23一维数组一维数组的操作
例:编写程序求10个数中的最大值24一维数组一维数组的操作
例:编写程序求10个数中的最大值和最小值以及求10个数中的最大值和最小值的位置#defineN10
#include"stdio.h"
main()
{inta[N],k,max,min;
for(k=0;k<N;k++)/*将N个数输入到a数组中*/
scanf("%d",&a[k]);
max=min=0;/*假定最大值和最小值均为a[0],记录它们的下标0*/
for(k=1;k<N;k++)/*依次比较各数,找出最大值和最小值的下标max、min*/
{if(a[max]<a[k])max=k;/*找出最大值下标max*/
if(a[min]>a[k])min=k;/*找出最小值下标min*/
}
printf("max=a[%d]=%d,min=a[%d]=%d\n",max,a[max],min,a[min]);
}在上面程序中必须增加记忆最大值下标和最小值下标的语句。即每当产生一个最大(小)值时,立即记录它的下标。若最大值下标是max,最小值下标是min,则a[max]就是最大值,a[min]就是最小值24一维数组一维数组的操作
例:编写程序求10个数中的最大值程序设计基础(C语言)二维数组程序设计基础(C语言)二维数组26二维数组二维数组的定义需要两个下标才能识别某个元素的数组称为“二维数组”二维数组可以看作具有行和列的平面数据结构如矩阵格式说明数据类型是数组全体数组元素的数据类型数组名用标识符表示两个整型常量表达式分别代表数组具有的行数和列数数组元素的下标一律从0开始例:intarray[3][4];类型说明符数组名[常量表达式1][常量表达式2];26二维数组二维数组的定义类型说明符数组名[常量表达式27012第0行第1行第2行0123第0列第1列第2列第3列数组名行下标列下标a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]该二维数组包含三行四列,因此称为3×4数组。数组中的每一个元素都用a[i][j]的形式表示。所以:该例中定义了一个3*4(3行4列)的数组,我们可以将其视为一个有3个元素a[0]、a[1]、a[2]组成的一维数组,而a[0]、a[1]、a[2]又是包含4个元素的一维数组。因此,可以将a[0]、a[1]、a[2]分别看成是三个一维数组的名字。二维数组270第0行第1行第2行0128二维数组二维数组的存放方式在C语言中,二维数组在内存中的存储是按行存放的a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]
aa[0][0]a[0][1]…….a[2][2]a[2][3]二维数组存储所占的内存字节数的计算公式为:数组总字节数=sizeof(type)*size1*size228二维数组二维数组的存放方式a[1][1]a[1][2]a29二维数组二维数组的初始化形式
数据类型数组名[整常量表达式][整常量表达式]={初始化数据};在{}中给出各数组元素的初值各初值之间用逗号分开把{}中的初值依次赋给各数组元素初始化方式分行进行初始化例:inta[2][3]={{1,2,3},{4,5,6}};在{}内部再用{}把各行分开提示初始化的数据个数不能超过数组元素的个数,否则出错29二维数组二维数组的初始化30二维数组二维数组的初始化按二维数组在内存中的排列顺序初始化例:inta[2][3]={1,2,3,4,5,6};把{}中的数据依次赋给a数组各元素(按行赋值)为部分数组元素初始化例:inta[2][3]={{1,2},{4}};省略第一维的定义,但不能省略第二维的定义系统根据初始化的数据个数和第2维的长度可以确定第一维的长度例:inta[][3]={1,2,3,4,5,6};a数组的第一维的定义被省略,初始化数据共6个,第二维的长度为3,即每行3个数,所以a数组的第一维是2省略第一维的定义时,第一维的大小按如下规则确定:初值个数能被第二维整除,所得的商就是第一维的大小;若不能整除,则第一维的大小为商再加1例如inta[][3]={1,2,3,4};等价于:inta[2][3]={1,2,3,4};30二维数组二维数组的初始化31二维数组二维数组的初始化提示只对部分数组元素初始化。未被初始化的数组元素将被编译系统自动清0两种初始化方法得到的初始结果是不同的inta[2][3]={{5,6},{7,8}};5,6,07,8,0inta[2][3]={5,6,7,8}5,6,78,0,031二维数组二维数组的初始化inta[2][3]={{532二维数组二维数组的初始化例:一下能够对二维数组a进行正确初始化的语句是:(A)inta[2][]={{1,0,1},{2,0,2}};(B)inta[][3]={{1,2,3},{4,5,6}};(C)inta[2][4]={{1,2,3},{4,5},{6}};(D)inta[][3]={{1,0,1},{},{2,3}};例:已知inta[][3]={0,1,2,3,4,5,6};则数组的第一维的大小是多少?(A)2(B)3(C)4(D)无确定值32二维数组二维数组的初始化例:一下能够对二维数组a进行正确33二维数组二维数组元素的引用格式
数组名[下标1][下标2];每个元素同一般变量一样使用例:inta[2][4];a[0][2]=a[1][3]*4;例:inta[2][3],i=1,j=2,k=0;合法引用a[i][k],a[j-1][i],a[1][j+k]a[i][k]=a[i-1][j]+a[1][j];错误引用a[2][3]下标越界a[3][2],行下标越界a[1,0]a(1)(2)C语言不进行数组的越界检查,在引用时不要使数组越界
33二维数组二维数组元素的引用格式34二维数组二维数组的操作可以采用循环(嵌套)结构实现对二维数组的操作例从键盘依次为数组元素输入数据计算数组a[2][4]的所有元素之和的操作将数组a[2][4]的第二行的所有元素初始化值为0的操作for(i=0;i<2;i++)
for(j=0;i<3;i++)
scanf("%d",&a[i][j]);
total=0;
for(row=0;row〈=1;row++)
for(column=0;column〈=3;column++)
total+=a[row][column];
for(column=0;column〈=3;column++)
a[1][column]=0;34二维数组二维数组的操作for(i=0;i<2;i++)35二维数组【例】:阅读下列程序,选择程序的运行结果。
intm[3][3]={{1},{2},{3}};
intn[3][3]={1,2,3};
main()
{printf(”%d\n”,m[1][0]+n[0][0]);/*1.结果*/printf(”%d\n”,m[0][1]+n[1][0]);/*2.结果*/}1.结果:A)0B)1C)2D)32.结果:A)0B)1C)2D)335二维数组【例】:阅读下列程序,选择程序的运行结果。1.结36【例】:阅读下列程序,选择程序的运行结果。
main()
{inta[6][6],m,n;
for(m=1;m<6;m++)
for(n=1;n<6;n++)
a[m][n]=(m/n)*(n/m);
}for(m=1;m<6;m++)
{for(n=1;n<6;n++)
printf(”%2d”,a[m][n]);
printf(”\n”);
}A)1111111111111111111111111B)0000100010001000100010000C)1000001000001000001000001D)1000101010001000101010001二维数组36【例】:阅读下列程序,选择程序的运行结果。for(m=137二维数组应用例将一个二维数组的每个元素按逆序存放在另一个数组中main(){inta[2][3]={{1,2,3},{4,5,6}};intb[2][3];inti,j;printf("arraya:\n");for(i=0;i<2;i++){for(j=0;j<3;j++) {printf("%4d",a[i][j]); b[i][2-j]=a[i][j];} printf("\n");}printf("arrayb:\n");for(i=0;i<2;i++){for(j=0;j<3;j++) printf("%4d",b[i][j]); printf("\n");}}关系:
b[i][2-j]=a[i][j]37二维数组应用main()关系:38二维数组应用例:求出一个二维数组的两条对角线上的元素之和#include”stdio0.h”main()
{inta[3][3]={1,3,7,13,19,27,37,49,63};
intsum1=0,sum2=0,m,n;
for(m=0;m<3;m++)
for(n=0;n<3;n++)
if(m==n)
sum1=sum1+a[m][n];
for(m=0;m<3;m++)
for(n=2;n>=0;n--)
if(m+n==2)
sum2=sum2+a[m][n];
printf(“sum1=%d,sum2=%d\n”,sum1,sum2);
}38二维数组应用#include”stdio0.h”39二维数组应用例:根据用户输入的年份和月份,输出这个月的天数分析要考虑平年和闰年的二月份的天数是不一样的程序中采用一个二维数组来存放平年和闰年的各个月份的天数#include<stdio.h>main(){
intdays[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
intyear,month;
intleap;39二维数组应用#include<stdio.h>40二维数组应用
printf(“enterayear:\n”);
scanf(“%d”
,&year);
printf(“enteramonth:\n”);
scanf(“%d”
,&month);
if(month>=1&&month<=12){
if((year%4==0&&year%100!=0)||(year%400==0))
leap=1;
elseleap=0;
i=days[leap][month-1];
printf(“%dyear%dmonth%ddays”,year,month,i);}
elseprintf(“entererrormonth!!!\n”);}
演示66.c40二维数组应用printf(“enterayea41小测试1.以下对一维数组a的正确说明是____。
A、chara(10);
B、inta[];C、intk=5,a[k];D、chara[]={'a','b','c'};2.若有说明语句:inty[][4]={0,0};则下面叙述不正确的是____。
A、数组y的每个元素都可得初值0
B、二维数组y的行数为1
C、该说明等价于inty[][4]={0};
D、只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值041小测试1.以下对一维数组a的正确说明是____。2.42小结提示“数组的第1个元素”和“下标为1的元素”之间的区别数组在编译时占用内存空间,要指定空间长度下标是一个整数或整数表达式在使用循环访问数组时,数组下标应该不小于0并且小于数组元素的个数初始化数据列表的数据个数可以少于数组元素个数常见错误缺少对数组元素的初始化声明时进行初始化的数据列表的数据个数多于数组元素的个数越界访问数组元素42小结提示程序设计基础(C语言)字符数组与字符串程序设计基础(C语言)字符数组与字符串44基本概念字符数组定义当数组元素为字符类型时,被称之为字符型数组具有一般数组的性质定义的格式charstr[10];
/*含有10个字符的一维字符型数组*/charstree[3][10];/*含有3*10个字符的二维字符型数组*/也可以将其看成3行并且每行各含有10个字符的一维字符数组44基本概念字符数组45基本概念字符数组字符数组的引用同数值型数组在用法上一样字符数组中的一个元素位置存放一个字符用赋值语句为其赋值时应该是单个字符例:intstr[10];
str[0]=‘A’;str[1]=‘‘;str[2]=‘n’;
str[3]=‘e’;str[4]=‘w’;str[5]=‘’;
str[6]=‘y’;str[7]=‘e’;str[8]=‘a’;
str[9]=‘r’;strA
new
yearstr开辟的连续存储单元中存放的是:
Anewyear。(一串字符)45基本概念字符数组例:intstr[10];str46例如:
charname[4];
main()
{name[0]=‘c’;name[1]=‘+’;
name[2]=‘+’;name[3]=‘\0’;}此程序段建立了一个四个元素的字符型数组。基本概念字符数组字符串串就是一组字符C语言没有提供内部串的类型串是由字符数组创建的实际上字符串就是带有若干限制的字符型数组其中一个限制条件是用‘\0’(NULL)来表示串的结束strA
new
year\0字符串46例如:基本概念字符数组strA字符串47基本概念字符数组双重性可被认为是一个表示若干个字符的字符类型的数组可被认为是一个字符串类型变量(如果一串字符的最后一个字符是一个‘\0’字符)提示字符型数组作为字符串形式处理时,无需使用下标实际上是将数组以指针的方式进行处理当使用下标时,实际上使用的是字符串中某一位置上的字符,而不是整个字符串字符型数组也不能整体赋值操作不允许一个数组赋给另一个数组47基本概念字符数组48基本概念字符数组赋值和引用方法将其元素作为字符型采用一般数组的处理方式,赋值、引用或初始化以字符串形式进行赋值、引用或初始化charmessage[6]={“hello”};或charmessage[]=“hello”;charmessage[]={‘h’,‘e’,‘l’,‘l’,‘o’};
——不是字符串;charmessage[]={‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’};
——是字符串;48基本概念字符数组charmessage[6]={“49基本概念字符数组赋值和引用方法区别字符常量charmessage[5]={‘h’,‘e’,‘l’,‘l’,‘o’};存放方式:字符串常量charmessage[]={“hello”};存放方式
‘h’
‘e’
‘l’
‘l’
‘o’
‘\0’charmessage[]={‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’};‘h’
‘e’
‘l’
‘l’
‘o’49基本概念字符数组‘h’‘e’‘l’50基本概念存放方式:thisi……………k!\0P.CHINA\0\0\0JAPAN\0\0\0\0\0CANADA\0\0\0\0存放方式:charstr[16]={“Thisisabook!”};或省略{},直接写成:
charstr[16]=“Thisisabook!”;
charstr1[3][10]={“P.CHINA”,“JAPAN”,“CANADA”};
50基本概念存放方式:thi51基本概念字符数组提示两种方式实现对字符数组的部分元素的初始化(赋初值)可省略一维数组的维长度和二维数组的第一维长度(与数值型相同)当用字符串常量赋初值时,系统自动加上“\0”字符字符数组的维长度要比实际字符长度多1个字符数组存放字符串时,应该事先估计出来实际字符串的长度保证数组的长度始终大于字符串的实际长度如果在一个数组中先后存放多个长度不同的字符串,数组长度的定义应大于最长字符串的长度如果字符串的长度大于存储它的字符数组的长度,由于C语言不提供越界检查。超出字符数组长度的部分就会将内存中字符数组后面的数据覆盖掉赋初值时,初值个数要少于数组的维长度,否则进行系统编译时越界例如:charstr[2][3]={“this”,“is”,“a”,“book”};51基本概念字符数组52基本概念【例1】下面有关字符数组和字符串说法正确的是:
A)字符数组中存放的一定是一个字符串。
B)所有的字符数组都可以被当作字符串处理。
C)对存放字符串的字符数组可以像一般数组一样对数组中的单个元素进行操作。
D)一个字符数组可以认为就是一个字符串。【例2】合法的数组说明语句是
。inta[]=“string”;inta[5]={0,1,2,3,4,5};chara=“string”;chara[]={0,1,2,3,4,5};
在C语言中,字符变量中存放的是与字符对应的ASCII码。数值
0,1,2,3,4,5所对应的ASCII字符虽然是不可显示的字符,但是这些都可以作为控制字符。52基本概念【例1】下面有关字符数组和字符串说法正确的是:53【例3】若有以下语句,则正确的描述是
。
charx[]=“12345”;
chary[]={‘1’,‘2’,‘3’,‘4’,‘5’};X数组和y数组的长度相同X数组长度大于y数组长度X数组长度小于y数组长度X数组等价与y数组【例4】阅读下面的程序给出执行结果。
main(){inti=0;
chara[3][3]={‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’};
for(i=0;i<3;i++)
printf(“%d”,a[i][1]);}
A)50,53,56B)49,52,55C)2,5,8D)1,4,7基本概念53【例3】若有以下语句,则正确的描述是。54字符数组输入/输出输入采用%c格式符,逐个输入所有字符main(){
inti,string[15];
for(i=0;i<15;i++){
scanf(“%c”
,&string[i]);
printf(“%c”
,string[i]);}}演示7C3.C54字符数组输入/输出输入main()55字符数组输入/输出输入采用%s格式符,输入字符串整体将字符数组作为字符串变量处理例scanf(“%s”,string);说明该函数向数组string中输入一个字符串数组名在数组中代表着首地址,所以scanf函数中的变量地址表中的输入变量只需写数组名string不能写成:scanf(“%s”,&string)为什么?scanf(“%c”,&string[i])针对的是某一变量元素的地址,取一字符串中一个元素的地址
scanf(“%s”,string)是要读入一串字符,数组名即是首地址55字符数组输入/输出输入56字符数组输入/输出输入采用%s格式符,输入字符串整体例此时假设数据输入的是:thisisabook则数组中的存储格式为:例:
main(){inti;
charstring[15];
scanf(“%s”,string);}this\0为什么?56字符数组输入/输出输入例:this\57字符数组输入/输出输入采用%s格式符,输入字符串整体如何解决scanf()函数不能完整输入全部字符(包括空格)的问题?C语言提供一个专门读入字符串的函数getsgets(string)其功能是从控制台读取一个字符串该函数可以读入包括空格在内的所有字符,直到遇到回车符作为结束标志,函数的值为字符串上例可写成此时输入Thisisabook在内存中的存放格式为:
main(){inti;
charstring[15];
gets(string);}Thisisabook\057字符数组输入/输出输入main()Th58字符数组输入/输出输出使用函数puts输出字符串puts()格式puts(字符串名)或puts(字符串常量)main()
{inti=0;
charch,text[80];
puts(“Enteralineoftext:”);
while((ch=getchar())!=‘\n’)text[i++]=ch;
text[i]=‘\0’;/*在字符串的最后加入一个NULL字符*/
puts(“\nThelineerteredwas:”);
puts(text);
}
演示7C6。C58字符数组输入/输出输出main()59字符串运算函数C语言支持多串函数的操作最常用的包括
strcpy(s1,s2)将s2拷贝到s1strcat(s1,s2)将s2连接到s1的尾部
strlen(s1)返回s1的长度(不包括‘\0’)
strcmp(s1,s2)若s1与s2相等,返回值为0若s1<s2,返回值小于0若s1>s2,返回值大于059字符串运算函数C语言支持多串函数的操作60字符串运算函数C语言支持多串函数的操作提示字符串处理函数的说明定义在头文件<string.h>中处理字符串时最好的方式是使用指针对字符串变量(字符数组)不能采用直接赋值的方法赋值,必须使用strcpy()函数来处理strcpy在拷贝时连同‘\0’一起拷贝两个字符串(数组)不能使用逻辑运算直接比较大小,必须使用strcmp()函数str=“abcd”
——非法strcpy(str,“abcd”)——合法if(str1>str2)printf(“true!”);——非法if(strcmp(str1,str2)==1)
printf(“true!”);——合法60字符串运算函数C语言支持多串函数的操作str=“abcd61字符串运算函数字符串应用编写一个比较两个字符串大小的程序分析字符串的比较规则是按两个字符串自左至右逐个字符比较(按其ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止若所有的字符全部相同,则两个字符串相等否则按第一个不同字符的比较结果处理#include<stdio.h>main(){inti,c;chars1[20],s2[20];printf("Firststring:");gets(s1);printf("Secondstring:");gets(s2);i=0;61字符串运算函数字符串应用#include<stdio.h62while(s1[i]!='\0'&&s2[i]!='\0'){ if(s1[i]>s2[i]) {c=1; break; } elseif(s1[i]<s2[i]) {c=-1; break; }else i=i+1; }字符串运算函数62while(s1[i]!='\0'&&s2[i]!='63if(s1[i]!='\0'&&s2[i]=='\0') c=1;if(s1[i]=='\0'&&s2[i]!='\0')c=-1;if(s1[i]=='\0'&&s2[i]=='\0')c=0;if(c==0)printf("%s=%s\n",s1,s2);elseif(c==-1) printf("%s<%s\n",s1,s2);else printf("%s>%s\n",s1,s2);}字符串运算函数63if(s1[i]!='\0'&&s2[i]=='\064字符串数组字符串数组定义就是说数组的每一个元素均是一个字符串
C语言中,常用二维字符数组的形式建立字符串数组数组的第一个下标(左下标)决定字符串的个数第二个下标(右下标)说明每个串的最大长度例如:charstr_array[30][80];说明定义了一个可以存放30个字符串的字符串数组,每个串的最大长度为80个字符提示在C语言中,一维字符数组的最普遍的用法是作为字符串使用数组处理字符串的另一种常见的形式是字符串数组64字符串数组字符串数组定义65字符串数组字符串数组引用访问字符串数组中一个单独的字符串只需要标明左下标即可例如gets(str_array[0]);数组str_array中的第一个字符串为参数调用函数gets()实际上是将str_array[0]作为指针处理的它指向字符数组元素str_array[0][0]的地址上述语句等价于gets(&str_array[0][0]);提示定义字符串数组时,数组的第二个下标应比实际字符串长度大1,以存放字符串的结束标志‘\0’65字符串数组字符串数组引用66
#include<stdio.h>#defineMAX100#defineLEN80chartext[MAX][LEN];
main(){registerintt,i,j;
for(t=0;t<MAX;t++)/*逐行输入字符串*/
{printf(“%d:”,t);
gets(text[t]);
if(!text[t][0])break;/*空行退出*/}
for(i=0;i<t;i++){for(j=0;text[i][j];j++)
putchar(text[i][j]);
putchar(‘\n’);}}该程序输入文本行直至遇到一个空行为止,而后每次一个字符地重新显示各行.字符串数组字符串数组引用例:以一个字符串数组为基础做简单的文本编辑处理66#include<stdio.h>该程序输入文本行直67字符串应用编程:将字符串S中所有的字符C删除#include<dtdio.h>main(){
inti,j;
chars[80];
gets(s);
for(i=j=0;s[i]!=‘\0’;i++)
if(s[i]!=‘c’)
s[j++]=s[i];
s[j]=‘\0’;
puts(s);}演示7CC。C67字符串应用编程:将字符串S中所有的字符C删除#inclu68#include<stdio.h>main(){charprompt[30]=“Whatisyourpassword?:”;
charpassword[10];
printf(“%s\n”,prompt);
gets(password);
if(strcmp(password,“000”)==0){printf(“passwordis:%s\n”,password);
printf(“ok!\n”);}
else
{printf(“passwordis:%s\n”,password);
printf(“Invalidpassword!”);}}字符串应用字符数组在人机交互系统中的应用。程序运行时要求用户输入口令并验证,若输入口令为“000”,则显示字符串“OK!”否则显示“Invalidpassword”68#include<stdio.h>字符串应用字符数组在69#include<stdio.h>#include<string.h>main(){chars[20],str[3][20];
inti;
for(i=0;i<3;i++)gets(str[i]);
strcpy(s,(strcmp(str[0],str[1])
<0?str[0]:str[1]));
if(strcmp(str[2],s)<0)
strcpy(s,str[2]);
printf(“%s\n”,s);}字符串应用编程:实现在三个字符串中找出最小的串69#include<stdio.h>字符串应用编程:实现70小测试1.以下正确的数组定义语句是____A、chara[5]={'1','2','3','4','5','\0'};B、intb[2][]={{1},{2}};C、floatc[][3]={1,2,3,4,5};D、chard[5]="CHINA";2.判断字符串str1是否大于字符串str2,应当使用____A、if(str1>str2)
B、if(strcmp(str1,str2))C、if(strcmp(str2,str1)>0)D、if(strcmp(str1,str2)>0)3.若有语句:chars1[10],s2[10]={“books”},则能将字符串books赋给数组s1的正确语句是____A、s1={"books"};
B、strcpy(s1,s2);C、s1=s2;
D、strcpy(s2,s1);70小测试1.以下正确的数组定义语句是____2.判断字71小测试4.下面程序中有错误的行是____1、main()2、{3、intx[3]={1};4、intk;5、scanf("%d",&x);6、for(k=1;k<3;k++)7、x[0]=x[0]+x[i];8、printf("x[0]=%d\n",x[0]);9、}A、3B、6C、7D、571小测试4.下面程序中有错误的行是____72小测试5.下面程序的功能是输出两个字符串中较短串的长度。请填空。
#include<stdio.h>
main()
{charstr1[20],str2[20];
inti,k,num;
gets(str1);gets(str2);
i=strlen(str1);k=strlen(str2);
num=______?____:____;
printf("%d\n",num);
}72小测试5.下面程序的功能是输出两个字符串中较短串的长度程序设计基础(C语言)数组概念程序设计基础(C语言)数组概念74基本概念问题的提出?a,b从大到小排序输出?Programming1:if(a<b){temp=a;a=b;btemp;}printf(“%d%d\n”,a,b);
a,b,c从大到小排序输出?Programming1:if(a<b){temp=a;a=b;b=temp;}if(a<c){temp=a;a=c;c=temp;}if(b<c){temp=b;b=c;c=temp;}printf(“%d%d%d\n”,a,b,c);a,b,c,d从大到小排序输出?a,b,…,从大到小排序输出?利用数组可以进行数据的排序2基本概念问题的提出?a,b从大到小排序输出?Progra75基本概念问题的提出?用变量来解决:#include<stdio.h>main(){floatcj1,cj2,cj3,…cj10;/*定义10个变量*/floatpj;scanf(“%f”,&cj1);/*输入10个数据*/scanf(“%f”,&cj2);
…scanf(“%f”,&cj10);pj=cj1+cj2+…+cj10;pj=pj/10;/*求平均值*//*打印低于平均成绩的同学成绩*/if(cj1<pj)printf(“%f\n”,cj1);if(cj1<pj)printf(“%f\n”,cj2);
…if(cj1<pj)printf(“%f\n”,cj10);
}例2:计算10个同学的成绩:计算平均成绩、打印低于平均成绩的同学成绩如果增加1000个成绩?3基本概念问题的提出?用变量来解决:例2:计算10个同学的成76基本概念问题的提出?用数组来解决:#include<stdio.h>main(){floatcj[10];/*定义一个实型数组存放10个成绩*/floatpj;inti;for(i=0;i<10;i++)/*输入10个数据*/scanf("%f",&cj[i]);for(i=1,pj=0;i<10;i++)/*求平均值*/ pj=pj+cj[i];pj=pj/10;for(i=0;i<10;i++)/*打印低于平均成绩的同学成就*/if(cj[i]<pj) printf("cj=[%d]=%f\n",i+1,cj[i]);}例2:计算10个同学的成绩:计算平均成绩、打印低于平均成绩的同学成绩4基本概念问题的提出?用数组来解决:例2:计算10个同学的成77基本概念问题的提出?用数组解决此类问题在程序设计中,数组是十分有用的数据类型循环中使用数组能更好地发挥循环的作用例2:采用数组和循环相结合,循环变量的值改变某些问题不使用数组就难以解决例1:优点程序简洁、思路清楚明了书写简洁,通用性强5基本概念问题的提出?78基本概念什么是数组?是一组具有固定数目的、有序的、类型相同的数据的集合是同类型有序数据的集合可以为该数据集合起一个名字,称为数组名该数据集合中的各数据项称为数组元素,用数组名和下标表示根据数组下标的多少,数组可以分为一维数组和多维数组一维只有一个下标,例如:cj[10]二维有两个下标,例如:grade[3][4]6基本概念什么是数组?79基本概念什么是数组?一个数组就是一组连续的内存空间,用来保存数据,数组中的每一项称为一个元素C语言数组的特点数组的个数必须确定不允许变动,但数组元素的值可以改变数组元素的类型必须是相同的不允许混合的a[0]a[1]a[2]a[3]a[4]DFFODFF2DFF4DFF6DFF8a7基本概念什么是数组?a[0]a[1]a[2]a[3]a[480基本概念什么是数组?使用下标的优点?下标唯一确定了元素在数组中的位置(或者说是排列顺序)采用数组名+[下标]
可以准确访问到数组中的每一个元素提示C语言是一个有趣的语言,它从0开始计数,而不是从1开始,所以例题中10个元素的编号是从0到9a[10]a[0]a[1]a[2]……a[9]数组名数组元素名数组长度8基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023一年级数学上册 六 认识图形第2课时 我说你做教学设计 北师大版
- 2023七年级英语下册 Unit 7 It's raining Section A 第1课时(1a-2d)教学设计 (新版)人教新目标版
- 七年级地理上册 第三章 第三节 降水的变化与分布教学设计3 (新版)新人教版
- 2024-2025学年高中物理 第二章 机械波 5 波的干涉、衍射教学设计2 教科版选修3-4
- 10我们爱和平 教学设计
- 4《少让父母为我操心》教学设计-2023-2024学年道德与法治四年级上册统编版
- 2024八年级英语下册 Unit 1 Spring Is ComingLesson 2 It's Getting Warmer教学设计(新版)冀教版
- 三年级信息技术下册 第5课《描绘美丽的大自然》教学设计2 川教版
- 13 精卫填海教学设计-2024-2025学年四年级上册语文统编版
- 2024秋三年级英语上册 Module 4 Unit 2 Its black dog教学设计 外研版(三起)
- 公安审讯技巧课件
- CSSD灭菌物品召回管理
- 4.1 公民基本义务课件 2024-2025学年统编版道德与法治八年级下册
- 第三单元第三课信息检索的方法教学设计 2024-2025学年西交大版(2024)初中信息技术七年级上册
- 2025广德辅警考试题库
- 软件开发java笔试题及答案
- 小学综合实践三年级下册巧手工艺坊教学课件
- 2025年绍兴职业技术学院单招职业适应性测试题库带答案
- DB61T 5113-2024 建筑施工全钢附着式升降脚手架安全技术规程
- 2025年供水安全考试试题及答案
- 腹外疝围手术期护理
评论
0/150
提交评论