260 likes | 525 Views
C 语言程序设计. 同学们好!下面开始讲授 C 语言课程的第 8 讲内容。 第 8 讲 数组和字符串( 2 ) 五、数组的应用 1. 数值计算 2. 统计 3. 排序 4. 查找 六、字符串 1. 字符串的概念 2. 字符串函数 3. 使用字符串函数的编程举例. 第 8 讲 数组和字符串( 2 ) 五、数组的应用 六、字符串. C 语言程序设计. 五、数组的应用 1 .数值计算 利用一维或二维数组存储具有一维(向量)结构的数据或二维(矩阵、表格)结构的数据,然后按照一定的规则进行相应的计算。
E N D
C语言程序设计 同学们好!下面开始讲授C语言课程的第8讲内容。 第8讲 数组和字符串(2) 五、数组的应用 1. 数值计算 2. 统计 3. 排序 4. 查找 六、字符串 1. 字符串的概念 2. 字符串函数 3. 使用字符串函数的编程举例 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 五、数组的应用 1.数值计算 利用一维或二维数组存储具有一维(向量)结构的数据或二维(矩阵、表格)结构的数据,然后按照一定的规则进行相应的计算。 举例:已知有两个数值矩阵A和B,编一程序计算出它们的和。 7-5336 -9 A=28-6B=2-8 3 1-4-25-2 -7 分析:由数学知识可知,行数和列数分别对应相同的两个矩阵可以做加法,它们的和仍为一个矩阵,并且与两个加数矩阵具有相同的行数和列数。在此题中的两个矩阵均为3行×3列,所以它们的和矩阵同样为3行×3列。 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 两矩阵加法运算的规则是:求和矩阵中每个元素的值等于两个加数矩阵中对应位置上的元素值之和,即Cij=Aij+Bij,其中A和B表示两个加数矩阵,C表示它们的和矩阵。 在编写的程序中,首先应定义三个二维数组,假定分别用标识符a、b和c表示,它们分别对应A、B和C这三个矩阵,并需要根据A和B的数据对a和b进行初始化;接着根据a和b计算出c;最后按照矩阵的行列结构输出二维数组c,它就是对应的矩阵C。 根据分析编写出程序如下: #include<stdio.h> #define N 3//定义矩阵的大小 void main() { int a[N][N]={{7,-5,3},{2,8,-6},{1,-4,-2}}; //用a保存矩阵A 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 int b[N][N]={{3,6,-9},{2,-8,3},{5,-2,-7}};//用b保存矩阵B int c[N][N];//用c保存求和结果,即矩阵C int i,j;//用i和j分别作为行、列循环变量 for (i=0; i<N; i++)//计算矩阵C for (j=0; j<N; j++) c[i][j]=a[i][j]+b[i][j]; for (i=0; i<N; i++) {//输出矩阵C for (j=0; j<N; j++) printf("%5d",c[i][j]);//每个数值占5个字符位置 printf("\n");//每行数据后输出一个换行 } } 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 该程序运行时得到的输出结果如下: 101-6 40-3 6-6-9 2. 统计 利用一维数组中的每个元素作为统计(计数)变量,统计出相应区间内数据的个数,然后再输出统计结果。 举例:假定需要对某个地区职工的工资状况进行调查,把工资划分为11个区段,每隔1000为一个区段,即0~999.99(不含0)为第1区段,1000~1999.99为第2区段,依次类推,9000~9999.99为第10区段,10000及以上为第11区段。编一程序,首先把调查得到的一批职工的工资数据输入到一个数组中,然后分别统计出每个区段内的职工人数及占总职工数的百分比。 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 分析:由题意可知,职工工资的统计区段共11个,为此定义一个统计数组,假定用c[11]表示,用它的第1个元素c[0]统计工资在0~999.99区段内(不含0)的职工数,用它的第2个元素c[1]统计工资在1000.00~1999.99区间内的职工数,依次类推,用它的第11个元素c[10]统计工资在10000及以上区段内的职工数。另外,还需要设置一个保存所有职工工资的数组,假定为a[Num],用来最多保存Num个职工的工资,Num为一个符号常量。 在程序中,首先定义数组a[Num]并为它最多输入Num个工资数据,若工资小于0则结束输入;接着定义数组c[11]并初始化每个元素值为0;然后依次读取a数组中的每个元素值,通过对1000整除确定出相应的统计区段,使得统计数组c中相应的元素值增1;最后计算出每个区段的统计结果的百分比并输出。 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 根据分析编写出程序如下: #include<stdio.h> #include<stdlib.h> #define Num 20 void main() { double a[Num]={0.0};//定义保存工资的数组a并初始化为0.0 int c[11]={0};//定义保存统计结果的数组c并初始化为0 int i=0,j; double x;//定义相应的简单变量 printf("输入一批职工的工资数据(小于等于0则结束):\n"); 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 while(i<Num) {//通过循环为数组a输入数据 scanf("%lf",&x); if(x<=0.0) {printf("数据输入完毕!\n"); break;} a[i++]=x; } for(j=0; j<i; j++) {//c中的相应下标变量的值加1,完成统计 int k=(int)a[j]/1000;//求出a[j]工资所在的区间序号 if(a[j]<10000) c[k]++; else c[10]++; } for(j=0; j<10; j++) {//输出前10个区间内的统计结果和百分比 printf("%8.2Lf---%8.2Lf: ",j*1000.0,j*1000.0+999.99); 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 printf("%d, %5.2Lf%%\n",c[j],c[j]*1.0/i*100); }//输出最后一个区间内的统计结果和百分比 printf("10000.00及以上: "); printf("%d, %5.2Lf%%\n",c[10],c[10]*1.0/i*100); } 3. 排序 排序就是对一组杂乱无章的数据进行有序排列的过程。首先把初始数据保存到一维数组中,然后按照一定的排序方法使数组中的数据值按下标次序排列有序,最后按下标次序输出结果。 举例:已知有10个常数为42,65,80,74,36,44,28,70,94,72,编一程序,采用选择排序的方法,按照从小到大的顺序排列并输出。 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 分析:首先需要把已知的10个常数存入到一维数组中,假定该数组被定义为a[10];接着采用选择排序的方法对数组a[10]中的10个元素按照其值从小到大的顺序排序,使得元素值的排列次序与下标次序相同,即得到a[0]≤a[1]≤a[2]≤...≤a[9];最后按照下标次序显示出每个元素的值,它们是按值从小到大的次序排列的。 具体排序过程:对数组a中的10个元素进行选择排序共需要进行9次选择和交换的过程,第1次从待排序区间a[0]~a[9]中通过顺序比较选择出一个最小值元素,把它与该区间的第1个元素a[0]交换后,a[0]就成为所有10个元素中的最小值。 0123456789 42658074364428709472//顺序比较查找出a[6] ↑最小值 28 [658074364442709472]//a[6]与a[0]交换 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 第2次从新的待排序区间a[1]~a[9]中通过顺序比较选择出一个最小值元素,把它与当前区间的第1个元素a[1]交换后,a[1]就成为仅次于a[0]的最小值元素。 0123456789 28 [658074364442709472]//顺序比较查找出a[4] ↑最小值 28 36 [8074654442709472]//a[4]与a[1]交换 同理,再从a[2]~a[9]中通过顺序比较选择出一个最小值元素,把它与当前区间的第1个元素a[2]交换后,a[2]就成为仅次于a[0]和a[1]的最小值元素。 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 0123456789 2836 [8074654442709472]//顺序比较查找出a[6] ↑最小值 283642 [74654480709472]//a[6]与a[2]交换,第3次 ↑最小值 28364244 [657480709472]//第4次结果 ↑最小值 2836424465 [7080749472]//第5次结果 根据以上分析,编写出此题的完整程序如下: #include<stdio.h> #define n 10 int a[n]={42,65,80,74,36,44,28,65,94,72}; 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 void SelectSort()//选择排序算法 { int i,j,k,x; for(i=0;i<n-1;i++) {//进行n-1次选择和交换 k=i;//给k赋初值,k保存当前比较得到的最小值元素的下标 for(j=i+1;j<n;j++)//选择出当前区间内的最小值a[k] if(a[j]<a[k]) k=j;//条件成立时k值被修改 x=a[i]; a[i]=a[k]; a[k]=x;//交换a[i]与a[k]的值 } } void main() { int i; SelectSort();//调用函数对数组a[n]进行选择排序 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 for(i=0; i<n; i++) printf("%d ",a[i]);//依次输出数组a[n]中的每个元素值 printf("\n"); } 该程序的运行结果为: 28 36 42 44 65 65 72 74 80 94 4. 查找 查找就是从一批数据中按照一定的查找方法查找出满足一定条件的数据。通常需要把原始数据保存到一维数组中,然后再进行查找并得到查找结果。 举例:假定在一维数组a[10]中保存着10个整数42, 55, 73, 28, 48, 66, 30, 65, 94, 72,编一程序从中顺序查找出具有给定值为x的元素,若查找成功则返回该元素的下标位置,否则返回-1表明查找失败。 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 分析:此程序比较简单,假定把从一维数组中顺序查找的过程单独用一个函数定义模块来实现,把数组定义和初始化以及调用该函数通过主函数来实现,则整个程序如下: #include<stdio.h> #define Num 10 //假定把数组中保存的整数个数用符号常量Num表示 int SequentialSearch(int a[], int n, int x) { //从数组a[n]中顺序查找值为x的算法 int i; for(i=0; i<n; i++) if(x==a[i]) return i; //查找成功返回元素a[i]的下标值 return -1; //查找失败返回-1 } 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 void main() { int a[Num]={42,55,73,28,48,66,30,65,94,72}; int x,y; while(1) {//每循环一次,从数组a中查找一个数据 printf("从键盘上输入一个待查找的整数(小于等于0则结束): "); scanf("%d",&x);//输入一个整数到x中 if(x<=0) {printf("程序运行结束!\n"); exit(0);} y=SequentialSearch(a,Num,x);//返回元素下标或-1赋给y if(y==-1) printf("查找 %d 失败!\n",x); else printf("查找 %d 成功! 下标为 %d\n",x,y); } } 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 六、字符串 1. 字符串的概念 (1)定义:用双引号括起来的一串字符。 如“abc”, “姓名”, “a+b=c”,“2456.0” (2)存储:用一维字符数组存储,最后自动存储一个空字符,即ASCII码为0的字符,此字符数组的长度必须要大于等于所存字符串的长度加1。 例如,char a[10]; 字符数组a只能存储长度小于等于9的字符串,必须在最后留有一个位置存储空字符‘\0’。如存储“abcd”字符串时,实际上存储的是“abcd\0”。 (3)利用字符串初始化字符数组 如:char a[10]= "array"; 等价定义:char a[10]={’a’,’r’, ’r’,’a’,’y’,’\0’}; 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 存储表示: 字符串的输入和输出 输入:gets(a);//等价于:scanf("%s",a); 键盘输入不使用双引号 //以按下回车键结束,而scanf则还以空格结束 输出:puts(a);//等价于:printf("%s\n",a); (4)利用二维字符数组存储若干个字符串 如:char b[3][10]={"well", "good", "pass"}; //每行存储一个字符串 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 2. 字符串函数 对字符串进行比较大小、复制、连接、求长度等操作是通过C语言函数库中提供的字符串函数实现的,使用这些函数时必须包含头文件string.h。 假定待处理的字符串:char a[10]= "abcd", b[10]="efg",c[10]=""; (1)求字符串长度的函数strlen(x) 求出字符串x的长度,即所含的字符个数。 strlen(a);strlen(b);strlen(c);strlen("学习");//4 3 0 4 (2)字符串复制(拷贝)函数strcpy(x,y) 把字符串y复制到字符串x中。 strcpy(c,a)//c[10]的内容为"abcd",直接赋值c=a 不允许 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 strcpy(c,b)//c[10]的内容变为"efg" strcpy(c, "2345.67")//c[10]的内容变为"2345.67“ (3)字符串连接函数strcat(x,y) 把字符串y复制到字符串x的末尾。 strcat(c, "58");// c[10]的内容变为"2345.6758" strcpy(c, a); strcat(c, b);// c[10]的内容变为"abcdefg“ 注意:要确保第1个参数的字符数组有足够的空余空间。即连接后的字符串长度要小于字符数组长度。使用c=c+b不允许。 (4)字符串比较函数strcmp(x,y) 比较字符串x和字符串y的大小,若x>y则返回1,若x==y则返回0,若x<y则返回-1。对字符串不允许直接使用比较运算符,比较过程逐个字符进行。 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 strcmp(a,b)//比较"abcd"和"efg",返回-1'a':97'e':101 strcmp(a, "abak")//比较"abcd"和"abak",返回1'c':99'a':97 strcmp(b, “efg”)//比较“efg”和“efg”,返回0 对应字符和长度相等 3. 使用字符串函数的编程举例 例1:编一程序,首先输入10个字符串到一个二维字符数组中,接着输入一个待查的字符串,然后从二维字符数组中查找出含有待查字符串的个数。 此程序比较简单,编写如下: #include<stdio.h>//用于输入输出 #include<string.h>//用于字符串函数运算 void main() 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 { char a[10][30];//用于存储10个字符串,假定每个串长度小于30 char s[30];//存储待查的字符串 int i,k=0; printf("输入10个字符串:\n"); for (i=0; i<10; i++) scanf("%s",a[i]);//10个串被输入到a中 printf("输入一个待查字符串:"); scanf("%s",s);//待查串被输入到s中 for (i=0; i<10; i++) if (strcmp(a[i],s)==0) k++;//统计结果保存在k中 printf("相同的字符串个数: %d\n",k);//输出统计结果 } 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 例2:编一程序,首先输入M1个字符串到一个二维字符数组中,并假定每个字符串的长度均小于N1,M1和N1为事先定义的符号常量,接着对这M1个字符串进行选择排序,最后输出排序结果。 分析:根据我们学习过的对整数进行选择排序的方法,也很容易实现对字符串进行选择排序,在这里是使用字符串函数进行比较和复制,而不能直接使用相应的运算符。 此题的完整程序如下: #include<stdio.h> #include<string.h> #define M1 10 //定义字符串个数 #define N1 30 //定义字符串长度,要小于30 void SelectSort(char a[M1][N1]) //对字符串进行选择排序的函数定义 { 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 int i,j,k; for (i=1; i<M1; i++) {//进行M1-1次选择和交换 char x[N1];//定义字符数组x用于交换a[i-1]和a[k]的值 k=i-1;//给k赋初值 for(j=i; j<M1; j++)//选择出当前区间内的最小值a[k] if (strcmp(a[j],a[k])<0) k=j;//进行字符串比较 if (k!=i-1) {//利用字符串拷贝函数进行字符串赋值和交换 strcpy(x,a[i-1]); strcpy(a[i-1],a[k]); strcpy(a[k],x); } } } void main() 第8讲 数组和字符串(2) 五、数组的应用 六、字符串
C语言程序设计 { //定义二维字符数组b并初始化每个字符串为空串 char b[M1][N1]={""}; //从键盘输入M1个字符串到字符串数组b中 int i; printf("输入%d个字符串:\n",M1); for (i=0; i<M1; i++) scanf("%s",b[i]); //调用字符串选择排序算法对字符串数组b进行选择排序 SelectSort(b); //依次输出字符串数组b中的每个字符串 printf("排序结果:\n"); for(i=0; i<M1; i++) printf("%s\n",b[i]); } 总结:数组应用和字符串 这一讲就到这里,同学们再见! 第8讲 数组和字符串(2) 五、数组的应用 六、字符串