標籤:最大公約數 二分 har 技術 分享 插入 哪些 時間 ati
一、PTA實驗作業題目1:7-4 簡化的插入排序1. 本題PTA提交列表
2.設計思路
3.代碼
4.本題調試過程碰到問題及PTA提交列表情況說明。
初始代碼為
但提交後顯示
沒有考慮到最大N,插在尾和N等於0的情況,然後改過之後,但忘記如果N為0插在頭,或者x>a[n-1]應插在尾,輸出x後結束程式,導致答案錯誤
題目2:7-8 加法口訣表1. 本題PTA提交列表
2.設計思路
3.代碼
4.本題調試過程碰到問題及PTA提交列表情況說明。
開始時不知道加數和被加數要怎麼輸出,以為可以單獨輸出,故寫出以下的代碼,
輸出錯誤,後問了同學,說第一行的+和加數可以單獨輸出,和存放在數組中和列數的被加數迴圈輸出
但還是輸出錯誤,發現題目要求的是輸出下三角,故因加上判斷條件i<j;但編譯後格式錯誤
重新讀題後發現行末不能有空格,所以當i=n-1時因單獨輸出
題目3:7-11 二分尋找法1. 本題PTA提交列表
2.設計思路
3.代碼
4.本題調試過程碰到問題及PTA提交列表情況說明
編譯時間輸入偶數時,都顯示not found,但是輸入奇數又可以找到,但是位置多了一,輸入在數組以外的數字,輸出正確
在pta上提交後顯示輸出YES的答案錯誤
這樣二分法尋找,其中間值m的大小即是所在位置,不用加一,改過之後答案正確
二、本周題目集的PTA最後排名
三、同學代碼結對互評(1分)1.互評同學名稱
互評同學:田亞琴
互評題目:7-4 簡化的插入排序
2.My Code、互評同學代碼(此處核心代碼就好,不一定全部代碼,圖上指明是誰的代碼。)
3.我和同學代碼不同在哪裡?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪裡出問題。
我和亞琴的代碼 最大的不同是:
1.亞琴一開始就將x賦值給a[n],x從已經排好序的整數最後一位開始比較
2.我是考慮各種情況(1)n=0;(2)n=1&&a[0]
四、本周學習總結1.你學會了什嗎?1.1 C中如何儲存字串?
1.字串的儲存--數組初始化,例如:
static char s[6] = {‘h‘,‘a‘,‘p‘,‘p‘,y,‘\0‘},數組s中就存放了字串“happy”
(字串由有效字元和字串結束符‘\0’組成)
2.字串的儲存--賦值和輸入
例如:static char s [80];
s[0] = ‘a‘;
s[1] = ‘\0‘;
採用賦值的方法將字串“a”存入數組s;且其等價於 static char s [80] = “a”;
1.2 字串的結束標誌是什麼,為什麼要結束標誌?
字串的結束標誌是‘\0‘,因為字串並沒有顯示地給出有效字元的個數,只規定在字串結束符‘\0‘之前的字元都是字串的有效字元,一般通過比較數組元素的值是否等於‘\0‘來決定 是否結束迴圈,即用結束符‘\0‘來控制迴圈
1.3 字串輸入有哪幾種方法?
1.直接輸入:scanf("%s",str1)
2.gets(str1)
3.使用迴圈while((str1=getchar())!=‘\0‘)
1.4 數字字元怎麼轉整數,寫個虛擬碼?
定義number,i,用於存放轉換成的整數,定義數組str[]用於存放數字字元
i=0;
while((str[i]=getchar()!=‘\n‘) i++; str[i]=‘\0‘; //輸入字串
for(i=0;str[i]!=‘\0‘;i++) // 迴圈條件:str[i]不等於‘\n‘
number=number*10+str[i]-‘0‘ / /轉換成數字
輸出number
1.5 16進位、二進位字串如何轉10進位?寫虛擬碼?
16進位字串轉10進位
定義i,定義數組hexad[80]用於存放16進位字串,定義number存放轉為十進位的結果,number=0;
i=0;
輸入字串while((hexad[i] = getchar())!=‘#‘)//假設‘#’為結束符
i++;
hexad[i]=‘\0‘ //將字串結束符也存入數組
for(i=0;hexad[i]!=‘\0‘;i++)遍曆整個數組,逐個轉換
if(hexad[i]>=‘0‘&&hexad[i]<=‘9‘ // 如果是0~9的數字字元
number=number16+hexad[i] -‘0‘
else if(hexad[i]>=‘A‘&&hexad[i]<=‘F‘ ) //如果是A~F的大寫字母
number=number16+hexad[i] - ‘A‘+10;
else if(hexad[i]>=‘a‘&&hexad[i]<=‘f‘ ) //如果是a~f的小寫字母
number=number*16+hexad[i] - ‘a‘+10;
輸出number
2進位字串轉10進位
定義i,定義數組str[80]用於存放2進位數,定義number存放轉換為十進位的結果
i=0;
輸入字串 while((str[i]=getchar())!=‘\0‘)i++;
遍曆數組str[i]
for(i=0;str[i]!=‘\0‘;i++)
number=number*2+pow(i,2)
輸出十進位數字number
2.本周的內容,你還不會什嗎?
1.對於二維數組的使用還不是很好,各進位之間的轉換還不是很熟練,
2.課堂派上的錯題
輸入時過於粗心,少打了&;數組中的前n-1數依次比較大小,故i
定義的c為字元型,輸入時用c=getchar();i=0,輸出 的大寫字母用i+65,表示ASII 碼值
給j附初始值,j=0;sent是字串,輸入時用gets(sent);i<80改為sent[i];當輸入的字元不是c,則將這個字元存入另一個數組中,sent[j++]=sent[i];將字串結束符也存入數組sent[j]中;
3.期中考試小結3.1 你認為為什麼沒考好?
- 1.選擇題:對課本的基礎知識掌握的還不夠牢固,對於各進位之間的轉換概念不清晰,
- 2剖析器:平時對代碼的閱讀量太少,導致離開編譯器要自己讀程式會理解錯程式的意思
- 3.填空和改錯:還是平時的代碼練習太少了,不能很好的反應過來程式需要表達的意思
4.編程:寫得程式結構混亂,平時很少用手寫代碼,沒有了編譯器提示錯誤點,導致錯誤也未知,還有平時寫完代碼後沒有很好的複習,導致曾經做過的題也做錯
其實這次考試考不好的最主要原因還是在於自己平時的學習方法不對,對預習作業不夠認真,導致基礎的知識掌握的很不牢固,對於老師說過的題目沒有及時的複習,自己做錯過的題目有時也會忘記去訂正,導致犯同樣的錯誤,平時的編程量和代碼的閱讀量太少,以至於拿到一道題目會思考很久;平時調試一道題目會花上很多時間,做題效率太低
3.2 羅列錯題。
- 選擇題:2.將十六進位數(1EB)16轉換為十進位數;
十六進位數中A表示10,則B表示11,E表示14;故這個十六進位數是(11416)16,轉換為十進位數為11616+1416+111=491;
- 填空題:4.輸入以後字元,統計並輸入其中英文字母、數字和其他字元的個數
考試考慮忘記英文字母還有大寫字母,只考慮了小寫字母,所以弄錯,重新作答1.char 2.(ch=getchar()) 3.(ch>‘a‘&&ch<=‘z‘||ch>=‘A‘&&ch<=‘Z‘)
- 改錯題:1.設計一個函數MaxCommonFactor(),利用歐幾裡得演算法,即輾轉相除法計算兩個正整數的最大公約數
考試時讀題不仔細,導致很多錯誤沒有發現
1.int MaxCommonFactor (int a ,int b)是函式宣告,應該在末尾加分號
2.scanf("%d%d",a,b)輸入時表示要加&,即scanf(“%d%d”,&a,&b)
3.x=MaxCommonFactor(int a,int b)此處為調用函數,不是定義函數,應改x=MaxCommonFacor(int a,int b)
4.do while迴圈時滿足條件才會進入迴圈,所以當餘數不等於0時才進入迴圈,所以while(r==0)應改為while(r!= 0)
5.最後是將b賦值給了a,r賦值給了b,所以迴圈結束後,a表示被除數,即此時的最大公約數,b表示餘數
編程題:3.編寫一個函數,求從n個不同的數中取r個數的所有選擇的個數,其個數值為:
考試時,手寫的代碼結構太過混亂,導致得分很低
3.3 下半學期要怎麼調整C的學習?
認真對待每一次的預習作業,把基礎知識掌握好,自己的錯題或不會做的題及時訂正,增加代碼的練習量和閱讀量,還有平時養成多看部落格的習慣,參考別人的思路,借鑒學的好的同學的學習方法和解題思路,不要在一道題上花太多的時間,如果很久沒有思路,可以參考同學的思路,按照自己的理解重新寫代碼,提高學習效率
C語言部落格作業--一二維數組