c语言实战项目2---用二分法在文件中查取数据

用到的文件<数据>,点击下载

目标:存在一个文件,里面存有以 “学号 成绩”形式保存的数据。设计一个程序,先对数据排序,然后用二分法查找某个学号所对应的成绩。

#include <stdio.h>
#include <stdlib.h>
int readData(int num[],int score[]);//读入文本文件数据到数组中
int search(int num[],int count1,int key);//用二分法搜索数据
void order(int num[],int score[],int count1);//给两个有联系的数组进行排序
int main()
{int num[200], score[200];  //分别保存学号和成绩int count1;  //代表学生人数int index;  //代表查找到的学生的下标int key;count1 = readData(num, score); //将成绩数据从文件中读到数组中if(count1 == -1){printf("没有打开文件!\n");exit(-1);}order(num,score,count1);printf("请输入要查找的学生学号:");scanf("%d",&key);index = search(num, count1, key);  //在count个学生中查找学号为key的学生对应的下标if(index<0)    //输入的学号不存在时,index的值要求返回-1printf("不存在学号为%d的同学\n",key);elseprintf("学号为%d的同学的成绩是:%d\n", key, score[index]);return 0;
}
int  readData(int num[],int score[])
{FILE *fpr;char str[50];int i = 0;fpr = fopen("I:\\cstudy\\function use\\order\\score1.txt","r");//读入文件if(fpr == NULL)//文件没有打开{printf("can't open!\n");return -1;}while(fgets(str,50,fpr)!=NULL)//将每一行的数据读入数组{sscanf(str,"%d",&num[i]);//读入学号,sscanf会以空格为结束符sscanf(str,"%*d %d",&score[i++]);//跳过学号,读入成绩}fclose(fpr);return i;
}
int search(int num[],int count1,int key)
{int left = 0,right = count1;//left、right分别表示二分法的左边界、右边界int i = (left + right)/2;if(key<num[0] || key>num[count1 -1]){return -1;}while(num[i] != key){if(key<num[i]){right = i;//替换右边界i =(left + right)/2;}else{left = i;//替换左边界i =(left + right)/2;}}return i;
}void order(int num[],int score[],int count1)
{int i,j;for(i = 0;i<count1-1;i++)//选择排序法{for(j = i+1;j<count1;j++){if(num[i] > num[j]){num[i] ^=num[j];//用异或运算交换变量数据num[j] ^=num[i];//交换学号的同时交换成绩num[i] ^=num[j];score[i] ^=score[j];score[j] ^=score[i];score[i] ^=score[j];}}}
}

使用软件:codeblocks

运行结果: