综合题.docx
- 文档编号:30558730
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:20
- 大小:24.20KB
综合题.docx
《综合题.docx》由会员分享,可在线阅读,更多相关《综合题.docx(20页珍藏版)》请在冰豆网上搜索。
综合题
综合题
一、航班信息的查询与检索(多关键字查询)
1.题目要求:
排序与查找是在数据信息处理中使用频率极高的操作。
为了加快查找的速度,需要先对数据记录按关键字排序。
当今乘飞机旅行的人越来越多,人们需要了解各类航班的班次、时间、价格及机型等信息。
在飞机航班数据的信息模型中,航班号是关键字,而且是具有结构特点的一类关键字。
因为航班号是字母数字混编的,例如CZ3896,这种记录集合是一个适合于多关键字排序的例子。
2.算法分析:
1.定义数据类型
根据设计要求,我们知道设计中所用到数据记录只用航班信息,因此要定义相关的数据类型:
Typedefstruct{
Charstart[7]; //起点
Charend[7]; //终点
Charsche[12]; //班期
Chartime1[5]; //起飞时间
Chartime2[5]; //到达时间
Charmodel[4]; //机型
Intprice //票价;
}InfoType; //航班记录类型
Typedefstruct{
KeyTypekeys[keylen];
InfoTypeothers;
Intnext;
}SlNode; //表结点
Typedefstruct{
SlNodes1[MaxSpace]; //静态链表,s1[0]为头结点
Intkeylen; //关键字长
Intlength; //当前表长
}SLList; //静态链表类型
为实现基数排序,需要定义在分配和收集操作时用到的指针数组:
TypedefintArrType_n[10]; //十进制数字指针数组
TypedefintArrType_c[26] //26个字母指针数组
2.实现排序的各函数说明
(1)一趟分配函数:
VoidDistribute(SLNode *s1,intI,ArrTypef,ArrTypee);
//本算法是按照关键字keys[i]建立RADIX个子表,使同一个子表中记录的Keys[i]
//相同,f[0,RADIX]和e[0,RADIX]分别指向各子表中的第一个和最后一个记录
(2)一趟搜集函数:
VoidCollect(SLNode *s1,intI,ArrTypef,ArrTypee);
//本算法是按照关键字keys[i]从小到大将[0,RADIX]所指向的各子表依次链表。
(3)链式基数排序函数:
VoidRadixSort(SLList L);
//本算法是按照关键字从低位到高位依次对关键字进行分配和收集,分两段实现。
(4)二分查找函数:
IntBinSearch(SLListL,KeyTypekey[]);
//L为带查找的表,key[]为待查找的关键字,按二分查找的思想实现查找
(5)主控函数
Voidmain()
{
初始化;
数据输入;
排序处理;
接受查找要求及查找关键字;
查找处理;
输出查找结果;
}
二、图书管理系统
1.题目要求:
图书信息表示的就是一个数据库文件。
图书管理一般包括:
图书采编,图书编目,图书查询及图书流通(借,还书)等,要求设计一个图书管理信息系统,利用文件存储数据,实现上述系统功能。
具体设计要求:
⑴建立一个图书信息数据库文件,输入若干种书的记录,建立一个以书号为关键字的索引文件;在主数据库文件中建立以书名,作者及出版社作为关键字的索引以及对应的索引链头文件,如下图所示;
⑵建立关于书号,书名,作者及出版社的图书查询;
⑶实现图书的借还子系统,包括建立读者文件,借还文件,读者管理及图书借还等相关的处理。
记录集
书号
书名
指针1
作者
指针2
出版社
指针3
分类
藏书量
借出数
1
1021
数据库
0
李小云
0
人民邮电
0
021
8
0
2
1014
数据结构
0
刘小阳
0
中国科技
0
013
6
0
3
1106
操作系统
0
许海平
0
人民邮电
1
024
7
0
4
1108
数据结构
2
孙华英
0
清华大学
0
013
5
0
5
1203
程序设计
0
李小云
1
中国科技
2
035
6
0
6
2105
数据库
1
许海平
3
清华大学
4
021
6
0
7
1012
数据结构
4
李小云
5
人民邮电
3
013
5
0
8
0109
程序设计
5
刘小阳
2
清华大学
6
035
7
0
a)图书主索引文件
书名
链头
长度
数据库
6
2
数据结构
7
3
操作系统
3
1
程序设计
8
2
b)书名索引链头文件
作者
链头地址
长度
李小云
7
2
刘小阳
8
3
许海平
6
1
孙华英
4
2
C)作者索引链头文件
作者
链头地址
长度
人民邮电
7
3
中国科技
8
2
清华大学
8
3
d)出版社索引链头文件
2.算法分析:
1.数据文件类型设计
⑴主数据库文件:
typedefstruct{
charbno[5];
charbname[2];
int namenext;
charauthor[9];
intauthnext;
charpress[11];
intprenext;
charsortno[4];
intstorenum;
intborrownum;
}BookRecType;
typedfstruct{
BookRecTypeBookDbase[BookSize];
intlen;
}BookDbaseFile;
⑵书号索引文件:
typedfstruct{
charbno[5];
intRecNo;
}BidxRecType;
typedfstruct{
BookRecTypeBnoIdx[BookSize];
intlen;
}BoIdxFile;
⑶书名链头索引文件:
typedfstruct{
char author[9];
intRecNum;
intlhead;
}BARecType;
typedfstruct{
BARecType LHFrec2[BLHnum];
intlen2;
}LHFrec2;
⑸作者链头索引文件:
typedfstruct{
charpress[11];
intRecNum;
intlhead;
}BPRecType;
typedfstruct{
BPRecType LHFrec3[BLHnum];
intlen3;
}LHFrec3;
⑹读者文件:
typedfstruct{
charrno[4];
charname[8];
intbn1;
intbn2;
}RRecType;
typedfstruct{
RRecType ReadRec[RRnum];
intlen;
}ReadFile;
⑺借还书文件:
typedfstruct{
charrno[4];
charbno[5];
chardate1[9];
chardate2[9];
}BbookRecType;
typedfstruct{
BbookRecType Bbook[BookSize];
intlen;
}BbookFile;
2.系统功能算法描述
⑴建立图书数据库文件及按书号的索引文件
建立文件时,在输入记录建立数据库文件的同时建立一个索引表。
索引表中的索引项按记录输入的书号升序(用插入排序法),并同时修改相关的索引及链头文件。
为了方便起见,将文件用记录数组替代实现;为了处理方便,在后面使用数组时,数组下标都是从1开始。
1)输入一条图书记录的算法描述如下:
void AppeDBaseFile(BookDbaseFile&bf)
{
提示输入项的输入顺序;
输入一条记录;
图书记录计数器加1;
}
2)书号索引文件的修改
void ChangeBnoIdxF(BookDbaseFile&bf,BnoIdxFile&bif)
{
while(j>=1)
{if(sh>索引表中第j个记录的书号)
{k=j+1;break;}
j--;
}
记录后移,留出位置;
插入记录;
Bif.len++;
}
⑵多重文件的建立
文件可以按照记录中关键字的多少,分成单关键字文件和多关键字文件。
若文件中的记录只有一个唯一标识记录的主关键字,则称其位单关键字文件;若文件中的记录除了含有一个主关键字外,还含有若干个次关键字,则称为多关键字文件。
设计的图书文件就是一个多关键字文件,除了书号为主关键字外,还有多个次关键字,如书名、作者、出版社等。
关键字文件的组织方式有两种:
一种叫做倒排文件,另一种叫做多重表文件。
在这个设计中采用多重表文件方式来表示图书文件。
多重表文件是将索引方法和连接方法相结合的一种组织方式,它对每个需要查询的次关键字建立一个索引,同时将具有相同次关键字的记录连接成一个链表,并将此链表的头指针,链表长度及次关键字,作为索引表一个索引项,该索引表又称为链头索引文件。
根据设计要求,需要建立三项次关键字的索引和相对应的链头索引文件。
建立次关键字索引及建立链头索引文件的基本思想是:
根据一条主文件的记录,将要建立索引的次关键字于对应的链头索引文件中的关键字比较,若有相等的,就将主文件中缩影指针修改成链头指针文件中的当前指针,并同时修改链头文件中和链头指针为当前文件的记录指针以及记录个数加1;若没有相等的,就将主文件中索引指针置成0(NULL空值),并修改链头文件和链头指针为当前文件的记录以及个数置成1。
以书名次关键字建立索引为例,具体算法描述如下:
voidChangeLinkReadF1(BookDbaseFile&df,LHFile1&lhf1)
{
处理图书文件当前记录;
while(j>=lhf1.len1)
{
在链头文件中查找于次关键字相等的记录
if(相等)
{k=j;break;}
j++;
}
if(找到相等的记录)
{
链头文件记录的指针存入图书主文件当前记录的相应指针域;
主文件的当前记录号(假定为指针)存入链头文件的指针域;
链头文件记录的记录计数器加1;
}
else
{
主文件中当前记录的指针域置空(0);
主文件的当前记录号(假定为指针)存入链头文件的指针域;
链头文件记录的吉林计数器加1;
}
else
{
主文件中当前记录的指针域置空(0);
主文件的当前记录号(假定为指针)存入链头文件的指针域;
链头文件记录的吉林计数器加1;
索引关键字个数加1;
}
}
⑶建立关于书号,书名,作者及出版社的查询。
voidSearchBook(BookDbaseFile&df,BnoIdxFile&bif,LHFile1f1,LHFile2f2,LHFile3f3)
{
choose=1;
while(choose>=1&&choose<=5)
{显示图书查询菜单:
1. 书号
2. 书名
3. 作者
4. 出版社
5. 退出
请用户选择:
tochoose
switch(choose)
{
case1:
输入书号:
调用书号查询算法;break;
case2:
输入书名:
调用书名查询算法;break;
case3:
输入作者:
调用作者查询算法;break;
case4:
输入出版社:
调用出版社查询算法;break;
case5:
return;
}
}
}
1)书号查询算法。
由于图书文件已按书号建立了索引文件,就是说已按书号索引有序化。
因此,可采用二分查找算法来实现书号查询。
查询算法描述如下:
intBinSearch(BnoIdxFilebif,charkey[])
{while(low<=high){
mid=(low+high)/2;
if(strcmp(key,L.sl[mid].keys)==0)return mid;
elseif(strcmp(key,L.sl[mid].keys)<0) high=mid-1;
elselow=mid+1;
}
return 0;
}
2) 按书名查询算法
intBnameFind(LHFile lhr1,char key[])
{
for(i=1;i<=lhf1.len1;i++)
{if(key==链头文件中当前吉林的书名)
{k=链头文件中当前吉林链头;
退出;
}
}
}
按作者和出版社查询于上述按书名查询算法类似。
⑷借书处理算法
voidBorrowBook(BookDbaseFile bf,BbookFile bbf,ReadFile rf)
{
输入读者号,书号,借阅日期;
借书处理:
查找读者文件,验证读者身份,先检验读者是否可以借书,
若不能借,就提示读者”书已借满,不能再借”;如可惜,
则查图书主文件,需要借阅的图书是否已被借出,如借出则显示
“图书已借出”;否则,借还书文件追加一条记录,记录相关内容,并分别
修改图书文件和读者文件;
}
⑸还书处理算法.
voidBackBook(BookDbaseFile bf,BbookFile bbf,ReadFile rf)
{
输入读者号,书号,还书日期;
还书处理:
查找读者文件,修改借书数;
查图书主文件,修改借书数;
查询借还书文件,修改借日期;
}
三、停车场管理
1.题目要求:
设停车场内只有一个可停放n辆汽车的狭长通道(先进后出),且只有一个大门可供汽车出入。
车辆按到达停车场时间的先后依次从停车场最里面向大门口处停放(最先到达的第一辆车停放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待。
一旦停车场内有车离开,排在便道上的第一辆车就可以进入停车场。
停车场内如果有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进入停车场。
每辆车在离开停车场时,都应该根据它在停车场内停留的时间长短交费。
如果停留在便道上的车没进停车场就要离开,允许其离开,不收停车费,并且仍然保持在便道上的车辆次序。
2.算法分析:
由于题目要求,停车场只有一个大门可供出入,且车辆进出必须满足先进后出的要求,所以在停车场内的车辆管理要用栈实现。
但在停车场内如果有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进入停车场,所以为实现这一功能,应该采用队列结构。
因此,本题需要结合栈和队列两种结构实现。
四、计算24点
1.题目要求:
问题描述:
有四个整数(0到10),运算符只有加减乘除,还有括号,每个数能且只能用一次,要求判断这些表达的结果中是否有24,如果有,输出过程,格式如下:
4*6*1*1.(允许有括号)。
注意:
1,中间结果允许出现分数,如:
(5–1/5)*5;
2,不能有多余的括号。
3,不能出现两个负数相乘,如(1-4)*(1-9),看作(4-1)*(9-1)的重复,也不能出现8-8*(2-4)。
4,避免交换律引起的重复。
5,避免结合律引起的重复。
6,由于数字相同的重复也不允许,如有两个2。
2.算法分析:
分析:
#1,#2,#3代表运算符,a,b,c,d代表运算数,对于表达式a #1 b #2 c #3 d根据运算顺序有如下六种可能.
1,运算顺序:
#1,#2,#3 (( a #1 b) #2 c) #3 d
2,运算顺序:
#1,#3,#2 ( a #1 b ) #2 ( c #3 d)
3,运算顺序:
#2,#3,#1 a #1 (( b #2 c ) #3 d )
4,运算顺序:
#2,#1,#3 (a #1 ( b #2 c ) ) #3 d
5运算顺序:
#3,#1,#2 ( a #1 b ) #2 ( c #3 d )
6运算顺序:
#3,#2,#1 a #1 ( b #2 ( c #3 d))
其中运算符对应关系有64种,运算数对应关系24种。
考虑6/(5/4-1)=24自定义数据类型CData,包含整形的分子,分母。
最后排除重复(输出成字符串再比较)
1,由于运算数相同的问题,直接比较就行了。
2,交换律的问题。
(( a #1 b) #2 c) #3 d成立
如果#都是+或*,那么,
(( b #1 a) #2 c) #3 d
(c #2 ( a #1 b)) #3 d
d #3 (c #2 ( a #1 b))
调整使不会出现小数加(乘)大数,再比较就行了,注意如果结果相同,还要比较过程,运算符在运算数之前,如:
(2+4)*6而不是6*(2+4)。
都是运算符也保证顺序的唯一性。
3,分配律不认为重复。
4,结合律,如:
a + b –c = a – c + b;由于只有三个运算符,故只会出现两个运算符的结合律和三个运算符的结合律。
我们先将-/变成加乘,全部是加(乘)的结合律好处理。
a-(b*c),a-(b/c),a/(b+c),a/(b-c)不好处理,加个标记就行了。
总共三个运算符,而结合律至少要两个运算符,故b,c不会再包含运算符。
五、大众匹萨问题
1.题目要求:
你准备为你和朋友订一个比萨,他们告诉你每个人希望比萨里有什么和没有什么材料。
当然,他们也明白只有一个比萨,所以没有人期望他所以的要求都得到满足。
你订一个比萨满足他们每个人至少一项的要求吗?
比萨店提供的比萨口味如下,你可以在一个比萨中要或者不要当中的任何一项:
代码
口味
A
凤尾鱼
B
黑橄榄
C
加拿大熏肉
D
方丁大蒜
E
浓奶酪
F
鲜花椰菜
G
青辣椒
H
火腿
I
意大利香肠
J
加拉佩诺胡椒
K
波兰熏肠
L
瘦牛肉
M
蘑菇
N
脱脂羊乳酪
O
洋葱
P
胡椒
你的朋友给你一行文字描述他们的比萨口味。
例如:
+O-H+P;
意味这某位朋友将接受一个包含洋葱,或不包含火腿,或带有胡椒的比萨。
而
-E-I-D+A+J;
表示某位朋友将接受一个不包含浓奶酪或意大利香肠或方丁大蒜的,或带有凤尾鱼或加拉佩诺胡椒的比萨。
输入格式:
每个要求一行,并以分号结束。
直到“.”表示所有约束都已输入结束。
输出格式:
如果存在可分配的方案则先输出一个长度为10的字符串“Toppings:
”,紧接输出分配方案(按字母顺序由小到大)。
如果不存在可分配的方案则输出:
“Nopizzacansatisfytheserequests.”
输入输出样例:
Simpleinput1
Outputfortheinput
+A+B+C+D-E-F-G-H;
-A-B+C+D-E-F+G+H;
-A+B-C+D-E+F-G+H;
.
Toppings:
Simpleinput2
Outputfortheinput
+A+B+C+D;
+E+F+F+H;
+A+B-G;
+O+J-F;
+H+I+C;
+P;
+O+M+L;
+M-L+P;
.
Toppings:
CELP
Simpleinput3
Outputfortheinput
+A;
-A;
.
Nopizzacansatisfytheserequests.
2.算法分析:
本题可以使用搜索算法,穷举所有的可能性,直到找到解为止。
使用搜索算法时要注意的两个问题是:
1、比萨约束的存储方式;
2、如何判断比萨是否符合要求。
这里使用位运算来表示比萨的约束方式:
定义一个整形数组want[PERSONMAX],其中PERSONMAX表示朋友的个数,want[i]表示第i为朋友想要的口味,例如:
want[i]=00000000000000000000000001000011表示第i个朋友想要口味凤尾鱼、黑橄榄和青辣椒。
注意由于整形有32位而pizza的口味只有16种,所以这里高16为无效。
同理,定义另一个整形数组hate[PERSONMAX],hate[i]表示第i位朋友不想要的口味,例如:
hate[i]=00000000000000000000000000001100表示第i个朋友不想要的口味有:
方丁大蒜和加拿大熏肉。
于是在表述pizza是否符合某人的口味是只要进行如下判断:
(pizza&want[i]>0)||(!
pizza&hate[i]>0)
这种表示方法充分利用了位运算的优点,使得程序的处理十分的方便,而且节省了空间。
六、王伯买鱼
1.题目要求:
王伯退休后开始养鱼。
他一早起来就赶去动物公园,发现这个世界的鱼真不少,五光十色、色彩斑斓,大的、小的,什么样的都有。
这些鱼实在太美了,买的人越来越多,湖里的鱼越来越少。
没有美丽的鱼,哪里有美丽的湖?
于是动物公园不得不规定,对于每种鱼,每个人最多只能买一条。
并且有些鱼是不能一起买的,因为放在一起他们相互争斗吞食。
王伯想买尽可能多的鱼,但很可惜,他的资金有限。
他冥思苦想,不知如何是好。
请编程帮他,如果有多个方案能买尽可能多的鱼,选择所花资金最多的一种方案。
具体要求:
【输入:
】
第一行:
资金m(<=1000)和鱼的种类n(<=30)。
以下n行,每行有两个正整数,鱼的编号s(1<=s<=n)和该鱼的价格t。
接着又有若干行,每行两个整数p和q,当p和q都大于0时,表示p和q不能共处;当p和q均等于0时,表示输入结束。
【输出:
】
第一行两个整数,x和y,x表示买的鱼的条数,y表示总的花费。
以下x行,每行有一个整数,表示所买鱼的编号。
编号按升序排列输出。
【样例输入:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合