注意:此复试题目是根据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) printf ("猜大了,请继续\n" ); else if (x < a) printf ("猜小了,请继续\n" ); else { 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); 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 { return score >= b.score; } }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); for (int j = 0 ; j < n; j++) printf ("%s " , stu[j].name); printf ("\n" ); } }
同样需要注意的是C/C++的文件操作,这里使用的是包含在stdio.h头文件中的文件操作方法,fscanf方法与从键盘上输入scanf基本一致,都是直到遇到第一个空格或第一个回车结束。