第一題:成績統計涉及輸入輸出,當時寫的代碼(No.1)其實運行下來看起來和樣例一致,但pta上就出現了“格式錯誤”的字樣;我看了半天,從簡化的代碼變成這種長的眼煩的碼,都不知道格式錯在哪里;
問題在於 printf 的那些數字格式,把空格和數字本身的長度加起來再輸出,(No.2)才能得到符合pta 要求的答案,其實光用眼睛看起來真的一樣。
-----------------------------------------(手動分割線)--------------------------------------------------------------------------------------------------------------------
輸入年份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); } }
成功過驗。
總結:學習程度還是比較低,和其他同學有挺大差距,繼續努力吧,有些漏洞多寫幾次相同類型的題目可以形成思路掌握方法。多問多花時間多看看視頻,下次爬起來。
寫題時要把握好好時間,一定要每道題都去思考試驗。