C语言 · 成绩查询系统

抱歉,昨天忘了往博客上更新,今天补上。

成绩查询系统

分值: 21

数学老师小y 想写一个成绩查询系统,包含如下指令:

  1. insert [name] [score],向系统中插入一条信息,表示名字为name的学生的数学成绩为score。
  2. find [name],表示查找名字为name的学生的数学成绩。

注意有些同学可能会为了刷分多次选课,查询的时候给出最大成绩即可。学生的名字是由小写字母组成。成绩是一个 0…100 的整数。

老师找到你,想你帮他完成这个系统。

输入格式

输入若干行,每行都是insert [name] [score]或者find [name]的形式,或一行end表示输入结束。输入行数不大于 1000,每个学生名字长度不大于 20 个字符。

输出格式

对于每个查询,输出查询的学生的最高成绩,如果系统中不存在该学生,输出 −1。

样例输入

insert zhangsan 90

insert lisi 78

insert xiaoming 86

find xiaoming

find jack

end

样例输出

86

-1

 

作者注释:本人能力有限,用纯C写的有bug,整std写了一个,仅供参考。

对了,代码功能添加了一个查询所有记录的功能,删掉即符合题意了。

 1 #include<stdio.h>
 2 #include<vector>
 3 #include<string>
 4 #include<iostream>
 5 #include<math.h>
 6 using namespace std;
 7 struct info{
 8     string name;
 9     int score;
10 }stu;
11 /*
12 定义find函数:
13     功能:在容器中按姓名查找是否有相同姓名的记录; 
14     参数:结构体类型的容器,字符串类型的姓名; 
15     返回值类型:指向某条数据的指针。 
16 */
17 vector<info>::iterator find(vector<info>&stu,string name){
18     vector<info>::iterator it;//声明迭代器 
19     for(it=stu.begin();it!=stu.end();it++){
20         if(it->name==name)
21             break;
22     }
23     return it;//返回的是指向某条数据的指针 
24 }
25 int main(){
26     string sign,name;
27     int score;
28     vector<info> inf;//声明结构体类型的容器,用来存放数据 
29     cin>>sign;//录入操作符 
30     vector<info>::iterator it;//声明迭代器 
31     while(sign!="end"){
32         if(sign=="insert"){
33             cin>>stu.name>>stu.score;//录入 
34             it = find(inf,stu.name);//调用函数 
35             if(it==inf.end()){
36                 inf.push_back(stu);
37             }else if(it->score<stu.score){//若刚刚输入的成绩大于已存的成绩 
38                 inf.insert(it,stu);//存放分数高的记录 
39             }else{//没有找到,新存一条记录 
40                 inf.insert(it+1,stu);
41             }
42         }
43         else if(sign=="find"){
44             cin>>stu.name;//录入
45             it=find(inf,stu.name);//调用函数
46             cout<<it->score<<endl;
47         }
48         else if(sign=="all"){
49             for(it=inf.begin();it!=inf.end();it++){
50                 cout<<it->name<<" "<<it->score<<endl;
51             }
52         } 
53         cin>>sign;//执行完一遍操作,进入下一遍 
54     }
55     return 0;
56 }

 

此题学到一个处理出入输出的技巧:用while来做判断。

如题中while(sign!="end"){······}。

 

补:今天有人提到此题,用map写:

 1 #include<map>
 2 #include<math.h>
 3 #include<iostream>
 4 using namespace std;
 5 int main(){
 6     map<string,int> m;
 7     string sign,name;
 8     int score;
 9     while(1){
10         cin>>sign;
11         if(sign=="end"){
12             break;
13         }
14         else if(sign=="insert"){
15             cin>>name>>score;
16             if(score>m[name]){
17                 m[name] = score;
18             }
19         }
20         else if(sign=="find"){
21             cin>>name;
22             if(m[name]==0){
23                 cout<<"-1"<<endl;
24             }else{
25                 cout<<m[name]<<endl;
26             }
27         }
28     }
29     return 0;
30 }

 

posted @ 2017-04-03 14:50  人间烟火地三鲜  阅读(1639)  评论(1编辑  收藏  举报