杭电2010年计算机复试真题

注意:此复试题目是根据CSDN博客逃离地球的小小呆上发布的回忆版整理复原。为了恢复试题的原貌,我根据试题要求进行合理的脑补,按照oj系统的风格补全了试题的Problem Description、Input、Output、Sample Input、Sample Out等内容,并加入了详解、具体的代码实现。因为是复原版,不能保证当时的题目就是这么呈现的,也不能说明考场上的试题就是oj风格叙述的,仅供大家参考。有什么错误、不合理的地方欢迎指出。

原创不易,还请大家多支持

第一题

Problem Description

随机产生一个3位的正整数,让你进行猜数字

Input

输入一个你认为正确的数

Output

如果猜小了,输出:“猜小了,请继续”。如果猜大了,输出:“猜大了,请继续”。如果猜对了。输出:“恭喜你,猜对了”。不过最多只能猜10次,如果猜了10次还没有猜对,就退出程序,输出:“Bye Bye”。

Sample Input

500

Sample Output

猜小了,请继续

这道题相当简单,应该属于大一入学c语言的期末考试题那种水平。简单判断下随机数与输入的大小关系,根据题意输出结果即可。但有一点需要注意,题目要求随机数应是一个三位数,而C/C++语言中的rand()的范围是[0-RAND_MAX],所以要对rand()的返回值做一些处理rand() % 900 + 100使之满足题意。同时,由于rand()产生的是伪随机数,他需要一个随机种子才可以产生随机数,若随机种子没有变化,产生的随机数也不会有变化,所以使用它之前,要调用srand() 函数初始化一下。一般大家都喜欢用,系统当前时间来初始化它srand(time(NULL))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
srand(time(NULL));//根据时间来确定随机种子
int a = rand() % 900 + 100;//确保生成的随机数是一个三位数
printf("%d", a);
for (int i = 0; i < 10; i++)
{
int x;
scanf("%d", &x);
if (x > a)//若输入比a大
printf("猜大了,请继续\n");
else if (x < a)//若输入比a小
printf("猜小了,请继续\n");
else//若输入等于a
{
printf("恭喜你,猜对了\n");
return 1;
}
}
printf("Bye Bye\n");
return 0;
}

第二题

Problem Description

字符串求和

Input

任意一个字符串,测试实例有多组,每组占一行

Output

把字符串中的数字作为整数进行求和,并输出结果,每组输出结果占一行

Sample Input

There are some apple.
124and 1524

Sample Output

0
1648

这道题主要是考察对C/C++语言内置基本函数的使用,首先要注意到因为输入的字符串中含有空格,所以应使用gets()函数进行输入。当程序运行至gets()语句后,它将依次读入遗留在输入缓冲中的数据直到出现换行符,并将除换行符外的所有已读字符保存在字符数组中,同时从输入缓冲中去除该换行符。而scanf ("%s",str)函数读取输入缓冲的字符直到出现空格、换行字符,它将读到的字符保存至字符数组str中,但并不删除缓冲中紧接的空格与换行。假设输入数据格式为:第一行为两个整数,第二行为一个字符串,如:
2 3(换行)

Test(换行)
为了读入输入数据,我们使用语句

1
2
scanf ("%d%d",&a,&b);
gets(str);

我们来分析其运行过程,当程序运行至scanf时,程序读入输入缓冲中的数据2 3,并将数字2、3分别保存至变量a、b中,此时输入缓冲中遗留的数据为第一行一个换行符,第二行一个字符串,即
(换行)

Test(换行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main() {
char str[100], num[100];
while (gets(str))
{
int len = strlen(str);
int cnt = 0;//数字字符串的索引
int sum = 0;//字符串中所有数字的和
for (int i = 0; i < len; i++)
{
if (str[i] >= '0' && str[i] <= '9')//如果该字符是数字
num[cnt++] = str[i];
else//若不是数字,则计算数字字符串中的值
if (cnt)
{
num[cnt] = 0;//字符串结束标志
sum += atoi(num);//将数字字符串转为整形数字,并累加到sum
cnt = 0;//重置数字字符串索引
}
}
if (cnt)//如果字符串的末尾还有数字,则加上
sum += atoi(num);
printf("%d\n", sum);
}
return 0;
}

在此程序中,为使字符串中的数字转换为整形数字,我们使用了atoi(),因此只需将输入字符串中的数字保存在字符串num中调用atoi(num)即可

第三题

Problem Description

给学生按照总成绩排序

Input

数据从文件读入,文件中有多组测试数据,每组数据中有一个数字n表示该组数据共有多少名学生,接下来n行表示n位学生的信息,从左到右依次是:姓名 学号 英语 语文 数学 科学,中间用空格隔开

Output

按照总成绩从高到低进行排序并输出学生姓名,每个名字用一个空格隔开,每组输出结果占一行

Sample Input

此为文件内容:

3
张三 20100601 78 89 62 75
李四 20100602 78 54 98 86
王五 20100603 78 69 85 75
5
张三 20100601 78 89 62 75
李四 20100602 78 54 98 86
王五 20100603 78 69 85 100
赵六 20100604 78 60 98 86
田七 20100605 78 69 85 75

Sample Output

李四 王五 张三
王五 赵六 李四 田七 张三

这是一道排序的问题,使学生按照总成绩的降序排列,我们可以使用sort 库函数来实现。我们在头文件方面包含了algorithm 头文件,并使用 using namespace std 语句声明了我们将会使用标准命名空间(sort 被定义在其中)。但是,学生结构是我们自定义的数据结构计算机并不知道如何对该结构进行排序,我们要做的即是向计算机说明该排序依据。我们可以直接定义该结构体的小于运算符来说明排序规则。sort 函数的两个参数代表待排序内存的起始地址和结束地址(sort 函数还有另外的重载形式,可自行上网查阅或参考《王道论坛计算机考研机试指南》第二章第一节排序相关内容),在此例中起始地址为 stu,结束地址为 stu+ n。该函数调用完成后,stu数组中的数字就已经通过快速排序升序排列。我们只需对其输出即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <algorithm>

using namespace std;
struct Student//学生结构
{
char name[20];
char ID[20];
int english;
int chinese;
int math;
int science;
int score;
void sum()
{
score = english + chinese + math + science;
}
bool operator < (const Student& b) const { //利用C++算符重载直接定义小于运算符
return score >= b.score;//从高到低排序,若当前分数高则返回true
}
}stu[100];
int main() {
FILE* fp = NULL;
char buff[255];
int n;

fp = fopen("test.txt", "r");//打开文件,打开方式为只读
while (fscanf(fp, "%d", &n) != EOF)//若文件中还有数据
{
for (int i = 0; i < n; i++)//读文件给学生赋值
{
fscanf(fp, "%s", &stu[i].name);
fscanf(fp, "%s", &stu[i].ID);
fscanf(fp, "%d", &stu[i].english);
fscanf(fp, "%d", &stu[i].chinese);
fscanf(fp, "%d", &stu[i].math);
fscanf(fp, "%d", &stu[i].science);
stu[i].sum();//求学生总成绩
}
sort(stu, stu + n);//使用sort给学生排序
for (int j = 0; j < n; j++)//遍历输出
printf("%s ", stu[j].name);
printf("\n");
}
}

同样需要注意的是C/C++的文件操作,这里使用的是包含在stdio.h头文件中的文件操作方法,fscanf方法与从键盘上输入scanf基本一致,都是直到遇到第一个空格或第一个回车结束。

文章作者: Teily
文章链接: https://teily.cn/article/HDU2010.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TeilyMa's Blog