C语言提高-27讲: 编写查找和排序函数(查成绩)

来源:互联网 发布:暖通设计软件 编辑:程序博客网 时间:2024/05/03 00:10

任务和代码:

/*  *All rights reserved  *文件名称:main.c  *作者: Osseyda  完成日期:2017.10.24  *版本号:v2.  *问题描述:score1.txt提供了某大学两个班某次测验的数据,包括每位同学的学号及成绩。请编程序,输入学号,查找出该同学的成绩。*设计要求:①在调用readData(num, score);读入数据后,立即调用自定义函数sort对两个数组进行排序(注意在排序需要交换时,应该同时交换两个数组中对应的值,以保证同一下标,对应的是同一个学生的学号和成绩);②这样,search函数可以实现为二分查找了;③改造main函数,支持多次的查找。*/ #include <stdio.h>#include <stdlib.h>int readData(int*,int*);int binary_search(int*,int,int);void sort(int*,int*,int);void saveData(int*,int*,int);int main(){    int num[200], score[200];            //分别保存学号和成绩    int count;                           //代表学生人数    int index;                           //代表查找到的学生的下标    int key;    count = readData(num, score);        //将成绩数据从文件中读到数组中    sort(num,score,count);               //由学号顺序排序,学号对应的成绩跟着排序    saveData(num,score,count);           //将排序后的数组元素保存到文件中    printf("请输入要查找的学生学号:");    while(scanf("%d",&key)!=EOF){        index=binary_search(num,count,key); //对排序后的数组二分查找学号为key的学生对应的下标        if(index<0)                         //输入的学号不存在时,index的值要求返回-1            printf("不存在学号为%d的同学\n",key);        else            printf("学号为%d的同学的成绩是:%d\n", key, score[index]);        printf("\n请输入要查找的学生学号:");    }    return 0;}//将成绩数据从文件中读到数组中int readData(int *p1,int *p2){    int i=0,j=0;    FILE *fp;    if((fp=fopen("score1.txt","r"))==NULL){        printf("data cannot be opened");        exit(0);    }    while(fscanf(fp,"%d %d",&*(p1+i),&*(p2+j))!=EOF){        i++;        j++;    }    fclose(fp);    return i;}//查找学号为key的学生对应的下标int binary_search(int *p,int n,int k){    int i=-1;    int low=0,high=n-1,middle;    while(low<=high){        middle=(low+high)/2;        if(*(p+middle)==k){            i=middle;            break;        }        else if(*(p+middle)>k)            high=middle-1;        else            low=middle+1;    }    return i;}//依据学号大小重新排序,学号的下标改变,原下标对应的成绩的下标也跟着变化void sort(int *p1,int *p2,int n){    int i,j,t,k;    for(i=0;i<n-1;i++){        for(j=0;j<n-i-1;j++){            if(*(p1+j)>*(p1+j+1)){                t=*(p1+j);               //交换学号数组单元所存的元素                *(p1+j)=*(p1+j+1);                *(p1+j+1)=t;                k=*(p2+j);               //同时交换(和学号数组相同的)成绩数组单元所存的元素                *(p2+j)=*(p2+j+1);                *(p2+j+1)=k;            }        }    }}//将排序后的数组元素保存到文件中void saveData(int *p1,int *p2,int c){    int i;    FILE *fp;    if((fp=fopen("score2.txt","w"))==NULL){        printf("score2 cannot be opened");        exit(0);    }    for(i=0;i<c;i++)        fprintf(fp,"%d\t%d\n",*(p1+i),*(p2+i));    fclose(fp);}
score1.txt
运行结果:



知识点总结:

        将数据从文件读入数组元素;将数组元素保存到文件;调用冒泡法排序函数和二分法查找函数;

        根据要求修改冒泡法排序函数;多次读入数据的表达

心得:

         除了编写速度,其他还好!



阅读全文
0 0