C語言作業--數組
一、PTA實驗作業
題目1:7-5 數組循環左移
1. 本題PTA提交列表
2. 設計思路
定義倆個整數 n,m 定義循環變量i,j,x 定義變量k用來存放下標 定義變量number用於交換數值 定義整型數組a[100] scanf("%d%d",&n,&m);輸入m,n i=0 當i<n時循環輸入整數,i遞增,並j將整數賦給數組a x=1 x遞增,只要滿足x<=m{ k=0每次設置下標為0 j=n-1,j遞減,只要滿足j>0{ number=a[k]; a[k]=a[j]; a[j]=number; 實現原先排第一個的數與後一個交換,直到排到末尾 重復m次,得到左移後的數組 } } i=0 i遞增,只要滿足i<n{ 依次輸出a中數值 在輸出最後一個數值前,每個數值後輸出一個空格}
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
1.如何實現左移
想到了冒泡排序中交換的思想,通過循序實現第一個數調到最後一個數的位置,相當於後面的左移了一個2.解決1中問題後發現,運行結果變成了最後的數調前面去了,把循環條件由遞增改為遞減,結果就對了
3.左移數大於一時發現輸出數組亂的
通過多組數據運行結果發現,是因為進入下一次循環後,下一次要後調的數下標是0,而不是誤認為的m-1,所以每次循環要將0賦給下標
題目2:7-7 找鞍點
1. 本題PTA提交列表
2. 設計思路
定義變量 n,i,j,p,q,k; 輸入n 定義數組a[6][6] i定義flag並賦初值0 i=0 i遞增,只要滿足i<n{ j=0 j遞增只要滿足j<n{ 輸入數值並賦給數組 } } i=0 i遞增,只要滿足i<n{ p=0; j=0 j遞增,只要j<n{ 滿足a[i][p]<=a[i][j]時 下標重新賦值p=j; 找到一行中最大值對應的下標 } } q=0; k=0 k遞增,只要k<n { 當(a[k][p]<=a[q][p]) 下標重新賦值q=k; 找到該列中最小值的角標 如果i==q即為鞍點 flag遞增 輸出最大鞍點的下標 } 如果flag==0 輸出NONE
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
沒有考慮到倆個或者多個鞍點的情況
增加了a[i][p]<=a[i][j]和a[k][p]==a[q][p]的判斷
題目3:7-6 閱覽室
1. 本題PTA提交列表
2. 設計思路
定義變量 n,i,number,hh,mm,number表示書序號,hh表示小時,mm表示分鐘 char op定義字符型變量op來存放E,S,0 輸入n i=0 i遞增,滿足i<n{ 定義sum,並賦初值0 定義count,並賦初值0 定義數組 time[1001] 定義flag[1001]並賦初值0 while(scanf("%d %c%d:%d",&number,&op,&hh,&mm)){輸入信息 如果number==0)退出循環 判斷輸入的字符op 如果為S{ 將開始的時間轉化成分鐘 time[number-1]=hh*60+mm; flag[number-1]=1表示該書被借 } break; 如果為E{ 如果該書被借{ flag[number-1]=0表示該書狀態為空閑 count++記錄借書次數 sum=sum+hh*60+mm-time[number-1]累加計算讀書時間 } } break; } } 如果count==0即沒有借書 輸出0 0 否則輸出借書次數count和平均借書時間sum*1.0/count
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
這一題主要就是思路的問題,考慮的東西多,用到好幾個數組,還有如何用while循環輸入信息,還有利用flag變量的值判斷
二、截圖本周題目集的PTA最後排名。
PTA排名
三、同學代碼結對互評
1.互評同學名稱 李夢冰
2.我的代碼、互評同學代碼截圖
題目7-7 找鞍點
我的代碼
夢冰代碼
3.我和同學代碼不同在哪裏?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪裏出問題。
主要不同在判斷出行最大後,繼續找列最小這一段。我是找出行最大,列最小,如果下標正好相等,那就找到鞍點了。而夢冰是找到行最大後,繼續判斷該元素所在列,它是不是最小,如果是,則為鞍點。思路上細微的差別吧。但是一開始我的代碼是有缺陷的,就是針對出現倆個鞍點的情況,沒有判斷倆元素相等的情況導致錯誤。另外由於我行和列比大小是分開的,設的變量名比較多,容易弄錯。那夢冰同學的就比較簡潔,思路清楚,可讀性高
四、本周學習總結
1.你學會了什麽?
(1)尾字符添加結束標誌 line[k]=‘\0’,結束符\0可以控制循環
(2)如果對全部元素都賦了初值,就可以省略數組長度
(3)字符串的有效長度就是有效字符的個數,由有效字符+1個字符組成,數組的長度至少是字符串的有效長度+1
一維數組定義一般形式:類型名 數組名[數組長度]
1.1 C中如何存儲字符串?
利用字符數組存放字符數據
1.2 字符串的結束標誌是什麽,為什麽要結束標誌?
‘\0’ 有了她字符數組的長度就顯得不那麽重要了,程序往往依靠檢測‘\0‘的位置判斷字符串是否結束,而不是字符數組長度,結束符可用來控制循環
1.3 字符串輸入有哪幾種方法?
(1)scanf("%s",str)
(2)gets(str)
1.4 數字字符怎麽轉整數,寫個偽代碼?
定義字符變量a
輸入數字字符‘a’
假設轉化為n進制整數
定義變量number用來存放十進制數,並賦初值0
numbe=number*n+‘a’-‘0’
1.5 16進制、二進制字符串如何轉10進制?寫偽代碼?
定義並輸入字符串
定義變量result,並賦初值result=0
char ch
當ch不是終止符\0時
result=result*10+ch-‘0‘
輸出result
2.本周的內容,你還不會什麽?
數組下標一開始還不大習慣從零開始,以及字符串的結束符判斷老丟。這次的PTA題目集,用到很多排序,幾種排序方式還是有點亂,比較習慣使用冒泡排序
錯題:
閱讀代碼:代碼前半部分是保證按從小到大的順序輸入,按%4d的格式輸出
後半部分是利用二分查找法,如果找到輸出是排第幾位,如果沒找到,輸出沒找到
所以答案:
pta題目集遇到多組輸入還是不能很快想到用while實現
3.期中考試小結
3.1 你認為為什麽沒考好?
閱讀代碼能力不強,速度慢。手寫代碼的格式不標準,寫的很亂。這都是平時太依靠編譯器的緣故,離開編譯器就不知道結果是對是錯了。還有像改錯這類題,對新題型太陌生了。另外就是基礎知識不大牢固,導致丟分
3.2 羅列錯題。
選擇題:
將十六進制數(1EB)16轉換為十進制的數是
A、272 B、273 C、427 D、491
E=14 B=11
011+1614+16161=491
錯誤原因:各種進制之間轉換不熟,不會運算
填空題:
【6】char
【7】while內對輸入的字符判斷,所以是(ch=getchar())
【8】判斷輸入字符是否為字母:(ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)
我少了括號。。。。。
改錯題:
(1)n沒賦初值,改為int n=1;
(2)變量類型為double,不是int,改%d為%lf
(3)計算公式錯了,不是term=-termXX/(n+1)(n+2)而是term=-termXX/((n+1)(n+2));
(4)求和錯誤:改為sum=sum+term
(5)根據題目每次n遞加2,所以改n++為n=n+2
編程題:
3.3 下半學期要怎麽調整C的學習?
- 1.課堂派上的預習作業代碼先自己閱讀,再用編譯器驗證答案
- 2.嘗試手寫代碼,用偽代碼寫思路也不錯,像這次寫的太亂了,框架都不怎麽完整,這補一句,那補一句,更別說註意縮進什麽的了
- 3.進制轉換和排序幾種方法都挺重要的,還有函數的使用,多多學習
C語言作業--數組