课程设计报告

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


Problem B

  1. 题意:输出所有在给定范围内的水仙花数(水仙花数是一个三位数,它的各位数字的立方和等于其本身)。

  2. 解题思路:用while语句输入多组数据,首先用for语句循环给定范围的每一个数,接着把个十百位数表示出来,用if语句进行判断。

  3. 细节处理:每一组数据的输出要换行,一组数据中的输出数要用空格间隔,最后一个数后面不能有空格。

  4. 源代码
    #include
    #include
    using namespace std;
    int main()
    {
    int m,n,i,a,b,c,d=0;
    while(cin>>m>>n)
    {
    for(i=m;i<=n;i++)
    {
    a=i/100;
    b=i/10%10;
    c=i%10;
    if(iaaa+bbb+ccc)
    {
    d++;
    if(d
    1)
    cout<<i;
    else
    cout<<" "<<i;
    }
    }
    if(d==0)
    cout<<“no”;
    d=0;
    cout<<endl;
    }
    return 0;
    }

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

  6. 解题思路::用while语句输入多组数据,首先用for语句循环给定范围的每一个数,用sqrt()函数判断是否为素数。

  7. 细节处理:多组数据之间的输出要换行,还有字母的大小写。

  8. 源代码
    #include
    #include
    #include
    using namespace std;
    int main()
    {
    int x,y,j,i,a,m,n;
    while(cin>>x>>y)
    { a=0;
    if(x0&&y0)
    break;
    else
    {
    for(i=x;i<=y;i++)
    {
    m=i*i+i+41;
    n=sqrt(m);
    for(j=2;j<=n;j++)
    {
    if(m%j0)
    a++;
    }}
    if(a
    0)
    cout<<“OK”;
    else
    cout<<“Sorry”;
    }
    cout<<endl;
    }
    }


Problem G

  1. 题意:去掉一个最高分和一个最低分,然后计算平均得分。
  2. 解题思路:把得分放在数组里,然后进行排序,将首尾数组定义为0,接着运用for循环累加求和再求平均值。
  3. 细节处理:定义输出结果为double类型,注意sort()函数使用加头文件algorithm,表示输出结果时需要从整型转换成实型,输出结果保留两位小数。

4.源代码
#include
#include
#include
using namespace std;
int a[110];
int main()
{
int n,i,sum;
double b;
while(cin>>n)
{
for(i=0;i<n;i++)
{
cin>>a[i];
}
sum=0;
sort(a,a+n);
a[0]=0;
a[n-1]=0;
for(i=1;i<n-1;i++)
{
sum=sum+a[i];
}
b=(1.0)*sum/(n-2);
cout<<fixed<<setprecision(2)<<b<<endl;
}
}


Problem H

  1. 题意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
  2. 解题思路:运用数组,首先定义出前三年的牛数,根据递归规律,表示出第四年开始的牛数,发现第N年的牛数等于第N-1年和第N-3年牛数之和,通过for循环表示出来。
  3. 细节处理:正确寻找出递归规律,并正确表示出来。
  4. 源代码
    #include
    using namespace std;
    int main()
    {
    int cow[60];
    cow[1]=1;
    cow[2]=2;
    cow[3]=3;
    for(int i=4;i<=60;i++)
    {
    cow[i]=cow[i-1]+cow[i-3];
    }
    int n;
    while(cin>>n)
    {if(n==0)
    break;
    else
    {
    cout<<cow[n]<<endl;
    }}
    return 0;
    }


Problem L

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

  2. 解题思路:判断字符串是否为回文串,需要对字符串中每个字符进行比较,用strlen()求字符串长度,然后通过for循环比较,最后用if进行判断。

  3. 细节处理:for循环中要从两边向中间靠拢,一定要有J>i,运用bool类型也要注意字母拼写。

  4. 源代码
    #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”);

    }
    }


Problem M

  1. 题意:输入一个十进制数N,将它转换成R进制数输出。
  2. 解题思路:先用if语句判断N的正负,如果N=0,输出N,如果N<0,令N=-N,并输出一个负号,可以用变量记录,如果N>0,不作处理。接着用while语句循环,运用N%r和N/R,将每一次的求余存进一个数组里,然后逆序输出,如果<10,直接输出,>=10,进行强制类型转换,将其转换成字符。
  3. 细节处理:对N正负的判断及处理,注意逆序输出数组,最后进行类型转换。
  4. 源代码

#include
#include
#include
using namespace std;
int main()
{
int arr[1000];
int r,len,flag;
long long a;
while(cin>>a>>r)
{
len=0;
flag=0;
if(a==0)
{
cout<<a;
}
while(a!=0)
{
if(a<0)
{
a *= -1;
flag=1;
}
arr[len++]=a%r;
a/=r;
}
for(int i = len-1;i>=0;i–)
{
if(flag)
{
cout<<"-";
flag=0;
}
if(arr[i]<=9)
cout<<arr[i];
else
{
printf("%c",arr[i]-10+‘A’);
}
}
cout<<endl;
}
return 0;
}

Problem P

  1. 题意:求A^B的最后三位数表示的整数。

  2. 解题思路:求最后三位数可以不用求出A的B次方结果,通过for循环只求后三位数乘积。

  3. 细节处理:赋初值s=1,循环次数控制好,每组数据要换行处理。

  4. 源代码
    #include
    #include
    using namespace std;
    int main()
    {
    int a,b,s,i;
    while(cin>>a>>b)
    {if(a0&&b0)
    break;
    else
    {
    s=1;
    for(i=1;i<=b;i++)
    {
    s=(s*a)%1000;
    }

    cout<<s;
    }
    cout<<endl;
    }}
        
    
                  八 
         Problem    S
    
  5. 题意:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。

  6. 解题思路:首先寻找递归规律,相隔一个蜂巢有一个路线,相隔两个蜂巢有两个路线,相隔三个蜂巢以上,路线数等于前两个之和,运用for语句循环。

  7. 细节处理:起点不是第一个蜂巢,要准确找出规律。

  8. 源代码
    #include
    #include
    using namespace std;
    long long c[60];
    int main()
    {
    int a,b,i,n,m;
    c[1]=1;
    c[2]=2;
    cin>>n;
    while(n–)
    {
    cin>>a>>b;
    m=b-a;
    for(i=3;i<=m;i++)
    {
    c[i]=c[i-1]+c[i-2];
    }
    cout<<c[m]<<endl;
    }
    return 0;
    }

Problem U

  1. 题意:假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。现在,给你一个11位长的手机号码,找出对应的短号。
  2. 解题思路:将号码中的每一个数字定义成一个字符,通过循环输出后五位数。
  3. 细节处理:再循环前不要忘记输入6,定义数字用char.
  4. 源代码:
    #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;
    }}


Problem W
1.题意:不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
2.解题思路:首先用bool类型对不吉利号码赋初值,然后用for循环判断是否符合,符合就累加。
3.细节处理:注意bool类型的使用和正确赋初值,最后结果是n-m+1-num注意不要忘记减去1。
#include
bool unlucky(int a)
{
while(a!=0)
{
if(a%104||a%10062)
{
return true;
}
a/=10;
}
return false;
}
using namespace std;
int main()
{
int m,n,i,sum,num;
while(cin>>m>>n,m!=0&&n!=0)
{
num=0;
for(i=m;i<=n;i++)
{
if(unlucky(i)==true)
num++;
}
sum=n-m+1-num;
cout<<sum<<endl;
}
return 0;

十一
Problem C2

  1. 题意:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
  2. 解题思路:通过坐标把三边长表示出来,运用余弦定理求出夹角余弦值,用反三角函数求出夹角。
  3. 细节处理:定义坐标点和PI用双精度,头文件要有cmath结果保留两位小数,反三角函数的正确表示。
  4. 源代码
    #include
    #include
    #include
    using namespace std;
    int main()
    {
    int n;
    double x1,x2,y1,y2,a,b,c,d;
    double PI=3.1415926;
    cin>>n;
    while(n–)
    {
    cin>>x1>>y1>>x2>>y2;
    a=sqrt(x1x1+y1y1);
    b=sqrt(x2x2+y2y2);
    c=sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2));
    d=(aa+bb-cc)/(2a*b);
    cout<<fixed<<setprecision(2)<<acos(d)*180.00/PI<<endl;
    }
    }

十二
Problem D2

  1. 题意:一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么。

  2. 解题思路:构建方程(a%b*100+i)==0,输出i值。

  3. 细节处理:注意空格处理,对m赋初值,运用累加控制空格。

  4. 源代码
    #include
    #include
    using namespace std;
    int main()
    {
    int a,b,x,i,m;

    while(cin>>a>>b)
    {
    if(a==0&&b==0)
    break;
    else
    {
       m=0;
        for(i=0;i<=99;i++)
        {
        if((a%b*100+i)%b==0)
        {
            if(i==0)
            {cout<<"00";
            m++;}
            else if(i>0&&i<10)
            {m++;
            if(m=1)
            cout<<"0"<<i;
            else
            cout<<" "<<"0"<<i;}
            else if(i>=10)
            {m++;
            if(m==1)
            cout<<i;
            else
            cout<<" "<<i;}
        }
        }
    }
    

    cout<<endl;}
    }

十三
Problem E2

  1. 题意:把一个偶数拆成两个不同素数的和,求有几种拆法。
  2. 解题思路:首先通过for循环对素数进行判断,用while循环输入多组数据,再用for循环判断是否两个不同的素数之和。
  3. 细节处理:处理素数时要用sqrt,所以要加头文件cmath,找两个素数时要注意循环不要过度,并且两个素数不相等。
  4. 源代码
    #include
    #include
    #include
    using namespace std;
    int prime(int x)
    {
    int i;
    double n;
    n=sqrt(x);
    for(i=2;i<=n;i++)
    {
    if(x%i0)
    return 0;
    }
    return 1;
    }
    int main()
    {
    int x,j,k,sum;
    while(cin>>x)
    {
    if(x
    0)
    break;
    else
    {
    sum=0;
    for(j=2;j<=x/2;j++)
    {
    k=x-j;
    if(prime(j)&&prime(k)&&k!=j)
    sum++;
    }
    cout<<sum<<endl;
    }
    }
    return 0;
    }

十四
Problem G2

  1. 题意:有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,判断这种整数到底存不存在。
  2. 解题思路:根据两个方程可以构建一个一元二次方程组,转化成求根问题,首先判断是否有根,若有根,表示出两根,
  3. 细节处理:定义要用double类型,把两个方程正确转化为一个一元二次方程,求根时运用根号函数,所以头文件要用cmath。
  4. 源代码
    #include
    #include
    #include
    using namespace std;
    int main()
    {
    int a,b;
    double x,y;
    while(cin>>a>>b)
    {
    if(a0&&b0)
    break;
    else{
    x=0,y=0;
    if(aa-4b<0)
    cout<<“No”<<endl;
    else
    {
    x=(a+sqrt(aa-4b))/2;
    y=(a-sqrt(aa-4b))/2;
    if(x*100int(x)100&&y100int(y)*100)
    cout<<“Yes”<<endl;
    else
    cout<<“No”<<endl;
    }
    }
    }
    }

十五
Prublem

  1. 题意:输出符合要求的高为n,底为2n-1的等腰三角形。

  2. 解题思路:首先运用嵌套循环正确输出三角形,然后处理空格问题,最后处理输出换行问题。

  3. 细节处理:定义符号用char,输出三角形用嵌套时用或连接条件,三角形的里面和左边输出空格,右边不输出空格,第一组数据输出三角形后每一个都空一行输出。

  4. 源代码
    #include
    #include
    using namespace std;
    int main()
    {
    int i,j,n,a;
    char m;
    a=0;
    while(cin>>m>>n)
    {
    a++;
    if(a>1)
    cout<<endl;
    if(m==’@’)
    break;
    else
    {

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=2*n-1;j++)
        {
            if(i+j==n+1||j-i==n-1||i==n)
            cout<<m;
            else if(j-i<=n-2)
            cout<<" ";
        }
       cout<<endl;
    }
    }
    

}

总结:C语言课程到这里已经接近尾声,这学期我们学了程序设计的一点基础知识,对于我们数学系的学生来说,学的太少太少。C语言是一门有趣的语言,一开始觉得头疼,但深入进去之后,你会无法自拔,有时候会觉得编程序会上瘾。它锻炼的不仅仅是我们的编程能力,更是我们的逻辑思维能力,通过多角度解决问题,只要有一个小地方出错,就不能AC,联系到生活中,每件事情都要专注对待,不能出一点差错。感谢老师和同学在这段时间对我的帮助,老师的和蔼可亲以及同学的互帮互助都让我觉得倍感温暖。我坚信我和程序设计的缘分还没结束,在老师和同学的帮助下,我一定会在这条路上越走越远。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值