《c++程序设计》课程设计报告

 

《c++程序设计》课程设计报告

 

 

 

班级:___数学二班______________________学号:___2018212798__________

 

报告人姓名:____苏世成_______ 

 

实验地点: ___教学楼机房411________________________________

 

完成起止日期: ______2019年一月二号到五号______________________

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                 第一题

问题描述:这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。

思路:先把余弦值求出来;利用余弦的反函数求出弧度,再把弧度转化成角度

代码:#include<iostream>

#include<cmath>

#include<cstdio>

using namespace std;

int main()

{

    double x1,y1,x2,y2,t,i;

    int a;

    cin>>a;

    for(i=1;i<=a;i++)//保证循环次数

    { cin>>x1>>y1>>x2>>y2;//输入变量

t=acos((x1*x1+y1*y1+x2*x2+y2*y2-pow(x1-x2,2)-pow(y1-y2,2))/(2*sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2))) *180/3.14159;//把弧度转化成角度

printf("%.2lf",t);//以两位小数输出

cout<<endl;}}

注意本题的反函数的写法,以及头文件

                                          第二题

题目描述:有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数

思路:利用两个数的乘积,来找到因子,再来求出他们的和,判断是否符合条件

细节:两个因子的符号同时变化

代码:

#include<iostream>

#include<math.h>

using namespace std;

int main()

{

    int a,b,sum,j;

    while(cin>>a>>b)

    {    if(a==0&&b==0)

         break;//a==0&&b==0时循环结束

         else

         {sum=0;//用sum记录符合条件的

         for(j=1;j*j<=abs(b);j++)

         {if(b%j==0)

         {if(b/j+j==a||-(b/j+j)==a)

         { cout<<"Yes"<<endl;sum++;}}}

           if(sum==0)

           cout<<"No"<<endl;}}}

                                           第三题

     问题描述:不同进制数字之和相等

思路:把不同进制的各位数字求出来,加起来求和比较

细节:Yes和No的大小写,输出时有" ."

代码:

#include<iostream>

#include<math.h>

using namespace std;

int main()

{

    int a,l,h,k,g,m,n;

    while(cin>>a)

    {   if(a==0) break;

           else

     {l=0,k=0,h=0,g=a,m=a,n=a;

        while(g!=0)

        {l=g%10+l;g=g/10;}// 10进制的位数

        while(m!=0)

        {k=m%12+k;m=m/12;}//12进制的位数

        while(n!=0)

        {h=n%16+h;n=n/16;}//16进制的位数

        if(l==k&&k==h)

        cout<<a<<" "<<"is a Sky Number."<<endl;

        else

        cout<<a<<" "<<"is not a Sky Number."<<endl;}

    

     }}

                                                  第四题

问题描述:输出字符三角形

思路:找到每一行与列数的关系

细节:注意每两个字符间空一行

代码:#include<iostream>

#include<cstdio>

using namespace std;

int main()

{

    char a;

    int b,j,i,flag=1;

    while(cin>>a)

    {    if(a=='@') break;

        else { cin>>b;

            if(flag==1)//用flag调程序,第一次输入时不换行

            flag=0;

            else

            cout<<endl;//大于第二次次输入时换行

             for(i=1;i<=b;i++)

         {if(i==b){for(j=1;j<=2*b-1;j++) cout<<a;}

         else {for(j=1;j<=2*b-1;j++)

              {if(j==b+1-i||j==b+i-1)  cout<<a;

               else if(j<b+i-1) cout<<" ";

               else break;}}

               cout<<endl;}}}}

 

                                                                第五题

问题描述:有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。

思路:用循环,当到达次数时我们输出一个平均数

细节:最后一个数没有空格

代码:

#include<iostream>

#include<cstdio>

using namespace std;

int main()

{

    int a,b,i,t,m,sum,c[101],k;

    while(cin>>a>>b)

    {

        t=0,m=0,sum=0,k=0;

        for(i=2;i<=2*a;i=i+2)

       {   t=t+i;

           sum++;

           if(sum%b==0)

         {c[k++]=t/b;t=0;sum=0;}}

         if(t!=0)

         c[k++]=t/sum;

         for(i=0;i<k;i++)

         {if(i==k-1) cout<<c[k-1];

         else  cout<<c[i]<<" ";}

         cout<<endl;}}

                                                                 第六题

题目描述:输出手机后六位

思路:利用字符串输出字符串后5位,前边输出一个6就可以了!

细节:最后要换行

代码:

 #include<iostream>

#include<cstdio>

using namespace std;

int main()

{

    int a,b,i,t,m,sum,c[101],k; 

  while(cin>>a>>b)

    {

        t=0,m=0,sum=0,k=0;

        for(i=2;i<=2*a;i=i+2)

       {   t=t+i;

           sum++;

           if(sum%b==0)

         {c[k++]=t/b;t=0;sum=0;}}

         if(t!=0)

         c[k++]=t/sum;

         for(i=0;i<k;i++)

         {if(i==k-1) cout<<c[k-1];

         else  cout<<c[i]<<" ";}

         cout<<endl;}}

 注意:利用字符串可以使复杂问题简单化。

                                                   第七题

题目描述:1个数的所有的真约数等于另一个数,而且另一个数的所有真约数等于这个数。

思路:每个数的公约数都求出来,再加起来,比较,输出结果

细节:最后换行,结果的大小写

代码:

#include<iostream>

#include<algorithm>

#include<cstdio>

using namespace std;

int main()

{   int a,i,m,n,j,b,t;

     cin>>a;

     for(i=1;i<=a;i++)

     { cin>>m>>n;

        t=0;

        b=0;

       for(j=1;j<m;j++)

       if(m%j==0)

       t=t+j;

       for(j=1;j<n;j++)

       if(n%j==0)

       b=b+j;;

        if(t==n&&b==m)

        cout<<"YES";

        else

        cout<<"NO";

        cout<<endl;}}

    

     

                                                       第八题

题目描述:在一个区间内,找出不含有62或4的所有车牌号的数量

思路:把所有不符合的先找出来,赋值1,输出时,输出不等于1的所有的和就可以了

细节:如果不先找来,会出现超时错误

代码:

      #include<iostream>

using namespace std;

int main()

{

 int i,t,a[1000001],m,n,s,j;

 for(i=1;i<1000000;i++)

 {    t=i;

           while(t>0)

           { if(t%100==62||t%10==4)

           { a[i]=1;} t=t/10;   }    }//找出所有不吉利数字

 while(cin>>m>>n)

 {   s=0;

          if(m==0&&n==0) break;

          else

         {for(j=m;j<=n;j++)

 { if(a[j]!=1) {s++;} }//把吉利数字累加就可以了

 cout<<s<<endl;}}}

                                                       第九题

题目描述:发工资寻找,所需钱币数量的最小数,钱币的大小为100,50,10,5,2,1

思路:利用求余运算,从所需面值最大数量到所需面值最小的数量

细节:防止运算过程的错误:

代码:#include<iostream>

using namespace std;

int main()

{   int a,i,t,b;

         while(cin>>a)

         { t=0;

         if(a==0)

          continue;

          else

          {for(i=1;i<=a;i++)

          {   cin>>b;

                   t=t+b/100+(b%100)/50+(b%100%50)/10+(b%10)/5+(b%10%5)/2+b%10%5%2;} cout<<t<<endl;}} }

                                                      第十题

题目描述:判断一个字符串是不是回文串

思路:利用strlen函数求出字符串的长度,然后把第一个与最后一个比较,把第二个与倒数第二个比较,依次类推下去

细节:注意比较结束的条件,以及输出结果的大小写

代码:#include<iostream>

#include<cstring>

using namespace std;

int main()

{

    int n,m,c;

    cin>>n;

    for(int i=0;i<n;i++)

    {

        char ch[101];

        cin>>ch;

        m=strlen(ch);

        c=0;

        for(int i=0,j=m-1;i<j;i++,j--)

        {

            if(ch[i]==ch[j])

            c++;

        }

        if(c==m/2) cout<<"yes"<<endl;

        else cout<<"no"<<endl;

    }

    return 0;

}

                                                               第十一题

 

题目描述:多项式的描述如下:

1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...,求出前n项和

思路:按找到每一项位置与每项的符号,大小关系

细节:结果保留两位小数

代码:#include<iostream>

#include<cmath>

#include<cstdio>

using namespace std;

int main()

{  

   double n,i,t,j,b;

   cin>>n;

   for(j=1;j<=n;j++)

   {  cin>>b;

          t=0;

          for(i=1;i<=b;i++)

    t=t+pow(-1,i-1)*1/i;

          printf("%.2lf\n",t);}}

     

                                                              第十二题

问题描述:求a的b次方的最后三位数

思路:每一次都除1000的余数求余,再乘起来

细节:不要超过32位整数的范围。

代码:#include<iostream>

 

#include<cmath>

 

using namespace std;

 

 int main()

 

{ int a,b,t,i;

 

while(cin>>a>>b)

 

t=1;

 

if(a==0&&b==0)

 

break;

 

else

 

{for(i=1;i<=b;i++)

 

{   t=(a*t)%1000;}

 

cout<<t<<endl;}}}

 

 

 

 

 

                                                           第十三题

递归题

题目大意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年

初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

思路:利用递推,找每一项与前几项的关系

细节:最后输出要换行,还要注意输出时,对0的处理

代码:#include<iostream>

 

#include<cmath>

 

using namespace std;

 

 int main()

 

{   int a[55],i,n;

 

    a[1]=1,a[2]=2,a[3]=3;

 

    for(i=4;i<55;i++)

 

    {   a[i]=a[i-1]+a[i-3];}

 

    while (cin>>n)

 

    {     if(n==0)

 

           break;

 

           else

 

        {cout<<a[n]<<endl;}}}

                                                               第十四题

题目大意:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

思路:利用递推的方法,把楼梯分为两种情况,从第四阶楼梯开始,我们可以把走楼梯,分为两部,一步是从比他低两阶的地方,走两步,一个是他比他第一阶的地方,走一步

细节:输出换行,还要注意递推时的关系不要写错了

代码: #include<iostream>

 

#include<cmath>

 

using namespace std;

 

 int main()

 

{   int c[40],i,a,b;

 

    c[1]=0,c[2]=1,c[3]=2;

 

    for(i=4;i<=40;i++)

 

    {

 

        c[i]=c[i-1]+c[i-2];

 

    }

 

    cin>>a;

 

    for(i=1;i<=a;i++)

 

    {   cin>>b;

 

        cout<<c[b]<<endl;}}

                                                                          第十五题

题目大意:有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).

若给出A0, An+1, 和 C1, C2, .....Cn.

请编程计算A1 = ?

思路:根据公式带入几项找到规律

细节:注意项数之间的关系

代码:#include <iostream>

#include <cstdio>

using namespace std;

 

int main()

{

         int n;

         double Ao, An;

         double num[3005];

         while(scanf("%d", &n) != EOF)

         {

                   scanf("%lf%lf", &Ao, &An);

                   for(int i = 1; i <= n; i++)

                            scanf("%lf", &num[i]);

                   double ans = double(n) / double(n + 1) * Ao + 1.0 / (n + 1) * An;

                   double k = double(n) * 2.0;

                   for(int j = 1; j <= n; j++)

                   {

                            ans -= k / (n + 1) * num[j];

                            k -= 2.0;

                   }

                   printf("%.2lf\n", ans);

         }

         return 0;

}

 

 

 

总结: 以上这十五道题, 都是逻辑性很强的题目,刚开始的时候做起来很困难,做的多了,就感觉比较轻松。做题一定不要盲目下手,要仔细思考,做的时候,也要迅速。由于自己打代码的的速度太慢,一道题需要很长时间,所以这一方面要多加练习。在这几道题中,我也明白了,要多加理解题目的思路,才能解决一类问题。反复做,反复去看。像递归这一类题,只要掌握一个,就能掌握一大类。学不好c,归根结底还是练得太少。学习c语言,也要学会使用c语言,懂得用c语言解决问题。我们也不能总是空泛的去理解课本中的知识,忘了学习c语言重要的是学会打代码。通过这几天课程,我知道我离学好c语言还有巨大的差距,我知道我的方法可能不太对,但是我一定不会气馁,会越来越努力,希望在以后的选修课课上对c的理解更深入。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值