C語言部落格作業--一二維數組

來源:互聯網
上載者:User

標籤:一點   結果   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進位數或位元的每一位

  • 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   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語言部落格作業--一二維數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.