2018212745段修泉课程设计报告

 

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

 

 

 

班级:_____数学类四班____学号:_2018212745___

 

报告人姓名: 段修泉  

 

实验地点: _____东校区教学楼414_________________

 

完成起止日期: _2018.12.27__-- 2019.1.3_______

 

 

题目来源:SDAU课程设计一ProblemB

题目大意:

筛选给定范围内的水仙花数,并输出。

解题思路:

对给定区间内每个数进行处理,判断是否为水仙花数并用数组储存水仙花数,再依次输出,并换行。

实现细节:

注意最后一个数后不能有空格,每次输出注意换行,多组数据测试,每次都有初始化某些循环使用变量。

程序实例:

#include<stdio.h>

int main(){

int m,n,i,j,a,b,c,k,s[999],t;

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

if(m>n){t=m;m=n;n=t;}

k=0;

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

        c=i%10;

        a=i/100;

        b=(i-(a*100))/10;

    if(a*a*a+b*b*b+c*c*c==i)

        {k++;

        s[k]=i;}

        }

    if(k==0)printf("no\n");

    else {

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

        {if(j==k)printf("%d",s[j]);

        else printf("%d ",s[j]);}

        printf("\n");

        }

    }

}

题目来源:SDAU课程设计一ProblemF

题目大意:

递增的偶数列,截取n个数,每m个求一组平均值。

解题思路:

若n能整除m,则求n/m个平均值,先储存在输出,最一个后面没有空格,否则输出前n/m个平均值,在输出最后不足m数的平均值,不加空格。

实现细节:

判断个数确保没有多余空格,每次循环更新数据,在while循环内部初始化变量。

程序实例:

#include<stdio.h>

int main(){

int m,n,l,t,s[999],a[999],b,c,d,i,j,k=0,e,f,g,h;

 for(i=2,a[1]=2;i<102;i++)

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

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

if(n<=m){g=0;for(h=1;h<=n;h++)g+=a[h];printf("%d",g/n);}

else{ 

    c=0;

    d=n/m;   

while(c<=d-1)

    {

        b=0;

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

        b+=a[j];

        k++;

        s[k]=b/m;

        c++;

        if(c==1)printf("%d",s[k]);

        else printf(" %d",s[k]);

    }

if(d*m!=n)

{

    f=0;

    for(e=d*m+1;e<=n;e++)

    f=f+a[e];

    s[k+1]=f/(n-d*m);

    if(m<n)printf(" ");

    printf("%d",s[k+1]);

}

}

    printf("\n");

}

}

题目来源:SDAU课程设计一ProblemH

题目大意:

母牛生小牛,小牛四年后能生小牛,求N年后共有多少只牛。

解题思路:

用四个变量分别表示四种牛,可以定义为老牛,大牛,中牛小牛,根据四种牛之间的数量规律,每年进行增加,最后求和,并输出。

实现细节:

第四年就可以生小牛,但数目不计入这一年,变量变化时,防止数据丢失

程序实例:

#include<stdio.h>

int main(){

int n,i,j,k,m,a=1,b=0,c=0,d=0;

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

{

    if(n==0)return 0;

    else{

    a=1,b=0,c=0,d=0;

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

        a=a+b;

        b=c;

        c=d;

        d=a;

        }

    printf("%d\n",a+b+c+d);

    }

}

}

题目来源:SDAU课程设计一ProblemI

题目大意:

对每组数据,根据数据的绝对值排序顺序输出原数据。

解题思路:

比较第一个元素和其他元素的绝对值,大者的原数据去前面,即两者换位,依次类推,倒数第二个数据比较后,得到结果。

实现细节:

比较的是绝对值,用函数注意头文件和对应的数据类型,每比较完一个数据可以输出其。

程序实例:

#include<stdio.h>

#include<cstring>

#include<algorithm>

#include<math.h>

using namespace std;

int main()

{

    int a[999],i,j,m,n,t;

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

    {

        if(n==0) return 0;

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

            scanf("%d",&a[i]);

 

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

        {

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

            if(abs(a[j])>abs(a[i]))

            {

                t=a[i];

                a[i]=a[j];

                a[j]=t;

            }

            if(i==1)printf("%d",a[i]);

            else printf(" %d",a[i]);

        }

        printf("\n");

    }

 

}

题目来源:SDAU课程设计一ProblemJ

题目大意:

对多组有序数组中每组插入一个数,并依次输出每个数组,使其仍然有序。

解题思路:

输入数组后排序,把插入数作为最后一个数加入,然后对新数组在排序后输出。

实现细节:

每个数组注意换行,每次都要先把数组所有元素初始化,防止上组数据影响下一组,sort函数的使用细节。

程序实例:

#include<stdio.h>

#include<algorithm>

#include<cstdio>

#include<cstring>

using namespace std;

int main(){

int n,m,i,a[105];

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

memset(a,0,sizeof(a));

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

for(i=1;i<=n;i++)scanf("%d",&a[i]);

a[n+1]=m;

sort(a,a+n+1+1);

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

if(i==1)printf("%d",a[i]);

else printf(" %d",a[i]);}

printf("\n");

}

return 0;

}

题目来源:SDAU课程设计一ProblemL

题目大意:

判断一个字符串是否为回文串

解题思路:

求出字符串长度,第一个和最后一个字符依次比较,若全部相等则为回文串,否则结束循环读入下一个字符串。

实现细节:

利用循环或者函数求字符串长度,字符串第一个字符从下标0开始,注意换行。

程序实例:

#include<stdio.h>

#include<string>

#include<iostream>

using namespace std;

int main()

{

    int i,n,j,m,l,k,s;

    char a[999];

    scanf("%d",&n);

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

    {

        cin>>a;

        for(m=0;a[m]!='\0';)

        m++;

        s=0;

        for(j=0,k=m-1;k>=j;j++,k--)

        {

            if(a[j]!=a[k]){s++;printf("no\n");break;}

        }

        if(s==0)printf("yes\n");

    }

}

题目来源:SDAU课程设计一ProblemO

题目大意:

两个集合求差集。

解题思路:

先输入两个集合的元素,然后各自排序,两个集合从第一个元素开始比较大小,谁小谁的下标加一,直到一方下标最大,若遇见相等,则在第一个集合中去掉这个数,输出第一个集合中剩余元素。

实现细节:

利用一个数组对应第一个集合中的每个元素,一个变量对应第一个集合中剩余元素的个数,判断是否出现空集。相等时两下标同时增加一。

程序实例:

#include<stdio.h>

#include<algorithm>

#include<cstring>

using namespace std;

int main()

{int a[999],b[999],i,j,l,m,n,s,t,c[999];

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

        memset(a,0,sizeof(a));

        memset(b,0,sizeof(b));

        memset(c,1,sizeof(c));

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

        l=n;

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

        scanf("%d",&a[i]);

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

        scanf("%d",&b[i]);

        sort(a,a+n+1);

        sort(b,b+m+1);

        for(i=1,j=1;i<=n,j<=m;)

        {

            if(a[i]==b[j])

            {

                c[i]=0;

                l--;

                i++;

                j++;

            }

            if(a[i]>b[j])

            j++;

            if(a[i]<b[j])

            i++;}

        if(l==0)printf("NULL");

        else

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

        if(c[i]!=0)printf("%d ",a[i]);

        printf("\n");}}

题目来源:SDAU课程设计一ProblemP

题目大意:

求A的B次方的末三位数。

解题思路:

三位数乘几位数结果一定大于等于三位数,用B做循环次数,每次结果乘A,若A为四位数则,求余1000使其成三位数,直到循环结束。

实现细节:

用B做循环次数,不断控制乘积结果大小防止越界,用求余用算求结果和缩小数据。

程序实例:

#include<stdio.h>

int main(){

int a,b,i,j,k,l,m,n;

while(scanf("%d %d",&a,&b)!=EOF){

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

    k=1;

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

    {

    k=k*a;

    if(k>1000)k=k%1000;

    }

printf("%d\n",k%1000);

}}

题目来源:SDAU课程设计一ProblemQ

题目大意:

判断两数除自身外的因子之和是否等于另一个数。

解题思路:

定义函数判断两数关系,两数两次调用函数都为真,则符合要求,否则判断下一个。

实现细节:

判断函数的循环从2开始,最高到n/2且每次只把被除数加和,最后要加一在比较是否相等,YES和NO大写。

程序实例:

#include<stdio.h>

int qh(int k,int w){

int j,s=0;

for(j=2;j<=k/2;j++)

if(k%j==0) s=s+j;

if(s+1==w) return 1;

else return 0;

}

int main(){

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

scanf("%d",&n);

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

{

scanf("%d %d",&a,&b);

printf("%d %d\n",qh(a,b),qh(b,a));

if(qh(a,b)+qh(b,a)==2)

printf("YES\n");

else printf("NO\n");

}

}

题目来源SDAU课程设计一ProblemR

题目大意:

共n阶楼梯,每次可以上一阶或两阶,求共有几种上楼方法。

解题思路:

递归方法定义函数,根据题意每多一阶楼梯,上楼梯次数为少一阶和少两阶次数之和。即f(n)=f(n-1)+f(n-2)

实现细节:

注意基本情况,刚开始位置为第一阶,阶数应为n-1。递归函数的定义与调用。

程序实例:

#include<stdio.h>

long long int lt(long long int k)

{

if(k==1)return 1;

if(k==2)return 2;

else return lt(k-1)+lt(k-2);

}

int main(){

long long int n,m,i,j,l,a,b,c;

scanf("%lld",&n);

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

   scanf("%lld",&m);

   if(m==1) printf("0\n");

   else printf("%lld\n",lt(m-1));

}

return 0;

}

题目来源:SDAU课程设计一ProblemS

题目大意:

从a到b每次只允许加一或加二,求共有几种方法。

解题思路:

递归思路,同上楼梯的题目。如从一到四有两种走法,先到二或先到三,递归思路为本种情况为前两种情况求和。

实现细节:

基本情况写清楚,循环起始点为3,总次数两数

之差。

程序实例:

#include<stdio.h>

int main(){

long long int n,a,b,i,k[52];

scanf("%lld",&n);

k[1]=1;

k[2]=2;

for(i=3;i<=51;i++)

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

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

     scanf("%lld %lld",&a,&b);

     printf("%lld\n",k[b-a]);

}}

题目来源:SDAU课程设计一ProblemV

题目大意:

已知a0与an+1,c1到cn,且ai=(ai-1+a+1)/2,求a1

解题思路:

根据已知公式进行代换化简,得到每个ai的表达式用已知数据表示未知,最后倒算出a1

实现细节:

数据均为浮点数,数组下表为整数,使用下标计算可以把下标值赋给浮点数变量后使用,先算an,倒退算a1。

程序实例:

#include<stdio.h>

#include<cstring>

using namespace std;

int main()

{

    double a[99999],c[99999],k,l;

    int i,j,m,n,s,t;

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

    {

        memset(a,0,sizeof(a));

        memset(c,0,sizeof(c));

        scanf("%lf %lf",&a[0],&a[n+1]);

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

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

        for(i=n;i>=1;i--)

        {

            l=i;

            for(j=i;j>=1;j--)

            {

                k=j;

                a[i]=a[i]-(((k*2.0)/(l+1))*c[j]);

            }

            a[i]=a[i]+(1.0/(l+1))*a[0]+(1.0*(l/(l+1))*a[i+1]);

        }

        printf("%.2lf\n",a[1]);

    }

}

题目来源:SDAU课程设计一ProblemX

题目大意:

依次输入一个字符串,两个实型数,作为菜名,菜价和数量,求和所有菜需要的价格并输出结果四舍五入。

解题思路:

while(cin>>a>>b>>c)形式输入,将b和c相乘并依次相加,最后用printf形式输出,并添加四舍五入处理。

实现细节:

数据均为实型,字符串只需输入不用处理,输入一组处理一组数,最后进行四舍五入处理并输出。

程序实例:

#include<iostream>

#include<stdio.h>

#include<math.h>

using namespace std;

int main()

{

 double n,m,s=0;

 char a[9999];

 while(cin>>a>>n>>m)

 {

  s=s+(n*m);

 }

 printf("%.1lf\n",floor(s*10+0.5)/10);

 return 0;

}

题目来源:SDAU课程设计二ProblemF

题目大意:

一个数十进制十二进制十六进制的各位数字加和相等则符合要求

解题思路:

先对十进制数进行十二和十六进制转换,同时把每一位加和,然后求出十进制数每位之和,判断是否相等。

实现细节:

处理数时要重新定义一个变量,不能更改原数,while循环进行进制转换

程序实例:

#include<stdio.h>

int main()

{

    int n,i,j,k,l,m,t;

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

    {

        if(n==0) return 0;

        i=n;

        j=n;

        t=n;

        l=0;

        m=0;

        k=0;

        while(t>0)

        {

           k+=t%10;

           t=t/10;

        }

        while(i>0)

        {

           l+=i%12;

           i=i/12;

        }

        while(j>0)

        {

            m+=j%16;

            j=j/16;

        }

        if(m==k&&m==l)

        printf("%d is a Sky Number.\n",n);

        else printf("%d is not a Sky Number.\n",n);

    }

}

题目来源:SDAU课程设计二ProblemH

题目大意:

根据输入的字符和数字输出要求高度的三角形,每两个间空一行。

解题思路:

从第一行开始输出,输出输出一行结束后换行

实现细节:

判断是否为第一个三角形,若不是第一个拍,输出一个行,与上一个隔开,每行分开输出且,空格和字符单独输出,行末没有空格,注意换行,最后一行输出后用getchar()读回车。

程序实例:

#include<stdio.h>

int main()

{

    int n,j,i,s,k=0;

    char ch;

    while(scanf("%c",&ch)!=EOF)

    {

        if(ch==64) break;

        scanf("%d",&n);

        if(k==1)

        printf("\n");

        k=1;

        if(n==1)

        printf("%c\n",ch);

        else

        {

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

            printf(" ");

            printf("%c\n",ch);

            for(i=2;i<n;i++)

            {

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

                printf(" ");

                printf("%c",ch);

                for(j=n-i+2;j<n+i-1;j++)

                printf(" ");

                printf("%c\n",ch);

            }

            for(j=1;j<=2*n-1;j++)

            printf("%c",ch);

printf("\n");

        }

        getchar();

    }

    return 0;}

总结:

随着课程设计的结束,我与C语言的旅程也告一段落,特别感谢陪伴我们一个学期要求严格的费老师。从开始学习C语言,每天忙碌于题目与代码之间,累伴随着快乐,那种得到AC时的快乐也只有自己能够体会。通过一个学期的学习,我不断的了解C语言,学习和使用C语言,使它成为了一个我解决问题的工具,让我不断感受到计算机的力量,但同时也体会到了计算机解决问题的不足,例如,通过计算机C语言程序,可以计算很多复杂的数学题,可以设计很多游戏和工具,可以帮助人们在生活中处理数据问题,筛选判断分析数据。不过烦琐的C语言也让许多人望而生畏,格式控制符,循环表达式,数组越界等等许多在程序编写和使用中会出现的问题,让C语言并不能真正广泛解决每一类问题,通过这学期的学习以及这一周紧张而激烈的课程设计,我以后会更加喜欢C语言,可能将来还会从事这方面的工作,让C语言更简单更实用,更好的服务生活。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值