数组:初始化,输入输出,使用。 核心:选择排序和冒泡排序
1 2 3 4 5 | 计算10种商品的利润 在一串字符中找出所有数字字符构成新的数组 从100名学生中找出成绩最高的学生 在有序数据中插入一个数 将8名候选人的投票数由多到少排序 |
【实例4.1】编写程序,根据10种商品的进价和销售价,计算各商品的利润。
【编程思路】
定义3个含有10个元素的数组a、b、c,分别存放各商品的进价、销售价和利润。利润通过销售价和进价的差得到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main(int argc, char *argv[]) { int a[10]= {12,8,20,15,28,32,38,45,51,65}; int b[10]= {20,13,29,22,37,40,49,56,62,78}; int c[10]= {0},i=0; for(i=0; i<10; i++) c[i]=b[i]-a[i]; for(i=0; i<10; i++) printf("%4d",a[i]); printf("\n"); for(i=0; i<10; i++) printf("%4d",b[i]); printf("\n"); for(i=0; i<10; i++) printf("%4d",c[i]); printf("\n"); return 0; } |
【实例4.2】编写程序,在一串字符中找出所有数字字符构成新的数组。
【编程思路】
ch的值为数字字符的条件是满足ch≥'0' 且 ch≤'9'
需要定义2个数组, 使用2个循环变量i和j,i用于从第1个数组中逐个访问各元素,j用于构建第2个数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> int main(int argc, char *argv[]) { char old[80]="From 500 B.C. to 500 A.D. is 1000 years.", new[80]= {'\0'}; int i=0, j=0; while(old[i]!='\0') { if(old[i]>='0' && old[i]<='9') { new[j]=old[i]; j++; } i++; } new[j]='\0'; puts(old); puts(new); return 0; } |
【实例4.3】编写程序,输入100名学生学号和学年总平均成绩,并找出其中成绩最高的学生。
【编程思路】
定义2个数组num和score,学号存放在num中,对应平均成绩存放在score中。
从数组score中查找最大元素下标值开始入手
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> #define N 5 int main(int argc, char *argv[]) { int num[N]={0},i=0,k=0; float score[N]={0.0}; for(i=0; i<N; i++) scanf("%d%f",&num[i],&score[i]); for(i=1; i<N; i++) if(score[k]<score[i]) k=i; for(i=0; i<N; i++) printf("%8d",num[i]); printf("\n"); for(i=0; i<N; i++) printf("%8.2f",score[i]); printf("\n"); printf("number=%d,score=%.2f\n",num[k],score[k]); return 0; } |
【实例4.4】编写程序,在已按小到大的顺序存入的学号中插入1个新学生学号。要求使学号仍然按原来的顺序有序。
【编程思路】
查找位置,数据移动,插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> #define N 5 int main(int argc, char *argv[]) { int num[N+1]={1002,1003,1006,1008,1010}; int i=0,j=0,new=0; printf("Original numbers:\n"); for(i=0; i<N; i++) printf("%6d",num[i]); printf("\n"); printf("Input a student number:"); scanf("%d",&new); for(i=0; i<N; i++) if(new<num[i]) break; for(j=N; j>i; j--) num[j]=num[j-1]; num[i]=new; printf("Final numbers:\n"); for(i=0; i<N+1; i++) printf("%6d",num[i]); printf("\n"); return 0; } |
【实例4.5】编写程序,将8名候选人的投票数由多到少排序。
【编程思路】
选择法排序: 采用2轮循环,外循环是有序后的元素遍历,内循环用于寻找最值。
假设最小元素在数组的第0个位置上,从数组的第一个元素开始遍历数组,找出最小的元素分别和数组的第0个位置上的元素分别比较,如果该元素小于第0个元素,则交换该元素, 则交换后该元素就是有序的。说的通俗一点就是:每次选择剩余数据中的最值调整到有序 部分的后面去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main(int argc, char *argv[]) { int a[8]= {34,56,45,57,69,48,79,61},i=0,j=0,k=0,t=0; for(i=0; i<7; i++) { k=i; for(j=i+1; j<8; j++) if(a[k]<a[j]) k=j; t=a[i]; a[i]=a[k]; a[k]=t; } for(i=0; i<8; i++) printf("%5d",a[i]); printf("\n"); return 0; } |
冒泡法排序:程序采用2轮循环,外循环遍历要排序的元素,内循环用于挑选出最值。内循环用于将相邻的两个元素进行比较,将小的元素调到大元素的前头。内循环的循环次数表示相邻元素的交换趟数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main(int argc, char *argv[]) { int a[8]= {34,56,45,57,69,48,79,61},i=0,j=0,t=0; for(i=0; i<7; i++) for(j=i+1; j<8; j++) if(a[i]<a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } for(i=0; i<8; i++) printf("%5d",a[i]); printf("\n"); return 0; } |