《c++程序设计》课程设计报告
班级:数学四班 学号:2018212826
报告人姓名:徐天娇
实验地点: 教学楼414
完成起止日期:2019/1/2——2019/1/5
一、03 Problem C
1、简要题意:求n个整数中所有奇数的乘积。
2、解题思路:输入n个数,用if语句判断n中的奇数,求所有奇数乘积,输出。
3、源代码:
#include<iostream>
using namespace std;
int main()
{
int n,i,a,x;
while(cin>>n) // 多组输入
{
x=1;
for(i=0;i<n;i++)
{
cin>>a;
if(a%2!=0) //判断是否为奇数
x=x*a;
}
cout<<x<<endl;
}
return 0;
}
二、05 Problem E
1、简要题意: 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...求出该多项式的前n项的和。
2、解题思路: 根据题意不难看出1/奇数都为正,1/偶数都为负数。可以用for循环分别将n个数中1/奇数和1/偶数求和,再相减,得到结果,输出。
3、源代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
double m,n,i,k,j,s,t,sum;
cin>>m;
for(i=1;i<=m;i++)
{
cin>>n;
s=0;t=0;
for(k=1;k<=n;k+=2)
{
s+=1/k;//奇数项加和
}
for(j=2;j<=n;j+=2)
{
t+=1/j;//偶数项加和
}
sum=s-t;
printf("%.2lf\n",sum);//输出结果保留两位小数
}
return 0;
}
三、07 Problem G
1、简要题意:去掉最高分和最低分,计算平均得分。
2、解题思路: 先建立数组输入所有打分情况,利用sort排序,将第一项和最后一项去掉,加和除以总数-2,得到结果,输出。
3、源代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
int i,a[101],n;
double s,t;
while(cin>>n)//多组输入
{
t=0;s=0;
for(i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);//将得分情况排序
for(i=1;i<n-1;i++)
{
s+=a[i];
}
t=s/(n-2);//别忘记此时以去掉最高低分,除以n-2
printf("%.2lf\n",t);//结果保留两位小数
}
return 0;
}
4、注意细节:sort排序之后的for循环应去掉第一项和最后一项;结果保留两位小数。
四、08 Problem H
1、简要题意:有一头母牛每年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。第n年有多少头母牛?
2、解题思路: 根据递推运算,建立数组,利用while循环for循环求出结果,输出。
3、源代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int i,n,a[1000];
while(cin>>n&&n!=0)//n不等于0
{
a[1]=1;
a[2]=2;
a[3]=3;
for(i=4;i<=n;i++)
a[i]=a[i-1]+a[i-3];//递推运算
cout<<a[n]<<endl;
}
return 0;
}
五、09 Problem I
1、简要题意:输入n个数,按绝对值从大到小排序后输出。保证对于每一个测试实例,所有的数的绝对值都不相等。
2、解题思路:建立数组a[ ]、b[ ],调用cmath数据库令b[i]=abs(a[i])。利用swap对b[i]排序,排序后输出。
3、源代码:
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
int n,i,j,a[1001],b[1001];
while(cin>>n&&n!=0)//n不等于0
{
for(i=1;i<=n;i++)
{
cin>>a[i];
b[i]=abs(a[i]);//需调用cmath数据库
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(b[i]>b[j])
{
swap(b[j],b[i]);//对b[i]排序
swap(a[j],a[i]);
}
}
}
for(i=1;i<n;i++)
cout<<a[i]<<" ";//前n-1项后都有空格
cout<<a[n]<<endl;
}
return 0;
}
4、注意细节:swap需调用iomanip数据库;输出格式最后一个数后无空格,需单独输出。
六、10 Problem J
1、简要题意:按从小到大顺序排列好的一组数,现另给一整数x,将该数插入到序列中,并使新的序列仍有序。
2、解题思路:建立数组a[i],输入所给的一组数,再将另给的m插入数组,利用sort语句对所有数据进行排序,输出结果时注意题目所给格式,除去最后一个数,其余的数都要在后面输出一个空格。
3、源代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int i,m,n,a[101];
while(cin>>n>>m&&(n!=0&&m!=0))//m,n不等于0
{
for(i=1;i<=n;i++)
{
cin>>a[i];
}
a[0]=m;//将m插入数组中
sort(a,a+n);//对所有数据进行排序
for(i=0;i<=n-1;i++)
cout<<a[i]<<" ";//输出前n-1个数带空格
cout<<a[n]<<endl;
}
return 0;
}
七、14 Problem L
1、简要题意: 求时间加和。
2、解题思路: 根据时间运算规则,60进1。先输入要加和的时间,if先判断秒是否到60,再判断分是否到60,根据运算规则求出最终结果。
3、源代码:
#include<iostream>
using namespace std;
int main()
{
int n,a,b,c,d,e,f,s,t,r;
while(cin>>n)
for(int i=1;i<=n;i++)
{
cin>>a>>b>>c>>d>>e>>f;
s=a+d;t=b+e;r=c+f;
if(c+f>=60)//判断秒是否向分进1
{
t=b+e+1;
r=c+f-60;
}
if(t>=60)// 判断分是否向时进1
{
t=b+e+1-60;
s=a+d+1;
}
cout<<s<<" "<<t<<" "<<r<<endl;//输出注意格式
}
return 0;
}
4、注意细节:输出格式加空格,换行。
八、17 Problem Q
1、简要题意:判断给定的两个数是否是亲和数。
2、解题思路: 输入两个个数,for循环分别找到其所有真约数并加和,if语句判断所得加和与另外一个数是否相同,若相同输出yes,否则,输出no。
3、源代码:
#include<iostream>
using namespace std;
int main()
{
int n,a,b,i,j,s=0,t=0,k;
while(cin>>n)
{
for(k=1;k<=n;k++)
{
s=0;t=0;
cin>>a>>b;
for(i=1;i<a;i++)
{
if(a%i==0)//判断是否为其真约数
s+=i;//对所有真约数求和
}
for(j=1;j<b;j++)
{
if(b%j==0)//判断是否为真约数
t+=j;//对所有真约数求和
}
if((s==b)&&(t==a))//判断满足条件
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
4、注意细节:判断满足条件时两个条件都须满足。
九、01 Problem A
1、简要题意:输入一个百分制的成绩t,将其转换成对应的等级,转换规则:90~100为A;80~89为B;70~79为C;60~69为D;0~59为E;
2、解题思路: while循环输出多组数据,用if语句分别判断各对应等级, 对于不在范围内的输出Score is error!
3、源代码:
#include<iostream>
using namespace std;
int main()
{
int t;
while(cin>>t)
{
if((t>=90)&&(t<=100))
cout<<"A"<<endl;
else if((t>=80)&&(t<=89))
cout<<"B"<<endl;
else if((t>=70)&&(t<=79))
cout<<"C"<<endl;
else if((t>=60)&&(t<=69))
cout<<"D"<<endl;
else if((t>=0)&&(t>=59))
cout<<"E"<<endl;
else if((t>100)&&(t<0))
cout<<"Score is error!"<<endl;}
return 0;
}
十、05 Problem 2E
1、简要题意:对于任意偶数,拆成两个不同的素数,求有几种拆法。
2、解题思路:函数求解,写一个判断素数的函数,在主函数中调用两次,若i和n-i都成立,结果加一。
3、源代码:
#include<stdio.h>
#include<math.h>
int prime(int m);
int main (void)
{
int n,i,a;
while(scanf("%d",&n),n!=0)
{
a=0;
for(i=3;i<n/2;i++)
{
if(prime(i)!=0)//找出可拆出的两个素数中较小的数
{
if(prime(n-i)!=0)//若n-i的值也为素数,结果加一
a++;
}
}
printf("%d\n",a);
}
return 0;
}
int prime(int m)//判断素数
{
int i,k;
if(m==1)
return 0;
k=(int)sqrt(m);
for(i=2;i<=k;i++)
{
if(m%i==0)
return 0;
}
return 1;
}
十一、07 Problem 2G
1、简要题意:二个整数,加起来等于某个整数,乘起来又等于另一个整数,判断有还是没有这种整数。
2、解题思路:要满足 x+y=n 且 x*y=m 这时候解方程组利用△判断有无解即可
3、源代码:
#include <cstdio>
#include <cmath>//求平方根sqrt需调用cmath数据库
#include <iostream>
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;//如果两个数都为0,跳出
if((int)sqrt(n*n-4*m)==sqrt(n*n-4*m))// 利用△判断有无解
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
十二、21 Problem U
1、简要题意:找出11位手机号的6位短号。
2、解题思路:建立一个12位字符串数组,从第七位开始把后5位输出,前加6,输出结果。
3、源代码:
#include<iostream>
using namespace std;
int main()
{
int n;
char a[12];
cin>>n;
while(n--)//直至n=0,循环结束
{
for(int i=1;i<=11;i++)
cin>>a[i];
cout<<6;
for(int i=7;i<=11;i++)//提出后五位
cout<<a[i];
cout<<endl;//注意输出格式,换行!
}
return 0;
}
十三、03 Problem 2C
1、简要题意:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
2、解题思路:使用余弦定理来求解,对于边长为a、b、c而相应角为A、B、C的三角形,有:a² = b² + c²- 2bc·cosA
3、源代码:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
int n;
double PI=3.1415926;//定义PI
double x1,x2,y1,y2,a,b,c,result;
cin>>n;
while(n--)//多组输出;直到n=0,循环终止
{
cin>>x1>>y1>>x2>>y2;
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
b=sqrt(x1*x1+y1*y1);
c=sqrt(x2*x2+y2*y2);//求平方根
double g=(b*b+c*c-a*a)/(2*b*c);
result=acos(g);
printf("%.2lf\n",result*180.00/PI);//结果保留两位小数
}
}
十四、22 Problem V
1、简要题意: 有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).若给出A0, An+1, 和 C1, C2, .....Cn.请编程计算A1 = ?
2、解题思路:一道纯规律的题目
不难发现
n = 1时,有 a1 = a0/2 + a2/2 - c1
n = 2时,有 3/2*a1 = a0 + a3/2 - 2*c2 - c1
n = 3时,有 2*a1 = 3*a0/2 + a4/2 - 3*c3 - 2*c2 - c1
所以得出
n = k 时,有 (n+1)/2 * a1 = (n/2)*a0 + a(n+1)/2 - n*cn - …-2*c2 -
3、源代码:
#include <stdio.h>
int main()
{
int n,i; double a0,an,c[3005];
while(scanf("%d",&n))
{
scanf("%lf%lf",&a0,&an);
for(i = 1;i<=n;i++)
scanf("%lf",&c[i]);
double ans,t = 0;
for(i = 1;i<=n;i++)
{
t = t+(n-i+1)*c[i];//由公式递推
}
ans = a0*(0.5*n)+an/2.0-t;
ans/=(0.5*(n+1));
printf("%.2lf\n",ans);//输出结果保留两位小数
}
return 0;
}
十五、24 Problem X
1、简要题意:输出一个精度为角的菜价总量。
2、解题思路: 题目说是要求多组数据,但是却没有给出每组数据结束标志,到最后其实就是EOF结束就可以了。然后四舍五入直接%.1lf输出就OK了。C语言在控制输出的时候自动四舍五入了。
3、源代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string a;
double sum,num,cost;
sum = 0;
while(cin >> a >> num >> cost)//输出多组数据
{
sum += (num*cost);
}
printf("%.1lf\n",sum);//保留一位小数
return 0;
}
总结
通过这一学期对c语言程序设计的学习,让我加深了对C语言的了解,而不只是单单的在课本中学到的那些理论,平时乏味的课程,通过自己动手亲自编写,变的生动有趣,而在自己动手的过程中,出现的问题很多,比理论要难的多,当一个程序写完以后,经常会有很多错误而没法解决。不过,通过这最后几天的课程设计,逐渐积攒了一些经验,有些错误可以很快就看出来。
这次课程设计有很大的收获,让我对C语言有了更深的认识,平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。如果是一个程序写完一处错误也没有,会有种成就感,于是兴趣就来了,兴趣来了,自然学的东西也就多了,能把理论变成实际的技能,让我对C语言有了浓厚的兴趣和更深层的认识。
C语言是一个有序的学习,学了最基本的替换,然后扩展到循环,嵌套,条理很清楚,不是一个零散的知识,实际上所有的课程都如此,不过通过课程设计我也知道了自己的不足,存在的很多问题。
比如自己写的写的小程序出了问题,不会解决了就叫同学帮忙,虽然说一定意义上增加了与同学之间的感情,但是会养成一种依赖的心理,碰到问题了个想到的是求助而不是自己独立解决,所以以后要多多锻炼自己的信心和增加自己的能力,争取做到老师不在身边的时候也可以完成一些简单的程序编写与错误排除。
还有自己的基础知识不扎实,遇到的问题,没有很好的逻辑思维,亲自编写一个陌生的程序的时候会有种无法下手的感觉,找不到突破口。通过实训,逐渐理清了顺序,对于简单的程序和一些相对比较繁琐的嵌套,循环,不在是看着一头雾水。其实只要理清了思路,把基础知识掌握了,然后有条不紊的分析,一步一步理解,C语言还是很有意思的课程。
自己亲自动手编写程序让我增加了对C语言程序开发环境的了解,在上课的时候老师就讲,学习C语言最重要的是学习C语言的逻辑思维,不管以后从事什么行业,学习C语言都对自己的职业很有帮助,如果是从事编程工程工作的话,就更有帮助了,即使以后的编程工作可能不用C语言,但是拥有扎实的C语言基础是对工作很有用的。
当初在初步接触C语言的时候,看着一堆“奇形怪状”的符号,觉得甚是无聊,通过这次实训,摆脱了那种似懂非懂的状态!
感谢学校安排这次课程设计,让我学到了很多知识,在学知识的同时,也增加了同学老师之间的感情。希望以后还会有更多类似的课程,在有限的大学时间内学到更多的实用技能,为以后的工作打下一个良好的基础。