第10讲 维数组与字符数组 ·以后会越来越难,因此一定要对前面的知识及时理解和掌握。 看懂、听懂并不等于会用。 课堂上时间有限,大家一定要及时预习和复习。 复习时注意只需要把我课上讲的几个例题理解透彻并掌握即可 注意:思路!算法
第10讲 一维数组与字符数组 •以后会越来越难,因此一定要对前面的知识及时理解和掌握。 •看懂、听懂并不等于会用。 •课堂上时间有限,大家一定要及时预习和复习。 •复习时注意只需要把我课上讲的几个例题理解透彻并掌握即可 •注意:思路!算法!
作业1:求60个学生的最高分 n算法: 输入60个学生的成绩 依次比较,找出最高分 输出最高分
2 作业1:求60个学生的最高分 ▪ 算法: ▪ 输入60个学生的成绩 ▪ 依次比较,找出最高分 ▪ 输出最高分
方法一: include *define n 60 void maino int a[ni, max: printf Input %od score: \n,N) for(i=0:imax) max=a[i: y printf \n The maximum score is %d: \n ", max):
3 方法一: #include #define N 60 void main() { int a[N],max; printf("Input %d score:\n",N); for(i=0;imax) { max=a[i]; } printf("\n The maximum score is %d :\n " ,max); }
方法二 include a[max订j maxi=i;}求最大元素对应的下标*/ printf \n The maximum score is %d: \n",a[max_i]
4 方法二: #include #define N 60 void main() { int a[N],max_i; printf("Input %d score:\n",N); for(i=0;ia[max_i]) { max_i=i; } /*求最大元素对应的下标*/ printf("\n The maximum score is %d :\n " ,a[max_i]); }
作业2:求60个学生的平均分鼠 #include fdefinen60 void maino int a[ni, sum printf( Input %d score: n",N): for(i=0i<=N-1;i*+) scanf( %d" &a[iD: sum=0 for(=oi<=N-1;i+)求和* sum+=a0: printf( \n average=%.1f n". (float)sum/N):
5 作业2:求60个学生的平均分 ▪ 算法: ▪ 输入60个学生的成绩 ▪ 计算总分,平均分 ▪ 输出平均分 #include #define N 60 void main() { int a[N],sum; printf("Input %d score:\n",N); for(i=0;i<=N-1;i++) scanf("%d",&a[i]); sum=0; for(i=0;i<=N-1;i++) /*求和*/ sum+=a[i]; printf("\n aversge=%.1f :\n ",(float)sum/N); }
例6-1对200个学生成绩 从大到小排序 算法 输入200个成绩 排序 输入排序结果
6 例6-1 对200个学生成绩 从大到小排序 ▪ 算法 ▪ 输入200个成绩 ▪ 排序 ▪ 输入排序结果
冒泡法对N个数从大到小排序 for i=0; j<=N-2: j++) 通过依次比较叫口和a[工+1.不满足顺序交换 再 直for(=O:=(N-1)-(-1)i+) 通 if(a[<a[+1 =a[a[=a[i+1]:a[i+1]=t} ■■■■ 第J趟排序:比较a[和a[1],不满足顺序交换, 再比较a[1]和a[2],不满足顺序交换,依此类推, 直至N-j-2]和aN-j-1]比较,不满足顺序交 换,通过这一趟的两两比较找到第j*1个最小的 数放在aN--1]的位置 共N-1趟 7
7 冒泡法对N个数从大到小排序: ▪ 第0趟排序:比较a[0]和a[1],不满足顺序交换, 再比较a[1]和a[2],不满足顺序交换,依此类推, 直至a[N-2]和a[N-1]比较,不满足顺序交换, 通过这一趟的两两比较找到第1个最小的数放在 a[N-1]的位置 ▪ …… ▪ 第J趟排序:比较a[0]和a[1],不满足顺序交换, 再比较a[1]和a[2],不满足顺序交换,依此类推, 直至a[N-j-2]和a[N-j-1]比较,不满足顺序交 换,通过这一趟的两两比较找到第j+1个最小的 数放在a[N-j-1]的位置 ▪ 共N-1趟 for(j=0;j<=N-2;j++) { /*第j趟排序*/ } /*通过依次比较a[I]和a[I+1],不满足顺序交换*/ for(i=0;i<=(N-1)-(j-1);i++) if(a[i]<a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}
include #deN200例6-1完整程序:冒泡法 〔 int a[N],ijt printf Input %d score: \nN) for(=0:i t=a[ij:a[i]=a[i+1]a[i+1]=t:} printf(" \n The sorted score: \n) for(i=0:i<=N-1:i++) if(‰15=0) printf("n") printf( %4d",a[iD: }/书中P167的源代码改为for(=0<N-j-2:++)*
8 #include #define N 200 void main() { int a[N],i,j,t; printf("Input %d score:\n",N); for(i=0;i*/ { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } printf(" \n The sorted score:\n"); for(i=0;i<=N-1;i++) { if(i%15==0) printf("\n"); printf("%4d ",a[i]); } } /*书中P167的源代码改为for(i=0;i<=N-j-2;i++) */ 例6-1完整程序:冒泡法
fori=0:ja[max_ iD) [max j=i:] 广若maxl=j,说明q[max比j大,则交换 if(max_i==j) [t=a[max_i]: a[max_i]=a[i]: aLi]=: ■第趟排序:从α叮全@N-1,比较找出其中 最大数所在的下标k,若k=j,说明a[k]比aj 大,则交换a和a[k,通过这一趟的比较找到 第j+1个最大的数放在a[门的位置 共N-1趟
9 选择法对N个数从大到小排序 ▪ 第0趟排序:从a[0]至a[N-1] ,比较找出其中 最大数所在的下标k,若k!=0,说明a[k]比a[0] 大,则交换a[0]和a[k],通过这一趟的比较找 到第1个最大的数放在a[0]的位置 ▪ …… ▪ 第J趟排序:从a[j]至a[N-1] ,比较找出其中 最大数所在的下标k,若k!=j,说明a[k]比a[j] 大,则交换a[j]和a[k],通过这一趟的比较找到 第j+1个最大的数放在a[j]的位置 ▪ 共N-1趟 for(j=0;ja[max_i]) {max_i=i;} if(max_i!==j) {t=a[max_i]; a[max_i]=a[j]; a[j]=t; }
#include define N 200 void maino 例6-1完整程序:选择法 t int a[N], i,j, max_i,t: printf("Input %d score:\n" N) for(i=0:ia[maxj/若从小到大排序,改成< [max j=i: 3 if(max_il==j) [t=a[max门;a[mx订=j:q[=t:} printf" \n The sorted score: \n"): for(i=0:i<=N-1:++) if(‰15==0)prn("n") ) printf("%4d ",a[iD):
10 #include #define N 200 void main() { int a[N],i,j,max_i,t; printf("Input %d score:\n",N); for(i=0;ia[max_i]) /*若从小到大排序,改成<*/ {max_i=i;} if(max_i!==j) {t=a[max_i]; a[max_i]=a[j]; a[j]=t; } } printf(" \n The sorted score:\n"); for(i=0;i<=N-1;i++) { if(i%15==0) printf("\n"); printf("%4d ",a[i]); } } 例6-1完整程序:选择法