MOOC哈工大2020C語言程序設計精髓練兵區編程題第五周


1 判斷一個整型數據有幾位v2.0(4分)

題目內容:

從鍵盤輸入一個整型數據(int型),編寫程序判斷該整數共有幾位,並輸出包含各個數字的個數。例如,從鍵盤輸入整數16644,該整數共有5位,其中有1個1,2個6,2個4。

int main(){
    int n,m,count = 0,i;
    int a[10]={0};
    printf("Please enter the number:\n");
    scanf("%d",&n);
    m = n>0?n:-n;
    while(m!=0)
    {
        a[m%10]++;
        m = m/10;
        count++;
    }
    printf("%d: %d bits\n",n,count);
    for(i = 0;i <10;i++)
    {
        if(a[i]!=0)printf("%d: %d\n",i,a[i]);
    }
   return 0;
}

2 獎金計算(6分)

題目內容:

企業發放的獎金根據利潤提成。利潤低於或等於10萬元時,獎金可提10%;利潤高於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可提成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時,高於40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤i,求應發放獎金總數?

int main(){
    long int profit,bonus;
    scanf("%ld",&profit);
    if(profit > 0 && profit <= 100000){
        bonus = profit * 0.1;
    } else if(profit < 200000){
        bonus = (profit - 100000) * 0.075 + (100000 * 0.1);
    } else if(profit < 400000){
        bonus = (profit - 200000) * 0.05 + (200000 - 100000) * 0.075 + (100000 * 0.1);
    } else if(profit < 600000){
        bonus = (profit - 400000) * 0.03 + (400000 - 200000) * 0.05 + (200000 - 100000) * 0.075 + (100000 * 0.1);
    } else if(profit < 1000000){
        bonus = (profit - 600000) * 0.015 + (600000 - 400000) * 0.03 + (400000 - 200000) * 0.05 + (200000 - 100000) * 0.075 + (100000 * 0.1);
    } else{
        bonus = (profit - 1000000) * 0.01 + (1000000 - 600000) * 0.015 + (600000 - 400000) * 0.03 + (400000 - 200000) * 0.05 + (200000 - 100000) * 0.075 + (100000 * 0.1);
    }
    printf("bonus=%ld\n",bonus);
    return 0;
}

3 程序修改—1(4分)

題目內容:

修改下面這個程序使其快速計算1+2+3……+n的值,n從鍵盤輸入。並按照下面給出的運行示例檢查程序。

#include  <stdio.h>
  int main()
  { 
    int i, j, sum = 0, n=100; 
    for (i=1,j=n; i<=j; i++,j--) 
    {
        sum = sum + i + j;
    }
    printf("sum = %d", sum);
    return 0;
  }

思路:源程序多加了一次中間數,減掉就行

#include  <stdio.h>
  int main()
  {
    int i, j, n ,sum = 0;
    scanf(" %d",&n);
    for (i=1,j=n; i<=j; i++,j--)
    {
        sum = sum + i + j;
            if(i==j){
                //減j減i都行
                sum=sum-i;
              }
    }
    printf("sum = %d", sum);
    return 0;
  }

重寫實現功能也行

int main()
{
    int sum = 0, n;
    scanf("%d",&n);
    for (int i = 1; i <= n; ++i) {
        sum += i;
    }
    printf("sum = %d", sum);
    return 0;
}

4 程序修改—2(4分)

題目內容:

修改下面這個用do-while語句實現的程序,改用while語句實現,並對比其優缺點。

#include  <stdio.h>
  int main()
  { 
      int sum = 0, m;
      do{
          printf("Input m:\n");
          scanf("%d", &m);
          sum = sum + m;
          printf("sum = %d\n", sum);
      }while (m != 0);
      return 0;
  }

修改后

int main()
{
    int sum = 0, m = 1;
    while (m != 0){
        printf("Input m:\n");
        scanf("%d", &m);
        //等於0要立即退出,不然會出現結果錯誤
        if(m == 0) break;
        sum = sum + m;
        printf("sum = %d\n", sum);
    }
    return 0;
}

5 程序改錯-1(4分)

題目內容:

我國古代的《張丘建算經》中有這樣一道著名的百雞問題:“雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一。百錢買百雞,問雞翁、母、雛各幾何?”其意為:公雞每只5元,母雞每只3元,小雞3只1元。用100元買100只雞,問公雞、母雞和小雞各能買多少只?目前程序運行結果有誤,請問為什么會比正確答案多出三個解?不僅要找出錯誤和修正錯誤,還要求利用以前學過的知識分析錯誤的原因。

#include <stdio.h>
  int main()
  {
      int x, y, z;
      for (x=0; x<=20; x++)
      {
          for (y=0; y<=33; y++)
          {
              z = 100 - x - y;
              if (5*x + 3*y + z/3 == 100)
              {
                  printf("x=%d, y=%d, z=%d\n", x, y, z);
              }
          }
      }
      return 0;
  }

修改后

int main()
{
    int x, y, z;
    for (x=0; x<=20; x++)
    {
        for (y=0; y<=33; y++)
        {
            z = 100 - x - y;
            //整數修改成浮點數,原因是整數類型除法會舍棄小數部分
            if (5*x + 3*y + z/3.0 == 100)
            {
                printf("x=%d, y=%d, z=%d\n", x, y, z);
            }
        }
    }
    return 0;
}

6 程序改錯-2(5分)

題目內容:

從鍵盤任意輸入一個正整數,編程判斷它是否是素數,若是素數,輸出“Yes!”,否則輸出“No!”。已知負數、0和1都不是素數。請找出下面程序的錯誤並改正之,同時按照給出的運行示例檢查修改后的程序。

#include <stdio.h>
   #include <math.h>
   int main()
   {
     int n, i;
     printf("Input n:\n");
     scanf("%d", &n);
     for (i=2; i<=sqrt(n); i++)
     {
       if (n % i = 0)
       {
         printf("No!\n");
       }
    }
    printf("Yes!\n");
    return 0;
  }

修改后

int main()
{
    int n, i,flag;
    printf("Input n:\n");
    scanf("%d", &n);
    if(n <= 1){
        printf("No!\n");
    } else {
        for (i=2; i<=sqrt(n);i++) {
            if (n % i == 0) {
                flag = 0;
            } else {
                flag = 1;
            }
        }
        if(flag == 1){
            printf("Yes!\n");
        } else{
            printf("No!\n");
        }
    }
    return 0;
}

7 程序改錯-3(4分)

題目內容:

從鍵盤任意輸入兩個符號各異的整數,直到輸入的兩個整數滿足要求為止,然后打印這兩個數。請通過測試找出下面這個程序存在的問題(不止一個問題哦),並改正。同時用下面給出的運行結果示例檢查修改后的程序。

#include <stdio.h>
  int main()
  {
    int x1, x2;
    do{
      printf("Input x1, x2:");
      scanf("%d,%d", &x1, &x2);
    }while (x1 * x2 > 0);
    printf("x1=%d,x2=%d\n", x1, x2);
    return 0;
  }

修改后

int main()
{
    int x1, x2,n,flag = 0;
    do{
        printf("Input x1, x2:\n");
        n = scanf("%d,%d", &x1, &x2);
        if(n == 2){
            if(x1 * x2 >= 0){
                flag = 1;
            } else{
                flag = 0;
            }
        } else{
            while(getchar() != '\n');
            flag = 1;
        }
    }while (flag);
    printf("x1=%d,x2=%d\n", x1, x2);
    return 0;
}

8 猴子吃桃程序_擴展1(4分)

題目內容:

猴子第一天摘了若干個桃子,吃了一半,不過癮,又多吃了1個。第二天早上將剩余的桃子又吃掉一半,並且又多吃了1個。此后每天都是吃掉前一天剩下的一半零一個。到第n天再想吃時,發現只剩下1個桃子,問第一天它摘了多少桃子?為了加強交互性,由用戶輸入不同的天數n進行遞推,即假設第n天的桃子數為1。

int main(){
    int day,peach=1;
    printf("Input days:\n");
    scanf("%d",&day);
    for (int i = 1; i < day; ++i) {
        peach =  2 * (peach + 1);
    }
    printf("x=%d\n",peach);
    return 0;
}

9 猴子吃桃程序_擴展2(4分)

題目內容:

猴子第一天摘了若干個桃子,吃了一半,不過癮,又多吃了1個。第二天早上將剩余的桃子又吃掉一半,並且又多吃了1個。此后每天都是吃掉前一天剩下的一半零一個。到第n天再想吃時,發現只剩下1個桃子,問第一天它摘了多少桃子?為了加強交互性,由用戶輸入不同的天數n進行遞推,即假設第n天的桃子數為1。同時還要增加對用戶輸入數據的合法性驗證(如:不允許輸入的天數是0和負數)

int main(){
    int day,peach=1,n;
    do{
        printf("Input days:\n");
        n = scanf("%d",&day);
        if(n == 1 && day > 0) {
            for (int i = 1; i < day; ++i) {
                peach = 2 * (peach + 1);
            }
            printf("x=%d\n", peach);
        } else{
            getchar();
        }

    }while (n == 0 || day <= 0);
    return 0;
}

10 6位密碼輸入檢測(4分)

題目內容:

從鍵盤輸入6位數字0~9組成的密碼。用戶每輸入一個密碼並按回車鍵后,程序給出判斷:如果是數字,則原樣輸出該數字,並提示用戶目前已經輸入了幾位密碼,同時繼續輸入下一位密碼;否則,程序提示"error",並讓用戶繼續輸入下一位密碼。直到用戶輸入的密碼全部是數字為止。

int main(){
    char c;
    int count = 0;
    printf("Input your password:\n");
    while (1){
        if(count == 6) break;
        scanf(" %c",&c);
        if(c >= '0' && c <= '9'){
            printf("%c, you have enter %d-bits number\n",c,count + 1);
            count++;
        } else{
            printf("error\n");
        }

    }
    return 0;
}

11 判斷一個整型數據有幾位v1.0(4分)

題目內容:

從鍵盤輸入一個整型數據(int型),編寫程序判斷該整數共有幾位。例如,從鍵盤輸入整數16644,該整數共有5位。

int main() {
    int x,temp,count = 0;
    printf("Please enter the number:\n");
    scanf("%d", &x);
    temp = fabs(x);
    while (1){
        temp = temp /10;
        count ++;
        if(temp == 0){
            break;
        }
    }
    printf("%d: %d bits\n", x, count);
}

12 檢測輸入數據中奇數和偶數的個數(4分)

題目內容:

從鍵盤輸入一系列正整數,輸入-1表示輸入結束(-1本身不是輸入的數據)。編寫程序判斷輸入數據中奇數偶數個數。如果用戶輸入的第一個數據就是-1,則程序輸出"over!"。否則。用戶每輸入一個數據,輸出該數據是奇數還是偶數,直到用戶輸入-1為止,分別統計用戶輸入數據中奇數和偶數的個數。

int main(){
    int num,odd_total = 0,even_total = 0;
    printf("Please enter the number:\n");
    while(1) {
        scanf("%d", &num);
        if (num == -1) {
            if(odd_total == 0 && even_total == 0){
                printf("over!\n");
            }
            printf("The total number of odd is %d\n",odd_total);
            printf("The total number of even is %d\n",even_total);
            break;
        } else if(num % 2 == 0){
            even_total++;
            printf("%d:even\n",num);
        } else{
            odd_total++;
            printf("%d:odd\n",num);
        }
    }

    return 0;
}

13 計算球的反彈高度(4分)

題目內容:

一個球從100米高度自由落下,每次落地后反跳回原高度的一半,再落下並反彈......,求它在第5次10次落地時,分別共經過了多少米第5次第10次反彈分別是多高?要求計算結果保留到小數點后3位。用戶從鍵盤輸入想要計算的第n次(n<=15)。程序中所有浮點數的數據類型均為float。

int main(){
    int n;
    float m = 100,sum = 0;
    printf("Input:\n");
    scanf("%d",&n);
    if(n > 0 && n <=15){
        for (int i = 1; i <= n; ++i) {
            sum = sum +  m;
            m = m / 2;
        }
        printf("%d times:\n",n);
        printf("%.3f\n",sum * 2 - 100);
        printf("%.3f\n",m);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM