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

  1. 输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
    90~100为A;
    80~89为B;
    70~79为C;
    60~69为D;
    0~59为E;

Input

输入数据有多组,每组占一行,由一个整数组成。

Output

对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。

题意:把在给定范围内的数字转化为给定的字母输出,不在给定范围内的输出”Score is error”.

解题思路:此题非常简单,是顺序结构比较简单的一类,按题目要求写代码即可。

细节处理:没有什么细节需要特别处理。

原代码:

#include

using namespace std;

int main()

{

int t;

while(cin>>t)

{

    if(t<0||t>100)

cout<<"Score is error!"<<endl;

else if(t>=90&&t<=100)

cout<<"A"<<endl;

else if(t>=80&&t<=89)

cout<<"B"<<endl;

else if(t>=70&&t<=79)

cout<<"C"<<endl;

else if(t>60&&t<=69)

cout<<"D"<<endl;

else if(t>=0&&t<=59)

cout<<"E"<<endl;

}

return 0;

}

总结:此题目就是运用最开始所学的顺序结构加上多组数据输入的while循环即可。

  1. 给你n个整数,求他们中所有奇数的乘积。

Input

输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。

Output

输出每组数中的所有奇数的乘积,对于测试实例,输出一行。

题意:把给定的一组数中所有奇数相乘,把所得到的数输出即可。

解题思路:把所有的奇数找出来,用一个循环把所得到的奇数连乘,就得到了最后的结果。

细节处理:while,for后面别忘了加花括号,最后别忘了换行cout<<endl;

#include

using namespace std;

int main()

{

int n,i,a,temp;

while(scanf("%d",&n)==1)

{

a = 1;

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

{

scanf("%d",&temp);

if(temp%2) a*=temp;

}

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

}

return 0;

}

总结:做这种需要先判断奇和偶,然后再用循环把他们找出来即可,被忘了是多组数据输入。

3.

Problem Description

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

Input

输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。

Output

对于每组输入数据,输出一个平均值序列,每组输出占一行。

解题思路:每隔题目所给定的长度,将这些数求平均值,有一个公式,首项加所求平均值的个数减去一就是这m个数的平均数。

细节处理:如果最后的数不足m,还需要单独拿出来计算。但公式和上面的一样。

原代码:

#include <stdio.h>

int main()

{

int n,m,a,b,c;

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

{

    b = n/m;

    c = n%m;

    a = 2;

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

    {

        if (i != 0)

            printf(" ");

        printf("%d", a + m - 1);

        a = a + 2 * m;

    }

    if (c != 0)

        printf(" %d", a + c - 1);

    printf("\n");

}

return 0;

}

总结:像这样的题需要找到它的规律,以便于根据规律来写出计算他的式子,以此来快速解决问题。

  1. Problem Description

青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。

Input

输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个评委的打分。

Output

对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。

解题思路:根据题目给出的数据,我们可以看出选手的得分是从大到小排好序的,因此不用我们从新排序,写码时去掉第一个数据和最后一个数据,求中间n-2个数据的平均值即可。

细节处理:别忘了最后输出的是保留两位小数,所以要用浮点数。别忘了头文件!

原代码:

#include

#include

using namespace std;

int main()

{

 int n,i,x=0,max,min,a;

 float s;

 while(cin>>n)

{

max=0;

min=100;

x=0;

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

{

    cin>>a;

x+=a;

if(max<a)

{

    max=a;

}

if(min>a)

{

    min=a;

}

}

s=(x-max-min)*1.00/(n-2);

cout<<fixed<<setprecision(2)<<s<<endl;

}

 return 0;

}

总结:做这个题需要把最大值最小值去掉,然后求平均值,不能忘了题目要求的浮点数,按自己的理解去写就可以了。

  1. Font Size: ← →

Problem Description

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

Input

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。

Output

对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。

解题思路:因为小牛四年以后才会生,所以分类讨论,当n<=4的时候,只有第一只母牛会生,所以年数就是母牛数,n>4的时候小牛就开始生了,先把年数减去4,所以就找规律得到代码中的式子。

细节处理:记住分两种情况!

原代码:

#include

using namespace std;

int main()

{

int n;

while(cin>>n)

{

    if(n==0)break;

    int a,b,c,d;

    if(n<=4)cout<<n<<endl;

    else{

        n=n-4;

        a=b=c=d=1;

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

        {

            d=c+d;

            c=b;

            b=a;

            a=d;

        }

        cout<<a+b+c+d<<endl;

    }

}

}

总结:像这一类的题也需要先找到规律,然后根据规律来写出式子求出来即可。

Problem Description

输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。

Input

输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。

Output

对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。

解题思路:因为是把绝对值作比较后绝对值从小到大的顺序排列,所以用abs函数来求,然后比较绝对值得大小,再用sort函数排序后输出。

细节处理:别忘了每个数之间的空格!

原代码:

#include

#include

#include

using namespace std;

int com(int a,int b)

{

 return abs(a)>abs(b);

}

int main()

{

 int a[101],x,i;

 while(cin>>i&&i!=0)

 {

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

      {

           cin>>a[x];

      }

      sort(a,a+i,com);

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

      {

           cout<<a[x];

           if(x!=i-1)

                cout<<" ";

      }

      cout<<endl;

 }

 return 0;

}

总结:学会运用c++中比较好用的函数如sqrt求根符号,abs绝对值符号等等。

  1. Problem Description

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

Input

输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。

Output

对于每个测试实例,输出插入新的元素后的数列。

解题思路:把所有的数输进去之后,用sort函数排序,再输出即可。

细节处理:sort(a,a+n+2)

原代码:

#include

#include

using namespace std;

int a[110];

int main()

{

int n,m;

while(cin>>n>>m,!(n==0&&m==0))

{

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

      cin>>a[i];

    a[n+1]=m;

    sort(a,a+n+2);

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

      cout<<a[i]<<" ";

    cout<<a[n+1]<<endl;

}

return 0;

}

总结:插入这种题,可以把所有数据都输进去后再排序。

Problem Description

作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。

Input

输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。
n=0表示输入的结束,不做处理。

Output

对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。

解题思路:把每一个数都从100-1来整除,然后求余,依次往下循环!

细节处理:按照正常的思路把他给写下来就行。

原代码:

#include

using namespace std;

int main()

{

int n,a,sum=0,i;

while(cin>>n)

{

    if(n==0)

    break;

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

{

    cin>>a;

sum+=a/100;

a%=100;

sum+=a/50;

a%=50;

sum+=a/10;

a%=10;

sum+=a/5;

a%=5;

sum+=a/2;

a%=2;

sum+=a;

}

cout<<sum<<endl;

sum=0;

}

return 0;

}

总结:因为是整数,所以每一个面值都要求一遍。

Problem Description

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

Input

输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。

Output

如果一个字符串是回文串,则输出"yes",否则输出"no".

解题思路:用字符串把它给表示出来,用gets输入,回文串就是收尾字母相同,把他的长度len给表示出来,然后输入开头和末尾的字母,看看是否相等,如果不相等就结束no,相等就继续,知道循环结束,说明是回文串,输出yes。

细节处理:分情况判断是否是回文序列,后别忘了往中间缩。

原代码:

#include<stdio.h>

#include<string.h>

int main(){

int n,i,len,j;

char s[100];

scanf("%d",&n);

getchar();

while(n--){

    gets(s);

    len=strlen(s);

    i=0;j=len-1;

    while(i<j){

        if(s[i]!=s[j])

            break;

        i++;

        j--;

    }

    if(i>=j)

        printf("yes\n");

    else

        printf("no\n");

}

return 0;

}

总结:像这种输字符串的需要用长度strlen(s)来处理,这样就十分方便简要,代码也会很简单。

Problem Description

这个题目的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位整数表示。

解题思路:因为是60进制的,所以应该先从秒判断,来确定最后时的数,然后输出时再把时分秒给取余,就得到了最后的结果。

细节处理:最后输出的时候,别忘了求余即可。

原代码:

#include

using namespace std;

int main()

{

int N,AH,AM,AS,BH,BM,BS;

cin>>N;

while(N--)

{

    cin>>AH>>AM>>AS>>BH>>BM>>BS;

    BS+=AS;

    BM+=(AM+BS/60);

    BH+=(AH+BM/60);

    cout<<BH<<" "<<(BM%60)<<" "<<(BS%60)<<endl;

}

return 0;

}

总结:这种题类似进制问题,只要把他们加起来求余就可以完成,这样的题就可以这样处理。

Input

每组输入数据占1行,每行数据的开始是2个整数n(0<=n<=100)和m(0<=m<=100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B. 每个元素为不超出int范围的整数,元素之间有一个空格隔开.
如果n=0并且m=0表示输入的结束,不做处理。

Output

针对每组数据输出一行数据,表示A-B的结果,如果结果为空集合,则输出“NULL”,否则从小到大输出结果,为了简化问题,每个元素后面跟一个空格.

解题思路:把B中与A对应的元素找出来,然后把A中剩下的元素按从大到小的顺序排出来,输出,如果A中的元素每一个都能在B中找到,就输出NULL。

细节处理:像这种分支比较多的程序,我们需要理清思路一步一步的写,千万不要把关系处理乱了,层次分明,条理清晰。

原代码:

#include

#include

#include

using namespace std;

int main()

{

int a[100], b[100], judge[100];

int i, j, k;

int n, m;

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

{

    int flag[100] = { 0 }, num = 0;

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

    {

    return 0;

    }

    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])

                {

                flag[j] = 1;

                }

                }

                }

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

                {

                if (flag[i] != 1)

                {

                sort(a, a + n);

                cout << a[i] << " ";

                judge[num++] = a[i];

                }

                }

                if (num == 0)

                {

                cout << "NULL";

                }

                cout << endl;

                }

                }

                }

总结:这样的程序应定要认真仔细的一步一步写,如果中间错一点就全错了,所以要明确步骤,一步一步的写。

Font Size: ← →

Problem Description

求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”

Input

输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

Output

对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

解题思路:对于这种超级简单的题就没有啥特别的思路,就是按套路写,把给定的两个数乘出来然后出去1000求余,输出余数即可;

细节处理:没啥细节。

原代码:

#include

using namespace std;

int main()

{

int a,b,x,i;

while(cin>>a>>b,a!=0||b!=0)

{

x=1;

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

x=(a*x)%1000;

   cout<<x<<endl;

}

return 0;

}

总结:一个非常常规的循环语句,按套路写就可以。

Problem Description

喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵-
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?

Input

输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。

Output

对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。

解题思路:找到猴子吃桃的规律,然后倒着用循环语句把规律用式子表示出来即可,反正我是用手推出来的!

细节处理:每输入一组数据之后,别忘了把y变成1,否则就会一直加下去,这样的话第二组数据数出来的结果就是错的.

原代码:

#include

using namespace std;

int main()

{

int y=1,i,n,s=0;

while(cin>>n)

{

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

        {

            s=(y+1)*2;

            y=s;

        }

        cout<<s;

        cout<<endl;

   s=0;

   y=1;

}

return 0;

}

总结:像这种题目需要先把它的规律找出来,然后寻找式子把他给表示出来,然后用一个循环就可以完成了,有一些麻烦的会多组循环,但也不影响。

Problem Description

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

Input

输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

Output

对于每个测试实例,请输出不同走法的数量

解题思路:先把前走向前三级的数据给表示出来,然后从第四个台阶开始,每一级台阶的走法,就是前两个台阶走法的加和,用循环把它给表示出来,然后输出题目所给的结果即可。

细节处理:记得每输入一组数据就要换行。

原代码:

#include

using namespace std;

int main()

{

int N,i,n;

int a[1000];

cin>>N;

while(N--)

{

    cin>>n;

    a[1]=0;

    a[2]=1;

    a[3]=2;

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

    {

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

    }

    cout<<a[n];

    cout<<endl;

}

return 0;

}

总结:想此类题目,需要仔细审题然后把其中的规律找出来,找到一个固定的式子,然后用循环把他给表示出来即可。

  1. Problem Description

一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢?

Input

输入数据有若干组,每组数据包含二个整数a,b(0<a<10000, 10<b<100),若遇到0 0则处理结束。

Output

对应每组数据,将满足条件的所有尾数在一行内输出,格式见样本输出。同组数据的输出,其每个尾数之间空一格,行末没有空格。

解题思路:这个题目就比较有意思了,我比较喜欢,根据题意来说这样的两位数有可能不止一组,所以我们就从0开始到99,一个一个数来试,如果在10以内出现的两位数,就得先输出一个零,再输出个位数,如果出现两个以上的两位数,就要输入空格,这就需要用if语句来判断,最后输出所有能被整除的结果。

细节处理:每一组数据完成以后需要把k变回零,否则就会影响下一组的结果。

原代码:

#include

using namespace std;

int main()

{

  int a,b,s,i,j,k=0;

  while(cin>>a>>b)

  {

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

      break;

      s=0;

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

      {

          j=a*100+i;

          if(j%b==0)

          {

              if(k!=0)

              {

                  cout<<" ";

              }

              if(i<10)

              {

                  cout<<"0";

                  cout<<i;

              }

              else

              {

                  cout<<i;

              }

              k++;

          }

      }

     cout<<endl;

     k=0;

   }

return 0;

}

总结:处理这一类问题一定要理清思路不要乱,就算是一个空格没有处理好,在这个程序也是错的,所以,做这种题的时候一定要仔细,层次清晰调理。

猜你喜欢

转载自blog.csdn.net/qq_43641708/article/details/85781097