还有一周就要期末了!快把学校的题库做一遍吧 ,说不定期末原题就在其中!!!
(C++题库附详细答案)
第一次实验
1.输入一行字符串,统计元素(易)
【问题描述】输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
【输入形式】根据系统提示,输入一行字符。
【输出形式】输出其中英文字母、空格、数字和其他字符的个数。
【样例输入】
affkd dfd 123 dfj%%**
【样例输出】
enter one line:
letter:11, space:3, digit:3, other:4
【样例说明】根据系统提示,输入一行字符。输出其中英文字母、空格、数字和其他字符的个数。
【评分标准】 结果完全正确得15分,每个测试点5分。提交程序名为:xt3-16.c或xt3-16.cpp
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a=0;
int b=0;
int c1=0;
int d=0;
char c;
while((c=getchar())!='\n')
{
if(c>='a'&&c<='z')
a++;
else if(c>='A'&&c<='Z')
a++;
else if(c==' ')
b++;
else if(c>='0'&&c<='9')
c1++;
else
d++;
}
cout<<a<<b<<c1<<d;
return 0;
}
(时间紧只打了大概,格式可以上考场在修改)
注意:
用while,结束条件为输入的字符为‘\n’
输入时用getchar函数,不要用cin,cin输入不了空格
这行代码要格外注意不要出错!
while((c=getchar())!='\n')
2、整数的逆位输出(<5位)(易)
【问题描述】给一个不多于5位的正整数,要求:(1)求出它是几位数;(2)分别打印出每一位数字;(3)按逆序打印出各位数字,例如原数为321,应输出123.
【输入形式】根据系统提示,输入一个不多于5位的正整数。
【输出形式】输出它是几位数、分别输出每一位数字、按逆序输出各位数字。
【样例输入】
564
【样例输出】
enter an integer(0~99999):
place=3
original order:5,6,4
reverse order:465
【样例说明】根据系统提示,输入一个不多于5位的正整数。输出它是几位数、分别输出每一位数字、按逆序输出各位数字。
【评分标准】 结果完全正确得15分,每个测试点5分。提交程序名为:xt3-12.c或xt3-12.cpp
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
int t;
for(int i=0;i<5;i++)
{
t=a%10;
cout<<t<<endl;
a=a/10;
if(a/10==0)
{
cout<<a;
break;}
}
return 0;
}
3、输出成绩等级(太易)
【问题描述】给出一个百分制的成绩,要求输入成绩等级‘A’‘B’‘C’‘D’‘E’。90分以上为‘A’,80-89分为‘B’,70-79分为‘C’,60-69分为‘D’,60分以下为‘E’。如果输入的分数没有在0~100以内,提示“data error,enter data again.”。
【输入形式】根据系统提示,输入学生的分数。
【输出形式】输出学生的分数和等级。
【样例输入】
88.2
【样例输出】
please enter score of student:
score is 88.2, grade is B
【样例说明】根据系统提示,输入学生的分数。输出学生的分数和等级。
【评分标准】 结果完全正确得15分,每个测试点5分。提交程序名为:xt3-11.c或xt3-11.cpp
if,if else的应用,很简单,不写也罢
4、求函数值(太易)
编写一程序,输入x,输出y的值。
【一个分段函数.JPG】
【输入形式】根据系统提示,输入x。
【输出形式】输出x的值和函数y的值。
【样例输入】
10
【样例输出】
enter x:
x=10, y=3*x-11=19
【样例说明】根据系统提示,输入x。输出x的值和函数y的值。
【评分标准】 结果完全正确得15分,每个测试点5分。提交程序名为:xt3-10.c或xt3-10.cpp
第二次实验
1、回文数(太易)
【问题描述】一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
【输入形式】12321回车
【输出形式】
【样例输入】78987
【样例输出】this number is a hui wen
【样例说明】
【评分标准】10分
解略
2、寻找最大最小整数(易)
【问题描述】编写一个程序,用户输入若干整数,试找出其中的最大数和最小数。
【输入形式】用户在第一行待输入数据个数,在第二行输入数据。
【输出形式】程序在下一行输出数据的最大值和最小值
【样例输入】
5
89 62 96 74 52
【样例输出】
96 52
【样例说明】用户第一次输入的为数据个数,在下一行依次输入数据。输出为5个数中的最大值和最小值,输出时候两个数之间用空格分隔。
【评分标准】 结果完全正确得10分,每个测试点2分。提交程序名为:getmaxandmin.c或getmaxandmin.cpp
图方便用的STL,不知道考试时行不行,应该可以吧
#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
int main()
{
deque<int>d1;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
d1.push_back(x);
}
sort(d1.begin(),d1.end());
cout<<d1[0]<<" "<<d1[n-1];
return 0;
}
用数组做也是可以的,但要注意把多余的元素赋一个很小很小的值
第三次实验
1、银行本息计算 (太易)
【问题描述】已知银行整存整取存款不同期限的月息利率分别为:
0.315% 期限一年
0.330% 期限二年
0.345% 期限三年
0.375% 期限五年
0.420% 期限八年
(其他情况认为利率为零)要求输入存钱的本金和期限,求到期时能从银行得到的利息与本金的合计。
【输入形式】用户依次存钱的本金和期限。
【输出形式】程序在下一行输出从银行得到的利息与本金的合计。
【样例输入】
120000 3
【样例输出】
Total=134904
【样例说明】用户依次存钱的本金和期限。输出为从银行得到的利息与本金的合计。
【评分标准】 结果完全正确得10分,每个测试点2分。提交程序名为:deposit.c或deposit.cpp
注:这是一道很长知识的题哈哈哈,第一次做的时候错在了没有生活经验上
解略
2、简单的计算器程序(太易)
【问题描述】编写一个简单计算器程序,输入格式为:data1 op data2。其中data1和data2是参加运算的两个数,op为运算符,它的取值只能是+、-、*、/。
【输入形式】用户依次输入data1、op 和data2分别对应的值。
【输出形式】程序在下一行输出运算形式及运算结果。
【样例输入】
5 * 3
【样例输出】
5*3=15
【样例说明】用户依次输入data1、op 和data2分别对应的值。输出为运算形式及运算结果。
【评分标准】 结果完全正确得10分,每个测试点2分。提交程序名为:counter.c或counter.cpp
解略
第四次实验
1.评委打分(中)
【问题描述】当前许多歌手大奖赛评分时,为了体现公平,在评委给出分数后统计平均得分时,都会去掉最高分和最低分。编写程序,读入评委打分(分数都是整数,评委人数大于等于5,小于等于50),去掉两个最高分和两个最低分,计算并输出平均得分(小数点后保留两位有效数字)。
【输入形式】从控制台输入评委人数,然后在下一行输入评委的打分(以一个空格分隔的整数)。
【输出形式】输出平均得分(小数点后保留两位有效数字)。
【样例输入】
15
90 98 99 100 92 97 98 95 91 90 100 92 93 98 90
【样例输出】
Please enter the number of judges:
Please enter the scores given by the judges:
Average score:94.82
【样例说明】输入评委打分有15个,去掉两个最高分100和100,两个最低分90和90,计算平均得分为:94.82。
【评分标准】 要求输出平均得分,共有5个测试点,提交程序文件名为:pingwei.c或pingwei.cpp
想了很久也不是很明白数组怎么做比较简单,又是用STL做的
#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
int main()
{
deque<int>d1;
int n;
int total=0;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
d1.push_back(x);
}
sort(d1.begin(),d1.end());
//cout<<d1[0]<<" "<<d1[n-1];
d1.pop_back();
d1.pop_back();
d1.pop_front();
d1.pop_front();
for(int j=0;j<n-4;j++)
{
total=+d1[j];
}
int t2=total/(n-4);
cout<<t2;
return 0;
}
2、韩信点兵(易)
【问题描述】相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件结束为止。
【输入形式】用户输入表示每种队形排尾的人数a,b,c(a<3,b<5,c<7),输入到文件结束为止。
【输出形式】输出总人数的最小值(或报告无解)。
【样例输入】
2 4 6
1 1 1
1 4 5
1 3 1
【样例输出】
Case 1: No answer
Case 2: No answer
Case 3: 19
Case 4: 43
【样例说明】用户输入表示每种队形排尾的人数a,b,c(a<3,b<5,c<7)。输出总人数的最小值(或报告无解)。
【评分标准】 结果完全正确得10分,每个测试点5分。提交程序名为:hanxin.c或hanxin.cpp
#include<iostream>
using namespace std;
int main()
{
int a,b,c,d;
cin>>a>>b>>c;
for(int i=10;i<=100;i++)
{
d=i;
if(d%3==a&&d%5==b&&d%7==c)
{
cout<<d<<endl;
break;
}
if(i==100)
cout<<"no answer";
}
return 0;
}
3、拍桌子(易)(输出格式)
【问题描述】输入一个100以内的数字n,从1开始数到数字n,如果数字个位含有7,或者十位含有7,或者该数字是7的倍数,打印敲桌子,其余数字直接打印输出(输出要求左对齐,每个数据占20列宽度,且每输出5个数据换行)。
【输入形式】从控制台输入一个100以内的数字n。
【输出形式】如果数字个位含有7,或者十位含有7,或者该数字是7的倍数,打印敲桌子,其余数字直接打印输出(输出要求左对齐,每个数据占20列宽度,且每输出5个数据换行)。
【样例输入】
20
【样例输出】
Please enter an ending number within 100:
1 2 3 4 5
6 knock the table 8 9 10
11 12 13 knock the table 15
16 knock the table 18 19 20
【样例说明】输入20,则从1开始数到20,遇到7、14、17打印敲桌子,其他数字直接输出。
【评分标准】 要求按正确格式输出,共有5个测试点,提交程序文件名为:qiaozhuozi.c或qiaozhuozi.cpp
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n;
cout<<"Please enter an ending number within 100:"<<endl;
cin>>n;
for(int i=1;i<=n;i++)
{
//for(int j=1;j<=n;j++){
if(i%10==7||i==7)
{
cout<<setiosflags(ios::left);
cout<<setfill(' ')<<setw(20)<<"knock the table";
}
else if(i>10&&i%7==0)
{
cout<<setiosflags(ios::left);
cout<<setfill(' ')<<setw(20)<<"knock the table";
}
else
{
cout<<setiosflags(ios::left);
cout<<setw(20)<<i;
}
if(i%5==0&&i>=5)
cout<<endl;
//}
}
return 0;
}
输出格式要背!不然考试格式错误就没法满分啦
第五次实验
1、打印日历(难)
真说难其实也就那样,但数很大而且错误不太好找
【问题描述】已知:公元1年1月1日是星期一,根据输入的年份和月份来输出该年月的日历。如下图所示
上图中每个星期几占5个字节,右对齐,由于简写显示本身就占3个字节,所以只需要在简写前面多输出两个空格就好了。每个日期数字占5个字节,也是右对齐,这样能使输出的日历上下对齐。
1、定义函数leapYear:判断闰年;
2、定义函数whatDay:计算某年某月的1号是星期几;
3、定义函数printMonth:按要求的格式打印某年某月的日历。
【输入形式】输入所要打印的年份和月份。
【输出形式】输出该年月的日历,其中每个星期几占5个字节,右对齐,由于简写显示本身就占3个字节,所以只需要在简写前面多输出两个空格就好了。每个日期数字占5个字节,也是右对齐,这样能使输出的日历上下对齐。
【样例输入】
2020 4
【样例输出】
Please enter the year and month:
【样例说明】用户输入所要打印的年份和月份。输出该年月的日历,其中每个星期几占5个字节,右对齐,由于简写显示本身就占3个字节,所以只需要在简写前面多输出两个空格就好了。每个日期数字占5个字节,也是右对齐,这样能使输出的日历上下对齐。
【评分标准】 结果完全正确得20分,每个测试点4分。提交程序名为:calendar.c或calendar.cpp
#include<iostream>
#include<iomanip>
using namespace std;
bool leapYear(int year)
{
bool a;
if(year%4==0&&year%100!=0||year%400==0)
{
a=true;
return a;
}
else
{
a=false;
return a;
}
}
int YearDays(int year)
{
int yearday;
if(leapYear(year))
{
yearday=366;
}
else
{
yearday=365;
}
return yearday;
}
int MonthDays(int monthnum,int year){
int monthday;
switch(monthnum)
{
case 4:
case 6:
case 9:
case 11:
//monthday=30;
return 30;
case 2:
if(leapYear(year))
{
//monthday=29;
return 29;
}
else
{
//monthday=28;
return 28;
}
default:
return 31;
}
}
int TotalDays(int year,int monthnum)
{
long int totalday;
int day1=0;
int day2=0;
for(int i=1;i<year;i++)
{
day1+=YearDays(i);
}
for(int j=1;j<monthnum;j++)
{
day2+=MonthDays(j,year);
}
totalday=day1+day2;
return totalday;
}
int main()
{
int year;
int monthnum;
cout<<"Please enter the year and month:"<<endl;
cin>>year>>monthnum;
cout<<" Mon Tue Wed Thu Fri Sat Sun"<<endl;
int week;
long int totalday=TotalDays(year,monthnum);
week=totalday%7;
//if(week==0)
//week=0;
for(int i=0;i<week;i++)
{
cout<<" ";
}
int monthday=MonthDays(monthnum,year);
for(int j=1;j<=monthday;j++)
{
cout<<setiosflags(ios::right)<<setw(5)<<j;
if((totalday+j)%7==0)
{
cout<<endl;
}
}
cout<<endl;
return 0;
}
思路:
1.判断闰年
返回值为布尔型
(后面if(yearday(a))直接判断ture or false)
注意判断条件的写法:不等于是!=0
2.得出年份天数
return值为年份天数
3.判断并得月天数
可以用switch case,也可以用if
注意switch语法!
switch(monthnum)
{ //!!!!!花括号!
case 4: //后面是冒号
case 6:
case 9:
case 11:
return 30;
case 2: //case2后面有判断闰年的if
if(leapYear(year))
{
return 29;
}
else
{
return 28;
}
default: //default不要忘了!!!!!
return 31;
}
4.计算总天数
分成年 月 两部分
for循环
注意:年月从1开始for(int i=1;...;...)
5.计算每个月的第一天是星期几
long int totalday=TotalDays(year,monthnum);
week=totalday%7; //总天数%7得这月一号是周几
for(int i=0;i<week;i++) //周几就在前面打n-1的空格
{
cout<<" ";
}
6.输出格式(遇到周日换行)
int monthday=MonthDays(monthnum,year);
for(int j=1;j<=monthday;j++) //输出日期数字啦
{ //=
cout<<setiosflags(ios::right)<<setw(5)<<j; //输出格式右对齐5字节
if((totalday+j)%7==0) //遇到周日换行
{
cout<<endl;
}
}
2、登月纸桥(中)
其实也不难,只是我第一遍怎么也做不对
【问题描述】已知:月球离地球最近距离(近地点)为363300千米,最远距离(远地点)为405500千米,一张纸的厚度一般为0.088到0.114毫米。
编写一个foldTimes函数,计算需要把纸折叠多少次(假设纸张足够大,可以无限次折叠),其厚度才能搭建一座登月纸桥,考虑到将来需要到更远的星球,所以函数需要根据具体距离计算纸张折叠的次数并返回。
【输入形式】输入星际距离(单位千米)和纸张厚度(单位毫米)。
【输出形式】输出需要折叠的次数。
【样例输入】
363300 0.088
【样例输出】
Please enter the interstellar distance and paper thickness:
Need to fold 42 times!
【样例说明】用户输入星际距离(单位千米)和纸张厚度(单位毫米)。输出需要折叠多少次,其厚度才能搭建一座登月纸桥。
【评分标准】 结果完全正确得10分,每个测试点2分。提交程序名为:moon_landing.c或moon_landing.cpp
#include <iostream>
using namespace std;
int times(double dis,double thick);
int main(){
cout<<"Please enter the interstellar distance and paper thickness:"<<endl;
double dis,thick;
cin>>dis>>thick;
cout<<"Need to fold "<<times(dis,thick)<<" times!"<<endl;
return 0;
}
int times(double dis,double thick)
{
int sum=0;
dis=1000000*dis; //统一单位为mm;1000(m) 00(cm) 0(mm)
while(thick<dis){
thick*=2; //不断*2
sum++;} //折叠次数+1
return sum;
}
下面这个也行哈
#include<iostream>
using namespace std;
int main()
{
double a=0.088;
double b=363300000000;
int i,t;
t=0;
for(i=1;;i++)
{
a*=2;
t++;
if(a>b)
break;
}
cout<<t;
return 0;
}
3、斐波那契数列(中)
【问题描述】已知:斐波那契级数模型的特点是
1,1,2,3,5,8,13,21,34,55,89,144,233……
特点是前面相邻两项之和,构成了后一项。请用递归的方法编写函数求Fibonacci级数。
【输入形式】输入要求斐波那契级数的第几项。
【输出形式】输出该项的值。
【样例输入】
20
【样例输出】
Please enter the item of Fibonacci sequence required:
The value of the 20 item of the sequence is: 6765
【样例说明】用户输入要求斐波那契级数的第20项。输出第20项的值是172。
【评分标准】 结果完全正确得10分,每个测试点2分。提交程序名为:fibonacci.c或fibonacci.cpp
#include<iostream>
using namespace std;
int F(int n) //利用return递归
{
if(n==1||n==2) //n=1或n=2时F=1
{
return 1;
}
else{
return F(n-1)+F(n-2);
}
}
int main()
{
int n;
cin>>n;
cout<<F(n);
return 0;
}
4、整数顺位输出(中)
【问题描述】请采用递归函数实现:输入一个正整数,然后把该整数的每一位数字从高位到低位顺序输出,每个数字占一行。
【输入形式】输入一个正整数。
【输出形式】输出该整数的每一位数字从高位到低位顺序输出,每个数字占一行。
【样例输入】
12345
【样例输出】
Please enter a positive integer:
The sequential output from high to low is:
1
2
3
4
5
【样例说明】提示用户输入一个正整数。从高位到低位顺序输出该正整数的每一位数字,每个数字占一行。
【评分标准】 结果完全正确得10分,每个测试点2分。提交程序名为:int_dec.c或int_dec.cpp
#include<stdio.h>
void Print(int n)
{
if(n>9)
{
Print(n/10);
}
printf("%d ",n%10);
}
int main()
{
int n;
scanf("%d",&n);
Print(n);
return 0;
}