標籤:一點 結果 http 部落格 運行 2-2 形參 int std
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 為1endfor 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輸入repeatfor 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初始化數組 endendfor i=0 to n-1 array[i][0]=1第一列賦值為1endfor j=0 to n-1 array[0][j]=0第一行除第一個數賦值為0endfor i=1 to n-1 for j=1 to n-1 array[i][j]等於上一行數加左上方的數 endendfor i=0 to n-1 for j=0 to n-1 if為首行或行數和列數相等,輸出array[i][j]換行,結束該行輸出 else 輸出%4d的array[i][j] endend
3.代碼
4.本題調試過程碰到問題及PTA提交列表情況說明。
格式錯誤
題目說每個資料佔4列,因為前面的題目,便以為是%-4d,結果寫出來後格式錯誤,有想辦法去掉後面多出來的空格,還是格式錯誤
解決方案:看了同學的代碼,意識到了是哪裡出錯,很快就改對了
二、本周題目集的PTA最後排名。
三、同學代碼結對互評1.互評同學名稱
李金瑤
2.My Code、互評同學代碼
3.我和同學代碼不同在哪裡?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪裡出問題。
不同點:
1.數組定義:
My Code是先輸入長度再定義數組,同學的代碼是定義數組長度,再決定用的範圍,而且他定義兩個數組,我只有一個。
2.數列順序的重新排列
我是在原有的數組中進行操作,同學是將原來的數組中的數轉移到另一個數組中。
3.其他不同
同學的代碼還添加了幾種條件的判斷才可以實現題目要求的功能,而My Code不用
各自優勢
我的優勢:代碼長度短,數組的使用較少,根據要求定義數組長度,節省使用記憶體
同學的優勢:思路直白簡單,只要將數組的數轉移到寧一個數組即可,比起我還要改變原有數組的值,操作簡單。
代碼風格
我更喜歡My Code,比較簡短,不用判斷數組為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進位數或位元的每一位
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=sum16+(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 10main( ){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);#endifdoubleFactorial(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的學習?
熟讀書本重要知識內容,多看看別人好的代碼,提高自己寫代碼和讀代碼的速度。
C語言部落格作業--一二維數組