版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章
数组程序设计C语言程序设计物理与电子工程学院--王美红第7章数组内容提要:★一维数组★二维数组和多维数组★字符数组★应用举例回忆1、迄今为止,我们使用的都是属于根本类型的数据(整型、字符型、实型)
2、其根本特点每个变量单独存储,称为简单变量比方:x=‘a’;y1=0;y2=-2*x;3、各变量之间单独存放,毫无任何联系。4、c语言还提供了构造类型的数据,它们有:数组类型、结构体类型、共用体类型。构造类型数据是由根本类型数据按一定规那么组成的,因此有的书称它们为“导出类型〞。1、计算机处理数据时,经常出现数据是用某种有序的形式进行组织的情况。例如:随温度而改变的实验数据;按学号排列的成绩表等;2、这些数据具有共同的特征:都是由假设干个分量构成;分量都是同一类型这些分量是按照一定顺序排列的
数组的根本概念甚么是数组数组是一种构造数据类型。数组是有序数据的集合。数组中的每一个元素都属于同一数据类型。用一个统一的数组名和下标唯一地确定数组中的元素。数组的根本概念甚么是数组形式:类型说明符数组名[常量表达式]例如:inta[5];floatb[10];说明:1、命名规那么:数组名是由合法的标识符组成,与简单变量命名相同。2、数组名后是用[](不()〕括起来的是常量表达式包括:整、字符、符号常量表达式。inta[2+3],b[5],_d[8],xyz[‘#’];一维数组的定义
提问1: #defineN5voidmain(){inta[N]; printf(“%d\n〞,a[1]=100); }提问2:inta(10),b[x],%[5],8[3],x-y[50],5x[100]是否正确?一维数组的定义
如何回答3、数组的长度:常量表达式表示元素的个数:数组长度.
例如:inta[6];说明:a[0],a[1],a[2],a[3],a[4],a[5]
6个元素,下标从0~5a[0]0145a[1]a[2]a[3]a[4]a[5]23a一维数组的定义
一维数组的存储形式6、一维数组的元素在内存中依次连续存储chara[5];...a[4]a[3]a[2]a[1]a[0]...高地址chara[5];低地址4、数组大小的定义只能是常量,而不能是变量或动态地定义举例:main()/*daxiao.c*/{ intn=5,a[n]; a[1]=100; printf(“a[1]=%d\n〞,a[1]);}编译指出:constantexpressionrequiredinfunctionmain〔主函数中要求常量表达式〕5、允许在同一个类型说明中,说明多个数组和多个变量。例如:inta,b,c,d,k1[10],k2[20];一维数组的定义
数组长度不能是不确定的值引用规那么:先定义,后使用。引用形式:数组名[下标]附加说明:1、下标表达式表示元素在数组中的顺序号2、必须是整型常量、整型变量或整型表达式3、元素下标总是从0开始4、下标表达式的有效范围是从0到元素个数-15、只能逐个引用数组元素〔下标变量〕,不能一次引用整个数组7.1.2一维数组元素的引用doublea[10];inti=2;a[i]=12.3;a[i+2]=56.4;a[1]=78.0;a[0]=a[‘b’-‘a’]+a[‘b’-96]-a[2*2]printf(“%lf\n〞,a[2]);例inta[10];printf(“%d〞,a);()必须for(j=0;j<10;j++)printf(“%d\t〞,a[j]);()6.2.2引用一维数组的元素P140例6.1引用数组元素。利用循环给数组元素a[0]~a[9]赋值为0~9,然后按逆序输出各元素的值。解题思路:先用循环给数组元素a[0]~a[9]赋值0~9,这样,每个数组元素都有固定的值了,然后按a[9]到a[0]的顺序输出各元素的值。6.2.2引用一维数组的元素#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]);printf("\n");}使a[0]~a[9]的值为0~90123456789a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]越界问题:TurboC和VisualC++中,系统不检查数组元素下标超过定义范围(下标越界问题)#include<stdio.h>/*yuejie.c*/voidmain(){inti,a[5];for(i=0;i<=4;i++){ a[i]=i+1; printf("a[%d]=%d\n",i,a[i]); }
printf("a[%d]=%d\n",5,a[5]); printf("a[%d]=%d\n",6,a[6]);}引用---注意越界运行结果:a[0]=1a[1]=2a[2]=3a[3]=4a[4]=5实现的方法有:1、定义时对数组元素初始化如:inta[5]={1,2,3,4,5};2、只给局部元素赋值如:inta[5]={1,3,5};3、初始化时给全部元素赋0值如:inta[5]={0,0,0,0,0};或inta[5]={0};4、对全部元素赋初值时可以不指出长度如:inta[5]={2,4,6,8,10};或inta[]={2,4,6,8,10};效果一样。7.1.3一维数组的初始化
a[0]=1;a[1]=3;a[2]=5;a[3]=0;a[4]=0;a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;举例:定义时对数组元素初始化#include<stdio.h>voidmain(){ inti; inta[5]={2,4,6,8,10}; for(i=0;i<=4;i++)printf("%d\n",a[i]);}
运行结果:2468107.1.3一维数组的初始化
i<5假设显示的结果为a[0]=2等的形式?7.1.4一维数组程序举例例:读10个整数存入数组,找出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x[0](b)依次用x[i]和max,min比较(循环)假设max<x[i],令max=x[i]假设min>x[i],令min=x[i]3.输出:max和min#include<stdio.h>voidmain(){intx[10],i,max,min;printf("Enter10integers:\n");for(i=0;i<10;i++){ scanf("%d",&x[i]);}max=x[0];min=x[0];for(i=1;i<10;i++){if(max<x[i])max=x[i];if(min>x[i])min=x[i];}printf("Maximumis%d\n",max);printf("Minimumis%d\n",min);}
main(){intx[10],i,max,min;printf("Enter10integers:\n");for(i=0;i<10;i++){ scanf("%d",&x[i]);}max=x[0];min=x[0];for(i=1;i<10;i++){if(max<x[i])max=x[i];if(min>x[i])min=x[i];}printf("Maximumis%d\n",max);printf("Minimumis%d\n",min);}过程:0123456789
355644510-2812303
55644510-281230355
644510-2812303556
44510-28123035564
4510-2812303556445
10-281230355644510
-281230355644510-2
812303
55644510-28
1230355644510-2812
30结果:max=3min=3结果:max=55min=3结果:max=55min=-2
7.1.4一维数组程序举例7.1.4一维数组程序举例例7-2〔P101〕求Fibonacci数列问题。#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++){if(i%5==0)printf("\n");printf("%12d",f[i]);}}f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]01452319235例7-2〔P101〕求Fibonacci数列问题。#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++){if(i%5==0)printf("\n");printf("%12d",f[i]);}}运行结果:1123581321345514423337761098715972584418167657.1.4一维数组程序举例例6.3假设有n个人,各人年龄不同,希望按年龄将他们从小到大排列。解题思路:排序的规律有两种:一种是“升序〞,从小到大;另一种是“降序〞,从大到小把题目抽象为:“对n个数按升序排序〞采用起泡法排序985420895420859420854920854290854209大数沉淀,小数起泡a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<5;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}854209584209548209542809542089a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<4;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}542089452089425089420589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<3;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}420589240589204589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<2;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}204589024589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<1;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}思路:将相邻两数两两比较,假设小那么调到前头,不小也要比较第五轮此处:n=6外层循环j:
0~n-1
内层循环i:0~n-j98888889555555944444492222229000000985555584444482222280000085444452222500005422240004200
02例7-3:用起泡法排序(由小到大)第一轮大数沉底第二轮第三轮第四轮a[0]a[1]a[2]a[3]a[4]a[5]7.1.4一维数组程序举例for(i=0;i<5;i++)if(a[i]>a[i+1]){……}for(i=0;i<4;i++)if(a[i]>a[i+1]){……}for(i=0;i<1;i++)if(a[i]>a[i+1]){……}……for(i=0;i<5-j;i++)if(a[i]>a[i+1]){……}for(j=0;j<5;j++)输入n个数给a[1]到a[n]forj=1ton-1fori=1ton-ja[i]>a[i+1]真假a[i]a[i+1]输出a[1]到a[n]补充例:用起泡法排序(由小到大)N-S图main(){inta[10];inti,j,t;printf(“input10numbers:\n〞);for(i=0;i<10;i++) scanf(“%d〞,&a[i]);printf(“\n〞);for(j=0;j<9;j++)for(i=0;i<9-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<10;i++)printf(“%d__〞,a[i]);}输入排序输出补充例:用起泡法排序(由小到大)input10numbers:1320647821814304523↙thesortednumbers:81314202123304564787.2二维数组----引入在C语言中,数组的元素还可以是数组,这样就构成了二维数组,所以二维数组可以看成是数组的数组。二维数组是多维数组中最简单、最常用的数组,它代表了多维数组的根本特征。二维数组的定义-p135定义形式:类型数组名[常量表达式][常量表达式];可以看作元素是一维数组的一维数组举例:inta[3][3];
/*3行3列*/例inta[3][4];floatb[2][5];
inta[3,4];()行数列数元素个数=行数*列数a[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]a[1]a[2]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]ÞÞÞÞa[2]a[1]a[0]a二维数组的存储:存储器是一维的;存放顺序:先行、后列的顺序依次存放。二维数组存储二维数组的存储:存储器是一维的;存放顺序:先行、后列的顺序依次存放。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]ÞÞÞÞa[2]a[1]a[0]a右边(列)的下标比左边〔行〕的下标变化快二维数组存储014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]二维数组元素的引用:形式:数组名[常量表达式][常量表达式]举例:遍历二维数组中的元素7.2.2二维数组的引用-p136inta[3][4];for(m=0;m<3;m++)for(n=0;n<4;n++)a[m][n]=m*n;常用嵌套的for循环############二维数组的初始化给全部元素赋初值inta[2][3]={{10,11,12},{13,14,15}};inta[2][3]={10,11,12,13,14,15};a[0][0]a[0][1]a[0][2]101112a[1][0]a[1][1]a[1][2]131415用括号按行分组7.2.2二维数组的初始化inta[2][3]={{10,11},{13}};a[0][0]a[0][1]a[0][2]10110a[1][0]a[1][1]a[1][2]1300inta[2][3]={10,11,13};a[0][0]a[0][1]a[0][2]101113a[1][0]a[1][1]a[1][2]000没有明确指定初值的元素被初始化为缺省初值二维数组的初始化给局部元素赋初值7.2.2二维数组的初始化不要搞混inta[][3]={{10,11,12},{13,14,15}};inta[][3]={10,11,12,13,14,15};a[0][0]a[0][1]a[0][2]101112a[1][0]a[1][1]a[1][2]131415编译器:我来算吧。二维数组的初始化给全部元素赋初值时,不指定第一维的长度,但要指定第二维的长度.7.2.2二维数组的初始化inta[][3]={{10,11},{13}};a[0][0]a[0][1]a[0][2]10110a[1][0]a[1][1]a[1][2]1300二维数组的初始化给局部元素赋初值时,不指定第一维的长度,但要指定第二维的长度.7.2.2二维数组的初始化例6.4:问题:将二维数组的行和列元素互换,存到另一数组二维数组程序举例-p138a=123456b=142536a=a[0][0]
a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]b=b[0][0]b[0][1]b[1][0]b[1][1]b[2][0]b[2][1]b[j][i]=a[i][j]i,j=0,1,2分析:main(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf(“arraya:\n〞);for(i=0;i<2;i++){for(j=0;j<3;j++){printf(“%4d〞,a[i][j]); b[j][i]=a[i][j]; } printf(\n〞); }printf(“arrayb:\n〞);for(i=0;i<3;i++){for(j=0;j<2;j++)printf(“%4d〞,b[i][j]);printf(“\n〞);}}源代码:互换输出arrayais:123456arraybis:142536二维数组程序举例解题思路:用二维数组,行代表学生,列代表一门课的成绩要存放30个学生5门课的成绩和平均成绩,数组的大小应该是30×6
例6.5有一个班30个学生,己知每个学生有5门课的成绩,要求输出平均成绩最高的学生的成绩以及该学生的序号。voidmain(){inti,j,max_i;floatsum,max=0;floats[5][6]={{78,82,93,74,65},{91,82,72,76,67},{100,90,85,72,98},{67,89,90,65,78},{77,88,99,45,89},};
第6列默认为0假设5个学生for(i=0;i<5;i++){sum=0;for(j=0;j<5;j++)sum=sum+s[i][j];s[i][5]=sum/5;}for(i=0;i<5;i++)if(s[i][5]>max){max=s[i][5];max_i=i;}printf(“stu_order=%d\n〞,max_i);printf(“max=%7.2f\n〞,max);}二维数组程序举例字符串及其结束标志:无字符串数据类型,用字符数组处理字符串字符串结束标志:‘\0’
说明字符数组长度时,至少为字符串长度加1字符串的长度:第一个‘\0’以前字符的个数字符串中遇'\0',即认为该字符串结束;例“hello”共5个字符,在内存占6个字节,字符串长度5
hello\01041011081081110内存存放字符ASCII码7.3字符数组和字符串字符型数组:用于存放字符型数据。一维字符数组:存放一个字符串(每个数组元素存放一个字符)二维字符数组:存放多个字符串(行数是字符串的个数)
7.3字符数组字符数组的定义:
形式:char数组名[常量表达式]
char数组名[常量表达式][常量表达式]
例:chara[5];a[0]=‘C’;a[1]=‘H’;a[2]=‘I’;a[3]=‘N’;a[4]=‘A’;
CHINAa[0]a[1]a[2]a[3]a[4]7.3.1字符数组的定义字符数组的初始化:
逐个字符赋值用字符串常量例charch[5]={‘H’,’e’,’l’,’l’,’o’};ch[0]Helloch[1]ch[2]ch[3]ch[4]字符数组的初始化逐个字符赋值字符数组的初始化:
逐个字符赋值用字符串常量例charch[]={‘H’,’e’,’l’,’l’,’o’};ch[0]Helloch[1]ch[2]ch[3]ch[4]编译程序计算字符数组长度例charch[5]={‘B’,’o’,’y’};ch[0]Boy\0\0部分初始化,未赋值部分自动赋为’\0’ch[1]ch[2]ch[3]ch[4]字符数组的初始化:
逐个字符赋值用字符串常量用字符串常量例charch[6]={“Hello”};charch[6]=“Hello”;charch[]=“Hello”;ch[0]Helloch[1]ch[2]ch[3]ch[4]\0ch[5]字符数组的初始化:
逐个字符赋值用字符串常量用字符串常量例charch[5]=“Boy”;ch[0]Boy\0\0ch[1]ch[2]ch[3]ch[4]字符数组的初始化:
逐个字符赋值用字符串常量注意:charstr1[20]=“hello〞;charstr2[20]=“you〞;str1={“Hello!〞};()str1=“Hello!〞;()str2=str1;()字符数组的初始化字符数组的初始化:逐个字符赋值用字符串常量举例7.6:输出一个字符串:#include<stdio.h>voidmain(){ charc[10]={‘I’,‘_’,‘a’,‘m’,‘_’,‘h’,‘a’,‘p’,‘p’,‘y’}; inti; for(i=0;i<10;i++)printf(“%c〞,c[i]); print(“\n〞);}运行结果:I_am_happy7.3.3字符数组的引用例chardiamond[][5]={{'.','.','*'},{'.','*','.','*'}, {'*','.','.','.','*'},{'.','*','.','*'},{'.','.','*'}};二维字符数组初始化..*\0\0.*.*\0*...*.*.*\0..*\0\0diamond[0]diamond[1]diamond[2]diamond[3]diamond[4]例
charfruit[][7]={“Apple”,”Orange”,”Grape”,”Pear”,”Peach”};二维字符数组初始化fruit[0]fruit[1]fruit[2]fruit[3]fruit[4]Apple\0\0Orange\0Grape\0\0Pear\0\0\0Peach\0\0二维字符数组注意:字符‘\0’并不一定都在字符数组的后面,输出时遇到第一个‘\0’结束;举例:#include<stdio.h>voidmain(){ chara[]={‘a’,‘b’,‘\0’,‘1’,‘2’}; charb[]=“ab\0cd〞; printf(“%s\n%s\n〞,a,b);}CHINA\0\0\0\0\0运行结果:abab说明1、字符数组的输出printf
%c:输出一个字符以数组元素格式:
%s:输出一个字符串以数组名7.3.5字符数组的输入输出2、字符数组的输入scanf形式:scanf(“%s〞,a);其中:字符数组名前不加地址运算符&,数组名代表数组的首地址#include<stdio.h>voidmain()/*printf.c*/{ inti; chara[10]=“CHINA〞; charb[18]=“CHINA\0ACHINA\0CHINA〞; for(i=0;i<10;i++) printf(“%c〞,a[i]); printf(“\n〞); printf(“%s\n〞,a); for(i=0;i<18;i++) printf(“%c〞,b[i]); printf(“\n〞); printf(“%s\n〞,b);}运行结果:
CHINACHINACHINA_CHINA_CHINACHINA数组名举例:结论?#include<stdio.h>voidmain(){chara1[5],a2[5],a3[5];scanf(“%s%s%s〞,a1,a2,a3);printf(“a1=%s\na2=%s\na3=%s\n〞,a1,a2,a3);printf(“&a1=%x\n〞,a1);printf(“&a2=%x\n〞,a2);printf(“&a3=%x\n〞,a3);}输出:a1=howa2=area3=you?&a1=ffcc&a2=ffd2&a3=ffd8a1[0]a1[1]a1[2]a1[3]a1[4]
a2[0]a2[1]a2[2]a2[3]a2[4]
a3[0]a3[1]a3[2]a3[3]a3[4]how\0\0are\0\0you?\0例:多个字符型数组输入字符串输入:how_are_you?结论:分隔符1、字符串输出函数puts形式:puts(字符数组或字符串〕功能:输出一个字符串(以‘\0’结束,并输出‘\n’)。举例:#include<stdio.h>voidmain(){ chara1[]="china\nbeijing"; chara2[]="china\0beijing"; puts(a1);puts(a2);puts(“WUHAN");}运行结果:chinabeijingchinaWUHAN这里是将‘\0’‘\n’因此光标移到下行7.3.6字符串处理函数2、字符串输入函数gets:形式:gets(字符数组〕功能:从键盘输入一个字符串到字符数组。在输入过程中,遇“〞结束,并将其转换为‘\0’存入字符串尾部,对输入的‘_’,‘\t’(Tab键)作为字符存入字符型数组中。常用的字符串处理函数main(){ chara1[15],a2[15]; gets(a1); scanf(“%s〞,a2); printf(“a1=%s\n〞,a1); printf(“a2=%s\n〞,a2);}输入:china_beijing
china_beijing输出:a1=china_beijinga2=china当前字符=空格是否未出现新单词,使word=0,num不累加前一字符为空格(word==0),新单词出现,word=1,num加1前一字符为非空格(word==1),未出现新单词,num不变否0是11是1未01否0是12否1未12是1未02否0是13是1未03否0是14否1未14否1未14否1未14例输入:Iamaboy.
当前字符是否空格word原值新单词开始否word新值num值Iamaboy.举例:输入一行字符,统计单词数,单词间用‘_’分隔。7.3.7字符数组应用举例I-ama--boy\0.s[0]s[1]s[2]s[3]s[4]s[5]s[6]s[7]s[8]s[9]s[10]s[11]num:统计单词数word:单词标志,在单词中为1,出了单词为0输入一字符串给stringi=0num=0word=0当((c=string[i])!=‘\0’)c==空格真真假假word=0word=1num=num+1i=i+1输出:numword==07.3.7字符数组应用举例main(){chars[81];inti,num=0,word=0;charc;gets(s);for(i=0;(c=s[i])!=‘\0’;i++)if(c==‘_’)word=0;elseif(word==0){word=1; num++;}printf(“There_are_%dwords_in_the_line\n〞,num);}输入:I_am_a_boy.
输出:There_are_4_word_in_the_line输入一字符串给si=0num=0word=0当((c=s[i])!=‘\0’)c=空格真真假假word=0word=1num=num+1i=i+1输出:numword==07.3.7字符数组应用举例3、字符串连接函数strcat<string.h>格式:strcat(字符数组1,字符数组2)功能:把字符串2连到字符串1后面说明:字符数组1必须足够大连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,新串以串2的‘\0’标志结束charstr1[10]=“hello〞;charstr2[10]=“you〞;strcat(str1,str2);常用的字符串处理函数hello\0you\0helloyou\04、字符串拷贝函数strcpy格式:strcpy(字符数组1,字符数组2)功能:将字符数组2,拷贝到字符数组1中去说明:字符数组1必须足够大
拷贝时‘\0’一同拷贝
不能使用赋值语句为一个字符数组赋值例charstr1[10]=“hello〞;/*strcpy.cpp*/charstr2[10]=“you〞;strcpy(str1,str2);hello\0you\0you\0o\0例charstr1[10]=“hello〞;/*strcpy.cpp*/charstr2[10]=“you〞;str2=str1;()常用的字符串处理函数012345678924…….例:strcpy与strcat举例#include<string.h>#include<stdio.h>voidmain(){chardestination[25];charblank[]="",c[]="C++",turbo[]="Turbo";
strcpy(destination,turbo);
strcat(destination,blank);
strcat(destination,c);printf("%s\n",destination);}TurboC++Trbo0123456789u\024…….…….Trbo\00123456789u24…….…...TrboC++0123456789u\024…….常用的字符串处理函数5、字符串比较函数strcmp<string.h>格式:strcmp(字符数组1,字符数组2)功能:比较两个字符串比较:对两串从左向右逐个字符比较〔ASCII码〕,直到遇到不同字符或‘\0’为止返值:返回值是第一个不同Ascii码值的差值。a.假设字符串1<字符串2,返回负整数b.假设字符串1>字符串2,返回正整数c.假设字符串1==字符串2,返回零常用的字符串处理函数例charstr1[10]=“your〞;charstr2[10]=“you〞;intt=strcmp(str1,str2);5、字符串比较函数strcmp<string.h>格式:strcmp(字符数组1,字符数组2)返值:返回值是第一个不同Ascii码值的差值。a.假设字符串1<字符串2,返回负整数b.假设字符串1>字符串2,返回正整数c.假设字符串1==字符串2,返回零your\0you\0t>0常用的字符串处理函数注意:两字符串比较不能用“==、>、<、>=、<=〞运算符,虽然编译无错,但结果不对#include<stdio.h>#include<string.h>voidmain(){inti,flag=0;charname[7];charlist[5][7]={〞Zhang〞,〞Wang〞,〞Li〞,〞Tan〞,〞Ling〞};printf(“请输入你的姓名:〞);gets(name);for(i=0;i<5;i++)if(strcmp(list[i],name)==0)flag=1;if(flag==1)printf(“%sisinourclass\n〞,name);elseprintf(“%sisnotinourclass\n〞,name);}\0gniL\0naT\0iL\0gnaW\0gnahZlist[0]list[1]list[2]list[3]list[4]例:一个班级中有假设干名学生。今输入一个学生名,要求查询该学生是否属于该班,输出相应的信息举例:6、求字符串长度函数strlen形式:strlen(字符数组)功能:检测字符串长度,返回字符串长度值,不包括‘\0’;举例:main(){ chara1[10]=“china〞; printf(“%d\n〞,strlen(a1)); printf(“%d\n〞,strlen(“beijing\0wuhan〞));}运行结果:57常用的字符串处理函数7、大小写字母转换函数:strlwr(字符串〕8、小大写字母转换函数:strupr(字符串〕举例:main(){ chara1[6]=“CHinA〞,a2[]=“wuHAn〞; printf(“%s\n〞,strlwr(a1)); printf(“%s\n〞,strupr(a2));}运行结果:chinaWUHAN常用的字符串处理函数例有三个字符串,找出其中最大者
How\0
Hello\0
High\0
str[0]str[1]str[2]#include<stdio.h>#include<string.h>voidmain(){charstring[20],str[3][20];inti;
for(i=0;i<3;i++)gets(str[i]);
if(strcmp(str[0],str[1])>0) strcpy(string,str[0]);elsestrcpy(string,str[1]);if(strcmp(str[2],string)>0) strcpy(string,str[2]);
printf("\nThelargeststringis:\n%s\n",string);}举例:字符串处理函数字符串小写,不是标准库函数strlwr(str)输出字符串,输出到'\0'为止并换行puts(str)字符串大写,不是标准库函数strupr(str)字符串长度,不包括结束标志'\0'strlen(str)字符串比较,依次按ASCII码比较strcmp(s1,s2)字符串复制,s1应留有总够的空间strcpy(s1,s2)字符串连接,s1应留有总够的空间strcat(s1,s2)输入字符串,可输入空白字符,回车结束gets(str)说明函数原型输入4名学生的姓名及三门课成绩,打印学生成绩表。〔姓名、三门课成绩、平均分〕main(){inti,j;charname[5][10];floatscore[5][4],ave[5],sum;for(i=1;i<=4;i++){printf("inputthenameofnumber%d:",i);scanf("%s",name[i]);printf("inputthescoresofnumber%d:",i);scanf("%f%f%f",&score[i][1],&score[i][2],&score[i][3]);}for(i=1;i<=4;i++){sum=0;for(j=1;j<=3;j++)sum=sum+score[i][j];ave[i]=sum/3;}输入4名学生的姓名及三门课成绩。求4名学生的平均分。综合--举例printf("\n***thetableofscore***\n");printf("-----------------------------------\n");printf("namemathengcomave\n");printf("-----------------------------------\n");for(i=1;i<=4;i++){printf("%-5s",name[i]);for(j=1;j<=3;j++)printf("%6.1f",score[i][j]);printf("%6.1f\n",ave[i]);}printf("-----------------------------------\n");}按一定的格式输出4名学生的姓名、成绩、平均分。综合--举例例用简单项选择择法对10个数排序排序过程:〔1〕首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上〔2〕再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序〔3〕重复上述过程,共经过n-1趟排序后,排序结束选择法例初始:[49386597761327]kji=11349一趟:13[386597764927]i=22738二趟:1327[6597764938]三趟:132738[97764965]四趟:13273849[769765]五趟:1327384965[9776]六趟:132738496576[97]kkkkjjjjjjjjjj选择法输入n个数给a[1]到a[n]fori=1ton-1forj=i+1tona[j]<a[min]真假min=j输出a[1]到a[n]min=ia[i]a[min]i!=min真假#include<stdio.h>main(){inta[11],i,j,k,x;printf("Input10numbers:\n");
for(i=1;i<11;i++)scanf("%d",&a[i]);printf("\n");
for(i=1;i<10;i++)
{min=i;
for(j=i+1;j<=10;j++)
if(a[j]<a[min])min=j;
if(i!=min)
{x=a[i];a[i]=a[min];a[min]=x;}
}
printf("Thesortednumbers:\n");
for(i=1;i<11;i++) printf("%d",a[i]);}选择法/*ch7_14.c*/#include<string.h>#include<stdio.h>main(){charstr1[]=〞Hello!",str2[]=〞Howareyou?〞,str[20];intlen1,len2,len3;len1=strlen(str1);len2=strlen(str2);if(strcmp(str1,str2)>0){strcpy(str,str1);strcat(str,str2);}elseif(strcmp(str1,str2)<0){strcpy(str,str2);strcat(str,str1);}elsestrcpy(str,str1);len3=strlen(str);puts(str);printf(〞Len1=%d,Len2=%d,Len3=%d\n〞,len1,len2,len3);}Howareyou?Hello!Len1=6,Len2=12,Len3=18例strcmp与strlen举例查找查找根据指定的关键字查找数组中的特定元素。常用方法顺序查找折半查找顺序查找顺序查找适用于小型和〔或〕没有排序的数组。用关键字与数组的元素依次进行比较。平均而言,要与数组的一半元素进行比较6572837997877957917887查找表关键字#defineN10voidmain(){
intlist[N+1]={0,65,72,83,79,97,87,75,57,91,78};intkey,i;printf("Inputsearchkey:");
scanf("%d",&key);
for(i=1;(list[i]!=key)&&(i<=N);i++);if(i>N)printf("Notfound!");elseprintf("Success!Thepositionis%d.",i);}顺序查找举例〔cw1009.c〕65728379978779579178顺序查找折半查找折半查找适用于已经排好序的数组。用关键字与数组的中间元素比较如果相等,那么查找结束——找到如果key<middle,那么继续在前半局部查找如果key>middle,那么继续在后半局部查找如果没有可查找的局部,那么查找结束——没有找到5765727578798387919783lowmidhigh折半查找折半查找举例〔cw1010.c〕#include<stdio.h>#defineN10voidmain(){inti,low,mid,high,key,found;
intlist[N+1]={0,57,65,72,75,78,79,83,87,91,97};printf("Sortedlist:\n");for(i=1;i<=N;i++)printf("%-4d",list[i]);printf("\n");printf("Inputsearchkey:");
scanf("%d",&key);折半查找折半查找举例
low=1;high=N;found=0;while((low<=high)&&(!found)){
mid=(low+high)/2;
if(key>list[mid])low=mid+1;
elseif(key==list[mid])found=1;
elsehigh=mid-1;}if(found)printf("Success!Thepositionis%d.",mid);elseprintf("Notfound!");}考虑不要found变量排序排序按特定的顺序来安排数据。常用方法直接插入排序简单项选择择排序冒泡排序数据插入问题把一个数据插入到已排好序的有序表中,从而得到一个新的、长度增1的有序表。57657275787987919783576572757879838791975765727578798791971.找到插入点2.腾出位置3.插入数据数据插入数据插入〔cw1011.c〕把一个数据插入到一个有序表中。#include<stdio.h>#defineN20voidmain(){inti,j,x,len=9;intlist[N]={57,65,72,75,78,79,87,91,97};printf("Sortedlist:\n");for(i=0;i<len;i++)printf("%-4d",list[i]);printf("\n");printf("Inputaintegertobeinsertedintothelist:");
scanf("%d",&x);数据插入数据插入续
for(i=0;(x>list[i])&&(i<len);i++);
for(j=len;j>i;j--)list[j]=list[j-1];
list[i]=x;
len++;printf("Thenewlist:\n");for(i=0;i<len;i++)printf("%-4d",list[i]);printf("\n");}找到插入点“腾出位子〞插入数据直接插入排序直接插入排序(78)4525311366928初始状态(4578)25311366928插入第2个数(254578)311366928插入第3个数(813253145667892)插入最后一个数……直接插入排序直接插入排序〔cw1012.c〕输入任意个数,按从小到大的顺序对它们进行排序。#include<stdio.h>#defineN10voidmain(){inti,j,k,len;intlist[N],x;printf("Inputseveralintegerstoconstructalist\n");printf(“Howmany?(<%d)〞,N);scanf("%d",&len);printf(“Pleaseinputthem:〞);for(i=0;i<len;i++)scanf("%d",&list[i]);printf("OK!Thelisthasbeenconstructed:\n");for(i=0;i<len;i++)printf("%-4d",list[i]);任意个数:程序运行时确定直接插入排序直接插入排序续
printf("\nTosort...\n");for(i=1;i<len;i++){x=list[i];for(j=0;(list[i]>list[j])&&(j<i);j++);for(k=i;k>j;k--)list[k]=list[k-1];list[j]=x;}printf("Finished!Thelisthasbeensorted:\n");for(i=0;i<len;i++)printf("%-4d",list[i]);}记住list[i]把list[i]插入有序数列:list[0]..list[i-1]〔1〕查找插入点〔2〕移动数据〔3〕插入784525311366928简单项选择择排序简单项选择择排序784525311366928初始状态(8)
78453125669213找到最小数(813)784531669225找到第二小的数(813253145667892)最大数被找到……一趟简单项选择择排序的操作:通过n-i次数据间的比较,从n-i+1个记录中选出最小的数,并和第i个数交换。简单项选择择排序简单项选择择排序〔cw1013.c〕输入任意个数,按从小到大的顺序对它们进行排序。#include<stdio.h>#defineN10voidmain(){inti,j,len,min;intlist[N],tmp;printf("Inputseveralintegerstoconstructalist.\n");printf(“Howmany?(<%d)〞,N);scanf("%d",&len);printf(“Pleaseinputthem:〞);for(i=0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二年级语文教案前
- 《红托竹荪鲜品贮运技术规程》征求意见稿
- 上海市县(2024年-2025年小学五年级语文)人教版期末考试(下学期)试卷及答案
- 一年级数学计算题专项练习1000题集锦
- 三年级语文上册教案
- 江苏省泰州市泰兴市2024-2025学年九年级上学期期中英语试卷(含答案解析)
- 【初中物理】《运动的描述》教学课件-2024-2025学年人教版(2024)八年级物理上册
- 护目镜市场需求与消费特点分析
- 拉力器市场发展预测和趋势分析
- 制药加工工业机器产品供应链分析
- 北京市海淀区2024学年七年级上学期语文期中试卷【含参考答案】
- 2024新信息科技三年级第四单元:创作数字作品大单元整体教学设计
- 2023-2024学年北京市东城区东直门中学七年级(上)期中数学试卷【含解析】
- JGJ48-2014 商店建筑设计规范
- 新制定《公平竞争审查条例》主题
- 小学体育课件《运动损伤的预防和处理》
- 个人招生计划方案
- 2024年中煤集团西南分公司招聘笔试参考题库附带答案详解
- 电信云网工程师-云网融合(客户IT上云)备考试题库(集团网大版)
- 演员艺术语言基本技巧图文.ppt
- 羊头岗村拆迁安置住宅—3#楼工程试验方案
评论
0/150
提交评论