开发者社区> 贺利坚> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《C语言及程序设计》实践参考——查成绩

简介: 返回:贺老师课程教学链接  项目要求 【项目4 - 查成绩】(1)score1.txt提供了某大学两个班某次测验的数据,包括每位同学的学号及成绩。请编程序,输入学号,查找出该同学的成绩。提示1:可以定义两个int型数组,其中一个n存放学号,另一个s存放成绩,可以保证两个数组中,元素下标相同,对应的是同一位同学。例如n[18]值为3123,s[18]为98,说明学号为3123的同学成绩为98
+关注继续查看

返回:贺老师课程教学链接  项目要求


【项目4 - 查成绩】
(1)score1.txt提供了某大学两个班某次测验的数据,包括每位同学的学号及成绩。
请编程序,输入学号,查找出该同学的成绩。
提示1:可以定义两个int型数组,其中一个n存放学号,另一个s存放成绩,可以保证两个数组中,元素下标相同,对应的是同一位同学。例如n[18]值为3123,s[18]为98,说明学号为3123的同学成绩为98。
提示2:因为数据无序,运用顺序查找算法,在n数组中依据学号进行查找,在s数组中对应下标的值则为其成绩。例如,通过在n中的查找,得出学号为3123的同学的下标为18,则其成绩为s[18]。
下面是完成应用的部分代码,已经能够输出成绩清单。请在此基础上实现有关的函数:

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);  //在count个学生中查找学号为key的学生对应的下标
    if(index<0)    //输入的学号不存在时,index的值要求返回-1
        printf("不存在学号为%d的同学\n",key);
    else
        printf("学号为%d的同学的成绩是:%d\n", key, score[index]);
    return 0;
}
[参考解答]
#include <stdio.h>
#include <stdlib.h>
int readData(int[], int []);
int search(int[], int, int);
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);  //在count个学生中查找学号为key的学生对应的下标
    if(index>=count)
        printf("不存在学号为%d的同学\n",key);
    else
        printf("学号为%d的同学的成绩是:%d\n", key, score[index]);
    return 0;
}

int readData(int n[], int s[])
{
    int c=0;
    FILE *fp;
    fp = fopen("score1.txt","r");
    if (fp==NULL)
    {
        printf("open file error!\n");
        exit(0);
    }
    //读入数据
    while(fscanf(fp,"%d%d",&n[c],&s[c])!=EOF)
        c++;
    fclose(fp);
    return c;
}

int search(int n[], int c, int k)
{
    int i;
    for(i=0; i<c; i++)
    {
        if(n[i]==k)
            break;
    }
    if(i==c) i=-1;
    return i;
}



(2)在实际工程中,为了让频繁执行的查询更快一些,常要求对数据进行排序,再进行查询。请改造程序:①在调用readData(num, score);读入数据后,立即调用自定义函数sort对两个数组进行排序(注意在排序需要交换时,应该同时交换两个数组中对应的值,以保证同一下标,对应的是同一个学生的学号和成绩);②这样,search函数可以实现为二分查找了;③改造main函数,支持多次的查找。

[参考解答]

#include <stdio.h>
#include <stdlib.h>
int readData(int[], int []);
void sort(int[], int[], int);
int search(int[], int, int);
int main()
{
    int num[200], score[200];  //分别保存学号和成绩
    int count;  //代表学生人数
    int index;  //代表查找到的学生的下标
    int key;
    int yn=1;
    count = readData(num, score);   //将成绩数据从文件中读到数组中
    sort(num, score, count);   //将保存学号和成绩的两个数组按学号排序
    while(yn)   //从文件中读出数据,就是要多次使用的,排序花的代价,也值了
    {
        printf("请输入要查找的学生学号:");
        scanf("%d",&key);
        index = search(num, count, key);  //在count个学生中查找学号为key的学生对应的下标
        if(index < 0)
            printf("不存在学号为%d的同学\n",key);
        else
            printf("学号为%d的同学的成绩是:%d\n", key, score[index]);
        printf("输入1继续,输入0结束...");
        scanf("%d", &yn);
    }

    return 0;
}

int readData(int n[], int s[])
{
    int c=0;
    FILE *fp;
    fp = fopen("score1.txt","r");
    if (fp==NULL)
    {
        printf("open file error!\n");
        exit(0);
    }
    //读入数据
    while(fscanf(fp,"%d%d",&n[c],&s[c])!=EOF)
        c++;
    fclose(fp);
    return c;
}

void sort(int n[], int s[], int c)
{
    int i,j,t;
    for(j=0; j<c-1; j++)
        for(i=0; i<c-j-1; i++)
            if (n[i]>n[i+1])   //根据学号升序排序
            {
                t=n[i]; //交换学号
                n[i]=n[i+1];
                n[i+1]=t;
                t=s[i]; //同步交换成绩
                s[i]=s[i+1];
                s[i+1]=t;
            }
    return;
}

int search(int n[], int c, int k)
{
    int low,high,mid;
    int i;
    low=0;
    high=c-1;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(k==n[mid])
        {
            i=mid;
            break;
        }
        else if(k>n[mid])
            low = mid + 1;
        else
            high = mid - 1;
    }
    if (low>high)
        i=-1;
    return i;
}



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C语言经典实例:1-10例:三角求和、显示所占字节数、自增自减运算while语句输出最小值、计算快递费用、学生成绩统计
C语言经典实例:1-10例:三角求和、显示所占字节数、自增自减运算while语句输出最小值、计算快递费用、学生成绩统计
0 0
程序员之路:C语言学生成绩处理小项目
程序员之路:C语言学生成绩处理小项目
0 0
浙大版《C语言程序设计(第3版)》题目集 - 习题9-6 按等级统计学生成绩(20 分)
浙大版《C语言程序设计(第3版)》题目集 - 习题9-6 按等级统计学生成绩(20 分)
0 0
C语言基础习题——统计学生成绩
C语言基础习题——统计学生成绩
0 0
程序员之路:C语言学生成绩处理小项目
程序员之路:C语言学生成绩处理小项目
0 0
C语言OJ项目参考(2969)学生成绩的处理
2969:学生成绩的处理 Description   编写一个函数void calcscore(int n),在函数中输入n个人的成绩,计算最高分,最低分,总分和平均分,要求在主函数中调用函数calcscore计算各种成绩,并在主函数中输出各种计算结果。(使用全局变量在函数之间传递多个数据) #include <stdio.h> double HighS
1070 0
《C语言及程序设计》实践参考——学生成绩统计
返回:贺老师课程教学链接 【项目1-学生成绩统计】 每位同学的信息学号、姓名、C、高数、英语成绩。定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[13])、姓名(name)、三门课的成绩(grade)、总分(score)、均分(average))。 (1)从键盘上输入N名学生的信息(N定义为常变量); (2)求出每名同学的总分和均分,并存储在结
1362 0
+关注
贺利坚
烟台大学计算机学院教师,建设系列学习资源,改革教学方法,为IT菜鸟建跑道,让大一的孩子会编程,为迷茫的大学生出主意,一起追求快乐的大学。 著书《逆袭大学:传给IT学子的正能量》,帮助处于迷茫中的大学
文章
问答
文章排行榜
最热
最新
相关电子书
更多
JAVA开发手册1.5.0
立即下载
Go语言路上踩过的坑
立即下载
低代码开发师(初级)实战教程
立即下载