任务和代码:在实际工程中,为了让频繁执行的查询更快一些,常要求对数据进行排序,再进行查询。请改造程序:①在调用readData(num, score);读入数据后,立即调用自定义函数sort对两个数组进行排序(注意在排序需要交换时,应该同时交换两个数组中对应的值,以保证同一下标,对应的是同一个学生的学号和成绩);②这样,search函数可以实现为二分查找了;③改造main函数,支持多次的查找。
/*
文件名:main.c
作者:小风景
完成日期:2016.7.7
问题描述:在实际工程中,为了让频繁执行的查询更快一些,常要求对数据进行排序,再进行查询。请改造程序:①在调用readData(num, score);读入数据后,立即调用自定义函数sort对两个数组进行排序(注意在排序需要交换时,应该同时交换两个数组中对应的值,以保证同一下标,对应的是同一个学生的学号和成绩);②这样,search函数可以实现为二分查找了;③改造main函数,支持多次的查找。
程序输出:
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int readData(int num[],int score[]);
int search(int num[],int n,int m);
void sort(int num[],int score[],int n);
void translate(int a[],int i,int j);
int main()
{
int num[200], score[200]; //分别保存学号和成绩
int count; //代表学生人数
int index; //代表查找到的学生的下标
int key;
char inter;
count = readData(num, score); //将成绩数据从文件中读到数组中
do
{
printf("请输入要查找的学生学号:");
scanf("%d",&key);
fflush(stdin);
index = search(num, count, key); //在count个学生中查找学号为key的学生对应的下标
if(index<0) //输入的学号不存在时,index的值要求返回-1
printf("不存在学号为%d的同学\n",key);
else
printf("学号为%d的同学的成绩是:%d\n", key, score[index]);
printf("是否继续查找,退出请按N:");
scanf("%c",&inter);
}
while((inter != 'N') && (inter != 'n'));
return 0;
}
int readData(int num[],int score[])
{
FILE *fp = NULL;
int output = 0;
int inputnum = 1;
int i = 0;
int j = 0;
if((fp = fopen("score1.txt","r")) == NULL)
{
printf("file score1.txt open error!");
exit(1);
}
while(fscanf(fp,"%d",&output) != EOF)
{
if(inputnum % 2 !=0)
{
num[i] = output;
i++;
}
else
{
score[j] = output;
j++;
}
inputnum++;
}
if(i != j)
{
printf("read data error!");
exit(1);
}
sort(num,score,i);
fclose(fp);
return i;
}
int search(int num[],int n,int m)
{
int index = -1;
int low = 0;
int high = n - 1;
int mid = 0;
while(low <= high)
{
mid = (low + high) / 2;
if(num[mid] == m)
{
index = mid;
break;
}
else if(num[mid] > m)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return index;
}
void sort(int num[],int score[],int n)
{
int i,j,k;
for(i = 0;i < n -1;i++)
{
k = i;
for(j = i + 1;j < n;j++)
{
if(num[j] < num[k])
{
k = j;
}
}
translate(num,i,k);
translate(score,i,k);
}
}
void translate(int a[],int i,int j)
{
int temp = 0;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
程序运行结果:
总结:程序中需要注意对两个数组进行排序。