標籤:全面 scan 輸出 clu 條件 優勢 解決方案 函數 for迴圈
一、PTA實驗作業題目1.出生年1. 本題PTA提交列表
- 2. 設計思路
- 1.定義數組r[10],後面用於存放位元
- 2.如果年份小於10000,接下來使用memset讓r[10]裡的每個元素都為0
- 3.讓b存放year,i存放年份的個位,再用b存放去除個位的年份,再讓r[i]等於1,迴圈直至b=0結束
- 4.用一個for迴圈,定義一個整型sum求r[10]裡所有元素的和,也就是求有幾位元不相同
- 5.如果繼續判斷year是否<1000且year%10!=0,說明這個年份不為10的倍數,最前面補充0被當做不同位,需要sum++;
- 6.如果sum==n,跳出條件為sum!=n的從2開始的while迴圈結束程式並以%04d的方式輸出,否則year++,count++(count計算與最開始的年份相差多少年份)
補充:%04d是不足4位在該數前補0補到4位
3.代碼
- 4.本題調試過程碰到問題及PTA提交列表情況說明
- 問題:部分正確,錯在這裡:
這個地方出現問題,比如輸入2013 3 ,2013被當做3位元字不同
解決問題的方法:原先演算法存在錯誤,一開始我是讓2與0,1,3,比較,如果都不相同則讓sum++,再讓0與1,3比較,以此類推
最後一個3就不判斷,所以最開始sum為0,最後變為3,導致程式錯誤,所以後面改用r[10]數組存放(每次存放前數組裡的元素都為0),
比如2013為r[2]=1,r[0]=1,r[1]=0,r[3]=1,2011為r[2]=1,r[0]=1,r[1]=1,r[1]=1,有相同位元在數組裡項數是一樣的,最後將r[10]裡所以元素相加,得sum(不同位元)
題目2.判斷上三角矩陣1. 本題PTA提交列表
2.設計思路
4.本題調試過程碰到問題及PTA提交列表情況說明
- 問題:自己學術不精,認為對角線上有0存在的話就不為對角矩陣,所以特地寫了演算法判斷對角線
發現PTA上是錯誤的
- 解決方案:發現問題後與同學交流,瞭解對角線上有0也能是上三角矩陣,刪除判斷對角線的演算法,答案正確
題目3.找出不是兩個數組共有的元素1. 本題PTA提交列表
2.設計思路
4.本題調試過程碰到問題及PTA提交列表情況說明
- 部分正確:錯在輸出的時候,
發現最開始多輸出了1個3
- 解決方案:調試過程中發現輸出第一個數後讓mark=1,這樣也能進入另一種輸出方式,結果輸出兩個3
所以調換兩個輸出方式的位置
正確:
錯誤:
二.本周題目集的PTA最後排名
三、同學代碼結對互評1.互評同學名稱
2.My Code、互評同學代碼
3.我和同學代碼不同在哪裡?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪裡出問題
不同:志堅同學用了一個二維數組,輸出二維數組條件為for(i=0;i<n;i++) for(j=0;j<=i;j++),輸出數的個數與行數和列數相同,同時還使用了#include
沒有發現錯誤,代碼挺不錯的 ,我說實話我喜歡志堅同學的代碼的風格,確實比我的好
四、本周學習總結1.你學會了什嗎?1.1 C中如何儲存字串?
字串可以存放在一維字元數組中並以Null 字元‘\0’作為結束標誌
例如:static char s[6] = {‘H’,‘E’,‘L’,‘L’,‘O’,‘\0’};
1.2 字串的結束標誌是什麼,為什麼要結束標誌?
- 結束標誌是‘\0’
因為普通數組元素的個數是確定的,一般用下標控制迴圈,而字串沒有顯示地給出有效字元的個數
只規定‘\0’之前的字元為有效字元,所以通過判斷字元是否為‘\0’來決定是否要結束迴圈
1.3 字串輸入有哪幾種方法?
- 三種種
- 1.scanf("%s”,s),遇斷行符號或者空格結束,並自動將‘\0‘輸入字串,字串中不能帶空格
- 2.gets("%s",s),遇斷行符號結束,並自動將‘\0‘輸入字串,字串中能帶空格
3.for(i=0;s!=‘\n‘;i++) scanf(‘%c",&s[i]),迴圈結束後s[i]=‘\0’,字串中能帶空格
1.4 數字字元怎麼轉整數,寫個虛擬碼
- 1.先輸入所有數字字元op存入字元數組a
2.再運用演算法(number為int型)number=op-‘0’,再把number存放入普通數組b
1.5 16進位、二進位字串如何轉10進位?寫虛擬碼?二進位:
- 1.將字串存放入字元數組a,sum=0;
- 2.將字串裡的每個字元進行sum=sum*2+a[i]-‘0‘累加累乘求和,直至a[i]=‘\0’結束,輸出sum
十六進位:
1.將字串存放入字元數組a,sum=0;
-2. 判斷字串裡的每個元素是否為十六進位數
if(a[i]>=‘0‘&&a[i]<=‘9‘) sum=sum16+a[i]-‘0‘;
if(a[i]>=‘a‘&&a[i]<=‘f‘) sum=sum16+a[i]-‘a‘+10;
if(a[i]>=‘A‘&&a[i]<=‘F‘) sum=sum*16+a[i]-‘A‘+10;
直至a[i]=‘\0’結束,輸出sum
2.本周的內容,你還不會什嗎?
- 課堂派字元數組第14題,
k值為2,n[k]不是超出了定義數組的範圍了嗎? 為什麼還是值是2?
當調用函數時,實參是一個數組名,則向函數傳送的是數組的首地址,不是數組每一個元素的地址。
3.期中考試小結3.1你認為為什麼沒考好?
- 1.考前沒有仔細複習
- 2.基礎知識還是不夠紮實,面對問題需要思考較長時間
- 3.概念題幾乎全軍覆沒,對概念知識需要全面鞏固
4.粗心
3.2 羅列錯題
選擇題:第四題
錯因:位元組和數的概念模糊不清
1.位元組通常用英文單詞“bit”來表示,有時也可以寫做“b” 改: bit是位元,Byte才是位元組,也可以寫做B
2.目前廣泛使用的Pentium機其字長為16個位元組 改:為32個位元組
3.電腦中不是所有數的運算均為補碼計算 正確 :邏輯運算就不為補碼計算
4.電腦的字長並不一定是Byte的整數倍 改:一定是Byte的整數倍
錯因:以為之前的代碼中有輸入語句
改:((ch=gerchar())!=‘\n‘)
錯因:沒看清題,以為之前做過類似的題目直接下手,認為是n++;
改n++為n+=2;
- 編程題:第三題:從n個不同的數中取r個數的所有選擇的個數。其個數值為:
錯因:定義函數時用傳回值為int型,其他大體對
改正:將傳回值改為double型
C語言部落格作業--一二維數組