c語言博客做業04--數組

1.本章學習總結

1.1 思惟導圖

1.2 本章學習體會及代碼量學習體會

1.2.1 學習體會

數組的定義簡單,可簡化代碼,增長代碼可讀性,也便於使用循環結構,但它的不足之處就是數組大小必須定義時給出,數組空間的大小一旦肯定後就不能更改,空間太大可能會形成空間浪費,過小數組又會越界,使得代碼出錯。相比前面的內容,數組仍是比較優秀的,數組可用來儲存數據,對於不一樣的狀況咱們能夠選擇一維數組,二維數組,字符數組。數字也可存放在字符數組中,但若要計算的話,就要先-‘0’,轉成數字。利用數組能夠將多個數進行排序,而普通代碼則作不到這點。冒泡法、排序法都是數組排序的經典作法。

1.2.2 代碼累計

2.PTA總分

2.1截圖PTA中函數題目集的排名得分



2.2 個人總分

一維數組:175
二維數組:105
字符數組:130
總分:405

3.PTA實驗做業

3.1PTA題目1

找出不是兩個數組共有的元素
給定兩個整型數組,本題要求找出不是二者共有的元素。
輸入格式:
輸入分別在兩行中給出兩個整型數組,每行先給出正整數N(≤20),隨後是N個整數,其間以空格分隔。
輸出格式:
在一行中按照數字給出的順序輸出不是兩數組共有的元素,數字間以空格分隔,但行末不得有多餘的空格。題目保證至少存在一個這樣的數字。同一數字不重複輸出。

3.1.1 算法分析

void Found(int a[],int b[],int n,int m);    //函數聲明

    定義 n,m,i,j;
    定義數組a a[20];
    定義數組b b[20];
    輸入a數組元素個數n
    輸入數組a
        輸入數組b元素個數m
        輸入數組b
    Found(a,b,n,m);    //調用函數
    return 0;

void Found(int a[],int b[],int n,int m)     //函數定義
    定義 i,j,k=0,cn;
    定義數組c c[41];   //把數組a和數組b中的元素放到c數組中
    static int flag[40];  //使用數組flag避免同一數字重複輸出
    cn=n+m;
    for  i=0  to  n-1  do //把a數組中的數放到c數組中 
    c[i]=a[i];
        end for
    for i=0  to  m-1  do  //把b數組中的數放到c數組中 
    c[n+i]=b[i];
        end for
    for  i=0 to cn-1  do
        if  flag[i]  then 
                      continue;
                end if
        for  j=i+1 to cn-1 do
            if c[i]==c[j]&&i<n&&j>=n  then //兩個數分別在a數組和b數組中 
                flag[j]=1;
                flag[i]=1;
                        end if
            if c[i]==c[j]&&i<n&&j<n  then   //兩個數同在a數組中
                   flag[j]=1; 
                        end if
            if c[i]==c[j]&&i>=n&&j>=n  then  //兩個數同在b數組中 
                   flag[j]=1;
                        end if
        end for
        if  flag[i]==0  then
             c[k++]=c[i];
                end if
    end for
    輸出數組c 
}

3.1.2 代碼截圖


3.1.3 PTA提交列表及說明


  • Q1:輸出不是兩數組共有的元素,且同一數字不重複輸出
  • A1:作的時候沒有想到用flag數組來處理重複的數字,使得輸出結果中有數字重複。若同一個數組中有相同的數或是與另外一個數組中有相同的數字,就把後面那個數的flag數組值置爲1,將重複的數的flag數組值置爲1,再把flag數組值爲0的數放到重構數組c中

3.2 PTA題目2

閱覽室
天梯圖書閱覽室請你編寫一個簡單的圖書借閱統計程序。當讀者借書時,管理員輸入書號並按下S鍵,程序開始計時;當讀者還書時,管理員輸入書號並按下E鍵,程序結束計時。書號爲不超過1000的正整數。當管理員將0做爲書號輸入時,表示一天工做結束,你的程序應輸出當天的讀者借書次數和平均閱讀時間。
注意:因爲線路偶爾會有故障,可能出現不完整的紀錄,即只有S沒有E,或者只有E沒有S的紀錄,系統應能自動忽略這種無效紀錄。另外,題目保證書號是書的惟一標識,同一本書在任什麼時候間區間內只可能被一位讀者借閱。算法

3.2.1 算法分析

void LibrarySystem(int a[][3],int k);    //函數聲明
    定義天數n
    定義二維數組a a[2000][3];
    定義 i,k,num,hour,minu;
    char c;    //S,E
    輸入天數n
    for i=1 to n-1  do
        k=0;
        while(1)
            scanf("%d %c %d:%d",&num,&c,&hour,&minu);
            if  num!=0  then        //把借書信息存入a數組中
                a[k][0]=num;     //數組每行第一個元素存放書號                
                a[k][1]=c;    //第二個元素存放是借書仍是還書
                a[k][2]=hour*60+minu;    //第三個元素存放時間
                k++;                 //記錄一天的借書還書次數
            end if
            else
            break;
        end while
        LibrarySystem(a,k);       //函數調用
    end for 
    return 0;
 
void LibrarySystem(int a[][3],int k)     //函數定義
    定義 i,j,count=0;  //可根據count的值判斷該借書數據是否有效
    double sum=0;
    for(i=0;i<k;i++)         //一天的借書還書次數
        if  a[i][1]=='S' then  //借書
            for  j=i+1 to k-1  do
                if a[i][0]==a[j][0]&&a[j][1]=='S'  then  //無效記錄 
                        break;
                                end if
                else if a[i][0]==a[j][0]&&a[j][1]=='E'  then   //還書
                    sum=sum+a[j][2]-a[i][2];        //計算借書時間
                    count++;                       //計算一天的借書次數
                    break;
                               end if
            end for
        end if
    end for
    if count!=0  then            //輸出有效數據
    printf("%d %.0f\n",count,sum/count);
    else                             //無效數據
    printf("0 0\n");
}

3.2.2 代碼截圖


3.2.3 PTA提交列表及說明

  • Q1:對一串既有數字又有字母還有時間的數據手足無措
  • A1:把一串既有數字又有字母還有時間的數據存放到二維數組a中
  • Q2:如何忽略無效數據
  • A2:利用count的值來判斷數據是否有效,只有同一書號輸入中有E時,count的值纔會改變,該數據也纔會被記錄下來

3.3 PTA題目3

大數加法
輸入2個大數,每一個數的最高位數可達1000位,求2數的和。
保證輸入數都是數字,不能有空格,輸出2數相加的結果

3.3.1 算法分析

定義 i,j,length1,length2;    // length1是字符數組s1的長度, length2是字符數組s2的長度,
    char s1[1000],s2[1000];
    int num1[1000]={0};           // 數字數組num1 
    int num2[1000]={0};           // 數字數組num2 
    輸入字符串s1,s2   
    length1=strlen(s1);         //求第一個加數的位數 
    length2=strlen(s2);      // 求第二個加數的位數 
    j=0;
    for i=length1-1 to 0  do   //將字符數組轉化爲數字數組,並倒數存放,做爲第一個加數 
        num1[j]=s1[i]-'0';
        j++;
    end for
    j=0;
    for i=length2-1 to 0  do   //將字符數組轉化爲數字數組,並倒數存放,做爲第二個加數 
        num2[j]=s2[i]-'0';
        j++;
    end for
    for i=0 to 1000  do            //實現大數的加法 
        num1[i]=num1[i]+num2[i];
        if num1[i]>9  then
            num1[i]=num1[i]-10;
            num1[i+1]++;    
        end if  
    end for
    for (i=999;i>=0&&num1[i]==0;i--)  //求得最終結果的位數 
        if(i>0)
            for(;i>=0;i--)                    //輸出最終答案 
              printf("%d", num1[i]);
                     end for    
            end if
            else 
             printf("0");
    end for
    return 0;

3.3.2 代碼截圖


3.3.3 PTA提交列表及說明

  • Q1:代碼寫完在devc測試時,輸不出結果
  • A1:我把兩個大數放在字符數組中,沒有把它們轉成數字就開始進行加法運算
  • Q2:進位問題
  • A2:兩個大數最大不超過1000位數,兩個數加起來也不會超過1000位,就先分別把兩個大數轉成數字逆序存放到其餘兩個定義數組中,把對應位數相加,若和大於9,則下一位加1,再重999位中去找第一個不是0的數,從這個地方逆序輸出它和它前面的數,就是答案

4. 代碼互評

4.1 代碼截圖

同窗的代碼

數組

個人代碼

函數

4.2 兩者不一樣

  • 從直觀角度看,同窗的代碼比個人代碼要簡潔一點。
  • 同窗代碼直接從最後一位開始相加計算,而我是先把它們轉成數字再逆序存到新的數組中,個人作法比較麻煩。
  • 同窗是先找出哪一個大數的位數較多,再把兩個大數相對應位數的元素的和賦給該數組,我是開了一個初始化爲0的1000大小的數組把相加的數存到裏面,再去找從哪位數組元素開始它的值不爲0,再從那位開始把它和它前面的數輸出,個人作法真的比同窗的複雜不少,理解上同窗的代碼也更好理解,向同窗學習。
相關文章
相關標籤/搜索