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

  

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

班级:数学3班                             学号:2018212769

报告人姓名:张传霖

实验地点:东校区教学楼413

完成起止时间:2019年1月2日至2019年1月4日

1、简要题意:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。

解题思路: 先把各位分解。就是例如153,把百位,十位,个位分解,分解就得循环。然后在再次循环把每位按1^3+3^3+5^3。最后判断最后的数是否相等。关键是分解各个数位。

 解题细节:if(!a),表示a为假时执行后续语句(即a为零的时候)

 编码:

#include<iostream>
using namespace std;
int main()
{
	int t,m,n,j,y;
	int a[1000];
	while(cin>>m>>n)
{
     t=0;
	for(j=m;j<=n;j++)
{
		y=(j/100)*(j/100)*(j/100)+(j/10%10)*(j/10%10)*(j/10%10)+(j%10)*(j%10)*(j%10);
		if(y==j)
		{
			a[t]=j;
			t++;
			}
			}
			if(!t)   
			cout<<"no"<<endl;
        else
        {
            for(int x=0;x<t; x++)
            {
                cout<<a[x];
                if(x<t-1) 
				cout<<" ";
            }
            cout<<endl;
        }
    }
    return 0;
}

2、简要题意:对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。

解题思路:质数又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。

解题细节:sqrt是计算机术语,编程中sqrt表示开平方根。
sqrt使用时大多需要要强制类型转化,因为sqrt只支持double和float类型

编码:

#include<iostream>
#include<math.h>
bool sort(int a);
using namespace std;
int main()
{
    int x,y,n;
    while(cin>>x>>y)
    {
        int s=0,flag=1;
        if(x==0&&y==0)
            exit(1);
        else
        {
             for(n=x;n<=y;n++)
             {
                s=n*n+n+41;
                 flag=sort(s);
                 if(flag==0)
                     break;
             }
             if(flag)
               cout<<"OK"<<endl;
             else
                cout<<"Sorry"<<endl;
        }
    }
    return 0;
}
bool sort(int a)
{
    int b=sqrt(double(a)),i;
    for(i=2;i<=b;i++)
        if(a%i==0)
            break;
    if(i>b)
        return true;
    else
        return false;
}

3、简要题意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

解题思路:递推公式:f(1)=f(2)=f(3)=1,f(n)=f(n-1)+f(n-3)(n>=4)

解题细节:a[56]={1,2,3} 令第一个为1

编码:

#include<iostream>
using namespace std;
int main()
{
    int n,i,j,a[56]={1,2,3},x=2;
    while(cin>>n)
    {
    if(n==0)
    {
    break;
    }
    if(n<x+1)
    {
        cout<<a[n-1]<<endl;
    }
    else
    {
        for(i=x+1;i<n;i++)
        {
            a[i]=a[i-1]+a[i-3];
        }
        x=n-1;
        cout<<a[n-1]<<endl;
    }
    }
    return 0;
}

4、简要题意:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。

解题思路:依次取出字符串的最左和最右字符进行比较

解题细节:string是个类,string str是定义一个名叫str的字符串对象。
str内部保存着字符串的内容,通过str.c_str()可以获取这个字符串的首地址。

编码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std ;
int main()
{
    int n,i;
    cin>>n;
    for(i=1;i<=n;i++)
    {
    string str ;
    int count = 0 ;
    while(cin>>str){
        bool flag = false ;
        int n = str.length();
        for(int i = 0 ; i < n/2 ; i++){
            if(str[i]==str[n-i-1]){
                continue ;
            }
            else{
                flag = true ;
            }
        }
        if(flag == true){
            cout<<"no"<<endl;
        }
        else{
            cout<<"yes"<<endl;
        }
    }
    }
    return 0 ;
}

5、简要题意:这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。

解题思路:A+B说到底还是进位的问题,就本题而言,只要把握好进位的顺序就好,记得把秒分的60进制加上并且不要漏加上一次已经进位的,并且要把进位的变化写到循环之中。

解题细节:cout<<h<<" "<<m<<" "<<s<<endl 输出多个空格

编码:

#include<iostream>
using namespace std;
int main()
{
    int n,ah,am,as,bh,bm,bs;
    cin>>n;
    while(n)
    {
        cin>>ah>>am>>as>>bh>>bm>>bs;
        int h=0,m=0,s=0;                                
        if(as+bs>=60)
        {
            s=as+bs-60;
            m=m+1;
        }
        else s=as+bs;
        if(am+bm>=60)
        {
            m=am+bm-60+m;                               
            h+=1;
        }
        else m=am+bm+m;
        h=ah+bh+h;                                        
        cout<<h<<" "<<m<<" "<<s<<endl;
        n--;
    }
    return 0;
}

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

解题思路:递推关系:a[i]=a[i-1]+a[i-2];a[41]={0};(i>=4)

解题细节:找规律用数组表示

编码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int M,N,i,j,sum=0,a[41]={0};
       cin>>N;
       for(j=1;j<=N;j++)
       {
       a[1]=0;
       a[2]=1;
       a[3]=2;
        for(i=4;i<41;i++)
       a[i]=a[i-1]+a[i-2];
      cin>>M;
      cout<<a[M]<<endl;
        }
        return 0;
    }

7、简要题意:有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).
若给出A0, An+1, 和 C1, C2, .....Cn.
请编程计算A1 = ?

解题思路:这是一道纯找规律的数学题,经过推算有:

n=1    2A1=A0+A2-2C1

n=2    3A1=2A0+A3-4C1-2C2

n=3    4A1=3A0+A4-6C1-4C2-2C3

n=4    5A1=4A0+A5-8C1-6C2-4C3-2C4

...    ......

n=n   (n+1)A1=nA0+A(n+1)-(2*n)C1-...-2Cn

解题细节:输出a1/(n+1)

编码:

#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main()
{
    int n,i;
    double a0,a1,ai,c[3001];
    while(cin>>n)
    {
        cin>>a0>>ai;
        a1=n*a0+ai;
        int k=n;
        for(i=1;i<=n;i++)
        {
        cin>>c[i];
        a1=a1-k*2*c[i];
        k--;
        }
        cout<<fixed<<setprecision(2)<<a1/(n+1)<<endl;
    }
    return 0;
}

8、简要题意:输入含有一些数据组,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),因此,每组数据的菜价就是数量乘上单价啊。菜种、数量和单价之间都有空格隔开的。

支付菜价的时候,由于最小支付单位是角,所以总是在支付的时候采用四舍五入的方法把分头去掉。最后,请输出一个精度为角的菜价总量。

解题思路:总价=单价*数量

解题细节:四舍五入:printf("%.1f\n",sum)

编码:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
    double sum=0;
    char a[50];
    double x,y;
    while(cin>>a>>x>>y)
    {
        sum+=x*y;
    }
    printf("%.1f\n",sum);
    return 0;
}

9、简要题意:一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢?

解题思路:直接一个for循环判断就行了,数比较小。输出格式比较麻烦

解题细节:cout<<" 0"输出空格0

编码:

#include<iostream>
using namespace std;
int main()
{
    int a,b;
	  while(cin>>a>>b&&a||b)
	  {
	  	a=a*100;
	  	int k=0;
	  	for(int i=0;i<=99;i++)
	  	{
	  		if((a+i)%b==0)
	  		{
	  			k++;
	  			if(k==1)
	  			{
	  			if(i<10)
	  			{
				  cout<<"0";
	  			  cout<<i;
				  }
	  			else
	  			cout<<i;
				  }
				else
				{
				if(i<10)
	  			{
	  			cout<<" 0";
	  			cout<<i;
				  }
				  else
				cout<<" "<<i;
				}
			  }
		  }
		  cout<<endl;
	   }
    return 0;
}

10、简要题意:每行包含一个字符和一个整数n(0<n<41),不同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1。如果遇到@字符,则表示所做出来的样板三角形已经够了。

每个样板三角形之间应空上一行,三角形的中间为空。显然行末没有多余的空格。

解题思路:依次输出空格,字符

解题细节:getchar(); //吸收回车键,要不出错,把a当做回车了。

编码:

#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
int main()
{
    int n,i,t,k,h,f=0;
	char a;
	while(cin>>a&&a!='@')
	{

		cin>>n;
		if(n==1)
		{
			if(f)
            cout<<endl;
		    f=1;
			cout<<a<<endl;
		    getchar();
			continue;
		}
		if(f)
		   cout<<endl;
		f=1;
		t=2*n-1;
        for(i=0;i<t/2;i++)
		    cout<<" ";
		cout<<a<<endl;
		k=t/2;
		h=1;
		if(k>1)
		{
			while(k--)
			{
				for(i=0;i<k;i++)
					cout<<" ";
				cout<<a;
				for(i=0;i<h;i++)
		    		cout<<" ";
			  cout<<a<<endl;
			  h+=2;
			  if(k==1)
				  break;
			}
		}
		for(i=0;i<t;i++)
			cout<<a;
		cout<<endl;
		getchar();
	}
	return 0;
}

11、简要题意:多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
现在请你求出该多项式的前n项的和。

解题思路:规律:for(j=0;j<a[i];j++)
       {
           if(j%2==0)
           sum=sum+(float)1/(j+1);
           if(j%2==1)
           sum=sum-(float)1/(j+1);
       }

解题细节:单精度float

编码:

#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main()
{
   int m,n,i,j;
   float sum;
   while(cin>>m)
   {
	int a[9999];
	sum=0;
	for(i=0;i<m;i++)
	cin>>a[i];
	for(i=0;i<m;i++)
        {
	   for(j=0;j<a[i];j++)
	   {
		   if(j%2==0)
		   sum=sum+(float)1/(j+1);
		   if(j%2==1)
		   sum=sum-(float)1/(j+1);
	   }
	   cout<<fixed<<setprecision(2)<<sum<<endl;
	   sum=0;
	}
   }
return 0;
}

12、简要题意:有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。

解题思路:将m赋值为a[i]然后对新数列用快排排序,再输出

解题细节:勿忘break

编码:

#include<iostream>
#include<iomanip>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{

     int n,m,a[100],i,j,t;
    while(cin>>n>>m&&n!=0)
    {
        for(i=0;i<n;i++)
        {
            cin>>a[i];
        }
        for(i=0;i<n;i++)
        {
            if(m<a[i])
            {
                for(j=n-1;j>=i;j--)
                {
                    a[j+1]=a[j];
                }
                a[i]=m;
                break;
            }
        }
        for(i=0;i<n+1;i++)
        {
            if(i==0)
            {
            cout<<a[i];
            }
            else
            {
            cout<<" "<<a[i];
            }
        }
        cout<<endl;
    }
    return 0;
}

13、简要题意:这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
注:夹角的范围[0,180],两个点不会在圆心出现。

解题思路:使用余弦定理来求解,对于边长为a、b、c而相应角为A、B、C的三角形,

有:a² = b² + c²- 2bc·cosA

解题细节:double PI,acos(a):反函数需要头文件<math.h>

编码:

#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
int main()
{
   int n;
   double PI=3.1415926;
   double x1,x2,y1,y2,a,b,c,t;
   cin>>n;
   while(n--)
   {
     cin>>x1>>y1>>x2>>y2;
     a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
     b=sqrt(x1*x1+y1*y1);
     c=sqrt(x2*x2+y2*y2);
     double g=(b*b+c*c-a*a)/(2*b*c);
     t=acos(g);
     cout<<fixed<<setprecision(2)<<t*180.00/PI<<endl;
   }
   return 0;
}

14、简要题意:A-B求的是两个集合的差,就是做集合的减法运算。(当然,大家都知道集合的定义,就是同一个集合中不会有两个相同的元素)

解题思路:集合的减法,A-B即是求集合A中有但是集合B中没有的元素,需要注意的地方便是结果需要从小到大输出,在得出结果之后需要进行一次排序,这里可以用sort函数来进行排序

解题细节:每个元素后面都有空格,最后一个元素也要有

编码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,m,i,a[105],b[105],c[105],j,k;
    while(cin>>n>>m)
    {
        int f[105]={0},num=0;
        if(m==0&&n==0)
        {
           break;
        }
        else
        {
        for(i=0;i<n;i++)
        cin>>a[i];
        for(i=0;i<m;i++)
        cin>>b[i];
        for(j=0;j<n;j++)
        {
            for(k=0;k<m;k++)
            {
                if(a[j]==b[k])
                {
                    f[j]=1;
                }
            }
        }
        for(i=0;i<n;i++)
        {
            if(f[i]!=1)
            {
            sort(a,a+n);
            cout<<a[i]<<" ";
            c[num++]=a[i];
            }
        }
    }
    if(num==0)
    {
        cout<<"NULL";
    }
    cout<<endl;
    }
}

15、把一个偶数拆成两个不同素数的和,有几种拆法呢?

解题思路:筛子法

解题细节:需要注意的是分成不同的素数

编码:

#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
int main()
{
   int n,a[10000],i,t,l,j,c;
   while(cin>>n)
   {
    if(n==0) break;
    c=l=0;
    for(i=2;i<=n-2;i++)
    {
      t=1;
      for(j=2;j<=sqrt(i);j++)
      {
        if(i%j==0)
        {
         t=0;
         break;
        }
      }
      if(t==1)
      {
        a[l++]=i;

      }
    }
    for(i=0;i<l;i++)
    {

       for(j=i+1;j<l;j++)
       {
         if(a[i]+a[j]==n)
         c++;
       }

    }
    cout<<c<<endl;
   }
   return 0;
}

总结:C语言是计算机程序设计的重要理论基础,在我们以后的学习和工作中都有着十分重要的地位。要学好这种语言,仅仅学习课本上的知识是不够的,还要经常自己动手,有较强的实践能力。只有多动手,经常编写程序,才能发现我们学习上的漏洞和自己的不足,并在实践中解决这些问题,不断提高自己转化知识的能力。

      虽然在调试程序的过程中遇到了许多困难,有时候甚至觉得一点头绪都没有,无从下手,但最终都通过各种渠道,各种方式,一一解决了。此外,在上机调试的过程中一定要有耐心,耐心地去寻找错误并改正错误;还要记住经常犯的错误,保下次不再犯同样的错误。    

      循环控制结构和条件控制结构对于解决问题非常重要,几乎都要用到这两个结构。数组对于递推问题很关键。格式错误一般为空格输出或者换行不当造成。

     半年的学期结束,时间虽短,但是我收货了很多。最后,谢谢老师和同学们的指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值