计算机科学-第3周 排序和查找 题目及参考解答

来源:互联网 发布:哪个挂号软件好用抢号 编辑:程序博客网 时间:2024/04/30 13:46

《计算机科学》课程主页在:http://blog.csdn.net/sxhelijian/article/details/13705597


本周练习需要的数据文件下载自:链接

练习一
  salary.txt中是某企业(不超过500)职工的工资,请编程读入数据,给每名职工的工资增加20%后降序排序,并输出排序后的结果。运行程序时,请将salary.txt复制到源文件同一文件夹下。Salary.txt在提供的材料中。
  下面是完成应用的部分代码,可以增加定义需要的变量,但不建议改动已有的代码:

#include <stdio.h>int main(){    float a[500];    int i,count=0;    freopen("salary.txt","r",stdin);  //输入重定向,数据将从文件中读入    //读入数据    while(scanf("%f",&a[count])!=EOF)        count++;    //共有count名职工的数据读入了数组,工资先涨20%    for(i=0; i<count; i++)        ________________;    //请你在下面写出为增加后的工资降序排序的程序    ……   //输出排序后结果   for(i=0; i<count; i++)        printf("%.2f\t",a[i]); //输出    return 0;}
参考解答:

#include <stdio.h>int main(){    float a[500],t;    int i,j,count=0;    freopen("salary.txt","r",stdin);  //输入重定向,数据将从文件中读入    //读入数据    while(scanf("%f",&a[count])!=EOF)        count++;    //共有count名职工的数据读入了数组,先涨工资    for(i=0; i<count; i++)        a[i]*=1.2;    //为增加后的工资排序    for(i=count-1; i>0; i--)    {        for(j=0; j<i; j++)        {            if(a[j]<a[j+1])  //降序排序            {                t=a[j+1];                a[j+1]=a[j];                a[j]=t;            }        }    }   //输出排序后结果   for(i=0; i<count; i++)        printf("%.2f\t",a[i]); //输出    return 0;}



练习二
  score1.txt提供了法133两个班某次测验的成绩(学号取后两位,成绩为随机生成,都过了,莫为低分忧伤),请输入学号,查找出该同学的成绩。
  说明:
  (1)定义两个int型数组,其中一个n存放学号,另一个s存放成绩,可以保证两个数组中,元素下标相同,对应的是同一位同学。例如n[18]值为3123,s[18]为98,说明学号为3123的同学成绩为98。
  (2)因为数据无序,运用顺序查找算法,在n数组同依据学号进行查找,在s数组中对应下标的值则为其成绩。例如,通过在n中的查找,得出学号为3123的同学的下标为18,则其成绩为s[18]。
  (3)后面学习了字符串后,根据学号查成绩可以做得更趋近于实用。
  下面是完成应用的部分代码,已经能够输出成绩清单。请在此基础上补充:
#include <stdio.h>int main(){    int n[110],s[110];  //分别保存学号和成绩    int i,k,count=0;    freopen("score1.txt","r",stdin);  //输入重定向,数据将从文件中读入    //读入数据    while(scanf("%d%d",&n[count],&s[count])!=EOF)        count++;    freopen("CON","r",stdin);  //将输入重新新向为键盘    //共有count名学生的数据读入了数组,下面显示数据    printf("学号\t成绩\n");    for(i=0; i<count; i++)        printf("%d\t%d\n",n[i],s[i]);    //(请在下面补充代码)输入待查找的学生的学号        //(在下面补充代码)在n数组中顺序查找该同学,找到即输出结果,找不到也显示         return 0;}  
参考解答:

#include <stdio.h>int main(){    int n[110],s[110];  //分别保存学号和成绩    int i,k,count=0;    freopen("score1.txt","r",stdin);  //输入重定向,数据将从文件中读入    //读入数据    while(scanf("%d%d",&n[count],&s[count])!=EOF)        count++;    freopen("CON","r",stdin);  //将输入重新新向为键盘    //共有count名学生的数据读入了数组,下面显示数据    printf("学号\t成绩\n");    for(i=0; i<count; i++)        printf("%d\t%d\n",n[i],s[i]);    //输入学生的学号    printf("请输入要查找的学生学号:");    scanf("%d",&k);    //在n数组中顺序查找,找到即输出结果    for(i=0; i<count; i++)    {        if(n[i]==k)        {            printf("学号为%d的同学的成绩为%d分\n",k,s[i]);            break;        }    }    if(i>=count)    {        printf("不存在学号为%d的同学\n",k);    }    return 0;}

程序的运行结果为:
    


练习三
  请运行课堂上讲过的二分查找的程序,掌握二分查找的方法。
  Score2.txt提供了法133两个班某次测验的成绩,已经按学号排序。请输入学号,查找出该同学的成绩。
  本题与练习二相比,应该采用更富有效率的二分查找完成。
  可以在练习二的参考代码基础上完成任务。

参考解答:

#include <stdio.h>int main(){    int n[110],s[110];  //分别保存学号和成绩    int i,k,count=0;    int low,high,mid;    freopen("score2.txt","r",stdin);  //输入重定向,数据将从文件中读入    //读入数据    while(scanf("%d%d",&n[count],&s[count])!=EOF)        count++;    freopen("CON","r",stdin);  //将输入重新新向为键盘    //共有count名学生的数据读入了数组,下面显示数据    printf("学号\t成绩\n");    for(i=0; i<count; i++)        printf("%d\t%d\n",n[i],s[i]);    //输入学生的学号    printf("请输入要查找的学生学号:");    scanf("%d",&k);    //在n数组中二分查找,找到即输出结果    low=0;    high=count-1;    while(low<=high)    {        mid=(low+high)/2;        if(k==n[mid])            break;        else if(k>n[mid])            low = mid + 1;        else            high = mid - 1;    }    if (low<=high)        printf("学号为%d的同学的成绩为%d分\n",k,s[mid]);    else        printf("不存在学号为%d的同学\n",k);    return 0;}



0 0
原创粉丝点击