完整版C++程序设计第一章函数编程题docWord下载.docx
《完整版C++程序设计第一章函数编程题docWord下载.docx》由会员分享,可在线阅读,更多相关《完整版C++程序设计第一章函数编程题docWord下载.docx(23页珍藏版)》请在冰豆网上搜索。
p->
name>
start>
end;
next=NULL;
head=add(head,p);
if(!
check(head))cout<
<
"
ERROR"
endl;
display(head);
return0;
/*请在这里填写答案*/
输入样例:
4
aaa1920
ccc169200
ddd153170
bbb20111
输出样例:
第一章1/13
bbb20111
*ddd153170
*ccc169200
Node*add(Node*head,Node*p){//把节点p插入到链表,按照任务的起始时间升序排列
Node*q=head,*s=head;
while((q!
=NULL)&
&
(q->
start<
start)){//当前的q节点不是末尾,并且q节点的起始时间
早于p节点的起始时间
s=q;
//s始终在q的前面
q=q->
}//直到当前节点NULL或者q的起始时间晚于p的起始时间
if(q==head){//p应该接在链表的开始位置,即成为新的表头
next=head;
head=p;
}else{
next=q;
s->
next=p;
returnhead;
voiddisplay(Node*head){
Node*p=head,*q;
boolconflict;
//用于标识是否有冲突
while(p!
=NULL){//当前p节点不空,是有效任务
conflict=false;
q=head;
while(!
conflict&
q!
=p){//检查p的开始时间是否小于p之前的任务的结束时间
if(q->
end>
start){//p之前的任务的结束时间如果大于p的开始时间则冲突
conflict=true;
break;
q=p->
=NULL){//检查p的结束时间是否大于p之后的任务的开始时间
if(p->
q->
start){//p之后的任务的开始时间如果大于p的结束时间则冲突
if(conflict){//当前任务与其它的任务时间冲突cout<
"
*"
;
cout<
name<
<
end<
endl;
p=p->
6-2函数调用(10分)
第一章2/13
编写三个函数:
求两个整数的最大值、最小值、和。
分别用这三个函数作为实参,再写一个计算函数compute,
对两个整数进行各种计算。
其中一个形参为指向具体算法函数的指针。
intmax(inta,intb);
intmin(inta,intb);
intsum(inta,intb);
intcompute(inta,intb,int(*func)(int,int));
在这里给出函数被调用进行测试的例子。
例如:
inta,b,res;
cin>
a>
b;
res=compute(a,b,&
max);
Maxof"
a<
and"
b<
is"
res<
res=compute(a,b,&
min);
Minof"
sum);
Sumof"
return0;
35
Maxof3and5is5
Minof3and5is3
Sumof3and5is8
intmax(inta,intb){
if(a>
b){
returna;
returnb;
intmin(inta,intb){
if(a<
intsum(inta,intb){returna+b;
}
intcompute(inta,intb,int(*func)(int,int)){
return(*func)(a,b);
6-3函数指针(理科实验班)
(7分)
第一章3/13
梦山高中现需要将某普通班的最优秀学生调整入理科实验班。
为此,将从两个方面考察学生,一是数学和英语两门课的总分;
另一个是所有四门课的总分。
分别找出两科总分和全科总分的第一名,并从中决定调整人选。
输入将首先输入学生数n,(n为不超过80的正整数);
接下来依次输入各位学生的学号,数学、英语、语文、理科综合成绩。
学号及四科成绩均为不超过300的正整数。
输出时:
第一行输出两科总分第一的学号,第二行输出四科总分第一的学号。
约定在两位学生成绩相同时,优
先选择学号较小的学生;
各位学生的学号均不相同。
constintN=80;
structStudent{
intnum;
intscore[4];
intmain()
{
inti,j,k,n;
bools2(constStudent&
constStudent&
);
bools4(constStudent&
Studentst[N];
n;
st[i].num;
for(j=0;
j<
4;
j++)cin>
st[i].score[j];
cout<
select(st,n,s2)<
select(st,n,s4)<
3
6148150120252
5148150117260
7145148128287
5
7
s1,constStudent&
s2)//比较s1和s2两位学生的数学+英语大小,如果s2的
大则返回true
if(s1.score[0]+s1.score[1]<
s2.score[0]+s2.score[1])returntrue;
if(s1.score[0]+s1.score[1]==s2.score[0]+s2.score[1]&
s1.num>
s2.num)returntrue;
returnfalse;
s2)//比较s1和s2两位学生的总分大小,如果s2的大则返回true{
第一章4/13
if(s1.score[0]+s1.score[1]+s1.score[2]+s1.score[3]<
s2.score[0]+s2.score[1]+s2.score[2]+s2.score[3])
returntrue;
if(s1.score[0]+s1.score[1]+s1.score[2]+s1.score[3]==
s2.score[0]+s2.score[1]+s2.score[2]+s2.score[3]&
s2.num)
returnfalse;
intselect(Students[],intn,bool(*p)(constStudent&
s2))
intmaxIndex=0;
for(inti=1;
i<
n;
i++)
if((*p)(s[maxIndex],s[i]))maxIndex=i;
returns[maxIndex].num;
6-4二维数组(海绵城市)(7分)
根据海绵城市建设指挥部要求,怡山小学将对校内道路进行改造,铺设透水砖。
这样有些道路将不能通行。
为了不妨碍假期少先队的校内活动安排,大队宣传委员小黄需要知道一些关键的活动地点是否可以到达。
已知校内一共有20处建筑,分别标为1号楼,2号楼,......,20号楼。
有些楼之间有道路连接,道路是双向
的,如果A楼与B楼间有道路,那么既可以从A楼到B楼,也可以从B楼到A楼。
首先将输入校内的道路数n,接下来分n行输入各条道路的信息,每行有两个整数(均在1和20之间),代表
这两座楼之间有道路连接。
接下来输入查询数m,然后分m行输入要查询的楼间连路信息,每行有两个整数(均
在1和20之间)。
如果两楼之间可以通过一条路径到达(中途有可能经过其它楼),则输出两楼是连接的,否则输出两楼是断开的。
完成查询两建筑是否连通的函数test
constintN=21;
inta[N][N]={0},n,m,i,j,k;
j>
k;
a[j][k]=a[k][j]=1;
m;
第一章5/13
'
-'
k<
'
if(test(a,j,k))cout<
connected"
elsecout<
disconnected"
}·
2
12
23
13
14
1-3connected
1-4disconnected
booltest(inta[N][N],intj,intk)//利用深度优先搜索找到一条从j到k的通路,若不存在则返回false
//维护一个一维数组,模拟栈的操作,从j开始深搜到一个邻居i且没有搜索过,则将i入栈,如果i==k则搜索成功
//维护一个一维数组,有N个元素,用于记录某个楼是否搜索过
intstack[N+1]={0};
//存储从j开始走过的路径,如jmnt,表示从j开始经过mn走到了t
boolvisited[N+1]={false};
inttop=0;
//top记录数组stack的最后一个元素的位置,
//首先j入栈
stack[++top]=j;
visited[j]=true;
while(top>
0)//当前栈不空
intcur=stack[top--];
//得到当前栈顶
//把与cur连接的所有未访问过的楼号压入栈
for(inti=0;
N;
if(a[cur][i]==1&
visited[i]==false)
stack[++top]=i;
if(i==k)returntrue;
//访问到k则表示从j到k有通路
visited[i]=true;
6-5引用作函数形参交换两个整数(10分)
设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作。
第一章6/13
voidSwap(int&
x,int&
y){
inttemp;
temp=x;
x=y;
y=temp;
inta,b;
Swap(a,b);
53
6-6函数重载实现两数相加(15分)
设计一个重载函数add,该函数有两个参数,可以实现两个类型相同的参数相加的操作,函数返回相加的结果。
两个参数可以是整数、实数和字符串,但必须保证两个参数类型相同。
iomanip>
intadd(intx,inty){
returnx+y;
doubleadd(doublex,doubley){
stringadd(stringx,stringy){
doublec,d;
strings1,s2;
c>
d;
s1>
s2;
add(a,b)<
fixed<
setprecision
(2)<
add(c,d)<
第一章7/13
add(s1,s2)<
3.33335.555555
helloworld
8
8.89
helloworld
6-7带默认形参值的函数(10分)
设计一个带默认形参值的函数add,该函数有三个参数,可以实现三个整数类型的参数相加的操作,函数返回相
加的结果。
默认形参值从右至左分别是30、20。
intadd(intx,inty=20,intz=30){
returnx+y+z;
inta,b,c;
b>
c;
add(a)<
add(a,b,c)<
123
51
33
6
6-8使用动态内存分配的冒泡排序(20分)
编程实现冒泡排序函数int*bubble_sort(intn);
其中n为数组长度(1≤n≤1000)。
函数接口定义如下:
第一章8/13
int*bubble_sort(intn);
/*对长度为n的数组arr执行冒泡排序*/
请实现bubble_sort函数,使排序后的数据从小到大排列。
要求在bubble_sort函数内使用动态内存分配方式分
配一个大小为n的数组,再读入待排序数据,排序完成后返回数组。
/*对长度为n的数组执行冒泡排序*/intmain(){
intn;
int*a=bubble_sort(n);
for(inti=0;
i++){
a[i];
if(i<
n-1)cout<
/*你的代码将嵌在这里*/
10
1516828139137142780122208325242165383532834125922
8353137141516821653222082592227801281392834132524
int*bubble_sort(intn){
int*a=newint[n];
inti;
a[i];
for(intj=0;
n-1-i;
j++){
if(a[j]>
a[j+1]){
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
delete[]a;
6-9逆序字符串(10分)
设计一个void类型的函数reverse_string,其功能是将一个给定的字符串逆序。
例如,给定字符串为“hello”,逆序后为“olleh”。
第一章9/13
/*函数原型参见main函数*/
intmain(intargc,charconst*argv[])
stringstr;
getline(cin,str);
//输入字符串
reverse_string(str);
//逆序字符串str
str<
//输出逆序后的字符串
hello
olleh
voidreverse_string(string&
str){
chart;
n=str.length();
for(inti=0;
n/2;
t=str[i];
str[i]=str[n-1-i];
str[n-1-i]=t;
7-1时间换算(10分)
输入一个正整数repeat(0<
repeat<
10),做repeat次下列运算:
输入一个时间数值,再输入秒数n,输出该时间再过n秒后的时间值,时间的表示形式为时:
分:
秒,超过24时从0时重新开始计时。
输出格式:
printf("
time:
%d:
%d:
%d\n"
);
输入输出示例:
括号内为说明,无需输入输出
输入样例:
(repeat=3)
0:
1
59
(
秒数n=59)
11:
59:
40
30
秒数n=30)
23:
第一章10/13
301
(秒数n=301)
输出样例:
0:
1:
(0:
01
加上59秒的新时间)
12:
(11:
加上
30秒的新时间)
4:
41
(23:
301秒的新时间)
structTime
inthour;
intminute;
intsecond;
voidtimeCompute