C語言博客作業--一二維數組


C語言博客作業--一二維數組

一、PTA實驗作業

題目1:簡化的插入排序

1. 本題PTA提交列表

2. 設計思路

定義循環變量i,交換變量時的暫存變量t,第一行輸入幾個數據n,判斷標志變量flag=0,插入的變量number
輸入n,定義一維數組num[n+1]為有序序列
for i=0 to n-1
    輸入num[i]
end
輸入要插入數
for i=0 to n
    如果flag為0且number>=num[i] 結束這輪循環,進入下一輪循環
    否則交換num[i]和number並且flag 為1
end
for i=0 to n
    輸出num[i]
end

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明。

多種錯誤
1:找到了插入的位置,最后一位的值異常
分析:因為我用的是continue,遍歷數組,如果number比num[i]小不再跳過后面的語句,所以能找到正確的位置,且剛開始交換出來的數會比后面的數小,會繼續叫喚下去,但是到達最后一位時由於,沒定義最后一位數,比較結果無法確定,所以排序后最后一位無法確定。
解決方法:引入flag,判斷是否進行了交換,一旦進行交換,便一直交換到數組結束

2:格式錯誤
沒有仔細看題目,以為還是和之前一樣,最后一個數沒空格,以為很對,還是錯誤
解決方法:輸出后跟空格就可以

題目2:加法口訣表

1. 本題PTA提交列表

2. 設計思路

定義循環變量i,j,k,輸入n和repeat
輸入repeat
for k=1 to repeat
    輸入n
    定義二維數組array[n+1][n+1]
    for i=0 to n
        for j=0 to n
            array[i][j]=0初始化數組為0
        end
    end
    for j=1 to n
        array[0][j]=j首列為遞增數列
    end
    for i=1 to n
        array[i][0]=i首行為遞增數列
    end
    for i=1 to n
        for j=1 to i
            題目要求位置的數等於列數加行數
        end
    end
    for i=0 to n
        for j=0 to n
            if首行首列輸出+
            else if到每行末或為0時,換行並結束該行輸出
            else
                if 最后一個輸出array[i][j]不加空格
                else輸出array[i][j]並占4個空格
        end
    end

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明。

格式錯誤
剛開始全部的輸出%-4d,輸出結果看着都一樣,到就是格式錯誤
解決方法:加了幾句判斷條件,讓它在每行最后一個輸出時不加空格

題目3:楊輝三角

1. 本題PTA提交列表

2. 設計思路

定義i,j,k為循環變量,n為輸入的數
輸入n
定義二維數組array[n][n]
for i=0 to n-1
    for j=0 to n-1
        array[i][j]=0初始化數組
    end
end
for i=0 to n-1
    array[i][0]=1第一列賦值為1
end
for j=0 to n-1
    array[0][j]=0第一行除第一個數賦值為0
end
for i=1 to n-1
    for j=1 to n-1
        array[i][j]等於上一行數加左上方的數
    end
end
for i=0 to n-1
    for j=0 to n-1
        if為首行或行數和列數相等,輸出array[i][j]換行,結束該行輸出
        else 輸出%4d的array[i][j]
    end
end

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明。

格式錯誤
題目說每個數據占4列,因為前面的題目,便以為是%-4d,結果寫出來后格式錯誤,有想辦法去掉后面多出來的空格,還是格式錯誤
解決方法:看了同學的代碼,意識到了是哪里出錯,很快就改對了

二、截圖本周題目集的PTA最后排名。

三、同學代碼結對互評

1.互評同學名稱

李金謠

2.我的代碼、互評同學代碼截圖


3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題。

  • 不同點:
    1.數組定義:
    我的代碼是先輸入長度再定義數組,同學的代碼是定義數組長度,再決定用的范圍,而且他定義兩個數組,我只有一個。
    2.數列順序的重新排列
    我是在原有的數組中進行操作,同學是將原來的數組中的數轉移到另一個數組中。
    3.其他不同
    同學的代碼還添加了幾種條件的判斷才可以實現題目要求的功能,而我的代碼不用

  • 各自優勢
    我的優勢:代碼長度短,數組的使用較少,根據要求定義數組長度,節省使用內存
    同學的優勢:思路直白簡單,只要將數組的數轉移到寧一個數組即可,比起我還要改變原有數組的值,操作簡單。

  • 代碼風格
    我更喜歡我的代碼,比較簡短,不用判斷數組為0時的情況,而且數組的定義較少,能更有效利用數組。

四、本周學習總結

1.你學會了什么?

1.1 C中如何存儲字符串?

定義字符型數組

1.2 字符串的結束標志是什么,為什么要結束標志?

結束標志:‘\0’
原因:定義字符數組是由於無法直接知道字符串中字符個數,通常會定義一個長度遠大於要存入字符串的長度,所以如果沒有結束標志,數組將全部遍歷完才能停止,這樣可能造成運行超時,或者無法預料的錯誤,所以要在使用的字符范圍后加上結束標志。

1.3 字符串輸入有哪幾種方法?

設ch為字符變量或字符數組的數組名
1.scanf("%c",&ch);輸入單個字符
2.ch=getchar();輸入單個字符
3.scanf("%s",ch);輸入字符串,不用&,直接放數組名,遇到空格停止
4.gets(ch);輸入字符串,可以吸收空格

1.4 數字字符怎么轉整數,寫個偽代碼?

單個轉換:數字字符-‘0’
多位轉換:
假設字符數組中有a[1]='1',a[2]='2',a[3]='3',轉換成123
1.定義循環變量i,sum=0
2.i=0
3.如果a[i]!='\0',進行以下循環
4.sum=sum*10+(a[i]-'0')
5.i++

1.5 16進制、二進制字符串如何轉10進制?寫偽代碼?

假設字符數組a[]中存了該16進制數或二進制數的每一位

  • 16進制

1.定義循環變量i,sum=0
2.i=0
3.如果a[i]!='\0'進行以下循環
4.如果a[i]是數字字符,則sum=sum16+(a[i]-'0')
5.如果a[i]是A-F,則sum=sum
16+(a[i]-'A'+10)
6.如果a[i]是a-f,則sum=sum*16+(a[i]-'a'+10)
7.i++

  • 二進制

1.定義循環變量i,sum=0
2.i=0
3.如果a[i]!='\0',進行以下循環
4.sum=sum*2+(a[i]-'0')
5.i++

2.本周的內容,你還不會什么?

雖然會了一點點編程,但是明顯感覺自己的代碼量明顯不夠,思路跟不上,同樣的題要花比別人長的時間才能寫出,而且有些錯誤要調很久才能完全正確,對於字符數組要用的范圍完全不能掌握,提交pta運行時錯誤只能不斷擴大數組范圍。

以下為錯題:

1.有以下定義:char x[ ]="abcdefg"; char y[ ]={'a', 'b', 'c', 'd', 'e', 'f', 'g'}; 則正確的敘述為()。
A、數組x和數組y等價
B、數組x和數組y的長度相同
C、數組x的長度大於數組y的長度
D、數組x的長度小於數組y的長度
答案:C,錯選B
數組中,字符與字符串存到數組中長度是不同的,字符串存入數組時會自動添加一個結束符號‘\0’,因而字符串會比單個字符輸入多一個長度

2.輸入10個整數,用選擇法排序后按從小到大的次序輸出。

#define  N   10
main( )
{
int  i,j,min,temp,a[N];
for(i=0;i<N;i++)
scanf("%d",  【1】);
printf("\n");
for(i=0;  【2】;  i++)
{min=i;
for(j=i;j<N;j++)
if(a[min]>a[j])  【3】 ;
temp=a[i];
a[i]=a[min];
a[min]=temp;
 }
for (i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n");
}

參考答案
&a[i]
i<N-1
min=j
我的作答&a[i] i<N a[min]=a[j]
應該是下標交換即可

3.期中考試小結

3.1 你認為為什么沒考好?

1.選擇題的題目基本錯在了較為基礎的內容,如賦值語句正確定義,邏輯判斷符的優先級,不同類型變量的作用域和生存周期,函數的形參與實參等
2.寫出程序運行結果題目主要是對遞歸的算法不熟悉,誤判了輸出的次數
3.程序填空題主要錯在對科學計數法沒有熟練掌握,及粗心大意
4.手寫程序題真的是不熟練,以前都是在電腦上編程,手寫的一下子寫不出來
基礎沒有掌握得一清二楚,選擇題猶豫較長時間,分析程序時花的時間較多,說明在代碼量方面還有不足,導致最后的程序題只用了較短的時間就寫完,其質量也不好。總之,基礎不牢固,時間沒安排好。

3.2 羅列錯題。

選擇題:
忽略B選項后面還有||,當&&前面0時以為整個式子就是0,其實還要與后面的式子比較,因為||后面是1,所以整個式子還是1
填空題:

第7空只填了ch,還要加=getchar,當時對字符輸入還不熟悉所以填的太快就錯了
改錯題:
做的時候只找到了4個錯誤,怕被扣分,不敢亂改,term=-termxx/(n+1)(n+2);//改為term=-termxx/((n+1)(n+2));未找出
編程題:

做完前面的題,這題沒剩多少時間,所以按照以前寫過的和這題相似的題的代碼寫了一遍
答案:

#ifndefFUNC
#defineFUNC
#include<stdio.h>
#include<math.h>
doubleFactorial(intnum);
doubleCnr(intn,intr);
#endif
doubleFactorial(intnum)
{
inti;
doublefac=1;
for(i=1;i<=num;i++)
fac*=i;
returnfac;
}
doubleCnr(intn,intr)
{
doublek;
k=Factorial(n)/Factorial(r)/Factorial(n-r);
returnk;
}
intmain(){
intn,r;
intx=15,y=0;
doublek;
printf("輸入:");
scanf("%d%d",&n,&r);
while(n!=0||r!=0){
}
printf("輸入:");
scanf("%d%d",&n,&r);
}
printf("程序結束");
return0;
}

3.3 下半學期要怎么調整C的學習?

熟讀書本重要知識內容,多看看別人好的代碼,提高自己寫代碼和讀代碼的速度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM