1. 程式人生 > >C語言作業--數組

C語言作業--數組

風格 轉換 小結 學習總結 n-1 遇到 n+1 長度 縮進

一、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語言作業--數組