| 這個作業屬於那個課程 | C語言程序設計II |
| 這個作業要求在哪里 | C語言I博客作業07 |
| 我在這個課程的目標是 | 學會理解運用switch語句 |
| 這個作業在那個具體方面幫助我實現目標 | 通過PTA作業和閱讀教材並練習 |
| 參考文獻 | 《C語言教材》《switch語句中default用法詳解》 |
一、PTA作業

1.1 計算天數
本題要求編寫程序計算某年某月某日是該年中的第幾天。
輸入格式:
輸入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)給出日期。注意:閏年的判別條件是該年年份能被4整除但不能被100整除、或者能被400整除。閏年的2月有29天。
輸出格式:
在一行輸出日期是該年中的第幾天。
輸入樣例1:

輸出樣例1:

輸入樣例2:

輸出樣例2:

1.1.1 數據處理
數據表達:用了四個整型int變量year,month,day,number;再把每個月的case n:number=(第(N-1)個月以及之前月之和)變化表達式列出;
數據處理:首先定義整型int變量,再用if-else判斷輸入的年是平年還是閏年,平年則一種switch框架以及相關case,閏年也是switch框架以及相關case,最后通用number=number+day計算得出輸入的年月日是輸入年的第多少天。
偽代碼:
include<stdio.h>
int main()
{
int 年,月,日,數字;
scanf("%4d四位數年/%2d二位數月/二位數日%2d",&year,&month,&day);
if如果(輸入的年份是閏年))
{
switch(月份)
{
case 1:表達式;break;
...
case 11:表達式;break;
default :表達式;break;
}
數字=輸出月份的數字+日期
}
else不是閏年
{
switch(月份)
{
case 1:表達式;break;
...
case 11:表達式;break;
default :表達式;break;
}
數字=輸出月份的數字+日期
}
輸出printf("%d\n",number);
return 0;
}
1.1.2 實驗代碼截圖

1.1.3 造測試數據
| 輸入數據 | 輸出數據 | 說明 |
|---|---|---|
| 2000/06/25 | 177 | 2000年06月25日是該年的第177天 |
| 2008/10/01 | 275 | 2008年10月01日是該年的第275天 |
| 2019/11/11 | 315 | 2019年11月11日是該年的第315天 |
1.1.4 PTA提交列表及說明

在PTA上雖然只有一次提交,但在編譯器上還有一些小錯誤;
提交列表說明:
編譯錯誤:無法編譯后看到提示的行后發現break竟然打在switch語句外了;
答案錯誤:檢查了幾遍表達式和case常量表達式沒有什么錯誤,后來發現判斷條件弄錯了;
答案錯誤:把if的條件的兩個switch框架的語句寫反了。
1.2整數的分類處理
給定 N 個正整數,要求你從中得到下列三種計算結果:
A1 = 能被 3 整除的最大整數
A2 = 存在整數 K 使之可以表示為 3K+1 的整數的個數
A3 = 存在整數 K 使之可以表示為 3K+2 的所有整數的平均值(精確到小數點后 1 位)
輸入格式:
輸入首先在第一行給出一個正整數 N,隨后一行給出 N 個正整數。所有數字都不超過 100,同行數字以空格分隔。
輸出格式:
在一行中順序輸出 A1、A2、A3的值,其間以 1 個空格分隔。如果某個數字不存在,則對應輸出NONE。
輸入樣例 1:

輸出樣例 1:

輸入樣例 2:

輸出樣例 2:

1.2.1 數據處理
數據表達:首先輸入整型int變量i,N,A1,A2,n,以及數組sum[N],由於題目輸出的A3有小數點,所以A3用浮點型double變量定義;
數據處理:輸入N,先把數組的數確定,然后利用for循環把數組里的數輸入進去,再利用for循環讓數組里的數逐個除以3看余數為多少,再根據余數不同進入不同case常量表達式,輸入完之后還得通過三個if-else判斷語句讓那些不存在的數據變為NONE。
偽代碼:
include<stdio.h>
int main()
{
int 輸入i,N,A1,A2,n;
scanf("%d",&N);先輸出N;
double A3;A3題目輸出有小數點所以浮點型定義;
int 輸入數組sum[N];
for(有個數字就讓它循環幾次的條件)
for循環先把數組給補充完整
scanf("%d",&sum[i]);
首先令A1=A2=A3=n=0;
for(i=1;i<=N;i++)
switch(讓數組的數字逐個除以3判斷余數)
{
case 1:A2條件;break;
case 2:A3條件;break;
default:A1條件:break;
}
用判斷語句A1,A2,A3分別不存在數字時令其輸出"NONE";
輸出A1,A2,A3的值
return 0;
}
1.2.2 實驗代碼截圖

1.2.3 造測試數據
| 輸入數據 | 輸出數據 | 說明 |
|---|---|---|
| 0 | NONE NONE NONE | 沒有一個數字存在 |
| 5:1 3 5 7 9 | 9 2 5.0 | A1=9 A2=2 A3=5.0 |
| 3:1 4 2 | NONE 1 NONE | A1不存在 A2=4 A3不存在 |
1.2.4 PTA提交列表及說明

提交列表說明:
部分正確:沒有考慮到兩種或兩種以上數字都不存在的情況,我通過測試點345的答案錯誤發現的;
二、代碼互評
同學(孫夢姣)代碼截圖

同學(柏朝暉)代碼截圖

我的代碼截圖

相同點:
1、都是用for循環套switch語句為框架;
2、switch語句的運行都是利用除法運算符為核心,case常量表達式都是對應數據自增;
3、輸入前都會讓A=B=C=D=E=0,而且都會在語句前單獨輸出N;
不同點:
1、第一位同學和第二位同學只用一次for循環和一次switch語句,而我用了兩次for循環和一次switch語句,我多用一次for循環是為了讓數組完整;
2、我的代碼用了六個常量表達式,其中第一個case表達式還是空的,而第一位同學的代碼用了七個常量表達式,她把為了讓第一個case也符合A,於是把第一個case的常量表達式也寫成了第二個case常量表達式,其實這是多余的,因為如果沒有輸入case的具體表達式,只要不添加break跳出語句,它就會自動進行下一個常量表達式,第二同學則把所有情況都考慮了,雖然答案都對,但是論嚴謹性還是第二同學實在;
3、我和他們最大的不同是我用了數組,論便捷性,我的還要多用一個for循環來完整數組,寫也是能寫出來的,原理也差不多,各有所好吧。
三、學習總結
3.1 學習進度條
| 周/日期 | 這周所花的時間 | 代碼行 | 學到的知識點簡介 |
| 第七周 | 10小時 | 132行 | 常用的數學函數,if-else語句 |
| 第八周 | 13小時 | 156行 | 學會運用for循環語句和知曉DevcC++調試 |
| 第九周 | 12小時 | 145行 | 學會了函數定義和調用函數 |
| 第十周 | 12小時 | 150行 | 了解了邏輯運算符和ASCII代碼 |
| 第十一周 | 5小時 | 70行 | 理解並運用switch語句,對數組有些了解 |
3.2 累積代碼行和博客字數
| 時間 | 博客字數 | 代碼行數 |
|---|---|---|
| 第五周 | 464 | 0 |
| 第六周 | 1017 | 50 |
| 第七周 | 1638 | 185 |
| 第八周 | 2533 | 341 |
| 第九周 | 3421 | 520 |
| 第十周 | 4399 | 666 |
| 第十一周 | 5051 | 721 |

3.3 學習內容總結和感悟
3.3.1 學習內容總結

3.3.2 學習體會
這周又學了一個語句,解題技巧又增加了幾分,想起剛報名的時候,不知不覺就過了十一周,還記得剛來那幾周對於編程的理解就是制作游戲的,特別酷,直到我學了這個專業,開始編代碼,我依然對計算機行業的知識一無所知,甚至編代碼都不會,在朋友的幫助下勉勉強強寫一下老師講過的代碼,到現在能編一些特簡單的小程序,看似不起眼的一步,其實也是我朝我希望的方向前進的一個重要的證明了,我希望我能不忘初心,逐漸成為我理想的樣子。
