階段一上機報告、錯題修改


 

第一題:成績統計涉及輸入輸出,當時寫的代碼(No.1)其實運行下來看起來和樣例一致,但pta上就出現了“格式錯誤”的字樣;我看了半天,從簡化的代碼變成這種長的眼煩的碼,都不知道格式錯在哪里;

           問題在於 printf 的那些數字格式,把空格和數字本身的長度加起來再輸出,(No.2)才能得到符合pta 要求的答案,其實光用眼睛看起來真的一樣。

 

          

-----------------------------------------(手動分割線)--------------------------------------------------------------------------------------------------------------------

 

 R7-4 求某月的天數 (20 分)
 

輸入年份year、月份month,判斷該月的天數。閏年:能被4整除但不能被100整除或者能被400整除的年份是閏年。

輸入格式:

測試數據有多組,處理到文件尾。對於每組測試,輸入兩個整數,表示年份year和月份month。

輸出格式:

對於每組測試,輸出對應年月的天數。

輸入樣例:

2020 2
2020 4
 

輸出樣例:

29
30

 這是我測試時寫的代碼,在我的設想里,“1、3、5、7、8、10、12”都是31天/月;“4、6、9、11”為30天/月;2月比較特殊,閏年29天,非閏年28天;

#include<stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);//a為年,b為月 

    if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
        printf("31");
    }
     if(b==4||b==6||b==9||b==11){
        printf("30");
    }if(b==2){
        if(a%4!=0){printf("28");
        }
        else
        printf("29");
    }
    
    
    
}
    

而根據我上述代碼來看,只能運行一次,我思考 “測試數據有多組,處理到文件尾“    加上while(scanf(”%d %d “,&a,&b)!=EOF) 后會有何變化,結果可以多行輸出但顯示答案錯誤。

 

 所以又是哪里出了問題呢?仔細看題目對閏年的定義,發現自己的代碼中對閏年的條件沒寫對,再進行改進一下,才正確了。代碼如下

#include<stdio.h>
int main()
{
    int a,b;
    //a為年,b為月 
    while(scanf("%d %d",&a,&b)!=EOF) {
    
    if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
        printf("31\n");
    }
     if(b==4||b==6||b==9||b==11){
        printf("30\n");
    }if(b==2){
        if(a%4==0&&a%100!=0||a%400==0){printf("29\n");
        }
        else
        printf("28\n");
    }
}
    
    
}
    

 

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

同樣需要用到while(scanf   !=EOF)的題目是測試中的沙漏圖形題如下

當n=5時,沙漏圖形如輸出樣例所示。請觀察並明確沙漏圖形的規律。要求輸入一個整數n,輸出滿足規律的沙漏圖形。

輸入:
測試數據有多組,處理到文件尾。每組測試輸入一個整數n(1<n<20)。

輸出:
對於每組測試,輸出滿足規律的沙漏圖形。

輸入樣例:
5
輸出樣例:
*********
 *******
  *****
   ***
    *
   ***
  *****
 *******
*********

我寫的代碼其實主題是正確的,但是在測試過程中一直是“ 答案錯誤”提示,顯然我有沒有考慮輸入終止的問題,以下是原來錯誤的代碼,以及修改后正確的代碼,只需要加上 !=EOF 終止即可

#include<stdio.h>

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n<20&&n>1) 
{
        int a,j,i;
    for(a=1;a<=n;a++) 
    {
        for(i=1;i<a;i++){
            printf(" ");
        }
        for(j=0;j<2*n-2*i+1;j++){
            printf("*");
        }printf("\n");
     } 
     
    for(a=0;a<n-1;a++){
        for(i=1;i<n-a-1;i++){
            printf(" ");
        }
        for(j=0;j<=2*n-2*i;j++){
            printf("*");
        }printf("\n");
    }
}
}
    

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

相似圖形補題

7-8 交替字符倒三角形 (20 分)
根據讀入的高,畫出一個ST字符交替的倒三角形。

輸入格式:
輸入數據含有不超過50個正整數n(1≤n≤30)。 以鍵盤輸入^Z或遇到文件結束符時結束數據輸入。

輸出格式:
輸出以n為高的ST字符交替的倒三角形,畫出每個三角形時都應另起一行。

輸入樣例:
3 10
結尾無空行
輸出樣例:
STSTS
 STS
  S
STSTSTSTSTSTSTSTSTS
 STSTSTSTSTSTSTSTS
  STSTSTSTSTSTSTS
   STSTSTSTSTSTS
    STSTSTSTSTS
     STSTSTSTS
      STSTSTS
       STSTS
        STS
         S

上述題目是在補題集的最后一題中輸出圖形字符,依然假設輸入數字n有n行,設 i 為每行所在的行數 i 起始為1 最高不超過n行,設 j 為每行的空格數,起始為0格,小於 i-1 格;設x為字符數,當字符為偶數時輸出T,單數時輸出S,代碼如下

#include<stdio.h>
int main()
{
    int n;
    int i,j,x;
    while(scanf("%d",&n)!=EOF&&1<=n&&n<=30){
        for(i=1;i<=n;i++)//行數
        {
            for (j=0;j<i-1;j++)//空格數
            {
                printf(" ");
             } 
            for(x=1;x<=2*n-2*i+1;x++){
                if(x%2==0){
//一行有幾個字符,當字符為雙數上輸出T,單數位輸出S 
                    printf("T");
                }
                else printf("S");
            }
            printf("\n");
         } 
        
    }
    
}
    

倒三角就成功過驗了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

7-5 位運算應用 (20 分)

現有96個端口狀態,用3個無符號整型ua(95~64),ub(63~32),uc(31~0)組合起來的96位二進制數來表示,每位二進制數的1、0表示其正常和故障狀態。

輸入一個tag位,將tag位上二進制數置1.

tag位表示其在96位中所處的位數(在96位中從低向高從0至95)

輸入格式:

第一行輸入三個無符號整數,表示ua,ub,uc

第二行輸入一個整數tag。

輸出格式:

若tag值不在0到95之間,則輸出Error,否則輸出轉換后的ua,ub,uc

輸入樣例:

1 2 3
-2

輸出樣例:

Error

輸入樣例:

1 2 3
10

輸出樣例:

ua=1,ub=2,uc=1027

看到這題,我意識到我知識點又短缺了,於是當時沒寫,事后再去翻看了慕課李戈的位運算視頻

按照題目給的信息,我們要在tag位上二進制數置1,當我們把tag輸入為10的時候,意味着需要指定右邊起數第10位上的數置1,此時試寫代碼

int main()
{
    unsigned int ua,ub,uc;
    scanf("%u %u %u",&ua,&ub,&uc);
    int tag;
    scanf("%d",&tag);
    if(tag<0||tag>95){
        printf("Error");
    }
    else {
    if(tag>=64&&tag<=95){
        ua|=1<<(tag-64); 
    }
    else if(tag<=63&&tag>=32){
        ub|=1<<(tag-32);
    }
    else uc|=1<<tag;
    printf("ua=%u,ub=%u,uc=%u",ua,ub,uc);
}
}

成功過驗。

 

 

 

總結:學習程度還是比較低,和其他同學有挺大差距,繼續努力吧,有些漏洞多寫幾次相同類型的題目可以形成思路掌握方法。多問多花時間多看看視頻,下次爬起來。

寫題時要把握好好時間,一定要每道題都去思考試驗。

 


免責聲明!

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



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