C語言博客做業04——數組

0.展現PTA總分

1.本章學習總結

1.1 學習內容總結

  • 數組中查找數據:
    利用下標 循環查找:好比a[5]={1,2,3,4,5}中找到3這個數字
for(i=0;i<5;i++)
if(a[i]==3)
index=i;//因而記下3所在數組的下標,則a[index]就是所要找的數了
  • 數組中插入數據:
    僞代碼(好比一個a[10]={1,2,3,4,5,7,8,9,10}中插入一個數x=6,按從小到大順序):
int i;
從左到右查找第一個比6大的數,記下它的下標index;
for(i=9;i>index;i--)
{
    a[i]=a[i-1];
}
a[index]=x;

作法:利用for循環從後面往前面賦值,最後在a[index]的位置賦予x的值,實現數組數據的插入。數組

  • 數組中刪除數據:
  • 好比有一個a[5]={1,2,3,4,5},要在數組中刪除3這個數據
    一、僞代碼(利用循環):
for(i=0;i<5;i++)
if(a[i]==3)//找出3所在數組的下標
index=i;//記下下標
for(i=index;i<4;i++)
{
    a[i]=a[i+1];
}//使a[index]賦值爲下一位,而後執行循環使下一位賦值爲下下一位;從而刪除3這個數據,保留其餘數據的數字的順序
for(i=0;i<4;i++)
printf("%d"a[i]);
//在使用數組的時候,因爲刪除了一位數字,因此從新輸出或者使用的時候,記得減小數組的一個長度,因此有i<4而不是i<5

二、僞代碼(利用另外一個數組):函數

int i=0;j=0;
for(i=0;i<5;i++)
if(a[i]==3)//找出3所在數組的下標
index=i;//記下下標
while(j!=5)//這裏若是數組長度爲n,則將5改成n便可
{
    if(i!=index)b[i++]=a[j++];
    else {j++}
}

這樣子就獲得了刪除3這個數字後剩餘數字不變的數字b了,這種方法能夠保留a這個數組,獲得新的數組,不過比第一種方法麻煩一點,有時候會顯得不必。學習

  • 數組中目前學到排序方法
    這裏舉例子並註釋說明(有一個數組a[n],其中的數據從小到大排列)
    一、冒泡法(把最大的沉下去):
    使用兩層循環
for(i=1;i<n;i++)//外循環n-1次
{
    for(j=0;j<n-1-i;j++)
        {
            判斷a[j]>a[j+1],是的話交換a[j]與a[j+1];
        }//內循環結束後,將有一個最大值「沉」到未排序的最下面
}

兩層循環後便可獲得有序的重構數組a[];
二、選擇法(先選擇最大的,而後按照順序排下來):
這裏也是要用到兩層循環測試

for(i=1;i<n;i++)
{
    for(j=0;j<n-i;j++)
    {
        若是a[MaxIndex]<a[j];則交換Max與j; //歷遍數組,找出最大的值所在下標
    }
    交換a[MaxIndex]與a[n-i]; //將最大的元素與(未排序)下標最大的數組元素交換
}

兩層循環後便可獲得有序的重構數組a[];調試

  • 數組作枚舉用法:code

  • 哈希數組用法:blog

1.2 本章學習體會

  • 學習感覺:又過了2個周,忽然以爲時間過得好快啊,從順序結構到循環結構,再到函數,如今已經到了數組,學到的知識愈來愈多,但相對應的題目難道也愈來愈大了,本身也要更加的努力了。
    這兩週以來學習了數組,數組有3大類,一個是一維數組,第二個是二維數組,還有一個三維數組,啊,不是,是字符數組,字符數組包括由簡單的字符組成的數組,還有字符串數組,作數組的話感受運用更靈活,思路也更復雜。
  • 這兩週的代碼量:884行排序

    2.PTA實驗做業

    2.1 題目:7-7 螺旋方陣

    2.1.1 僞代碼:

for(k=0;k<5;k++)//控制螺旋賦值的次數
{
    i = 0, j = 0;//從新賦值行、列
    for(j = 0+k; j < n-k; j++)//控制賦值的數量
        {
              從左到右賦值方陣第一行;
         }
    for(i = 1+k; i <n-k; i++)//控制賦值的數量
        {
              從上到下賦值最後一列;
        }
    for(j = n - 2-k; j >= 0+k; j--)//控制賦值的數量
        {
              從右到左賦值最後一行;
         }
    for(i = n - 2-k; i >= 1+k; i--)//控制賦值的數量
        {
              從下到上賦值第一列;
        }

}
利用循環,輸出二維數組a[i][j]

2.1.2 代碼截圖:

2.1.3 造測試數據:

輸入數據 輸出數據 說明
2 恰好圍成一圈
4 普通的一個數據
9 臨界最大的數據

2.1.4 PTA提交列表及說明:(在VS上已調試成功)

提交列表說明:

這道題遇到了2個問題,均在VS上調試完成
本題採用了一個for裏面4個for螺旋式地給2個行2個列賦值的方法字符串

  • 問題一、螺旋方陣賦值時出現後一個for賦值把前面for最後一個拐角覆蓋掉了,進行右移或左移後正常賦值
    好比:
    1 2 3 4
    13 14 15 5
    12 18 17 6
    11 10 9 8
    這裏a[3][3]原來應該被第2個for賦值爲7的,結果卻被第3個for從新賦值爲8,還有外循環進行一次後的a[2][2]也是出現了覆蓋賦值的狀況.
    原來錯誤的循環:for (j = n - 1-k; j >= 0+k; j--),改成for (j = n - 2-k; j >= 0+k; j--),將j的初始值-1,使它賦值向左移了一位。
  • 問題二、內循壞條件控制很差,也致使了覆蓋賦值的狀況
    好比:
    1 2 3 4
    12 13 14 15
    11 18 17 16
    10 9 8 7
    這裏a[1][3]原來應該爲5,a[2][3]原來應該爲6,可是卻被第二次外循環從新賦值爲1五、16;
    因而將第1個內循壞由for (j = 0+k; j < n; j++)改成for (j = 0+k; j < n-k; j++),改變循壞條件,使最後一個賦值變爲有k控制的賦值。

2.2 題目名2

2.2.1 僞代碼

2.2.2 代碼截圖

2.2.3 造測試數據

2.2.4 PTA提交列表及說明

提交列表說明:

2.3 題目名3

2.3.1 僞代碼

2.3.2 代碼截圖

2.3.3 造測試數據

2.3.4 PTA提交列表及說明

提交列表說明

3.閱讀代碼

相關文章
相關標籤/搜索