1. 程式人生 > >《c++程式設計》課程設計報告

《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;

}

總結:處理這一類問題一定要理清思路不要亂,就算是一個空格沒有處理好,在這個程式也是錯的,所以,做這種題的時候一定要仔細,層次清晰調理。