《c++程序设计》课程设计报告
班级:数学四班__
学号:2018212720___
报告人姓名:柳思思
实验地点:山东农业大学东校区教学楼414
完成起止日期: 2019.1.1-2019.1.3___
1. ProblemA
1. 简要题意:输入一个百分制的成绩t,将其转换成对应的等级
2. 解题思路:先定义成绩score,然后用if,else if 表示
3. 源代码:
#include
#include
using namespace std;
int main()
{
int score;
//定义成绩
while(cin>>score)
if (score>=90 && score <= 100) //90-100:A
printf(“A\n”);
else if
(score>=80 && score < 90)//80-90:B
printf(“B\n”);
else if
(score>=70 && score < 80)//70-80:C
printf(“C\n”);
else if
(score>=60 && score < 70)//60-70:D
printf(“D\n”);
else if
(score>=0 && score < 60)//0-60:E
printf(“E\n”);
else printf(“Score is error!\n”);
return 0;
}
2. ProblemB
1. 简要题意:输入n, m代表区间范围,输出区间内所有的水仙花数(“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身),并且将数从大到小输出。如果给定的范围内不存在水仙花数,则输出no。
2. 解题思路:(1)先将给定区间数的个十百位分离,找出所有符合题意的数。(2)将符合条件的数存入一数组中,按照条件输出。
3. 源代码:
#include
#include
using namespace std;
int p[901];
int main()
{
int b=0,c=0,d=0,m,n,s=0;//定义b:百位数,c:十位数,d个位数,s:水仙花数,在(m,n)的范围内。
while(cin>>m>>n)
{
s=0;
for(int a=m;a<=n;a++)//(初始,增值,循环)
{
b=a/100;//计算百位数
c=a/10%10;//计算十位数
d=a%10;//计算个位数
if(a==bbb+ccc+ddd)p[++s]=a;
}
if(s==0)cout<<“no”<<endl;
//在范围内不存在的是NO
else
for(int i=1;i<=s;i++){
if
(i==s)cout<<p[i]<<endl;//如果符合要求就输出
else cout<<p[i]<<"
";
}
}
return 0;
}
3. ProblemC
1. 简要题意: 给你n个整数,求他们中所有奇数的乘积。
2. 解题思路:用累乘的方法求乘积,选出其中是奇数的数,进行累乘,最后输出结果
3. 源代码:
#include
#include
using
namespace std;
int main()
{
int i,n,sum,p;
while(cin>>n)
{
sum=1;//累乘的初始化是1,累加的初始化是0.
for(i=0;i<n;i++)
{
scanf("%d",&p);
if(p%2==1) //如果是奇数,就乘进去
sum*=p;
}
printf("%d\n",sum);//输出
}
return 0;
}
4. ProblemF
1. 简要题意:每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。
2. 解题思路:先将n个数分成i个组,每组m个,将每个组里的数相加并求平均数,再将每个组里的数相加并求平均数
3. 源代码:
#include<stdio.h>
void main()
{
int n,m,i,j,sum=0,k;
while(~scanf("%d%d",&n,&m))//读取操作
{
k=0;
for(i=1;i<=n/m;i++)//先将n个数分成i个组,每组m个
{
sum=0;
if(i>1) printf(" ");//规定输出格式,每个数之间用空格隔开
for(j=1;j<=m;j++)//将每个组里的数相加并求平均数
{
k=k+2;
sum+=k;
}
printf("%d",sum/m);
}
if(n%m)
{
//分成i个组后剩余的数求平均数
sum=0;
for(j=1;j<=n-n/m*m;j++)
{
k=k+2;
sum+=k;
}
printf("
%d",sum/(j-1));}
printf("\n");
}
}
5. ProblemG
1. 简要题意:去掉一个最高分和一个最低分,然后计算平均得分
2. 解题思路:先让最小值是最大的100,最大值是最小的0.当最小值比成绩大时,成绩赋值给最小值,最大值小于成绩时,成绩赋值给最大值,最后求平均时:sum-max-min再除以n-2.
3. 源代码:
#include<stdio.h>
int main()
{
int n,i,sum=0,min,max,grade;
double aver;
while(scanf("%d",&n)!=EOF)
{
min=100;
max=0;
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&grade);
sum+=grade;
if(min>grade)
{
min = grade;
}
if(max<grade)
{
max = grade;
}
}
aver = (sum-max-min)*1.00/(n-2);
printf("%.2lf\n",aver);
}
return 0;
}
6. ProblemH
1. 简要题意:判断在第n年的时候,共有多少头母牛
2. 解题思路:定义a,b,c,d分别代表一岁二岁三岁四岁及其以上的母牛的数目, 若n<=4,很容易得出总数为n; d=c+d;//当年大母牛数目d为前一年c和d的总和 c=b;//b母牛长了一岁到了c; b=a;//同上;a=d;//长成的母牛和原本的母牛共生出新的小母牛a个
3. 源代码:
#include
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n==0)break;
int a,b,c,d; //分别代表一岁二岁三岁四岁及其以上的母牛的数目。
if(n<=4)cout<<n<<endl; //若n<=4,很容易得出总数为n
else{
n=n-4;
a=b=c=d=1;
for(int i=0;i<n;i++)
{
d=c+d;//当年大母牛数目d为前一年c和d的总和
c=b;//b母牛长了一岁到了c
b=a;//同上
a=d;//长成的母牛和原本的母牛共生出新的小母牛a个
}
cout<<a+b+c+d<<endl;
}
}
}
7. ProblemI
1. 简要题意:
A
A A
A A
A
A
A
A
A
A
AAAAAAAAAAAAA
2.解题思路:图形的输出问题1.char的使用,字母的输入,getchar()的使用; 2.图形输出时式子的推导,空格,字母的输出;3.每个测量数据间的空行的使用;
3.源代码:
#include<stdio.h>
int main ()
{
int i,j,n,f=0; //定义变量f用于控制空行的输出;
char a,s[100];
while(~scanf("%s",s))
{
a=s[0];
if(a==’@’) break;
getchar(); //消除空格键的影响(空格键也是字符);
scanf("%d",&n);
if(f==0)
f=1; //变量f控制空行的输出;
else
printf("\n");
for (i=1; i<n; i++)
printf(" ");
printf("%c\n",a); //分步输出字母;
for(i=2; i<n; i++)
{
for(j=0; j<n-i; j++) //找公式输出空格;
printf(" ");
printf("%c",a);
for(j=0; j<2*i-3; j++)
printf(" ");
printf("%c",a);
printf("\n"); //每一行输出换行,换行在循环里面;
}
if(i==n)
{
for(j=1; j<=2*n-1; j++)
printf("%c",a);
printf("\n"); //末尾换行;
}
}
return 0;
}
8. ProblemL
1. 简要题意:把字符数组a的内容倒序赋值给b
2. 解题思路:输入字符串并计算它的长度;把字符数组a的内容倒序赋值给b;如果所有元素都相等则说明 a中元素倒序排列后仍相等
3. 源代码:
include <stdio.h>
include <string.h>
int main (void)
{
int n;
while (scanf("%d",&n)!=EOF)
{
int i,length,count;
char a[1000],b[1000];
while (n–)
{
count = 0;//每次循环必须初始化
scanf("%s",a);
length = strlen(a);//输入字符串并计算它的长度
for (i=0;i<length;i++) //把字符数组a的内容倒序赋值给b
b[i] = a[length-1-i];
for (i=0;i<length;i++)//计算a,b中相等元素的个数
if (b[i] == a[i])
count++;
if (count == length)//如果所有元素都相等则说明 a中元素倒序排列后仍相等
printf(“yes\n”);
else
printf(“no\n”);
}
}
return 0;
}
9. ProblemR
1. 简单思路:爬台阶问题,找前几个爬台阶的规律
2. 思路来源:在第一个台阶:0种可能(就在第一个台阶上),在第二个台阶:1种可能;第三个:2种,从第四个开始,后一种可能是前两种可能加和。
3. 源代码:
#include
#include
using namespace std;
int main()
{
int N,m,a[41];
cin>>N;
a[1]=0;
a[2]=1;
a[3]=2;
for(int i=4;i<41;i++)//前三次没有规律,从第四次开始,后一次是前两次的之和。
{
a[i]=a[i-1]+a[i-2];
}
while(N–)
{
cin>>m,
cout<<a[m]<<endl;
}
return 0;
}
10. ProblemG(2)
1. 简单题意: 有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在
2. 解题思路:
∵x + y = n
∴y = n - x
∵xy =
m
∴(n - x) *
x = m
∴x2
- nx + m = 0
∵m是整数,且xy = m
∴x、y都是整数。
∴要判断是否有整数解,就要判断方程:x2 - nx + m = 0的△是否为完全平方数。
3. 源代码:
#include
#include
#include
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n0&&m0)
break;
if((int)sqrt(nn-4m)==sqrt(nn-4m))
cout<<“Yes”<<endl;
else
cout<<“No”<<endl;
}
return 0;
}
十一.ProblemC
1. 简单思路:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
2. 解题思路:运用两点间的距离公式,计算两点间的距离,运用余弦定理求出t的大小。
3. 源代码:
#include <stdio.h>
#include <math.h>
const double pi =
3.1415926;//定义宏常量
int main()
{
int n;
scanf("%d",&n);
while(n–)
{
double x1,x2,y1,y2,t,a,b,c,max;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
a
= sqrt(x1x1+y1y1);//计算a的距离
b
= sqrt(x2x2+y2y2);//计算b的距离
c
= sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2));//计算两点连线的距离
t
= (aa+bb-cc)/(2.0b*a);//余弦定理
t
= acos(t)*180/pi;//反余弦函数
while(t>180)
t-=180;
printf("%.2lf\n",t);
}
return 0;
}
十二.ProblemF
1. 简要题意:四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22
2. 解题思路:
3. 源代码;
#include<stdio.h>
int f(int n,int r)
{
int sum=0,i,s;
for(i=1;n!=0;i++)
{
s=n%r;
n=n/r;
sum+=s;
}
return sum;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
if(f(n,10)==f(n,12)
&& f(n,10)==f(n,16))
printf("%d is a Sky
Number.\n",n);
else
printf("%d is not a Sky
Number.\n",n);
}
return 0 ;
}
十三.ProblemA
1. 简单题意:第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
2. 解题思路:找出n,m的关系,看m,如何循环,在输出。
3. 源代码;
#include<stdio.h>
int main()
{
int n,m,i;
while(scanf("%d",&n)!=EOF)
{
m=1;
for(i=0;i<n-1;i++)
{
m=(m+1)*2;
}
printf("%d\n",m);
}
}
十四.ProblemD
1.简要题意:一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢
2.解题思路:假设未知数加到给的数字上,再整除给定的数,满足的输出就行!两个for循环是必须的,这样才把数都过了一遍。主要是输出格式问题,我这道题是用c++写的,不像c那样容易控制格式,但,可以做个外循环,来控制“ ”(空格)的输出。先假设bool为true再在后面的双for循环中控制。
3.源代码:
#include
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
{
if(a0&&b0)
break;//输入的都是零,结束
int i,j,s;//定义末两位数字分别为i(十位数字),j(个位数字),所以都不超过十。
bool first
= true;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
s=a100+i10+j;
if(s%b==0)
{
if (first)
{
cout<<i<<j;
first =
false;
}
else
{
cout<<"
"<<i<<j;
}
}
}
cout<<endl;
}
return 0;
}
十五.ProblemE
1.简要题意:把一个偶数拆成两个不同素数的和,输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束
2.解题思路:用素数筛选法求素数;如果已经知道这个数不是素数了,结束本次循环如果发现这个数除了1和它本身之外有其他的因子,说明这个数不是素数,将这个数筛去;i从三开始是因为0,1,2不是素数直接排除,i<n-2是因为(0,n)(1,n-1)(2,n-2)这样的组合根本不可能存在
3.源代码:
#include
#include
using namespace std;
int a[10000];
void
prime() //素数筛选法求素数,制作素数表
{
int i,j;
memset(a,1,sizeof(a)); //提前将数组初始化为1,假设每一个数都是素数
a[0]=0;a[1]=0;a[2]=0; //0,1,2不是素数,直接赋为0
for(i=2;i<10000;i++) //筛选法求素数关键代码
for(j=i+1;j<10000;j++)
{
if(a[j]==0) //如果已经知道这个数不是素数了,结束本次循环
continue;
if(j%i==0) //如果发现这个数除了1和它本身之外有其他的因子,说明这个数不是素数,将这个数筛去
a[j]=0;
}
}
int main()
{
int n,num,i;
prime(); //先调用函数讲0~10000间的素数全部求出
while(cin>>n)
{
num=0;
for(i=3;i<n-2;i++) //i从三开始是因为0,1,2不是素数直接排除,i<n-2是因为(0,n)(1,n-1)(2,n-2)这样的组合根本不可能存在
{
if(a[i]&&a[n-i]) //如果i是素数且n-i也是素数,素数对增加1.
num++;
}
cout<<num/2<<endl; //例如10,可以分成(3,7)(7,3)但这只能算是一对,不能算两对,因此最终答案是num、2;
}
return 0;
}
总结:c语言的编写具有自由性和严谨性的特点。两者并不矛盾。通过一个学期的学习,解决问题的方法不止一种,同时一种方法的编写又不止一种,它的自由性由此可以体现。同时它的严谨性表现在程序的书写上,包含逻辑书写符号等,必须严谨有序。
在科技快速发展的今天,计算机在人们生活中的作用越来越突出,而C语言作为一种计算机的语言,我们学习它有助于我们更好地了解计算机。通过学习,我们可以了解到计算机是如何执行程序命令的。不仅如此,我们还可以根据自己的需要编写程序,来解决生活当中的实际问题。因此C语言的学习对于当代大学生来说尤为重要。 这段时间我们学习了C语言,并对它有了深入的了解。C语言有它自己严格的语法规定,符号绝对要按要求使用,不能乱加、错加,但同时它也是很灵活泼的程序设计语言,同一种程序可以有不同的编写方法,但均可以保证最终的结果是一样的,我们要在学习中找到编写程序简单、快捷的方法,尽量舍弃那些复杂的步骤,让我们编写的程序更加容易读。这体现了C语言的灵活性,同一个结果可以有不同的途径到达。但在学习过程中还是遇到了不少困难,有时一个小小的错误就导致整个程序不能运行,需要花大量时间找出错误并修改。有时一个程序会出现七八个错误,好在计算机可以自己找到错误的位置,并提醒我怎么改正,慢慢的,一个一个的错误被纠正过来,看到程序能运行时,心里就觉得很有成就感。也就越来越对它产生兴趣。我可以学着编一些程序,比如数字排序。由此可以看出C语言的用处是非常大的。 学习C语言可以让我们更好的锻炼自己的逻辑思维能力,通过一些复杂的程序设计来强化我们的大脑。与此同时,还可以更好地掌握计算机知识,在不断学习中让自己自信起来。学习C语言对以后的工作也是有帮助的。C语言的实用性特别强,特别是在科技、信息快速发展的今天,我们更应该重视它。并将其运用到以后的生活、工作中。