有一个足够“大”的数组a,其中已经存储了n个呈升序排列的数据。调用函数insert(a, n, m),可以将数m插入到a中的合适位置,使其仍然保持升序,并且返回值为数组中有效数字的个数(即原先的n加1)。
例如,若a中数据为1 7 8 17 23 24 59 62 101,n=9,需要插入的数字m为50,调用函数insert(a, n, m)后,a中数据为1 7 8 17 23 24 50 59 62 101,n=10。
下面给出了调用函数insert的main函数,请写出insert函数来,实现上述功能。
#include<stdio.h> #define N 10 int main() { int a[10]={11,22,33,44,55,66,77,88,99}; int i,j,num,t; for(i=0;i<N-1;i++) printf("%d ",a[i]); printf("\n输入数字:"); scanf("%d",&num); a[9]=num; for(j=0;j<N-1;j++) for(i=0;i<N-j-1;i++) { if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } } for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); return 0; }运行结果:
#include<stdio.h> int del(int a[],int n,int x); int main() { int a[]={76,76,72,58,77,85,92,76,96,88,77,67,86,68,78,87,64,59,76,76}; int i,n,x; n=20; for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n请输入要删除的元素:"); scanf("%d",&x); n=del(a,n,x); printf("\n"); for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); return 0; } int del(int a[],int n,int x) { int i,j; for(i=0;i<n-1;i++) { if(x==a[i]) { for(j=i;j<n;j++) a[j]=a[j+1]; n--; i--; } } if(x==a[n-1]) n--; return n; }
#include<stdio.h> int del(int a[],int n,int x); int main() { int a[]={7,9,15,16,16,25,34,48,49,56,59,63,67,77,85,94,96,126,140,140}; int i,n,x; n=20; for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n请输入要删除的元素:"); scanf("%d",&x); n=del(a,n,x); for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); return 0; } int del(int a[],int n,int x) { int i,j; for(i=0;i<n-1;i++) { if(a[i]==x) { for(j=i;j<n-1;j++) a[j]=a[j+1]; n--; i--; } if(a[i]>x) break; } if(a[n-1]==x) n--; return n; }运行结果:
(1)编写函数,完成冒泡排序
要求不能改变下面的main函数。
#include <stdio.h> void bubble_sort(int a[],int n); void output_array(int a[],int n); int main( ) { int a[20]={86,76,62,58,77,85,92,80,96,88,77,67,80,68,88,87,64,59,61,76}; int b[15]={27,61,49,88,4,20,28,31,42,62,64,14,88,27,73}; bubble_sort(a,20); //用冒泡法按降序排序a中元素 output_array(a,20); //输出排序后的数组 bubble_sort(b,15); //用冒泡法按降序排序b中元素 output_array(b,15); //输出排序后的数组 return 0; } void bubble_sort(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) { for(j=0;j<n-i-1;j++) if(a[j]<a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } printf("\n"); } void output_array(int a[],int n) { int i; for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); }运行结果:
#include <stdio.h> void bubble_sort(char a[],int n); void output_array(char a[],int n); int main( ) { char a[20] = {'s','o','r','t','b','u','b','b','l','e','s','e','l','e','c','t','o','k','o','k'}; char b[15] = {'c','b','a','n','f','l','e','d','o','g','j','h','m','i','k'}; bubble_sort(a,20); //用冒泡法按降序排序a中元素 output_array(a,20); //输出排序后的数组 bubble_sort(b,15); //用冒泡法按降序排序b中元素 output_array(b,15); //输出排序后的数组 return 0; } void bubble_sort(char a[],int n) { int i,j,t; for(i=0;i<n-1;i++) { for(j=0;j<n-i-1;j++) if(a[j]<a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } printf("\n"); } void output_array(char a[],int n) { int i; for(i=0;i<n;i++) printf("%c ",a[i]); printf("\n"); }运行结果:
#include <stdio.h> void select_sort(int a[],int n); void output_array(int a[],int n); int main( ) { int a[20]={86,76,62,58,77,85,92,80,96,88,77,67,80,68,88,87,64,59,61,76}; int b[15]={27,61,49,88,4,20,28,31,42,62,64,14,88,27,73}; select_sort(a,20); //用选择法按升序排序a中元素 output_array(a,20); //输出排序后的数组 select_sort(b,15); //用选择法按升序排序b中元素 output_array(b,15); //输出排序后的数组 return 0; } void select_sort(int a[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if(a[k]>a[j]) { k=j; } } t=a[k]; a[k]=a[i]; a[i]=t; } printf("\n"); } void output_array(int a[],int n) { int i; for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); }运行结果:
(1)score1.txt提供了某大学两个班某次测验的数据,包括每位同学的学号及成绩。
请编程序,输入学号,查找出该同学的成绩。
提示1:可以定义两个int型数组,其中一个n存放学号,另一个s存放成绩,可以保证两个数组中,元素下标相同,对应的是同一位同学。例如n[18]值为3123,s[18]为98,说明学号为3123的同学成绩为98。
提示2:因为数据无序,运用顺序查找算法,在n数组中依据学号进行查找,在s数组中对应下标的值则为其成绩。例如,通过在n中的查找,得出学号为3123的同学的下标为18,则其成绩为s[18]。
下面是完成应用的部分代码,已经能够输出成绩清单。请在此基础上实现有关的函数:
#include<stdio.h> #include<stdlib.h> int readData(int a[],int b[]); int search(int a[],int n,int key); int main() { int num[200],score[200]; int count; int index; int key; count=readData(num,score); printf("请输入要查找的学生学号:"); scanf("%d",&key); index=search(num,count,key); if(index<0) printf("不存在学号为%d的同学\n",key); else printf("学号为%d的同学的成绩是:%d\n",key,score[index]); return 0; } int readData(int a[],int b[]) { FILE *p; int i=0; p=fopen("score1.txt","r"); if(p==NULL) { printf("File cannot open!\n"); exit(0); } while(fscanf(p,"%d%d",&a[i],&b[i])!=EOF) i++; fclose(p); return i; } int search(int a[],int n,int key) { int i,index=-1; for(i=0;i<n;i++) { if(a[i]==key) { index=i; break; } } return index; }运行结果:
#include<stdio.h> #include<stdlib.h> int readData(int a[],int b[]); void sort(int a[],int b[],int n); int search(int a[],int n,int key); int main() { int num[200], score[200]; int count; int index; int key; int start=1; count = readData(num, score); sort(num,score,count); while(start) { printf("请输入要查找的学生学号:"); scanf("%d",&key); index = search(num,count,key); if(index<0) printf("不存在学号为%d的同学\n\n",key); else printf("学号为%d的同学的成绩是:%d\n\n", key, score[index]); printf("输入 1 继续,0 结束:"); scanf("%d",&start); } return 0; } int readData(int a[],int b[]) { int i=0; FILE *fp; fp=fopen("score1.txt","r"); if(fp==NULL) { printf("open file error!\n"); exit(0); } while(fscanf(fp,"%d%d",&a[i],&b[i])!=EOF) i++; fclose(fp); return i; } void sort(int a[],int b[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(a[k]>a[j]) k=j; t=a[k]; a[k]=a[i]; a[i]=t; t=b[k]; b[k]=b[i]; b[i]=t; } } int search(int a[],int n,int key) { int max,min,mid; int index=-1; min=0; max=n-1; do { mid=(max+min)/2; if(a[mid]==key) { index=mid; break; } else if(a[mid]>key) max=mid-1; else if(a[mid]<key) min=mid+1; } while(min<=max); return index; }运行结果: