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

 


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

 

     班级:数学4班

     学号:2018212824

     报告人姓名:沈园园

 实验地点:山东农业大学东校区教学楼

 完成起止日期:2018.1.1——2018.1.5

 

 

 


1

Problem Description
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。
Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。

题目思路,输入题目数据,判断可否被m整除,分情况求平均。
#include<iostream>
using namespace std;
int main()
{
    int m,n;
    while(cin>>n>>m)//循环结构
    {
        int b=n;
        for(int i=2;i<=2*n;i+=2*m)//i的增量是2*m
        {
            int s=0,a;
            if(b/m!=0)//如果b不能被m整除
            {
                for(int j=i;j<=i+2*(m-1);j+=2) 
                {
                    s+=j;    //偶数列加和
                }
                a=s/m;  //求平均
                cout<<a;
                if(b!=m) cout<<" ";
            }
            if(b/m==0)//如果b能被m整除

            {
                for(int h=i;h<=i+2*(b-1);h+=2)
                {
                    s+=h;偶数列加和

                }
                a=s/b;//求平均

                cout<<a;
            }

 

 

            b-=m;//b的减量是m
        }
        cout<<"\n";
    }
    return 0;
}
2
Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

题目思路,输入数据,判断是否为0,符合进入循环程序,取余后三位。
#include<stdio.h>  
#include<stdlib.h>  
int main()
{  
    int a,b,i,p;  
    while(scanf("%d %d",&a,&b)!=EOF)
   {  
        if(a==0&&b==0)
{  
              break;   //a与b其一为0停止循环        
        }               
        p=a%1000;  //取余后三位
        a=1;  
        for(i=1;i<=b;i++)
        {  
             a=a%1000;  
             a=a*p;         //计算a的b次方     
         }  
         printf("%d\n",a%1000);  //取余后三位
    } 
    return 0; 
}
3
Problem Description
妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐。现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵。
Input
输入含有一些数据组,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),因此,每组数据的菜价就是数量乘上单价啊。菜种、数量和单价之间都有空格隔开的。
Output
支付菜价的时候,由于最小支付单位是角,所以总是在支付的时候采用四舍五入的方法把分头去掉。最后,请输出一个精度为角的菜价总量。

题目思路,输入菜价和数量,总和为各加和。输出。
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
    char a[100];
    double m,n,k=0;//定义m n
    while(cin>>a>>m>>n)
    {
        k+=m*n;//k为mn乘积的和
    }
    printf("%.1lf\n",k);//输出k保留一位小数
    return 0;
}
4
Problem Description
HDOJ上面已经有10来道A+B的题目了,相信这些题目曾经是大家的最爱,希望今天的这个A+B能给大家带来好运,也希望这个题目能唤起大家对ACM曾经的热爱。
这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
Input
输入数据有多行组成,首先是一个整数N,表示测试实例的个数,然后是N行数据,每行有6个整数AH,AM,AS,BH,BM,BS,分别表示时间A和B所对应的时分秒。题目保证所有的数据合法。
Output
对于每个测试实例,输出A+B,每个输出结果也是由时分秒3部分组成,同时也要满足时间的规则(即:分和秒的取值范围在0~59),每个输出占一行,并且所有的部分都可以用32位整数表示。

题目思路,输入时间,对时分秒转化相加,输出时间和。
 #include<math.h>
#include<string.h>
#include<time.h>
 
int h1,m1,s1,h2,m2,s2;
 
int main()
{
    int T;
    scanf( "%d" ,&T );//输入T
    while( T-- )//每次循环自减一
    {
        scanf( "%d%d%d%d%d%d" ,&h1,&m1,&s1,&h2,&m2,&s2 );//输入
        s1 += s2;
        m1 += ( m2 + s1 / 60 );
        h1 += ( h2 + m1 / 60 );//时分秒转化加和
        printf( "%d %d %d\n" , h1 ,m1%60 ,s1%60 );//输出时分秒
    }
    return 0;
}
5
Problem Description
给你n个整数,求他们中所有奇数的乘积。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。
Output
输出每组数中的所有奇数的乘积,对于测试实例,输出一行。

题目思路,先输入数组,对数1直接相乘,然后判断数是否可被2整除,即判断奇数,符合值连乘。
#include <iostream>
using namespace std;
int main(){
    int n,i,b,c;
    int a[1000];
    while(cin>>n)
{
        c=1;
        for(i=1;i<=n;i++)
        {cin>>a[i];
        if(a[i]==1)
        c=c*a[i];//如果a[i]=1,c为a[i]乘积
        else
        b=a[i]%2;//取余判断b是否为0
        if(b!=0)//可以看出a[i]为奇数
        c=c*a[i];}//算出乘积
    cout<<c<<endl;}
    return 0;
}
6
Problem Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。

题目思路,输入循环数,将其拆分,对拆分值验证,符合值输出。
 #include <stdio.h>
int f[999];
int main(){
int a,b,c,m,n,t,s,k,j,i;
while(scanf("%d %d",&m,&n))
    {
        j=0;
        for(i=m;i<=n;i++)
            {
                a=i/100;//百位数
                b=(i%100)/10;//十位数
                c=i%10;//个位数
                if(i==a*a*a+b*b*b+c*c*c)//判断i是否符合水仙花数
                    {
                        j++;//数目递增
                        f[j]=i;
                    }
                }
        if(j==0) printf("no\n");//没有符合的数输出0
        else
            {
                for(k=1;k<=j;k++)
                {
                      if(k==j)printf("%d\n",f[j]);
                      else
                      printf("%d ",f[k]);//排序
                }
            }
    }
return 0;
}

7
Problem Description
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
Input
输入数据有多组,每组占一行,由一个整数组成。
Output
对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。

题目思路,输入成绩,作分数段,输出分数段对应字母即可。
 #include<stdio.h>
int main()
{
    int a;
     while(scanf("%d\n",&a)!=EOF)//输入a
     {
    if(a<=100&&a>=90) printf("A\n");
    if(a<=89&&a>=80) printf("B\n");
    if(a>=70&&a<=79) printf("C\n");
    if(a<=69&&a>=60) printf("D\n");
    if(a>=0&&a<=59) printf("E\n");//对分数分段分类
    if(a<0||a>100) printf("Score is error!\n");}//对不在区间的分数输出
    return 0;
    }
8
Problem Description
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

题目思路,先将输入数据拆分,对其相邻的数做判断,62连舍去,4舍去,输出符合值即可。
#include <iostream>
using namespace std;
int s[1000000];
int main()
{
 s[1000000] = { 0 };
 int n, m, i, q, c = 0, z;
 for (i = 1; i <=1000000; i++)
 {
  z = i;
  while (z)
  {
   q = z % 10;//q为z的个位数
   z = z / 10;//z为其本身的个位前的数
   if (q == 4)
   {
    c++;//q=4,c本身增1
    break;
   }
   else if ((q == 2) && (z % 10 == 6))
   {
    c++;//62连号C增1
    break;
   }
  }
  s[i] = c;
 }
 while (cin >> n >> m)
 {
  if (n == 0 && m == 0)
   break;
  cout << m - n + 1 - (s[m]-s[n-1]) << endl;//输出符合号码
 }
 system("pause");
 return 0;
}

9
Problem Description
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
Input
输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。 
Output
对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。

题目思路,输入n个数,比较其绝对值然后排序。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n,i,j,m;
    float a[1000];
    while(cin>>n)
    {
        if(n==0)//n=0结束
        break;
        else
        for(i=1;i<=n;i++)
        cin>>a[i];
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n-i;j++)
            {
                if(abs(a[j])<abs(a[j+1]))//绝对值比较
                {
                    int temp;
                    temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;//交换排序
                }
            }
        }
        for(i=1;i<=n;i++)
        {
            if(i!=n)
            cout<<a[i]<<" ";//两个数之间用空格隔开
            else
            cout<<a[i];//最后一位不用
        }
        cout<<endl;
    }
}
10
Problem Description
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个评委的打分。
Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。

题目思路,定义输入最大最小值,sum减去即得总分,在除以人数减去2即可。
 #include<stdio.h>
int main()
{
    int n,i;double s,x,max,min;
    while(~scanf("%d",&n))
    {
        scanf("%lf",&x);//输入x
        s=max=min=x;//给最大最小值赋值
        for(i=1;i<n;++i)
        {
            scanf("%lf",&x);
            s+=x;//s为分数加和
            max=(x>max)?x:max;//三目运算判断最大最小值
            min=(x<min)?x:min;
        }
        printf("%.2lf\n",(s-max-min)/(n-2));//加和减去最大最小值求平均
    }
    return 0;
}
11
Problem Description
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。
Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。

题目思路,用最后桃子每次加一乘以二即得到最后数目
#include<stdio.h>
int main()
{
    int n,m,i;
    while(scanf("%d",&n)!=EOF)//输入n
    {
        m=1;//最后剩余的一个
        for(i=0;i<n-1;i++)
        {
            m=(m+1)*2;//在n次循环后,每次m+1再乘以2
        }
         printf("%d\n",m);//输出m
    }
}

12
Problem Description
据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成了绝技,能够毫不休息得以恒定的速度(VR m/s)一直跑。兔子一直想找机会好好得教训一下乌龟,以雪前耻。
最近正值HDU举办50周年校庆,社会各大名流齐聚下沙,兔子也趁此机会向乌龟发起挑战。虽然乌龟深知获胜希望不大,不过迫于舆论压力,只能接受挑战。
比赛是设在一条笔直的道路上,长度为L米,规则很简单,谁先到达终点谁就算获胜。
无奈乌龟自从上次获胜以后,成了名龟,被一些八卦杂志称为“动物界的刘翔”,广告不断,手头也有了不少积蓄。为了能够再赢兔子,乌龟不惜花下血本买了最先进的武器——“"小飞鸽"牌电动车。这辆车在有电的情况下能够以VT1 m/s的速度“飞驰”,可惜电池容量有限,每次充满电最多只能行驶C米的距离,以后就只能用脚来蹬了,乌龟用脚蹬时的速度为VT2 m/s。更过分的是,乌龟竟然在跑道上修建了很多很多(N个)的供电站,供自己给电动车充电。其中,每次充电需要花费T秒钟的时间。当然,乌龟经过一个充电站的时候可以选择去或不去充电。
比赛马上开始了,兔子和带着充满电的电动车的乌龟并列站在起跑线上。你的任务就是写个程序,判断乌龟用最佳的方案进军时,能不能赢了一直以恒定速度奔跑的兔子。
Input
本题目包含多组测试,请处理到文件结束。每个测试包括四行:
第一行是一个整数L代表跑道的总长度
第二行包含三个整数N,C,T,分别表示充电站的个数,电动车冲满电以后能行驶的距离以及每次充电所需要的时间
第三行也是三个整数VR,VT1,VT2,分别表示兔子跑步的速度,乌龟开电动车的速度,乌龟脚蹬电动车的速度
第四行包含了N(N<=100)个整数p1,p2...pn,分别表示各个充电站离跑道起点的距离,其中0<p1<p2<...<pn<L
其中每个数都在32位整型范围之内。
Output
当乌龟有可能赢的时候输出一行 “What a pity rabbit!"。否则输出一行"Good job,rabbit!";
题目数据保证不会出现乌龟和兔子同时到达的情况。
#include <iostream>
using namespace std;
int path[102];
double dp[102];

int main()
{
    int L,N,C,T,vr,vt1,vt2;
    while(cin>>L)
    {
        cin>>N>>C>>T;
        cin>>vr>>vt1>>vt2;
        for(int i=1;i<=N;++i)
            cin>>path[i];
        path[0]=0;path[N+1]=L;//每个充电站看作一个节点,把起点和终点也看作节点
        dp[0]=0;//初始化一些,下面要用到
        for(int i=1;i<=N+1;i++)
        {
            double min=1000000;//从第J到第I个充电站的最短时间
            for(int j=0;j<i;++j)
            {
                double temp;//temp是指从起点到节点i所用的时间
                if(path[i]-path[j]>=C)//从节点j到节点i的距离大于等于C的话
                    temp=dp[j]+C*1.0/vt1+(path[i]-path[j]-C)*1.0/vt2; //时间是起点到节点j加上从j到i这一段所用的时间(分为两部分)
                else
                    temp=dp[j]+(path[i]-path[j])*1.0/vt1;
                if(j>0)
                    temp+=T;//在节点j充电的时间,计算的时候看作每次都是在节点j充满电再走向节点i
                if(temp<min)
                    min=temp;//取最小时间
            }
            dp[i]=min;
        }
        double rt;
        rt=L*1.0/vr;//兔子用的时间
        if(dp[N+1]<rt)
            cout<<"What a pity rabbit!"<<endl;
        else
            cout<<"Good job,rabbit!"<<endl;
    }
    return 0;
}
13
Problem Description
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。

Input
输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50)。
Output
对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。
#include<iostream>
using namespace std;
int main()
{
    int i,m,j,k;
    long long a,b,temp;//temp作为交换的工具
    cin>>m;
    for(i=0; i<m; i++)
    {
        a=1,b=0;
        cin>>j>>k;
        for(int t=0; t<=k-j; t++)
        {
            temp=b;
            b=a+b;
            a=temp;//a与b交换,b=a+b
        }
        cout<<b<<endl;
    }
    return 0;
}
14
Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
题目思路,先输入数组,对上楼梯个数定义,统计总加和为楼梯数的方法。
 #include<iostream>
using namespace std;
int main()
{
    int M,N,i,a[10000];
    cin>>N;
    while(N--)//N的减量为1
    {
        cin>>M;
        a[1]=1;a[2]=1;//设置每次上楼梯数
        for(i=3;i<=M;i++)
        a[i]=a[i-1]+a[i-2];//对总方法统计
        cout<<a[M]<<endl;//输出
    }
    return 0;
}
15
简要题意:

对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。输入数据有多组,当x=0,y=0时,表示输入结束,该行不做处理。对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。

解题思路:

当给定x与y的值时,我们可以依次判断表达式的值是否为素数。定义一个布尔型变量,若有一个数不为素数则取反。从而得到结果。
#include<stdio.h>

int  main()

{

int x,y,n,z,i;//定义

while(scanf("%d %d",&x,&y)!=EOF)//输入

{

if(x==0&&y==0)//判断xy是否为0

break;

int flag=1;

for(n=x;n<=y;n++)//for结构循环

{

z=n*n+n+41;//赋值z

for(i=2;i<=z/2;i++)

{

if(z%i==0)//z可被整除时

flag=0;

}

}

if(flag)

printf("OK\n");//输出

else printf("Sorry\n");//否则输出

}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++程序设计是计算机科学和软件工程中非常重要的一个领域,许多大学和在线教育平台都提供与C++相关的课程。这些课程可以帮助学习者从基础到高级掌握C++编程技能。以下是一些常见的C++程序设计相关课程: 1. 初级C++课程:这些课程主要面向初学者,介绍了C++的基本语法、变量、数据类型、运算符、流程控制语句等基础知识。学习者将通过编写简单的程序来巩固所学内容。 2. 面向对象编程(OOP)课程:这些课程重点介绍面向对象编程的概念和技术,包括类、对象、封装、继承、多态等。学习者将学习如何使用C++实现面向对象的程序设计。 3. 数据结构和算法课程:这些课程讲解了常见的数据结构(如数组、链表、栈、队列、树等)和算法(如排序、搜索、图算法等),并通过C++语言实现。这些课程旨在帮助学习者理解和应用数据结构和算法来解决实际问题。 4. 高级C++课程:这些课程探讨了C++的高级主题,如模板、异常处理、多线程编程、STL(标准模板库)等。学习者将学习如何利用这些高级特性来编写更高效、可维护的C++程序。 除了传统的大学课程,许多在线教育平台也提供了丰富的C++课程资源,例如Coursera、Udemy、edX等。您可以根据自己的需求和学习进度选择适合的课程。另外,参与编程社区和讨论论坛也是很好的学习方式,可以与其他学习者交流经验和解决问题。希望这些信息对您有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值