计算机科学-第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
- 计算机科学-第3周 排序和查找 题目及参考解答
- 计算机科学-第4周 结构 题目及参考解答
- 计算机科学-第6周 文件 题目及参考解答
- 计算机科学-第13周 函数 题目及参考解答
- 计算机科学-第14周模块化程序设计 题目及参考解答
- 计算机科学-第15周 递归函数 题目及参考解答
- 计算机科学-第8周 字符串和动态数组 题目及参考解答
- 计算机科学-第7周 指针及应用 题目及参考解答
- 计算机科学-第9周 数组、结构体、指针综合练习 题目及参考解答
- 计算机科学-第2周 数组初练-参考解答
- 法133计算机科学课第9、10周实践题目及参考解答
- 法133计算机科学课第11周实践题目及参考解答
- 法133计算机科学课第12周实践题目及参考解答
- 2013-C++第13周班级对抗赛题目及参考解答
- 法133计算机科学课第13周实践题目及参考解答
- 法133计算机科学课第15周实践题目及参考解答
- 查找和排序题目
- 2014秋C++第17周 OJ题目及参考
- Android 信息中URL地址识别问题
- php 文件上传
- 常见的十种排序算法总结
- 字符与GBXX,UCS-2,utf-8编码的相互转换
- 中国知网论文查重算法和修改攻略
- 计算机科学-第3周 排序和查找 题目及参考解答
- 让一个图片随页面垂直滚动条滚动位置不变
- ASP.NET页面中获取服务器控件的客户端ID
- mysql workbench建表时PK,NN,UQ,BIN,UN,ZF,AI
- LDA与PCA算法与应用
- 字符串匹配算法——BM算法
- /bin/sh^M: 坏的解释器: 没有那个文件或目录
- Sicily10330
- GStreamer基础教程05——集成GUI工具