0.展示PTA總分
1.本章學習內容總結
1.1學習內容總結
- 數組中查找數據的方法有順序查找,二分查找
順序查找:
二分查找:
- 數組中插入數據
輸入一個數據x,將數組中的數據與x一個一個比較,如果大於x,記錄下數據的下標,然后這個數據下標和其后的數據的下標都加一,后挪一位,然后將x賦值給數組的那個下標。
輸入長度為n的一維數組
輸入一個數據x
for i=0 to n
if(數組元素大於x)
break;
end if
end for
for n-1 to i
數據下標加一
end for
x=a[i];
- 數組中刪除數據
刪除算法:
刪除某個元素:
輸入長度為n的一維數組
輸入需要刪除的數據x
for i=0 to n
if(x等於數組元素)
for i to n-1
數組下標加一
end for
end if
end for
-
數組中的排序方法有選擇排序和冒泡排序
選擇排序:第一步找到一個最小數放到最前面,然后第二步在剩下的數里面,再找一個最小的放到剩下的數的最前面,重復步驟二,直到所有數排好
冒泡排序:從左到右,相鄰元素進行比較。每次比較一輪,把最大或者最小的放在前面,這樣一輪一輪比較,實現排序。
-
哈希數組案例:
思路:設計一個輔助hash[],初值都為零,其下標為數組元素。輸入一個數date,判斷hash[date]是否為1,若為1,說明有重復數據,若為0,說明該數第一次輸入,將它置為1。
1.2本章學習體會
- 本章學習了數組,內容比較多,有一維數組,二維數組,字符數組,需要記的知識點很多,要掌握的算法應用也多,學習下來總是忘記,或者記下來了不會用,對其知識點比較模糊,可能是練習應用還不夠多。因此,每一次學習新的東西,都應該及時拿來應用,及時鞏固,進行整理,方便記憶。最后一句話總結,要想提高編程能力,一定不能心急浮躁,要不斷勤加練習。
- 兩周代碼代碼量在1400以上。
2.PTA實驗作業
2.1 7-4 求矩陣中的最大小值
2.1.1偽代碼
數據處理:最大值max,最小值min,二維數組a[n][m]表示輸入的矩陣,row,col分別表示最大值的行下標和列下標,row1,col1分別表示最小值的行下標和列下標
賦最大值最小值初值都為數組第一個元素
for i=0 to n
for j=0 to m
if(a[i][j]>max)
max=a[i][j]
記錄下最大值的行下標和列下標
end if
if(a[i][j]<min)
min=a[i][j]
記錄下最小值的行下標和列下標
end if
end for
end for
2.1.2代碼截圖
2.1.3造測試數據
輸入數據 | 輸出數據 | 說明 |
---|---|---|
3 5 | max=98 row=0 col=4 | 正常數據 |
57 30 66 41 98 | min=11 row=1 col=0 | |
11 93 54 62 31 | ||
49 87 71 70 37 | ||
----- | --------- | ----------- |
2 4 | max=60 row=0 col=1 | 有相同的最大的數,要求輸出行列最小,行優先 |
55 60 43 21 | min=21 row=0 col=3 | |
21 54 60 33 |
2.1.4PTA提交列表及說明
答案錯誤:把最大行下標和最小行下標搞混
答案錯誤:我以為沒有給最大行下標和最小行下標等變量賦初值是錯的,都賦值為0后還是錯
答案錯誤:把最小值初值賦值為數組元素最后一個值
答案錯誤:運行結果正確,可是提交顯示錯誤,同學告訴要能連續輸入,while的循環條件是scanf("%d %d", &n, &m) == 2
格式錯誤:第二個輸出沒有加換行符
2.27-3 判斷上三角矩陣
2.2.1偽代碼
數據處理:T表示矩陣的個數,n為數組長度,cnt為是否是上三角矩陣的標記
輸入矩陣的個數
輸入數組長度
輸入矩陣元素
for j=1 to n
for k=0 to j
if(a[j][k]!=0)
cnt=1;//不是上三角矩陣
break;
end if
end for
if(cnt==1)
break;
end for
2.2.2代碼截圖
2.2.3造測試數據
輸入數據 | 輸出數據 | 說明 |
---|---|---|
2 | ||
3 | ||
1 2 3 | YES | 正常數據 |
0 4 5 | NO | |
0 0 6 | ||
2 | ||
1 0 | ||
-8 2 | ||
----- | --------- | ----------- |
2 | YES | 最小n |
0 | YES | |
0 |
2.2.4PTA提交列表及說明
段錯誤:輸入二維數組時忘記加上&,提示段錯誤
答案錯誤:只遍歷對角線下方元素,for循環中j應該從1開始而不是從0開始
答案錯誤:內層for循環條件不是k<n而是k<j,掃描對角線下方元素
答案錯誤:if的判斷條件是對角線下方元素等於0,若為0退出,應該是若有不為0的就退出。
答案錯誤:忽略了break只能跳出一層循環,所以要在內層for循環外加上一個判斷條件,滿足則繼續跳出外循環
2.3 A-B
2.3.1偽代碼
數據處理:字符數組a存放第一次輸入的字符串,字符數組b存放第二次輸入的字符串,數組c為靜態數組,初值全為0,strlen() 用於計算字符數組長度
輸入字符數組a
輸入字符數組b
for i=0 to strlen(b)
c[b[i]]=1;
end for
for i=0 to strlen(a)
if(c[a[i]]==0)//說明數組a中沒有數組b包含的數據
輸出處理后的數組a
end if
end for
2.3.2代碼截圖
2.3.3造測試數據
輸入數據 | 輸出數據 | 說明 |
---|---|---|
I love GPLT! It's a fun game! | 正常數據 | |
aeiou | I lv GPLT! It's fn gm! | |
----- | --------- | ----------- |
I love GPLT! | 無 | 全部刪除 |
I love GPLT! | ||
----- | --------- | ----------- |
It's a fun game! | I's a fun gam! | 要刪除的在頭和尾 |
te | ||
----- | --------- | ----------- |
I love GPLT! It's a fun game! | 無刪除 | |
zbh | I love GPLT! It's a fun game! |
2.3.4PTA提交列表及說明
部分正確:開始用fgets()函數輸入字符串,運行沒有問題
部分正確:將fgets改成gets居然就對了,但是在vs中顯示語法錯誤,所以還是考慮另一種輸入
答案錯誤:用scanf輸入字符串,不小心輸入兩個相同的字符串,顯示答案錯誤
部分正確:分別用scanf輸入兩個字符串數組a和b,提交過了幾個測試點
答案錯誤:將scanf中原來的%s改為%c,全部錯誤
段錯誤:換用while循環輸入,寫循環條件時getchar忘記了后面的括號
部分正確:b[j]='\0';不小心寫成b[i]='\0';
3.閱讀代碼
- 代碼功能:給出密文C和公鑰{E,N},,其中加密由C=(M^E)mod N定義,解密由M=(C^D)mod N定義,代碼利用密文C和公鑰{E,N}找出明文M。
- 代碼優點:
1.用const定義了一個整型常變量S。便於進行類型檢查,消除了一些隱患,還可以避免模糊數字的出現,可以很方便地進行參數的調整和修改。
2.巧妙運用了while (~scanf("%lld%lld%lld", &C, &E, &N)),只有scanf返回-1時循環才結束,增強了程序的可讀性。
3.代碼語句構造簡單直接,功能與性能良好,一行一條語句,程序邏輯結構層次分明,結構清楚。