C++程序设计总结

《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语言的实用性特别强,特别是在科技、信息快速发展的今天,我们更应该重视它。并将其运用到以后的生活、工作中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值