北理计算机复试上机题.docx
《北理计算机复试上机题.docx》由会员分享,可在线阅读,更多相关《北理计算机复试上机题.docx(15页珍藏版)》请在冰点文库上搜索。
北理计算机复试上机题
2006年北理计算机复试上机题
2009-09-1910:
48
1.写一个程序判断字符串中数字的位置(不限制使用面向对象编程)
例如:
输入 a3b4c5
输出 246
实现:
#include
#include
usingnamespacestd;
intmain()
{
charc_arr[100];
inti,len=0;
cout<<"Pleaseenterastring:
"< cin>>c_arr;
while(c_arr[len++]);
cout< for(i=0;i {
if(isdigit(c_arr))
{
cout<
}
}
cout< return0;
}
2.写一个类,能接受int型的变量,接收变量后能存储原变量(譬如12345)和其反向变量(54321),最多处理数量为10个,当输入达到10个或者输入变量为0的时候停止。
并且在类销毁前输出存储的所有变量。
例如:
输入:
12345,2234,0
输出:
12345 54321
22344322
实现:
#include
usingnamespacestd;
typedefstructs_store
{
intnum;
intreverseNum;
}s_store;
classCStore
{
public:
CStore(){};
~CStore(){};
voidsetS_st(intnum,intsub);
voidsetCount();
voidprint(intsub);
intgetCount();
protected:
private:
staticintcount;
s_stores_st[10];
};
intCStore:
:
count=0;
intmain()
{
CStorecs;
intnum,size;
cout<<"Pleaseenteryourdata:
"< cin>>num;
cs.setS_st(num,cs.getCount());
cs.setCount();
//cout<<"countis:
"< while(cs.getCount()<10)
{
cin>>num;
if(num==0)
{
break;
}
cs.setS_st(num,cs.getCount());
cs.setCount();
//cout<<"Inwhilecountis:
"< }
size=cs.getCount();
//cout<<"sizeis:
"< for(inti=0;i {
cs.print(i);
cout< }
return0;
}
voidCStore:
:
setS_st(intnum,intsub)
{
s_st[sub].num=num;
intb=0,a;
while(num>0)
{
b*=10;
a=num%10;
b+=a;
num/=10;
}
s_st[sub].reverseNum=b;
}
voidCStore:
:
setCount()
{
count++;
}
intCStore:
:
getCount()
{
returncount;
}
voidCStore:
:
print(intsub)
{
cout<}
3.写一个CTriangle类,要求可以接受CTriangle(y,x)形式的构造,创建在坐标系中的直角三角形样子如下
A
|\
| \
| \
| \
B----------C
三点的坐标分别是A(0,y)B(0,0)C(x,0)
实现+运算,并且能够处理键盘连续输入若干个(少于十个)三角形,并且连加(相加时候三角形边长长度相加,方向同第一个三角形)。
输入0后结束并输出最后得出的三角形的三个坐标值。
例如:
输入:
1 2
-1 -5
输出:
A(0,7),B(0,0),C(2,0)
实现:
#include
#include
#include
usingnamespacestd;
classCTriangle
{
public:
CTriangle(doubley,doublex);
~CTriangle(){};
voidset(doubley,doublex);
voidaddTriangle();
voidprintShape();
voidprint();
protected:
private:
doublex;
doubley;
};
intmain()
{
CTrianglectrgle(10,-4),ctrgle1(10,4),ctrgle2(10,-4),ctrgle3(-10,-4);
ctrgle.printShape();
ctrgle.print();
ctrgle1.printShape();
ctrgle1.print();
ctrgle2.printShape();
ctrgle2.print();
ctrgle3.printShape();
ctrgle3.print();
ctrgle.addTriangle();
ctrgle.printShape();
return0;
}
CTriangle:
:
CTriangle(doubley,doublex)
{
set(y,x);
}
voidCTriangle:
:
set(doubley,doublex)
{
this->y=y;
this->x=x;
}
voidCTriangle:
:
addTriangle()
{
set(0,0);
doubleyval,xval;
intcount=0;
boolxjudge=true,yjudge=true;
cout<<"Pleaseenterthevalues:
"< cin>>xval>>yval;
if(xval<0)
{
xjudge=false;
}
if(yval<0)
{
yjudge=false;
}
while(xval)
{
this->y+=abs(yval);
this->x+=abs(xval);
cin>>xval;
if(!
xval)
{
break;
}
cin>>yval;
}
if(!
xjudge)
{
this->x=(this->x)*(-1);
}
if(!
yjudge)
{
this->y=(this->y)*(-1);
}
print();
}
voidCTriangle:
:
printShape()
{
inti,num;
if(y>0&&x>0)
{
for(i=0;i {
if((i+1)%2==0)
{
cout< continue;
}
cout<<"|"< }
for(i=0;i {
cout<<"-";
}
}
elseif(y<0&&x>0)
{
for(i=0;i {
cout<<"-";
}
for(i=int(abs(y)-1);i>=0;i--)
{
if((i+1)%2==0)
{
cout< continue;
}
cout<<"|"< }
}
elseif(y>0&&x<0)
{
num=int(abs(y)-1);
for(i=num;i>=0;i--)
{
if((i+1)%2==0)
{
cout< continue;
}
cout< }
cout< for(i=0;i {
cout<<"-";
}
}
elseif(y<0&&x<0)
{
for(i=0;i {
cout<<"-";
}
cout< num=int(abs(y));
for(i=0;i {
if((i)%2==0)
{
cout< continue;
}
cout< }
}
cout<}
voidCTriangle:
:
print()
{
cout<<"A(0,"<y<<"),B(0,0),C("
<x<<",0)"<}
Timelimit:
1Seconds
TotalSubmit:
155 AcceptedSubmit:
3
题目要求:
现有一笔经费可以报销一定额度的发票。
允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。
现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。
具体的输入输出格式规定如下:
输入格式:
测试输入包含若干测试用例。
每个测试用例的第1行包含两个正数Q和N,其中Q是给定的报销额度,N(<=30)是发票张数。
随后是N行输入,每行的格式为:
mType_1:
price_1Type_2:
price_2...Type_m:
price_m
其中正整数m是这张发票上所开物品的件数,Type_i和price_i是第i项物品的种类和价值。
物品种类用一个大写英文字母表示。
当N为0时,全部输入结束,相应的结果不要输出。
输出格式:
对每个测试用例输出1行,即可以报销的最大数额,精确到小数点后2位。
输入样例:
200.003
2A:
23.50B:
100.00
1C:
650.00
3A:
59.99A:
120.00X:
10.00
1200.002
2B:
600.00A:
400.00
1C:
200.50
1200.503
2B:
600.00A:
400.00
1C:
200.50
1A:
100.00
100.000
输出样例:
123.50
1000.00
1200.50
题目描述:
输入:
两行
第一行:
M和N
第二行:
X
M和N是一个十进制数,M和N都在[2-35]之间,X是一个M进制数,X在[1-2*10^19]
输出:
一行
第一行:
现在要求你将M进制数X转换成N进制数输出
注:
A相当于10,B相当于11,Z相当于35
输入一:
1610
F
输出一:
15
2009年山东大学计算机复试上机题目【网友回忆版】
文章来源:
勤思教育转载请标明出处和链接 ,阅读次数:
[103]次
一共两个题,每个50分,上机环境不限,编程语言不限,只要求结果,不要源代码,数据随机生成。
题目均非准确描述,但保持了原意
【1】输入一个整数,它可以由n(n>=2)个连续整数相加得到,输出所有可能的连续整数序列,每个序列占一行,数字之间用空格分开,数据从小到大,每列按最小元素递增顺序排列,如果找不到,输出none
例:
21=1+2+3+4+5+6
21=6+7+8
则输出123456
678
【2】某国设计了一种导弹防御系统,但有缺陷,导弹来袭时,第一枚炮弹可以达到任意高度,但以后的任意一炮均不能超过前一发炮弹高度。
现在仅有一套这样的系统
输入:
来袭的导弹数目(不超过100枚)
输出:
1:
能够拦截的导弹数目30分
2:
若要拦截所有导弹,需要几套这样的系统20分
其实第一问就是找一个递减序列的长度,第二问就是找一下有几个这样的递减序列。
本次上机使用了一个考试系统,要求先编好这两个程序,然后输入你的姓名,系统就会随机生成两个题目的输入数据,运行后将结果在5分钟内输入提交,否则时间用完,重新生成一组输入数据,最多有三次机会。
很遗憾,第一次使用这样的东西,我得了0分。
而且与编程无关,反正编程我也不行,不过我得到的第一个数据实在比较简单:
98
可以用笔算得到结果,无需程序。
我分解对了,但填错位置了。
(苦笑),第二个我也知道怎么弄,不过一着急,数错个数了。
希望师弟师妹吸取教训。
第一题是给定一个程序,关于字符串的,要求输入并调试,说出此程序的意图。
意图是按字母顺序对两个字符串比较排序。
第二问要求用尽可能少的语句对该程序进行修改,使其能够对两个字符串比较长度排序
实现:
#include
#include
usingnamespacestd;
intmain()
{
stringstr1,str2;
cout<<"请输入两个字符串"< cin>>str1>>str2;
if(str1 {
cout<"< }
else
{
cout<"< }
/*
if(str1.length() {
cout< }
else
{
cout< }
*/
return0;
}
第二题是要求编写一个日期类,要求按xxxx-xx-xx的格式输出日期,实现加一天的操作,不考虑闰年问题,所有月份设为30天。
本题黑盒测试时,输入2004年3月20日,得到加一天后时间为2004-3-21,能得一部分分数。
输入2004年3月30日,得到加一天后时间为2004-4-1,能得一部分分数。
输入2004年12月30日,得到加一天后时间为2005-1-1,且有时间越界处理,能得全部分数。
实现:
#include
usingnamespacestd;
classd_date
{
public:
d_date();
~d_date(){};
voidsetD_date(intyear,intmonth,intday);
d_dateaddToD_date();
voidprint();
protected:
private:
intyear;
intmonth;
intday;
};
intmain()
{
intyear,month,day;
d_dated_dat;
while(true)
{
cout<<"请输入年、月、日"< cin>>year;
cin.ignore
(2);
cin>>month;
cin.ignore
(2);
cin>>day;
cin.ignore
(2);
d_dat.setD_date(year,month,day);
d_dat=d_dat.addToD_date();
cout<<"加一天以后是:
"< d_dat.print();
}
return0;
}
d_date:
:
d_date()
{
year=1900;
month=1;
day=1;
}
voidd_date:
:
setD_date(intyear,intmonth,intday)
{
this->year=year;
if(month<0||month>12)
{
cout<<"对不起,您输入的月份有误,将自动设置为1月"< this->month=1;
}
else
this->month=month;
if(day<0||day>30)
{
cout<<"对不起,您输入的日期有误,将自动设置为1日"< this->day=1;
}
else
this->day=day;
}
d_dated_date:
:
addToD_date()
{
day++;
if(day>30)
{
day=1;
month++;
}
if(month>12)
{
month=1;
year++;
}
return*this;
}
voidd_date:
:
print()
{
cout<year<<"-"<month<<"-"<day<}
第三题要求编写一个复数类,要求有4条。
一是有构造函数,能对复数初始化。
二是对复数c1,c2,c3.....能实现连加运算,令c=c1+c2+c3+.....此处可以重载加法操作符。
三是有函数实现两个复数相加,并按照a+ib的形式输出。
四是能实现对一个复数c=a+ib,定义doublex=c有效,使x的值为实部和虚部之和。
实现:
#include
usingnamespacestd;
classPluralism
{
public:
Pluralism();
~Pluralism(){};
Pluralism&operator+(constPluralism&);
voidsetPluralism();
voidaddAnother(constPluralism&);
voidprint();
doublequalificatory()