| 這個作業屬於哪個課程 | C語言程序設計II |
| 這個作業要求在哪里 | https://edu.cnblogs.com/campus/zswxy/CST2020-1/homework/11610 |
| 我在這個課程的目標是 | 掌握break、continue語句的使用,以及他們的區別,了解多層循環結構如何跳出多層循環,使用循環輸出乘法表,了解循環嵌套的循環次數,簡化代碼 |
| 這個作業在那個具體方面幫助我實現目標 | pta實驗作業、同學代碼互評。 |
| 參考文獻 | C語言程序設計(3)、C primer plus |
| 學號 | <20208956> |
1.PTA實驗作業(20分/題)
請再此處列出自己的排名圖片。

從PTA題目集中選出2個你最滿意的題目完成以下內容,選擇題目難度越大,分值越高,每題20分(每項5分),內容要求如下:
1.1 題目名1 字符菱形
題目內容描述
輸入數據含有若干組的數據,每組數據包括一個可見字符c和一個整數n(1≤n≤30)。 以鍵盤輸入^Z或遇到文件結束符時結束數據輸入。
輸出以c為填充字符,邊長為n的菱形,每個菱形之后都輸出一個換行符。
1.1.1數據處理
數據表達:定義字符型變量c,整型變量n,c、n分別為輸入的字符和邊長。用i、j分別表示行列。
數據處理:先使用一個for(i=1;i<=n;i++)確定從上至n行,再嵌套for(j=1;j<=n-i;j++)確定每行輸出的空格數(每行空格有多少列)for(j=1;j<=2*i-1;j++)表示字符所在的列,用來循環輸出字符。當循環輸出字符結束后輸出換行。
for(i=1;i<=n-1;i++)表示下半部分的行數與上部分一樣的思路,只不過算出行列的算式不一樣,for(j=1;j<=i;j++)用來輸出空格的循環,for(j=1;j<=2*n-1-2*i;j++)輸出字符的循環,字符數量與上部分剛好成相反的變化,
1.1.2實驗代碼截圖

1.1.3 造測試數據
| 輸入樣例 | 輸出樣例 | 說明 |
|---|---|---|
| A 5 B 3 | ![]() |
A\B為填充字符 邊長分別為5、3 |
| A 3 B 3 | ![]() |
A\B為填充字符 邊長分別為3、3 |
根據PTA提交列表,簡要描述調試程序碰到的問題及解決辦法。
提交列表說明:

1.編譯錯誤主要是修改的時候不小心刪掉了一些符號。
2.運行超時:但是使用while循環的時候跳出循環的條件是scanf("%c %d",&c,&n)=='EOF',跳不出while語句,死循環了。后來將''去掉了但答案錯誤。
3.答案錯誤:輸出時A與B的菱形之間出現了一個與A邊長一樣的空格棱形,意味着輸入多了什么,從提交列表也看得出來,這里卡了很久,我最終還是沒找到原因,后來去問助教才知道在scanf中的%d后面還需加一個空格,因為如果沒有這表示A 5 B 3中5后面的空格被當作字符輸入了但是沒有得到新的n所以會出現一個與A邊長一樣的棱形。
1.2 題目2 Wifi密碼
A-1;B-2;C-3;D-4;把一系列題目的答案按照卷子上給出的對應關系翻譯成 wifi 的密碼。這里簡單假設每道選擇題都有 4 個選項,有且只有 1 個正確答案。
1.2.1 數據處理
數據表達:首先定義了mn兩個整型變量,n表示行數,n是用來表示數組中的第幾個數,再接着定義了啊,a,b兩個字符型變量用來輸入選項和對錯。最后定義了一個數組(t[n])。用來保存得到的密碼的每位數。用i表示行數,用j表示輸入字符數。
數據處理:使用兩層for循環對行數和列數進行計算,輸入完后判斷答案是否正確,對應到相應的密碼並存入數組。
最后使用for循環依次將存入的數從數組中輸出。用if語句簡化問題。
1.2.2 實驗代碼截圖

1.2.3 造測試數據
| 輸入樣例 | 輸出樣例 | 說明 |
|---|---|---|
![]() |
132 | 三位密碼 |
![]() |
130 | 無輸入時輸出0 |
![]() |
13224143 | 8位 |
1.2.4 PTA提交列表及說明

1.之前我的第二層循環j是小於等於4,因為我覺得我用scanf輸入的是兩個,一行只有四個,但是輸出的結果卻超過了n位。調試后發現在if語句時一次只判斷一個,每行一共四次輸入,每次輸入兩個,所以循環次數為8.
2.在最后輸出數組的時候出了錯誤。漏了一位。
2.代碼互評(5分)
同學代碼截圖
1

2


自己代碼截圖

1.第一位同學的代碼使用了數組,函數、自定義函數,系統性很強。我目前水平還不夠,還寫不出。
2.第二位同學與第一位的風格相似,但有很多細節的處理方式不同,都非常值得學習。
3.我沒有用到數組,按照平常的思路來,在判斷素數是否達一百的這個地方,因為我沒想出來怎么計數(每輸出15個將計數變量初始化)於是就用另一段代碼算出當輸出100個素數時輸入m的值,然后就判斷輸入值與m的大小即可。要是題目換了就得改代碼,沒有系統性。
3.學習總結(15分)
3.1 學習進度條(5分)
| 周/日期 | 這周所花的時間 | 代碼行 | 學到的知識點簡介 | 目前比較迷惑的問題 |
|---|---|---|---|---|
| 第八周 | 18 | 220 | printf,scanf的使用,以及int類型 | |
| 第九周 | 22 | 231 | if語句分支結構、調用數學函數 | |
| 第十周: | 25 | 255 | for、while、do...while語句、字符型數據的使用 | switch語句多分支結構、break語句和continue語句 |
| 第十一周 | 28 | 600左右 | switch語句,邏輯運算符,數組,自定義函數 | 多個循環結構的嵌套使用容易出錯 |
| 第十二周 | 27 | 680左右 | 無新的知識點 | 排序問題 |
| 第十三周 | 25 | 400左右 | 鞏固switch語句、const限定符、short int、long int、long long int、unsigned整數類型 | 無 |
| 第十四周 | 20 | 500 | 宏定義、多種循環結構的使用 | for循環與while循環之間的轉換 |
| 第十五周 | 19 | 700 | break,continue語句的使用,九九乘法表,水仙花數··· | 數組的使用,菱形字符··· |
3.2 累積代碼行和博客字數(5分)

3.3 學習內容總結和感悟(5分)
3.3.1 學習內容總結

3.3.2 學習體會
這周學習了break、和continue語句。
continue語句和break語句的區別是:break語句只用於循環體和switch語句中,continue只能用於循環語句。continue語句只結束本次循環,而不終止整個循環的執行。而break語句則是結束整個循環過程。break語句用來跳出循環時遇到多層循環嵌套時,break只能跳出離它最近的循環體,所以多層循環使用break跳出時得一層一層的來。
我查閱相關資料找到多層循環跳出可以使用使用goto語句;借用c++異常處理中的throw拋出異常從多重循環出來;把嵌套循環寫成函數,使用return語句結束函數。后面兩個方法還不太懂。
goto語句想跳哪里都可以。





