程序设计报告

C++程序设计》课程设计报告
Problem 1
题意:输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
思路:这是一个简单的条件语句,要把条件考虑全面,按照要求的格式输出
代码:
#include
using namespace std;
int main()
{
int a;
while(cin>>a)
if(a>=90&&a<=100) cout<<“A”<<endl;
else if(a>=80&&a<=89) cout<<“B”<<endl;
else if(a>=70&&a<=79) cout<<“C”<<endl;
else if(a>=60&&a<=69) cout<<“D”<<endl;
else if(a>=0&&a<=59) cout<<“E”<<endl;
else if(a<0||a>100) cout<<“Score is error!”<<endl;
return 0;
}
解析:题目说的很清楚,就是对每一段的成绩给出定级;把题目中的每一个条件都写出来,然后按照要求输出即可。
Problem 2
题意:春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。
现在要求输出所有在m和n范围内的水仙花数。
思路:要弄清楚“水仙花数”的定义,然后解题。
代码:
#include
#include
using namespace std;
int main()
{
int p,q;
while(cin>>p>>q)
{
int count=0;
for(int i=p;i<=q;i++)
{
int sum=pow(i%10,3)+pow((i/10)%10,3)+pow(i/100,3);
if(sumi){
count++;
if(count
1) cout<<i;
else cout<<" “<<i;
}
}
if(count0) cout<<“no”;
cout<<endl;
}
return 0;
}
解析:利用求余,把每一个输的个位十位百位等都表示出来,然后代入给的公式,判段是否符合要求。注意运用pow函数时的头文件。
Problem 3
题意:给你n个整数,求他们中所有奇数的乘积。
思路:把给的n个整数的奇数都求出来,然后求乘积即可。
代码:
#include
using namespace std;
int main()
{
int n,i,sum,a;
while(cin>>n)
{
sum=1;
for(i=0;i<n;i++)
{
cin>>a;
if(a%2
1)
sum*=a;
}
cout<<sum<<endl;
}
return 0;
}
解析:这道题目很简单,但是我当时做的时候不知道如何求出所有的奇数,后来发现可以用除2求余的方法把所有的奇数都求出来。
Problem 4
题意:对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
思路:找全为素数的对立面,即所给区间中存在非素数,然后解题。
代码:
#include
#include
using namespace std;
int main()
{
int x,y,a,b;
while(cin>>x>>y)
{
b=0;
if(x0&&y0) break;
else
{
for(int i=x;i<=y;i++)
{
a=i*i+i+41;
for(int j=2;j<a;j++)
{
if(a%j0)
{
b++;
break;
}
}
}
if(b
0) cout<<“OK”<<endl;
else cout<<“Sorry”<<endl;
}
}
return 0;
}
解析:充分利用求余,只要所给的区间中存在非素数,就输出”Sorry”;否则就输出OK。
Problem 5
题意:多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + …现在请你求出该多项式的前n项的和。输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。保留两位小数。
思路:首先观察规律,神魔时候是加神魔时候是减。
代码:
#include
#include
using namespace std;
int main()
{
int n,m,i,j;
while(cin>>m)
{
for(i=1;i<=m;i++)
{
cin>>n;
double sum=0;
for(j=1;j<=n;j++)
{
if(j%2!=0)
{
sum=sum+1.0/j;
}
else {sum=sum-1.0/j;}
}
printf(”%.2lf",sum);
cout<<endl;
}
}
}
解析:运用求余,如果是偶数则为减,反之则为加,把它写在循环里,让其求和即可得到答案。
Problem 6
题意:有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
思路: 分两种情况:一是n整除m,这时正好分为n/m组,没有剩余;二是n不整除m,分为n/m组+余数作为一组。注意点:仍然是注意输出格式问题,同时不要忘记初始化变量,以及变量初始化的位置。
代码:
#include
#include
#include
using namespace std;
int main()
{
int n,m,c,s;
while(cin>>n>>m)
{
c=0;
for(int i=1;i<=n/m;i++)
{
s=0;
if(i>1)
{
cout<<" ";
}
for(int j=1;j<=m;j++)
{
c=c+2;
s+=c;
}
cout<<s/m;
}
if(n%m!=0)
{
s=0;
for(int j=1;j<=n%m;j++)
{
c=c+2;
s+=c;

        }
        cout<<" "<<s/(n%m);
    }
    cout<<endl;
}
return 0;

}

解析:第一个for循环,是n/m组,包含了n整除m的情况,以及n大于m,但n不整除m的情况;
用一个变量c每次循环逐次加2,代表了一个有序的偶数序列;
S存储,每m个偶数的和,所以s在每次小循环前要清零;
下面if里面是讨论,n小于m和n大于m且n不整除的情况;
当n大于m且不整除m时,执行if上面的循环且接着执行if里面的,c的值是for循环结束时的值,当n小于m时,不执行上面的for循环,c的值从0开始,符合题意,最后输出结果;
每组输完之后,换行再输入下一组数据。
Problem 7
题意:青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分
思路:先给所有的得分排序,然后去掉最高分和最低分,求和,再求平均值;
注意去掉两个数据以后剩下的就只有n-2个评委给的成绩了。
代码:
#include<stdio.h>
int main()
{
int max,min,n,i,s,sum;
double ave;
while(scanf("%d",&n)!=EOF)
{
max=-1;min=101;sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&s);
sum=sum+s;
if(max<s) max=s;
if(min>s) min=s;
}
ave=(sum-max-min)*1.0/(n-2);
printf("%0.2f\n",ave);
}
return 0;
}
解析:这道题主要考查排序问题和保留小数问题,用C++输出小数有点麻烦,不妨用C语言;同时要注意去掉两个数据以后剩下的就只有n-2个评委给的成绩了。
Problem 8
题意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
思路:这是一个递推公式的问题。
代码:
#include
using namespace std;
int a[60];
int main()
{
int n,i;
a[1]=1;
a[2]=2;
a[3]=3;
a[4]=4;
while(cin>>n&&n!=0)
{
for(i=5;i<=n;i++)
{
a[i]=a[i-1]+a[i-3];
}
cout<<a[n]<<endl;
}
return 0;
}
思路:先写出a[1],a[2],a[3],a[4],a[5];就可以得出递推规律了,即a[i]=a[i-1]+a[i-3];然后累加求和即为第n年的所有小牛数目。
Problem 9
题意:输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
思路:先比较绝对值,然后再输出绝对值大的那个数本身。
代码:
#include
#include
#include
#include
using namespace std;
int a[110],b[110];
int main()
{
int n,i,j,c,d;
while(cin>>n)
{
if(n==0)break;
else
{
for(i=0;i<n;i++)
{
cin>>a[i];
if(a[i]<0)
b[i]=-a[i];
else
b[i]=a[i];
}
for(i=0;i<n;i++){
for(j=i+1;j<n;j++)
{
if(b[i]<b[j])
{
c=a[i],a[i]=a[j],a[j]=c;
d=b[i],b[i]=b[j],b[j]=d;
}
}}
for(i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;
}
}
return 0;
}
解析:定义两个数组,第二个数组用于暂时储存第一个数组中的绝对值,然后再输出第一个数组排完顺序的第一个数组,判断绝对值时,可以用if条件语句,也可以用sort排序,它定义在iostream中。
Problem 10
题意:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示在这里插入图片描述

思路:这是一个递推的题目,先求从1到n的方法。
代码:
#include
using namespace std;
int main()
{
long long a[51];
long long i,j,n,p,q,c;
a[2]=1;
a[3]=2;
for(i=4;i<=51;i++)
{
a[i]=a[i-1]+a[i-2];
}
cin>>n;
for(j=1;j<=n;j++)
{
cin>>p>>q;
c=q-p;
cout<<a[c+1]<<endl;
}
return 0;
}
解析:根据从第一个蜂房到第n个蜂房有多少种方法,求出从a到b有多少种走法,即代码中的a[c+1];递推的题目一定在得出规律以后再写代码,这样会使题目变简单,打出正确的代码也就非常容易了,最后还要注意题目要求输出的格式问题。
Problem 11
题意:古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为: 1+2+4+5+10+11+20+22+44+55+110=284。而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。你的任务就编写一个程序,判断给定的两个数是否是亲和数
思路:先求出所有真约数,然后求和;判断。
代码:
#include
using namespace std;
int main()
{
int m,a,b,i,j;
cin>>m;
for(i=1;i<=m;i++)
{
cin>>a>>b;
int s1=0,s2=0;
for(j=1;j<a;j++)
{
if(a%j0)
{s1=s1+j;}
}
for(j=1;j<b;j++)
{
if(b%j
0)
{s2=s2+j;}
}
if(s1b&&s2a)
{cout<<“YES”<<endl;}
else{cout<<“NO”<<endl;}
}
return 0;
}
解析:运用暴力求解法,从1开始找真约数,然后求和判段是否相等即可。
Problem 12
题意:假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。现在,给你一个11位长的手机号码,找出对应的短号。
思路:将号码中的每一个数字定义成一个字符,通过循环输出后五位数。
代码:
#include
#include
using namespace std;
int main()
{
int n,i;
char a[12];
cin>>n;
while(n–)
{
for(i=1;i<=11;i++)
{
cin>>a[i];
}
cout<<“6”;
for(i=7;i<=11;i++)
{
cout<<a[i];
}
cout<<endl;
}}
解析:再循环前不要忘记输入6,定义数字用char,注意字符串的定义以及头文件的名称,这是自己的薄弱处,要加强练习。
Problem 13
题意:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
思路:判断字符串是否为回文串,需要对字符串中每个字符进行比较,用strlen()求字符串长度,然后通过for循环比较,最后用if进行判断。
代码:
#include<stdio.h>
#include<string.h>
#include
using namespace std;
int main()
{
char a[110];
int n;
scanf("%d",&n);
while(n–)
{
scanf("%s",a);
int len=strlen(a);
bool m=true;
for(int i=0,j=len-1;j>i;i++,j–)
{
if(a[i]!=a[j])
{
m=false;
}
}
if(m==true)
printf(“yes\n”);
else
printf(“no\n”);

}

}
解析:首先判断字符串是否为回文串,需要对字符串中每个字符进行比较,用strlen()求字符串长度,然后通过for循环比较,最后用if进行判断,for循环中要从两边向中间靠拢,一定要有J>i,运用bool类型也要注意字母拼写。
Problem 14
题意:猴子吃桃问题:第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。请问,他第一天开始吃的时候桃子一共有多少个呢?
思路:可以先用几组数据测试,自己演算,找出计算规律。
代码:

#include
using namespace std;
int main()
{
int n,x,a;
while(cin>>n&&n>1&&n<30)
{
int x=1;
for( ;n>1;n–)
{
x=(x+1)*2;
}
cout<<x<<endl;
}
return 0;
}
解析:要看清题目是输出第n天准备吃的时候只剩下一个桃子,属于递推里面的倒着推;即x=(x+1)*2;然后写入循环中就能得出结果了。
Problem 15
题意:Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。Sky非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。
思路:首先弄清楚十进制、十二进制、十六进制的换算。
代码:
#include
using namespace std;
int main()
{
int n,s1,s2,s3;
while(cin>>n&&n!=0)
{
s1=n%10+(n/10)%10+(n/100)%10+n/1000;
s2=n%12+(n/12)%12+(n/144)%12+n/1728;
s3=n%16+(n/16)%16+(n/256)%16+n/4096;
if(s1s2&&s2s3)
{cout<<n<<" “;
cout<<“is a Sky Number.”<<endl;}
else
{cout<<n<<” ";
cout<<“is not a Sky Number.”<<endl;}
}
return 0;
}
解析:十进制转十二进制,目的是求出每个位上的数字,然后求和;好了,就直接按照十进制的方法求就行了,即s1=n%10+(n/10)%10+(n/100)%10+n/1000;同理可以得出12进制和16进制,注意后面应该除12和16的2次方3次方。

总结:经过3天的上机实践学习,使我对c语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在问题的处理上不够熟练,深深的知道要多打代码,才能提高自己的能力。通过学习也有所改进;再有对c语言的一些标准库函数不太熟悉,还有对函数调用的正确使用不够熟悉,还有对c语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。还有就是自己对数组的运用不够,甚至对数组如何输入还不会,但是经过三天的上机练习,在老师和同学们的帮助下学会了如何处理,虽然很累,但是能学到知识,真正自己学会,还是很开心的。但看到自己的程序能够运行成功后,收获的不仅仅是知识,还有内心的快乐。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习c语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使更好的适应各种语言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值