《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(abbb+ccc+ddd)p[++s]=a;
}
if(s
0)cout<<“no”<<endl; //在范围内不存在的是NO
       else
for(int i=1;i<=s;i++){
if (is)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/mm;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(n0)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.0ba);//余弦定理
       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(a
0&&b
0) break;//输入的都是零,结束
​​int i,j,s;//定义末两位数字分别为i(十位数字),j(个位数字),所以都不超过十。
​​bool first = true;
​​for(i=0;i<10;i++)
​​​for(j=0;j<10;j++)
​​​{
​​​​s=a
100+i
10+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语言的实用性特别强,特别是在科技、信息快速发展的今天,我们更应该重视它。并将其运用到以后的生活、工作中。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值