文档库

最新最全的文档下载
当前位置:文档库 > c语言样题

c语言样题

清华大学试卷(本科生专用)

c语言样题

系别班号200 级班学号姓名成绩

考试课程日期200 年月日阅卷老师

c语言样题

说明:请务必在每个源程序的最开头写上你的姓名、学号和班级。

一、(20分)编写一个程序,输入三个正整数min,max和factor,然后对于从min到max之间的每一个整数(包括min和max),如果它能够被factor整除的话,就把它打印出来。【5分钟】

输入格式:输入只有一行,即三个正整数min、max和factor。

输出格式:输出有N行,每一行表示符合条件的一个整数,按照递增顺序排列。

样例:

c语言样题

二、(20分)编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N 也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。【20分钟】

输入格式:第一行是一个整数N,N ≤ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。

输出格式:输出只有一行,即出现次数最多的那个元素值。

样例:

c语言样题

三、(20分)编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数。例如:对于句子“one little two little three little boys”,总共有5个不同的单词:one, little, two, three, boys。【20分钟】说明:(1)由于句子当中包含有空格,所以应该用gets函数来输入这个句子;(2)输入的句子当中只包含英文字符和空格,单词之间用一个空格隔开;(3)不用考虑单词的大小写,假设输入的都是小写字符;(4)句子长度不超过100个字符。

输入格式:输入只有一行,即一个英文句子。

输出格式:输出只有一行,是一个整数,表示句子中不同单词的个数。

样例:

c语言样题

四、(10分)一个数如果从左往右读和从右往左读数字是完全相同的,则称这个数为回文数,比如898,1221,15651都是回文数。编写一个程序,输入两个整数min和max,然后对于从min到max之间的每一个整数(包括min和max),如果它既是一个回文数又是一个质数,那么就把它打印出来。【15分钟】

输入格式:输入只有一行,即两个正整数min和max。

输出格式:输出有N行,每一行表示符合条件的一个整数,按照递增顺序排列。如果找不到符合条件的整数,则打印字符串"none"。

样例:

c语言样题

五、(20分)采用动态链表来实现一个堆管理器(heap memory manager)。堆管理器的功能是这样的:

(1)整个堆空间的大小是固定的,在系统运行的某个时刻,整个堆空间被划分为若干个块,有的块是空闲的,有的块已经被某个程序所占用,这样就形成了空闲块和占用块交错的情形。例如,在图1当中,整个堆空间的大小为1200个字节,总共分为5块区域,其中,第一块区域的起始地址为0,大小为200个字节,被程序1所占用;第二块区域的起始地址为200,大小为200字节,被程序2占用;第三块区域的起始地址为400,大小为400字节,现在是空闲的;第四块区域的起始地址为800,大小为200字节,被程序3占用;第五块区域的起始地址为1000,大小为200字节,现在是空闲的。

(2)用户程序可以用malloc函数来申请一块堆空间,假设申请的空间大小为size,那么系统就会从左往右,对整个堆空间进行扫描,寻找一块大小超过size的空闲区域,如果没有找到这样的空闲区域,那么这次内存申请就失败了;如果能够找到这样的区域,那么就从这个空闲区当中切下一块,把它分配给用户程序,切完后的剩余部分仍然是一块空闲区域,只不过它的大小变小了。例如,对于图1来说,假设这时又有一个用户程序来申请200个字节的一块空间,那么系统就会把起始地址为400的那块空闲区域一分为二,一部分分配给这个用户程序,另一部分仍然是一块空闲区域,如图2所示。

(3)当用户程序执行完毕后,可以用free函数来释放它所占用的空间。例如,在图2当中,如果程序2所占用的空间被释放了,那么对于起始地址为200、大小为200字节的这块区域来说,它的状态就变成了空闲块。另外,为了提高管理效率,当某一块内存区域被释放后,还要去看一下它的左邻右舍,看它们是否是空闲的,如果是的话,就要与它们进行合并,形成一个更大的空闲块。例如,在图2

当中,如果程序4运行结束,它占用的空间被释放了,那么就要把这块空间和它右边的那块空闲块进行合并,从而得到一块更大的空闲块,如图1所示。

c语言样题

c语言样题

现在要求用动态链表的方法来实现这个堆管理器。即对于每一块区域来说,用一个链表结点来描述,包括这块区域的起始地址、大小、状态(占用或空闲)等信息,这样,整个堆空间就可以用一条线性链表来表示。

任务描述:编写一个程序,首先输入内存空间的初始状态,从而建立相应的链表。然后再输入一些内存申请或释放的操作,并根据这些操作来修改链表,如增加、删除或合并链表结点;最后把更新以后的内存空间状态打印出来。

输入格式:第一行是一个整数N ,表示在初始状态,堆空间被划分为多少个块。接下来有N 行,每一行是三个整数s i ,t i ,f i ,其中,s i 表示第i 块区域的起始地址,t i 表示第i 块区域的大小,f i 表示第i 块区域的状态(0表示空闲,1表示被占用)。接下来的一行是一个整数M ,表示有多少个内存请求需要处理,再接下来有 M 行,每一行是两个整数d i 和w i ,其中,d i ∈{0, 1}表示内存请求的类型,如果d i 等于1,表示申请一块内存区域,因此w i 中存放的是需要申请的空间大小;如果d i 等于0,表示释放一块内存区域,因此w i 中存放的是需要释放的这块空间的起始地址。 输出格式:系统在处理完上述的 M 个内存请求之后,会得到一个新的状态,现在需要把这个状态打印出来。第一行是一个整数K ,表示内存中有多少个块,接下来有K 行,每一行是三个整数s i ,t i ,f i

,其中,s i 表示第i 块区域的起始地址,t i 表示第i 块区域的大小,f i 表示第i 块区域的状态(0表示空闲,1表示被占用) 样例:下面这个样例描述的是:初始状态为图1,然后有两个内存请求,一是申请200个字节的空间,这样就得到了图2;二是再把刚刚申请的这块区域释放,这样又回到了图1。

c语言样题

六、(10分)小张是一家餐馆的采购人员,一天他去市场上买鱼。在鱼摊上总共有N 条鱼,每条鱼的

0 200 400 800 1000 1200 0 200 400 600 800 1000 1200

重量为t i。出于成本考虑,小张最多只能买T公斤的鱼,而为了携带方便,他又希望买的鱼的条数越少越好。所以他必须从这N条鱼当中选择若干条,使得这些鱼的总重量L尽可能地大(L ≤T),并且在此前提下,鱼的条数又尽可能地少。

参数限制:0 < N ≤ 30,表示鱼的总数;0 < T ≤ 20000,表示小张最多能够买的鱼的总重量;t i 是一个正整数,表示第i条鱼的重量。

输入格式:第一行是两个整数N和T,接下来有N行,每一行是一个整数t i ,表示第i条鱼的重量。 输出格式:第一行是一个整数K,表示买回家的鱼的数量,接下来有K行,每一行是一个整数,表示一条鱼的重量。

样例:

c语言样题