概述
《c++程序设计》课程设计报告
班级:______数学类4班____________学号:_2018212761____
报告人姓名:___赵景乐________
实验地点: _______山东农业大学东校区教学楼414________
完成起止日期: __2019年1月1日至2019年1月4日__
- 概要
经过一个学期的C语言学习,现在已经能初步掌握C++程序的编写,应对一些不同的问题。在这里将整理一些做过的题目并列出其题目大意、解题思路、注意事项,并附带上原代码。
- 十五道题目
1、吃桃
题目:每天吃掉一半多一个的桃子,给出吃剩下1个桃子的天数,求桃子的个数。
思路:可以从结果反推桃子的个数。
注意:多组数据。
代码:
#include<iostream>
using namespace std;
int main()
{ int n,k,i;
while(cin>>n)
{
k=1;//余下1个//
for(i=1;i<=n-1;i++)
{
k=(k+1)*2;
}//注意天数与循环的差别//
cout<<k<<endl;
}
return 0;
}
2、末二位数
题目:一不知道末二位数的整数,但已知其能被另一数整除,求所有满足条件的末二位数。
思路:循环寻找。
注意:对同一组数据在一行输出结果,不同组在不同行,输入0 0表示结束。
代码:
#include<iostream>
using namespace std;
int main()
{
int n,m,i,k;
int a[100000];
while(cin>>n>>m)
{
k=1;
if(n==0&&m==0) break;
for(i=0;i<=99;i++)
{
if((n*100+i)%m==0)
{
a[k]=i;
k++;
}
}//将满足条件的末二位数保存,并记录个数//
for(i=1;i<=k-2;i++)
{
if(a[i]<=9) cout<<0<<a[i]<<" ";
else cout<<a[i]<<" ";
}
if(a[k-1]<=9) cout<<0<<a[k-1]<<endl;//控制空格//
else cout<<a[k-1]<<endl;
}
}
3、三角型图形
题意:给一整数和一字符,输出一个等边三角形。
思路:循环控制输出,设置变量控制空格。
注意:三角形右侧不含有空格,字符@表示结束。
代码:
#include<iostream>
using namespace std;
int main()
{
char a;int n,i,j,flag=0;
while(cin>>a>>n)
{
if(a=='@') break;
if(flag)
cout<<endl;//每个图形中间输出换行//
flag=1;
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n+i-1;j++)
{
if(j==n-i+1||j==n-1+i)
cout<<a;
else cout<<" ";
}
cout<<endl;
}//用n+i-1控制j,去掉多余空格//
for(j=1;j<=2*n-1;j++)
cout<<a;
cout<<endl;
}
}
4、sky数
题目:一个4位数其十进制,十二进制,十六进制各位数之和都为相同的数,则其位sky数,判断一个4位数是否是sky数。
思路:进制转换并判断。
注意:要满足3个条件,任一不满足都不行,输入0表示结束。
代码:
#include<iostream>
using namespace std;
int main()
{
int n,m,r, a,b,c,d, x,y,z;
while(cin>>n)
{
if(n==0) break;
m=n;
x=0;y=0;z=0;
a=n%10;
b=(n%100)/10;
d=n/1000;
c=n/100-d*10;
x=a+b+c+d;//十进制//
while(n)
{
r=n%12;
n=n/12;
y+=r;
}//十二进制//
n=m;
while(n)
{
r=n%16;
n=n/16;
z+=r;
}//十六进制//
if(x==y&&x==z) cout<<m<<" is a Sky Number."<<endl;
else cout<<m<<" is not a Sky Number."<<endl;
}
}
5、水仙花数
题目:称一个3位数为水仙花数,若其每位数字的三次方之和为其身,求多个区间内的所有水仙花数。
思路:循环判断。
注意:正确表示区间内的循环,不能超时,从小到大排列,每组数用空格隔开,不存在水仙花数输出no。
代码:
#include<iostream>
using namespace std;
int main()
{
int a,b,c[5]={0},d[1005]={0},e,f,i,j;
while(cin>>a>>b)
{ e=0;
for(i=a;i<=b;i++)
{f=i;
for(j=1;j<=3;j++)
{c[j]=f%10;f/=10;}//取出每个数//
if(c[1]*c[1]*c[1]+c[2]*c[2]*c[2]+c[3]*c[3]*c[3]==i)
{d[e]=i;e++;}
}
if(e!=0)
{for(i=0;i<e-1;i++) cout<<d[i]<<" ";cout<<d[e-1]<<endl;}
else cout<<"no"<<endl;
}
}
6、奇数乘积
题目:多组数据,每组第一个表示本组有n个数,每组至少一个奇数,求每组所有奇数的积
思路:判断是否是奇数,再乘积。
注意:正确求出所有奇数,求和用1*a的形式。
代码:
#include<iostream>
using namespace std;
int main()
{
int a[100010]={0},b,i,n;
while(cin>>n)
{ b=1;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++) {if(a[i]%2!=0) b*=a[i];}
cout<<b<<endl;
}
}
7、多个平均值
题目:有多组数据,其都为从2开始的有序偶数(连续),每个长度为n,每m个求一个平均值,最后不足m个的也求出其平均值。
思路:判断,并用数组每m个求一个平均,最后一组特殊处理。
注意:最后一组特殊处理易出错,应用变量用循环计算满m个的偶数的平均值。
代码:
#include<iostream>
using namespace std;
int main()
{
int m,n,a,b,c,i,j,d[1010]={0};
while(cin>>n>>m)
{
for(i=1;i<=n;i++) d[i]=d[i-1]+2;//有序偶数//
a=n/m;b=n%m;//a为a组m个 偶数,b为多出来的偶数//
for(i=1;i<=a;i++)
{c=0;
for(j=(i-1)*m+1;j<=i*m;j++)
{
c+=d[j];
if(j==i*m) c/=m;
}//利用变量实现不同的循环,如先从1到m,再从m+1到2m//
if(i!=a||b!=0) cout<<c<<" ";if(i==a&&b==0) cout<<c<<endl;
}if(b!=0)
{c=0;
for(j=a*m+1;j<=n;j++)
{
c+=d[j];if(j==n) cout<<c/b<<endl;
}
}
}
}
8、母牛生小牛
题目:每个母牛每年生一头小母牛,小母牛4年后能生新的小母牛,求n年的时候有多少头母牛。
思路:找出规律求解,每年的母牛数正好的去年和大前年的母牛数之和。
注意:年份的运算,第一年有1头母牛,第二年有两头,第四年有四头,说明在第一年的时候还没开始运算,注意年份与代码中变量的联系.
代码:
#include<iostream>
using namespace std;
int main()
{
int a[60]={0},i,n;
while(cin>>n)
{
a[1]=1;a[2]=2;a[3]=3;a[4]=4;
if(n==0) break;
for(i=5;i<=n;i++)
{
a[i]=a[i-1]+a[i-3];
}cout<<a[n]<<endl;/*用求出的关系求解要比直接暴力运算好很多*/
}
}
9、进制转化
题目:输入十进制数和R,将该十进制数转化为R进制数。
思路:类似十进制转二进制,用除法的思想。
注意;R的取值为2到16,分别用A,B,C,D,E,F代表10,11,12,13,14,15,该题为多组数据的处理。
代码:
#include<iostream>
using namespace std;
int main()
{
int n,i,j,l,r,s[10010];
while(cin>>n>>r)
{
l=0;if(n<0) {n=-n;l=1;}//将所有数变为正数//
for(i=1;n>=0;i++)
{
s[i]=n%r;
if(n/r==0) {s[i]=n;n=-1;}
else n/=r;
}//类似转化二进制的运算,不过输出要逆序输出//
for(j=i-1;j>0;j--)
{
if(j==i-1&&l==1)cout<<"-";/*正负数对应有无符号,注意判断条件*/
if(s[j]<=9) cout<<s[j];
else if(s[j]==10) cout<<"A";
else if(s[j]==11) cout<<"B";
else if(s[j]==12) cout<<"C";
else if(s[j]==13) cout<<"D";
else if(s[j]==14) cout<<"E";
else if(s[j]==15) cout<<"F";
}
cout<<endl;
}
}
10、时间的和
题目:n表示有n行数据,每组数据有代表时,分,秒的共6个,2组数据,求时间的和。
思路:数组求和。
注意:分和秒的范围都是0~59。
代码:
#include<iostream>
using namespace std;
int main()
{
int n,i,j,l,r,s[100],a[100];
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=3;j++) cin>>s[j];//第一组时间//
for(j=1;j<=3;j++) cin>>a[j];//第二组时间//
for(j=3;j>=1;j--)
{
s[j]+=a[j];
if(j!=1&&s[j]>=60){s[j-1]++;s[j]-=60;}
}//满60进1//
for(j=1;j<3;j++) cout<<s[j]<<" ";cout<<s[3]<<endl;//没空格//
}
}
11、集合的查
题目:给出两个集合,n,m代表每个集合的元素的个数,求差,差以从小到大的顺序排列。
思路: 先求差,再排列。
注意:多组输入且0 0表示输入结束,差为空集输出NULL。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m,j,i,k,h,q,x;
int a[10000],b[10000];
while(cin>>n>>m)
{
if(n==0&&m==0) break;
h=0;x=0;//计数,便于之后判断输出//
for(i=1;i<=n+m;i++)
{
cin>>a[i];
}
for(i=1;i<=n;i++)
{
k=0;
for(j=n+1;j<=m+n;j++)
{
if(a[i]==a[j]){h++;break;}
else k++;
}
if(k==m) {b[x]=a[i];x++;}
}
if(x>=1)
{
sort(b,b+x);//从小到大排列差//
for(q=0;q<x;q++)
cout<<b[q]<<" ";
cout<<endl;
}
if(h==n) cout<<"NULL"<<endl;
}
}
12、蜜蜂爬行
题目:蜜蜂只能向右爬行,给出其起点和终点,判断所有可能的方式有几种。
思路:寻找规律求解。
注意:重点在起点和终点的差值上。
代码:
#include<iostream>
using namespace std;
int main()
{
int n,m,a,b,i,j;long long int s[60];
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a>>b;m=b-a+1;//求出差值//
s[2]=1;s[3]=2;
if(m>=4) for(j=4;j<=m;j++) s[j]=s[j-1]+s[j-2];//规律求解//
cout<<s[m]<<endl;
}
}
13、手机尾号
题目:给出n个11位的手机号,6+每个手机号的后5位为对应短号,求多个短号。
思路:数组直接运算。
注意:数组范围。
代码:
#include<iostream>
using namespace std;
int main()
{
int n,a,b[220];long long int f[220];
cin>>n;
for(a=1;a<=n;a++) cin>>f[a];
for(a=1;a<=n;a++)
{
b[a]=f[a]%100000;
if(b[a]==0) cout<<"600000"<<endl;
else if(b[a]<10) cout<<"60000"<<b[a]<<endl;
else if(b[a]<100) cout<<"6000"<<b[a]<<endl;
else if(b[a]<1000) cout<<"600"<<b[a]<<endl;
else if(b[a]<10000) cout<<"60"<<b[a]<<endl;
else if(b[a]<100000) cout<<"6"<<b[a]<<endl;
}
}
14、不吉利号码
题目:含有4或者连续的62的号码为不吉利号码,给出多个区间,求其中不是不吉利号码的个数。
思路:函数求不吉利号码的运算。
注意:易超时。
代码:
#include<iostream>
bool hs(int x)
{
while(x)
{
if(x%10==4||x%100==62)//判断是否含有4和62//
{
return true;
}
x/=10;
}
return false;
}
using namespace std;
int main()
{
int m,n,i,sum,num;
while(cin>>m>>n,m!=0&&n!=0)//多组输入//
{
num=0;
for(i=m;i<=n;i++)
{
if(hs(i)==true)//求不吉利号码的个数//
num++;
}
cout<< n-m+1-num <<endl;//求不是不吉利号码的个数/、
}
return 0;
}
15、龟兔赛跑
题意:该题是关于龟兔赛跑的题,给兔子恒定的初速度vr,乌龟骑电车速度是vt1,爬行的速度是vt2。在长l的赛道上有n个充电站,每一次充电可以跑c远的距离,但充一次电需要t时间,而且知道每一个充电站距离起点的距离是lj1、lj2……求兔子和乌龟谁先到终点。
细节:循环的初始值;double定义;
解题思路:将乌龟的电站看成一个个分节点,一共分成了n+1段,我们只需要求最短时间即可。分别把节点看成终点。例如第一个节点我们将所求的时间赋值给abc[1],当第二个节点时第一次判断该点到起点与c的大小.如果>=c,则求出该段时间h,并赋值到min,再从第一个节点出发,如果第二个节点到第一个节点的距离>=c,则求出时间并+t,与min进行判断取最小的赋值.如果<c则说明不需要充电求出时间。以此类推当第n+1个节点(即终点)时,求出了最短时间abc[n+1],与兔子所用的时间进行比较,便可得出结果。
源代码:
#include<iostream>
using namespace std;
int lj[1000]; //电站到起点的距离;
double abc[1000]; //起点到第k个节点的时间;
int main()
{
int l,n,c,t,vr,vt1,vt2,i,j;
double min , h;
while(cin>>l)
{
cin>>n>>c>>t;
cin>>vr>>vt1>>vt2;
for(i=1;i<=n;i++)
cin>>lj[i];
abc[0]=0;
lj[0]=0;lj[n+1]=l; //起点即lj[0]、终点即lj[n+1];
for(i=1;i<=n+1;i++)
{
min=1000000; //把min赋值成特别大的数,以便取最小值的判断;
for(j=0;j<i;j++) (//第个节点到i个节点的时间)
{
if(lj[i]-lj[j]>=c)
h=abc[j]+1.0*c/vt1+1.0*(lj[i]-lj[j]-c)/vt2;
else
h=abc[j]+1.0*(lj[i]-lj[j])/vt1;
if(j>0)
h+=t;
if(h<min)
min=h;
}
abc[i]=min; //起点到第i个的时间;
}
double tz; //兔子所用的时间;
tz=1.0*l/vr;
if(abc[n+1]<tz) //判断时间的大小;
cout<<"What a pity rabbit!"<<endl;
else
cout<<"Good job,rabbit!"<<endl;
}
return 0;
}
三,总结
在解决问题时,应先理清思路,注意细节编写代码,在代码出现问题时,可在重要的步骤中添加输出,分析是哪一步出现错误,若是有超时的情况,尽量简化代码运算步骤,上网查询别人的代码借鉴一下思路,如第15题,若是将小于c的小区间合并,再分别判断最短用时,对大部分的情况都是可以满足的,但并不意味这没有错误。又如倒序输出一段数,若是依照一般的想法,求出每一位数再输出,将会非常麻烦,但运用循环只需要除10和余10两个代码循环就能完成。借鉴不意味着抄袭,借鉴的是思路,并不是说复制下来代码就会做相应的题目。C语言的学习在一点点累积,在解决题目时多思考,不需要大量背诵和死记硬背。C语言的学习还在进行中,之后还会再学习函数,指针等,还需要继续努力。
最后
以上就是激动书包为你收集整理的《c++程序设计》课程设计报告 《c++程序设计》课程设计报告的全部内容,希望文章能够帮你解决《c++程序设计》课程设计报告 《c++程序设计》课程设计报告所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复