版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
例求一个班100个学生的平均成绩,然后统计高于平均分的人数。使用简单变量和循环结构相结合的方法求平均成绩:
aver=0;for(i=1;i<=100;i++){scanf(“%f”,&mark);aver=aver+mark;}aver=aver/100;2024/3/71精选ppt
若要统计高于平均分的人数,则无法实现。mark是一个简单变量,存放的是最后一个学生的成绩。
用已有知识解决方法:1.再重复输入成绩,带来两个问题:(1)输入数据的工作量成倍增加;(2)若本次输入的成绩与上次不同,则统计的结果不正确。2.使用100个变量mark1,mark2,……,mark99,mark100。2024/3/72精选ppt分析:1.此100个变量均为学生成绩,表示同一类对象。2.数据类型相同。3.可以用序号区分不同的变量。
解决此问题的根本方法,引入数组,始终保持输入的数据,一次输入,多次使用。2024/3/73精选ppt除了int、float、char等基本数据类型外,C语言还提供了构造数据类型,来满足不同应用的需要。构造数据类型是由基本数据类型按一定规则组成的,也称作“导出类型”。构造数据类型包括数组、结构体、共用体。数组(array)能将具有相同类型的数据组合在一起,通常是用于处理批量数据。Anarrayisadatatypethatusessubscriptedvariablesandmakespossibletherepresentationofalargenumberofhomogeneousvalues.第4章数组和指针精选ppt数组的维数数组中能唯一确定数组元素的下标的个数称为数组的维数一维数组:只用一个下标就能区分数组中的不同元素的二维数组:要用两个下标才能区分数组中的不同元素1×6一维数组3×4二维数组2×3×4三维数组inta[6]; intb[3][4];intc[2][3][4];精选ppt4.1一维数组
4.1.1一维数组的定义与初始化
1.一维数组定义
类型定义符
数组名[整型常量表达式];【例如】
inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a数组名表示内存首地址,是地址常量编译时系统分配连续内存内存字节数=数组维数*sizeof(元素数据类型)数组a在内存占24字节(6*4字节)6精选pptAone-dimensionalarraydeclarationisatypefollowedbyanidentifierwithabracketedconstantintegralexpression.Thevalueoftheexpression,whichmustbepositive,isthesizeofthearray.Itspecifiesthenumberofelementsinthearray.Thearraysubscriptscanrangefrom0tosize-1.Thelowerboundofthearraysubscriptsis0andtheupperboundissize-1.精选ppt4.1.1一维数组的定义与初始化【例如】floatscore[50];
charname[20];注意:
不能用变量定义数组的长度。
floatscore[n];×当定义数组语句中不同时给变量赋值时,方括号内不得为空。
inta[];×数组一旦定义,数组的大小就不能再改变。常用的办法是用符号常量来指定元素个数。
#definesize50
floatscore[size];8精选ppt4.1.1一维数组的定义与初始化2.一维数组初始化类型定义符
数组名[常量]={值1,值2,…,值n};例如:inta[6]={1,2,3,4,5,6};inta[]={1,2,3,4,5,6};两者等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6;例如:
inta[6]={1,2};等价于:a[0]=1;a[1]=2;a[2]=0;a[3]=0;a[4]=0;a[5]=6;intc[10]={0};//将0赋给c[0]~c[9]inta[]={1,2};//等价于:a[0]=1;a[1]=2;9精选ppt4.1.2一维数组元素的引用与操作1.数组元素的引用
数组名[下标]注意:(1)数组元素的下标从0开始(2)引用数组元素时,只能单个引用,不能一次引用整个数组
inta[6];a={3,4,5,6,7};×a[6]={3,4,5,6,7};×(3)下标不要超出数组的范围,否则导致错误的程序结果。10精选ppt2.数组的赋值可以在定义数组时对数组中的全部变量或部分变量赋值(即数组的初始化)。可以在语句中为变量赋值。利用循环依次为每个数组元素赋值或输入值。4.1.2一维数组元素的引用与操作main(){inti,a[5];
for(i=0;i<5;i++)a[i]=i;
//用循环结构直接对数组赋初值for(i=0;i<5;i++)
printf("%d,",a[i]);printf("\n");}
运行结果为:0,1,2,3,4,
精选ppt用交互的循环结构对数组赋初值main(){
inti,a[5];
for(i=0;i<5;i++)
printf("a[%d]=",i),scanf("%d",&a[i]);
for(i=0;i<5;i++) printf("%d,",a[i]);printf("\n");}精选ppt例:定义长度为10的整型类型一维数组并完成以下功能: ⑴从键盘输入10个整数,分别存放在10个数组元素中;⑵输出数组中的各元素值;⑶按逆序输出数组中的各元素值。main(){
inti,a[10];
for(i=0;i<10;i++) printf("第%d个数据:",i+1), scanf("%d",&a[i]);
for(i=0;i<10;i++)printf("%4d",a[i]);printf("\n");
for(i=9;i>=0;i--)printf("%4d",a[i]);printf("\n");}应用举例精选ppt下标越界:差一错误off-by-oneerror在C语言中,有N个元素的数组其元素下标的允许取值范围为0到N-1,不存在下标为N的元素。例如这段代码本意是要设置数组a中的10个元素均为0。但通常编译器按内存递减方式分配内存,使得内存中a[9]之后的4个字节分配给i。本来计数器i的值为10,循环体内将并不存在的a[10]设为0,实际是将i值设为0,就陷入死循环!main(){
inti,a[10];
for(i=1;i<=10;i++){ a[i]=0; printf("%d",a[i]); }}精选ppt4.1.3数组应用
1.比较法排序由键盘输入10个数,按由小到大排序输出解题方法:将10个数存入数组a将a(0)与a(1)、a(2)……a(9)依次比较,哪个元素的值比a(0)小,就将它与a(0)的值交换,这样就将最小的数送到了a(0)中。再将a(1)与a(2)、a(3)……a(9)依次比较,哪个元素的值比a(1)小,就将它与a(1)的值交换,这样就将最小的数送到了a(1)中。重复以上步骤。对于n个数,比较排序法的总运行次数为:
(n-1)+(n-2)+…+3+2+1=n*(n-1)/2.精选ppt1.比较法排序16精选ppt1.比较法排序#include<stdlib.h>main(){
inti,j,a[10]; srand(time(0));
for(i=0;i<10;i++){ a[i]=rand()%101; printf("%4d",a[i]); } putch('\n');
for(i=0;i<9;i++){
for(j=i+1;j<10;j++)
if(a[i]>a[j]) a[i]^=a[j]^=a[i]^=a[j]; }
for(i=0;i<10;i++) printf("%4d",a[i]);}精选ppt2.冒泡法排序是一种交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。首先将a[0]与a[1]、a[1]与a[2]、a[2]与a[3]、……a[n-2]与a[n-1]相邻两个数进行比较,若为逆序(比如a[0]>a[1])则两者交换,这样就将将最大的数放在a[n-1]中;再将a[0]、a[1]、……a[n-2]这n-1个数进行同样的相邻两数比较,若为逆序则两者交换,这样就将这n-1个数中最大的数被放在a[n-2]中;重复以上步骤,经过n-1趟比较交换完成冒泡法排序。18精选ppt用冒泡法排序将10个整数按从小到大的次序排列出来。2.冒泡法排序19精选ppt#include<stdio.h>#defineN10//数据的个数
main(){
inta[N]={5,12,29,47,9,18,13,50,38,2};
inti,j,k,t;
for(i=0;i<N-1;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; } } printf("\n最后的排序结果:\n");
for(i=0;i<N;i++) printf("%5d",a[i]);}2.冒泡法排序20精选ppt数组应用II--插入向一个有序数组中插入一个数字,插入后不改变原有顺序a[0]1a[1]2a[2]3a[3]4a[4]6a[5]7a[6]8a[7]9a[8]10a[9]0a[0]1a[1]2a[2]3a[3]4a[4]5a[5]6a[6]7a[7]8a[8]9a[9]10插入数字前插入数字后精选ppt方法1:找到插入点后再移位。从前向后循环,从第1个元素开始依次将数组元素与要插入的数x比较,当x<a[i]时,将a[i]~a[8]依次向后移动,这时a[i]就可以存放x了。for(i=0;i<9;i++) {
//将要插入的数与每个元素比较,找插入的位置if(x<a[i]){
//依次将插入点后的元素向后移位for(j=8;j>=i;j--)a[j+1]=a[j];a[i]=x;
//插入数据后退出整个循环break;}}数组应用II--插入22精选ppt方法2:边找插入点边移位。从后向前循环,直接从最后1个元素开始,将其与要插入的数x比较,如果x<a[i],说明x要插在a[i]的前面,那么a[i]元素就要向后移位;再将下标i--,做同样的比较,直到找到插入点退出循环,这时的a[i]>x,因此x要赋值给a[i+1]。//从最后1个元素开始,依次将要插入的数与每个元素比较for(i=8;i>=0;i--){
//如果要插入的数比元素值小,则该元素直接向后移位
if(x<a[i]) a[i+1]=a[i];
elsebreak;//表示找到插入点,退出循环}a[i+1]=x;
//插入数据数组应用II--插入23精选ppt数组应用III:不改变顺序,删除指定的数字main(){
inti,j,del=0,
inta[10]={1,2,3,4,5,6,7,8,9,10},x=5;for(i=0;i<10;i++) printf("%4d",a[i]);putch('\n');for(i=0;i<10-del;i++){//删除后数组的容量减小一
if(x==a[i]){
for(j=i;j<10;j++) a[j]=a[j+1]; i--;//还原到删除位置,以处理连续删除
del++; }}for(i=0;i<10-del;i++) printf("%4d",a[i]);}删除前:12345578910删除后:123478910精选ppt二分法检索(在序列x[]中检索y的位置)前提:有序数列(以递增序为例)原理:
等分区间;
若y小于中间数,则取左半边,否则取右半边。再等分,再比较…例:对于区间[a,b]等分为若y==x[k]则位置为k若y<x[k]则取新区间[a,k-1](即b=k-1)若y>x[k]则取新区间[k+1,b](即a=k+1)数组应用IV–二分查找(检索)精选ppt二分法查找递增序列main(){
intx[10]={34,56,78,87,88,90,101,112,520,888};
inty,i,k,a=0,b=9;
for(i=0;i<10;i++) printf("%d",x[i]); scanf("%d",&y);
while(a<=b){//二分法查找
k=(b+a)/2; printf("x[%d]=%d\n",k,x[k]);
if(y==x[k])break;
if(y<x[k])b=k-1; elsea=k+1; }
if(a>b)printf("ERROR");
elseprintf("\nx[%d]=%d\n",k,x[k]);getch();}精选ppt4.2二维数组
4.2.1
二维数组的定义和初始化1.定义需要两个下标才能标识数组中某个元素的位置,也称为矩阵。Useatwo-dimensionalarrayiftwootheridentifiersareneededtodeterminethevalueofinterest.定义格式为:
类型定义符
数组名[常量表达式1][常量表达式2]列数行数inta[2][3];逻辑结构存储结构27精选ppt4.2.1
二维数组的定义和初始化2.二维数组的初始化和引用两种初始化方式:按行初始化:每一对花括号对应一行的元素。按存放顺序初始化:按内存中的存放顺序将初始值分别赋值给对应的元素。inta[2][3]={{1,2,3},{4,5,6}};inta[2][3]={1,2,3,4,5,6};inta[][3]={1,2,3,4,5,6};
28精选ppt4.2.1
二维数组的定义和初始化intd[3][4]={{1},{2,3},{4,5,6}};intd[][4]={{1},{2,3},{4,5,6}};intd[3][4]={1,0,0,0,2,3,0,0,4,5,6};intd[][4]={1,0,0,0,2,3,0,0,4,5,6};inte[3][4]={{0,0,0,1},{0,0,2,3},{0,4,5,6}};inte[][4]={{0,0,0,1},{0,0,2,3},{0,4,5,6}};inte[3][4]={0,0,0,1,0,0,2,3,0,4,5,6}};29精选ppt4.2.1
二维数组的定义和初始化3.二维数组在内存中的存放M行N列的二维数组a,a[i][j]的位置公式为:i*N+j+1数组元素a[i][j]存储映射关系为:a[i][j]
a[0][N*i+j]Realcomputermemoryhasonlyonedimension,i.e.eachlocationisidentifiedwithonlyonecomponentofaddress.因此,二维数组元素可用它相对数组首元素[0][0]位置的偏移量来表示(称为存储映射关系storagemapping)。对二维数组元素的操作除了用二重循环外,还可以用一重循环实现。InC,oranyotherlanguagesupportingarrayswithdimensionsizesgreaterthanone,two-dimensionalarrayssimulatetheeffectofusingtwocomponentsofaddress.Todothis,thearrayismappedintoconsecutivememorywithrow0’svaluesfirst,thenrowone’svalues,etc.Youcanthinkofthisasasetofonedimensionalarraysholdingthecolumnvaluesasasinglevalueintherow’svalues.30精选ppt二维数组元素的引用对二维数组inta[3][4]中各元素的输出操作① for(i=0;i<3;i++)
for(j=0;j<4;j++) printf("%4d",a[i][j]);② for(i=0;i<3;i++)
for(j=0;j<4;j++)
//用相对a[0][0]位置的偏移量来表示printf("%4d",a[0][4*i+j]);③ for(i=0;i<12;i++)
//用相对a[0][0]位置的偏移量
printf("%4d",a[0][i]);31精选ppt求矩阵特征值之和#defineN3main(){
inti,j,s=0,a[N][N]={{1,1,1},{2,1,1},{2,2,1}};
//显示矩阵a[3][3] printf("对于矩阵a[%d][%d]\n",N,N);
for(i=0;i<N;i++){
for(j=0;j<N;j++) printf("%4d",a[i][j]); putch('\n'); } //主对角线元素之和
for(i=0;i<N;i++) s+=a[i][i]; printf("\n主对角线元素之和s=%d\n\n",s);二维数组的应用举例——矩阵精选ppt
//副对角线元素之和
s=0;
for(i=0;i<N;i++) s+=a[i][N-1-i]; printf("副对角线元素之和s=%d\n\n",s); //上△元素之和
s=0;
for(i=0;i<N;i++)
for(j=i;j<N;j++) s+=a[i][j]; printf(“上△元素之和s=%d\n\n",s);
二维数组的应用举例——矩阵(续1)精选ppt//下△元素之和
s=0;
for(i=0;i<N;i++)
for(j=0;j<=i;j++) s+=a[i][j]; printf("下△元素之和s=%d\n\n",s); //周边元素之和
s=0;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(i==0||i==N-1||j==0||j==N-1) s+=a[i][j]; printf("周边元素之和s=%d\n\n",s); getch();}二维数组的应用举例——矩阵(续2)精选pptTips:对于int型一维数组a和二维数组b
用
sizeof(a)/sizeof(int)
得到数组a的大小;
用sizeof(b)/sizeof(b[0])二维数组b的行数
sizeof(b[0])/sizeof(int)二维数组b的列数
【例】显示二维数组b的各元素#include<stdio.h>main(){
intb[][4]={0,1,0,0,1,0,0,0,2,6,4},i,j;
for(i=0;i<sizeof(b)/sizeof(b[0]);i++){
for(j=0;j<sizeof(b[0])/sizeof(int);j++) printf("%5d",b[i][j]);printf("\n");;
}}二维数组的应用举例——sizeof的使用精选pptmain(){
intx[4][3]={{1,2,3},{2,3,4},{3,4,5},{0,0,1}};
inti,j,k,row=0,column=0,min,m=4,n=3;
for(i=0;i<m;i++){//按行查找 max=x[i][0];
for(j=1;j<n;j++)//查找第i行的最大值
if(x[i][j]>max) max=x[i][j],row=i,column=j;
for(k=0;k<m;k++)//接下来判断max是否本列最小值
if(x[k][column]<max)//如果不是则标记 { row=column=-1;break;}
if(row>-1&&column>-1){ printf("鞍点是该行上的最大值该列上的最小值\n");
printf("鞍点是x[%d][%d]=%d\n",row,column,max); }
} }应用举例:求二维数组的鞍点saddlepoint,即该位置上的元素是该行上的最大值,是该列上的最小值。鞍点可能不存在精选pptmain(){ inta[5][3]={1,2,3,2,3,4,3,4,5,4,5,6,5,6,7}; inti,j,max[5],min[3]; //先把每行第1个数当最大值每列第1个数当最小值
for(i=0;i<5;i++)max[i]=a[i][0]; for(j=0;j<3;j++)min[j]=a[0][j];
//比对找出每行最大值和每列最小值 for(i=0;i<5;i++) for(j=0;j<3;j++){ if(a[i][j]>max[i])max[i]=a[i][j]; if(a[i][j]<min[j])min[j]=a[i][j];
}
//如最大值最小值是同1个数,找到鞍点 for(i=0;i<5;i++)
for(j=0;j<3;j++)
if(max[i]==min[j]) printf("a[%d][%d]=%d是鞍点\n",i,j,a[i][j]);}寻找鞍点方法二:直接找出所有行的最大值所有列的最小值。一比对,若该行的最大值与该列的最小值相等,该位置的数就是鞍点。精选ppt4.2.3多维数组当需要用多个下标来确定数组元素时,数组称为多维数组。Thereisnolimitinthelanguageastothenumberofdimensionsthatanarraymaybegiven.Eachdimensionrequiresasizespecifierwithinapairofbrackets.1. 多维数组的定义类型数组名[常量表达式1][常量表达式2]…[常量表达式n];【例如】定义一个整型三维数组:intb[2][3][4];b[0][0][0]b[0][0][1]b[0][0][2]b[0][0][3]
b[0][1][0]b[0][1][1]b[0][1][2]b[0][1][3]
b[0][2][0]b[0][2][1]b[0][2][2]b[0][2][3]
以下标0、1为变量i,下标0、1、2为变量j,下标0、1、2、3为变量k,就可以用三重循环结构对数组的每一个元素进行处理了。精选ppt多维数组初始化对于三维数组,可将其看作多个二维表格,即可以把它看成是由多个二维数组构成的。依此类推,一个n维数组可以看成是由多个n-1维数组构成的。前面数组b有24个元素,它们在内存中排列顺序跟二维数组类似:先变化第三个下标,然后变化第二个下标,最后变化第一个下标。
【例如】以三维数组初始化为例:
intb[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},
{{13,14,15,16},{17,18,19,20},{21,22,23,24}}};由第一维为2,可认为b数组由两个二维数组组成,每个二维数组为3行4列。初始化时,对每个二维数组以按行初始化的方法,分别用花括号把各行元素值括起来,并且将三行的初值再用花括号括起来。精选ppt多维数组的一维表示多维数组元素也可用它相对数组首元素位置的偏移量来表示。三维数组b[L][M][N]的数组元素b[i][j][k]的存储映射关系为:b[i][j][k]
b[0][0][M*N*i+N*j+k]Example:intb[2][3][4];causesthecompilertoreservespacefor2arraysof3arraysof4integersincontiguousmemory.Thus24contiguousintegersarereserved.Astoragemappingfunctionisusedtotranslateanarrayreferenceintoapointerreference.Inthiscase,thestoragemappingfunctionmaps:
b[i][j][k]
*(b[0][0][0]+3*4*i+4*j+k)精选ppt4.3字符型数组在C语言中,存储字符串必须使用类型为char的字符型数组。字符型数组的每个数组元素存放一个字符的ASCII码。字符串的结束标志是'\0'。在存储一个字符串时,系统自动在其末尾添加一个结束标志'\0'(数字0)。'\0'不包括在字符串长度内。ThestringinCprogramminglanguageisactuallyaone-dimensionalarrayofcharacterswhichisterminatedbyanullcharacter'\0'.例如,对于定义的字符数组chara[10]="Hello";Hello\0\0\0\0\0字符串结束符其余元素自动赋值为'
\0'精选ppt通常,一个字符串用一维字符型数组来存放,
多个字符串用二维字符型数组来存放。如果要将三个字符串置于字符数组s中"Howareyou"
"Goodmorning""Goodbye"
可定义为:chars[3][13];s[0]s[1]s[2]4.3字符型数组How
are
you\0\0Good
morning\0Good
bye\0\0\0\0\0精选ppt4.3.1字符数组的初始化chara[]="abcde";charc[][5]={"Boy","Girl"};以下赋值语句也是合法的:chara[6]="abcde";chara[6]={"abcde"};chara[6]={'a','b','c','d','e'};chara[]={'a','b','c','d','e','\0'};charc[2][5]={"Boy","Girl"};charc[][5]={{"Boy"},{"Girl"}};charc[2][5]={{"Boy"},{"Girl"}};·精选ppt注意
(1)字符数组的长度应该大于实际存储的字符串长度。否则按语法错误处理。(2)使用字符常量初始化时,如果字符末尾没有'\0',则字符数组不能按字符串处理,只能对字符逐个进行处理。比如,数组a[]用单个字符来初始化,chara[5]={'a','b','c','d','e'};最后一个元素不是’\0’,它就不是字符串,就不能用字符串方法(如gets()、puts()、scanf()或printf()中%s格式)来操作。(3) 一维字符数组在初始化时,可以省略其长度,默认长度为初始化字符串的长度加1。如果没有初始化赋值,则必须说明数组的长度。(4) 单引号是字符常量定界符,双引号是字符串常量定界符。(5) 不能使用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。chara[5];a[]="abcde";//是错误的。4.3.1字符数组的初始化精选ppt字符数组的输入─从键盘输入的三种方法1、用gets函数输入整个字符串
能输入含空格字串并把回车转成\0
2、在scanf函数中用格式符%s输入整个字串
只能输入不含空格符的字符串
chara[10];
scanf("%s",a);3、在scanf函数中用格式符%c逐个输入字符
chara[12];inti;
for(i=0;i<12;i++)scanf("%c",&a[i]);a[12]=’\0’;chara[12];
gets(a);chars[3][13];inti;for(i=0;i<3;i++)
gets(s[i]);精选ppt对于二维字符数组,可看成若干个一维字符数组(每个一维字符数组是一个字符串),使用时用二维字符数组行下标来表示二维字符数组中各个字符串的首地址。
main(){
char
s[3][13];
inti;
for(i=0;i<3;i++)
gets(s[i]);
for(i=0;i<3;i++)
printf("%s",s[i]);
}执行时输入:Howareyou
Goodmorning
Goodbye
程序中的s[i]
是一维数组名,它是一个地址常量。二维字符数组的输入精选ppt字符数组的输出─从屏幕输出的三种方法1、puts函数输出整个字符串
这种输出方式遇到\0就自动换行
2、printf函数格式符%s输出整个数组遇到遇到\0不换行
3、printf函数格式符%c逐个输出数组元素chara[12]=“Howareyou”;puts(a);
chars[2][5]={"Boy","Girl"};
puts(s[0]);puts(s[1]);chara[12]="Howareyou";
printf("%s",a);chars[3][13]={"Howareyou","Goodmorning","Goodbye"};
printf("%s\n",s[0]);
printf("%s\n",s[1]);
printf("%s\n",s[2]);
chars[12]="Howareyou";inti;
for(i=0;i<13;i++)printf("%c",s[i]);精选ppt
例:输入0--99数字,显示读法(由于汉字为双字节码,所以不能用一维数组,要用二维数组。)main(){
intx,i,j,k;
char
a[11][3]={"零","壹","贰","叁","肆","伍","陆","柒",
"捌","玖","拾"}; scanf("%d",&x); i=x/10;//十位 j=x%10;//个位
if(i==0) printf("%s",a[j]);//个位数直接显示
else
if(j==0) printf("%s%s",a[i],a[10]);//个位为0的十位数
else printf("%s%s%s",a[i],a[10],a[j]); getch();}
字符数组的应用举例精选ppt4.3.4字符串函数在C语言中,由于字符串的处理通常要用字符数组,而字符数组名是地址常量不是变量(不能出现在赋值号的左边),所以对字符串的连接、复制、比较等操作就比较麻烦。C语言提供了一些专门用于字符串处理的函数,以方便用户的使用。Csupportsawiderangeoffunctionsthatmanipulatenull-terminatedstrings,suchasstrlen(),strcat(),strcpy(),strcmp(),strlow()andstrupr().精选ppt常用的字符串处理函数1、测字串长度函数stringlengthstrlen()2、字串连接函数stringcaststrcat()3、字串复制函数stringcopystrcpy()
strncpy()4、字串比较函数stringcomparestrcmp()5、小写转换函数stringlowerstrlwr()6、大写转换函数stringupperstrupr()
因为字符串处理函数不是C语言的组成部分而是系统提供的公共函数,因此调用字符串处理函数前,通常要加预编译命令:
#include
<string.h>精选pptstrlen(字符数组)
测试字符串长度,不包含“\0”在内。
例如:#include<string.h>main(){
chars[]="Howdoyoudo";
intc;c=strlen(s);printf("%d\n",c);}
运行结果是:13
改为
s[30]="Howdoyoudo\0"
运行结果也是13常用的字符串处理函数----求字符串长度精选ppt例:显示一个字串中的大写字母main(){
charc,s[30],i; printf("输入一个字串:"); gets(s);
for(i=0;i<strlen(s);i++){
if(s[i]>='A'&&s[i]<='Z') printf("%c",s[i]); }}
常用的字符串处理函数--求字符串长度函数举例精选ppt例:指针表示法显示一个字串中的大写字母main(){
charc,s[30],*p; printf("输入一个字串:"); gets(s);
for(p=s;p-s<strlen(s);p++){
if(*p>='A'&&*p<='Z') printf("%c",*p); }}精选ppt连接两个字符数组中的字符串:
把字符数组2接在字符数组1的后面,放到字符数组1中,并得到一个函数值,该函数值是字符数组的起始地址。注1:字符数组1必须足够大;注2:字符数组2也可以是一个字符串常量。常用的字符串处理函数----字符串连接strcat(字符数组1,字符数组2)
精选ppt例如
#include<string.h>main(){
charc[30]="abcde\n",s[20]="Howdoyoudo";
strcat(c,s);
/*将S接在C的后边*/
printf("%s\n",c);}运行结果是:
abcdeHowdoyoudostrcat(c,"Howdoyoudo");
printf("%s\n",c);}
常用的字符串处理函数----字符串连接举例精选pptstrcpy(t,a);strcpy(a,b);strcpy(b,t);常用的字符串处理函数----字符串拷贝将字符数组2拷贝到字符数组1中。复制后的结果放在字符数组1中,字符数组2不变。函数值是字符数组1的地址。
字符数组1必须写成数组名形式,如s。字符数组2可以是字符数组名,也可以是一个字符串常量。说明:
(1)字符数组1定义时其长度要大于等于字符数组2的长度。
(2)复制时连同字串2中的’\0’一起被复制到字串1中。
(3)若字符数组1中原存有字符,则原有字符不再存在。字串间的赋值不能用a=b;只能用strcpy(a,b)strcpy(字符数组1,字符数组2)
精选pptstrncpy(字符数组1,字符数组2,n)将字符数组2的前n个字符拷贝到字符数组1中。复制后的结果放在字符数组1中,字符数组2不变。函数值是字符数组1的地址。
例如:
main(){
chara[]="helloworld!"; strncpy(a,"HELLOWORLD!",2); puts(a); getch(); }显示:HElloworld!常用的字符串处理函数----字符串拷贝精选pptstrcmp(字符串1,字符串2)
如果两个字符串一样大,函数值为0;
如果字符串1大,函数值为一正整数;
如果字符串2大,函数值为负整数。对于字符数组a和b而言:
strcmp(a,b)==0a、b两字串相等
strcmp(a,b)>0a字串>b字串
strcmp(a,b)<0a字串<b字串(字符串比大小,按ASCII码比较,先比第1个字符。)
常用的字符串处理函数----字符串比较精选ppt#include<string.h>main(){
charc[7]="abcdef",s[4]="abc",t[]="acb";inta,b;a=strcmp(c,s);b=strcmp(c,s);printf("%d\n%d",a,b);}
常用的字符串处理函数----字符串比较举例在TC2.0中的运行结果:
100-1在VC++中的运行结果:
1-1精选ppt数据比较时应注意判断两个字符串是否相等时:
不能使用if(a==b)
应使用if(strcmp(a,b)==0)
相等比较的总结字符串strcmp(a,b)==0整数
a==b实数fabs(a-b)<1e-6精选ppt例如main(){
inti=0;
chara[]="abcd",b[]="abcd";
if(a==b)printf("Yes");
elseprintf("No");}结果居然是No,将if语句改为:if(strcmp(a,b)==0)后,结果就为Yes。
字符串比较时应注意精选pptstrlwr(字符串)
将字符串中的大写字母转换成小写字母strupr(字符串)
将字符串中的小写字母转换成大写字母
例:大小写转换函数应用main(){
char
s[100];gets(s);strupr(s);puts(s);strlwr(s);puts(s);}常用的字符串处理函数----字母大小写转换精选ppt#include<string.h>main(){
chara[]="wang",b[]="1234",user[100],psw[100];
do{ system("cls"); printf("请输入用户名"); gets(user);strlwr(user); printf("请输入密码"); gets(psw); }while(strcmp(a,user)!=0||strcmp(b,psw)!=0); printf("\n欢迎您:%s",user);}字符串应用举例:用户名和密码的验证I精选ppt#include<string.h>main(){
chara[]="wang",b[]="1234",user[100],psw[100];inti; do{
system("cls"); printf("请输入用户名"); gets(user);strlwr(user); printf("请输入密码"); i=-1; do{ i++; psw[i]=getch(); putch('*'); }while(psw[i]!=13); psw[i]='\0'; }while(strcmp(a,user)!=0||strcmp(b,psw)!=0); printf("\n欢迎您:%s",user);}字符串应用举例:用户名和密码的验证II精选ppt#include<string.h>main(){
chara[10][20]={"广州","武汉","上海","北京","成都","太原","郑州","南京","石家庄","天津"},t[20];
inti,j;
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
if(strcmp(a[i],a[j])>0) strcpy(t,a[i]), strcpy(a[i],a[j]), strcpy(a[j],t);
for(i=0;i<10;i++) printf("%s\t",a[i]);}字符串应用举例:字符串的排序精选ppt4.4指针和数组指针的应用与数组是密不可分的。数组a的指针是指数组a的起始地址,即&a[0],数组元素的指针就是该数组元素的地址。
inta[6];
int*p=a;
&a[0]&a[1]&a[2]&a[3]&a[4]&a[5]a+0a+1a+2a+3a+4a+5p+0p+1p+2p+3p+4p+5a[0]a[1]a[2]a[3]a[4]a[5]实际上,下标表达式a[i]就是按照指针表达式*(a+i)定义的。精选ppt指向数组的指针变量的赋值方法
方法1:在定义指针变量时赋值。inta[10],*p=a;方法2:在定义指针变量后赋值。inta[10],*p;p=a;结果:p是数组a的指针,指向a
数组的第一个元素a[0]的首地址
main(){
inti,a[6]={0,1,2,3,4,5},*p; p=a;
for(i=0;i<6;i++) printf("%d",a[i]);}可替换为*(a+i)或*(p+i)精选ppt在程序中使用指针变量时应当注意
①
指针的变化
++--
使指针按它所指向的类型所规定的字节数在内存区中移动(跳动而不是滑动)。
②
指针变量的运算
++和*是同优先级,从右至左的结合方向。
*p++和*(p++)等价*++p和*(++p)等价③
(*p)++表示p所指向的元素值加1。精选ppt通过指针的算术运算引用数组元素指向数组的指针可以指向数组中的其它元素。main(){inta[10]={2,4,5,8};
int*p=a;//p指向a[0]printf(“%4d”,*p++);//输出a[0],p指向a[1]printf(“%4d”,*p++);//输出a[1],p指向a[2]printf(“%4d”,*p++);//输出a[2],p指向a[3]printf(“%4d”,*p++);//输出a[3],p指向a[4]}运行结果是:2458
精选ppt用*p++遍历整个数组main(){
inta[]={9,8,7,6,5,4,3,2,1,0},*p=a,i;
for(i=0;i<sizeof(a)/sizeof(int);i++) printf("%d",*p++); getch();}注意:
这种方法造成了指针p的移动。精选ppt同样,可以用p++和地址偏移量遍历整个数组main(){
inta[10]={9,8,7,6,5,4,3,2,1,0},*p;
for(p=a;p-a<10;p++) printf(“%d,",*p);}运行结果:9,8,7,6,5,4,3,2,1,
其中p中存放的是地址,p-a<10表示p单元中的值减去数组a的首地址所得的单元数不超过10。注意:
这种方法也造成了指针p的移动用p++与地址偏移量遍历整个数组精选ppt通过带下标的指针变量引用数组元素指向数组的指针变量也可以带下标定义了:inta[10],*p=a;
后:
可以使用a[i]
或 p[i]
或 *(a+i)
或 *(p+i)这4种方法引用a数组中的第i个元素。注意:这些方法都不造成指针p的移动。精选ppt输出数组元素四种方法main(){
inta[10]={10,9,8,7,6,5,4,3,2,1},*p,i; p=a;
for(i=0;i<10;i++) printf("%d",a[i]); putch('\n');
for(i=0;i<10;i++) printf("%d",p[i]); putch('\n');
for(i=0;i<10;i++) printf("%d",*(a+i)); putch('\n');
for(i=0;i<10;i++) printf("%d",*(p+i));}精选ppt利用指针变量对数组元素赋值通过指针变量p实现数组元素的赋值:inta[5],*p=a,i;
for(i=0;i<5;i++){ printf("a[%d]=",i); scanf("%d",&a[i]); }
可替换成&p[i]或a+i或p+i或p++利用p++和地址偏移量p-a实现数组元素的赋值for(p=a;p-a<5;p++){printf("a[%d]=",p-a);scanf("%d",p);}精选ppt总结:数组遍历的6种方法造成指针p的移动的2种方法(p必须初始化)*p++p++配合*p不造成指针p的移动的4种方法*(p+i)p[i]*(a+i)a[i]
数组在C语言中是个二等公民:不能作为整体操作数组。但将指针变量指向一个数组后,就可以用对指针变量的操作去整体操作一个数组了。精选ppt在程序中使用指针变量时应当注意
常见的指针变量运算*(++p) 先移指针,取出下一个单元的值。*(p++) 先取出当前单元的值,再移指针。
(*p)++ 先取出当前单元值,再使当前单元加1。
不移指针。
++(*p) 先使前单元的值加1,再取出。不移指针。注意:*p++和*(p++)是等价的。
数组和指针的统一性是C语言的长处之一。用指针可以很方便地访问数组和模拟动态分配的数组。但是,说数组和指针等价并不表示它们相同,甚至也不能互换。“等价”的意思是:指针算术和数组下标运算等价,指针和数组是不同的。(WayneThroop)精选ppt遍历数组时指针的移动在用指针变量遍历数组时,要特别注意指针是否移动。main(){
int*p,i,x[10]={10,9,8,7,6,5,4,3,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年长岭县卫健系统事业单位公开招聘工作人员(含专项招聘高校毕业生)(48人)考试核心试题及答案解析
- 2025重庆江津区第二人民医院招聘5名备考核心题库及答案解析
- 2025年盐城经济技术开发区部分单位公开招聘合同制工作人员7人备考题库及1套参考答案详解
- 2025年旅游酒店五年复苏:服务与体验报告
- 2025年东航实业集团陕西分公司招聘(8人)考试核心题库及答案解析
- 2025年家政行业客户满意度提升策略分析报告
- 重庆市大足区教育事业单位2025年面向应届高校毕业生考核招聘工作人员备考题库及答案详解1套
- 2025年南京机电职业技术学院公开招聘高层次人才备考题库及参考答案详解一套
- 2025年广西百色市乐业县专业森林消防救援队伍招聘13人笔试重点试题及答案解析
- 2026西藏民族大学急需紧缺人才引进2人考试核心试题及答案解析
- 《化工企业可燃液体常压储罐区安全管理规范》解读课件
- 2025至2030等静压行业发展研究与产业战略规划分析评估报告
- 听障儿童家庭康复训练
- 2024年考研政治真题及考点解析
- 2025中国南水北调集团新能源投资有限公司社会招聘岗位拟聘人员笔试历年参考题库附带答案详解
- 零碳园区评价技术规范
- 质子泵抑制剂临床使用指南2023
- 大学生财务管理专业职业规划
- 检验科标本前处理课件
- 2025-2026学年苏教版小学科学六年级上册期末测试卷附答案
- (15)普通高中美术课程标准日常修订版(2017年版2025年修订)
评论
0/150
提交评论