250 likes | 311 Views
数组小结. (1) 数组是多个同类型变量的集合,通常与循环语句结合使用,用于批量数据处理。 (2) 数组按维数分,可分为一维数组、二维数组和多维数组 ( 三维及以上 ) ,其中二维数组相当于一个多行多列的矩阵;数组按类型分,可分为数值型数组、字符型数组、结构体数组等。 (3) 数组可以在定义时对其赋值,称为数组的初始化。使用时,数组元素通过下标来引用,数组下标从 0 开始。. 用一维数值和二维数值求最值的区别. 【 例 5-6】 输入一个 8 个整数的一维数组,求该数组中最大的元素值以及最大元素所在的下标。. #include <stdio.h> void main()
E N D
数组小结 (1) 数组是多个同类型变量的集合,通常与循环语句结合使用,用于批量数据处理。 (2) 数组按维数分,可分为一维数组、二维数组和多维数组(三维及以上),其中二维数组相当于一个多行多列的矩阵;数组按类型分,可分为数值型数组、字符型数组、结构体数组等。 (3) 数组可以在定义时对其赋值,称为数组的初始化。使用时,数组元素通过下标来引用,数组下标从0开始。
【例5-6】输入一个8个整数的一维数组,求该数组中最大的元素值以及最大元素所在的下标。【例5-6】输入一个8个整数的一维数组,求该数组中最大的元素值以及最大元素所在的下标。 #include <stdio.h> void main() { int i,max,r,a[8];//max、r分别存放最大元素值、下标 max=-10000000; for(i=0;i<8;i++) { scanf("%d",&a[i]); if(max<a[i]) { max=a[i]; r=i; } } printf("最大元素值:%d,下标:%d\n",max,r); }
【例5-6】输入一个3×4的矩阵,按行、列输出该矩阵,并求该矩阵中最大的元素值以及最大元素所在的行、列下标。【例5-6】输入一个3×4的矩阵,按行、列输出该矩阵,并求该矩阵中最大的元素值以及最大元素所在的行、列下标。 void main() { int i,j,max,row,col,a[3][4];//max、row和col分别存放最大元素值、行和列 max=-10000000; for(i=0;i<3;i++) for(j=0;j<4;j++) { scanf("%d",&a[i][j]); if(max<a[i][j]) {max=a[i][j]; row=i; col=j;} } for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%6d",a[i][j]); printf("\n"); } printf("最大元素值:%d,行下标:%d,列下标:%d\n",max,row,col); }
【例5-11】从键盘输入一个字符串,找出其中ASCII码值最大的字符并输出该字符及其ASCII码值。【例5-11】从键盘输入一个字符串,找出其中ASCII码值最大的字符并输出该字符及其ASCII码值。 #include <stdio.h> void main() { char a[20],max=0; int i=0; scanf("%s", a); while(a[i]) { if(a[i]>max) max=a[i]; i++; } printf("%c,%d\n",max,max); }
排序 冒泡 比较交换排序 选择排序
【例5-13】从键盘输入一批学生的信息到学生信息管理系统中,然后按总分由高到低进行排序。【例5-13】从键盘输入一批学生的信息到学生信息管理系统中,然后按总分由高到低进行排序。 编程思路:排序在现实生活中有着广泛的应用,排序的方法很多,其中冒泡排序法是一种比较著名的排序算法。假设按从小到大的顺序排序,冒泡排序法的基本思想如下: 从第一个数开始,依次比较相邻的两个数,将小数放在前面,大数放在后面,第一趟结束时,最大的数被排到了最后; 第二趟,再从第一个数开始,采用相同的方法,一直比较到倒数第二个数为止(倒数第一的位置上已经是最大的了),第二趟结束时,次大的数被排到了倒数第二的位置上;…; 重复以上过程,直至排完为止。 该方法之所以称为“冒泡排序”,是因为排序过程中总是大的数像石头一样“沉底”,小的数像水中气泡一样“上升”,每一趟都将剩余数中最大的一个数沉底。
以5 3 4 2 1 0 这六个数的排序为例,说明冒泡排序的过程。
通过以上分析可以看出,如果有n个数,最多经过多少趟完成排序?第i趟排序中进行两两比较的次数为多少?通过以上分析可以看出,如果有n个数,最多经过多少趟完成排序?第i趟排序中进行两两比较的次数为多少? • 这样,可以采用二重循环来实现冒泡排序。 • 外循环:控制排序的趟数,循环控制变量i的取值范围是1≤i ≤ n-1。 • 内循环:控制每一趟两两比较的次数,由于数组的下标从0开始,为方便处理,将循环控制变量j的取值范围设为:0 ≤ j<n-i。
#define N 6 #include <stdio.h> void main() { int x[N],i,j,temp; printf("请输入%d个数据:",N); for(i=0;i<N;i++) scanf("%d",&x[i]); for(i=1;i<=N-1;i++) //控制趟数 for(j=0;j<N-i;j++) //控制每一趟的比较次数 if(x[j]>x[j+1]) { temp=x[j]; x[j]=x[j+1]; x[j+1]=temp; } printf("排序结果为:"); for(i=0;i<N;i++) printf("%d ",x[i]); } 如果需要将数据由大到小进行排序,则上述程序应如何修改?
【例5-14】从键盘输入N个数,采用比较交换排序法将这N个数按从小到大的顺序排序。【例5-14】从键盘输入N个数,采用比较交换排序法将这N个数按从小到大的顺序排序。 编程思路:将第一个数顺序与其后的每个数进行比较,如果某个数比它小,则两者交换。 第一趟结束时,最小的数被排到了第一个位置上; 第二趟从第二个数开始,将第二个数顺序与其后的每个数进行比较,如果某个数比它小,则两者交换,第二趟结束时,次小的数被排到了第二个位置上;…; 重复以上过程,经过N-1趟的比较,可将N个数排好。
以5 3 4 2 1 0 这六个数的排序为例,说明比较交换排序的过程
#include <stdio.h> #define N 6 void main() { int x[N],i,j,temp; printf("请输入数据:"); for(i=0;i<N;i++) scanf("%d",&x[i]); for(i=0;i<N-1;i++) //要选择的趟数 for(j=i+1;j<N;j++) //控制每一趟的比较次数 if(x[i]>x[j]) //比较、交换 { temp=x[i]; x[i]=x[j]; x[j]=temp; } printf("排序结果为:"); for(i=0;i<N;i++) printf("%d ",x[i]); }
【例5-15】从键盘输入N个数,采用选择排序法将这N个数按从小到大的顺序排序。【例5-15】从键盘输入N个数,采用选择排序法将这N个数按从小到大的顺序排序。 编程思路:首先从要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后从剩下的数当中再选出一个最小的数与第二个位置的数交换;…;如此继续,直至倒数第二个数和最后一个数比较完为止。 下面以5 3 4 2 1 0 这六个数的排序为例,说明选择排序的过程,如图5-5所示。
#define N 6 #include <stdio.h> void main() { int x[N],i,j,min,temp; //变量min用来保存本趟最小数的下标 printf("请输入%d个数据:",N); for(i=0;i<N;i++) scanf("%d",&x[i]); for(i=0;i<N-1;i++) //要选择的趟数 { min=i; //先假设x[i]是最小数,如果后面有更小的数再调整 for(j=i+1;j<N;j++) //找出本趟的最小数 if(x[min]>x[j]) min=j;//将最小数的下标保存到min中 if(i!=min)//如果x[i]不是最小数,就将最值和当前数交换 { temp=x[i]; x[i]=x[min]; x[min]=temp; } } printf("排序结果为:"); for(i=0;i<N;i++) printf("%d ",x[i]); }
【例5-6】输入一个8个整数的一维数组,将各数顺序向后移一位,最后一个数移到最前面,并输出。【例5-6】输入一个8个整数的一维数组,将各数顺序向后移一位,最后一个数移到最前面,并输出。 #include <stdio.h> void main() { int i,t,a[8];//max、r分别存放最大元素值、下标 for(i=0;i<8;i++) scanf("%d",&a[i]); t=a[7]; for(i=7;i>0;i--) a[i]=a[i-1]; a[0]=t; for(i=0;i<8;i++) printf("%d ",a[i]); } 顺序向前移一位,最第一个数移到最后?
9.从键盘输入字符串,将下标为偶数位置上的字符按顺序复制到另外一个字符数组中并输出。9.从键盘输入字符串,将下标为偶数位置上的字符按顺序复制到另外一个字符数组中并输出。 #include <stdio.h> void main() { int i=0,j=0; char s1[80],s2[80]; printf("请输入1个字符串:"); scanf("%s", s1); while(s1[i]!='\0') { if (i%2==0) { s2[j]=s1[i]; i++; j++; } else i++; } s2[j]='\0'; //添加字符串结束标志 printf("%s\n",s2); }
9.从键盘输入字符串及任一字符,查找该字符在字符串中第一次出现的位置。9.从键盘输入字符串及任一字符,查找该字符在字符串中第一次出现的位置。 #include <stdio.h> #include <string.h> void main() { char a[20],c; int i=0; scanf("%c",&c); scanf("%s",a); while(a[i]!='\0') { if(a[i]==c) { printf("%d\n",i+1); break; } i++; } if(a[i]=='\0') printf("没找到!\n"); }
9. 从键盘输入两个字符串,将第二个字符串连接到第一个字符串的后面,并输出连接后的结果。要求:不能调用字符串库函数strcat()。 #include <stdio.h> void main() { int i=0,j=0; char s1[80],s2[80]; printf("请输入第2个字符串:"); scanf("%s", s1); scanf("%s", s2); while(s1[i]!='\0')//计算字符串1的长度值 i++; while(s2[j]!='\0')//将字符串2连接在字符串1之后 { s1[i]=s2[j]; i++; j++; } s1[i]='\0'; //添加字符串结束标志 printf("连接后的字符串为:%s\n",s1); }
3 从键盘上输入一个M×N的二维数组,求该数组各行的平均值,将结果放到一个一维数组中,并输出。
#include <stdio.h> #define M 3 #define N 4 void main() { int i,j; float a[M][N],b[M],sum; printf("请输入%d×%d的矩阵:",M,N); for(i=0;i<M;i++) { sum=0; for(j=0;j<N;j++) { scanf("%f",&a[i][j]); sum=sum+a[i][j];//在接收第i行输入的同时求和 } b[i]=sum/N; //求每行的平均值并放入数组b中 } for(i=0;i<M;i++) printf("%4.2f ",b[i]); }