一、PTA實驗作業
題目1:6-3 使用函數判斷完全平方數
本題要求實現一個判斷整數是否為完全平方數的簡單函數。
函數接口定義:
int IsSquare( int n );
其中n是用戶傳入的參數,在長整型范圍內。如果n是完全平方數,則函數IsSquare必須返回1,否則返回0。
1. 本題PTA提交列表
2. 設計思路
- 第一步:main()函數運行到:if ( IsSquare(n) ),開始調用函數 IsSquare( int n );
- 第二步:定義變量i表示完全平方數;
- 第三步:先考慮輸入的整數n,如果n=0或n=1,均符合條件,即return 1;
- 第四步:輸入i的表達式:i=sqrt(n);
- 第五步:如果滿足:i*i==n,即為完全平方數,return 1;
- 第六步:否則 return 0;
3.本題調試過程碰到問題及PTA提交列表情況說明
- 本題代碼雖然就幾行,但在於寫的時間比較長,有很多錯誤,一是對於函數的理解還不夠深,就把主函數里面的條件搬下來運行,導致編譯就已經發生錯誤;
- 二是在思路上少了很多細節方面沒有考慮到,比如:n=1跟n=0時的情況,導致部分正確;
- 調試過程中發現當i==1時,不滿足return 1的條件,直接跳到return 0,執行不了100的情況,變換思路,定義專門變量i,數學公式;
題目2:7-1 求組合數
本題要求編寫程序,根據公式
算出從n個不同元素中取出m個元素(m≤n)的組合數。
建議定義和調用函數fact(n)計算n!,其中n的類型是int,函數類型是double。
輸入格式:
輸入在一行中給出兩個正整數m和n(m≤n),以空格分隔。
輸出格式:
按照格式“result = 組合數計算結果”輸出。題目保證結果在double類型范圍內。
1. 本題PTA提交列表
2. 設計思路
- 第一步:函數fact( )自定義聲明 ;
- 第二步:定義變量m,n用於存放兩個正整數,double result存放結果;
- 第三步:main()函數運行到求組合數,即:result=fact(n)/(fact(m)*fact(n-m))這里時,開始調用函數fact( );
- 第四步:進入被調用函數,重新定義新變量i:實現循環條件,double product:變量product用於存放階乘的結果;
- 第五步:prodct初始值為1.0,保證類型一致;
- 第六步:進入循環,求階乘;
- 第七步:返回運算結果;
3.本題調試過程碰到問題及PTA提交列表情況說明
- 編程題,一開始程序本身就存在錯誤,在大體注意了函數步驟后,在調用函數執行某個內容時候不能夠正確寫出來,我一開始思路是把fact(n)、fact(m)、fact(n-m)三個值分別用函數計算出來后再代入總組合數公式,寫出來的太復雜,同學看了后指出說對函數還是不理解,沒有把函數作用弄明白,函數fact( )作用就是計算階乘:
- 在調用函數上形參的定義上弄錯,導致編譯出錯,本題其他基本沒有大問題:
題目3:6-6 使用函數輸出水仙花數
水仙花數是指一個N位正整數(N≥3),它的每個位上的數字的N次冪之和等於它本身。例如:
本題要求編寫兩個函數,一個判斷給定整數是否水仙花數,另一個按從小到大的順序打印出給定區間(m,n)內所有的水仙花數。
函數接口定義:
int narcissistic( int number );
void PrintN( int m, int n );
函數narcissistic判斷number是否為水仙花數,是則返回1,否則返回0。
函數PrintN則打印開區間(m, n)內所有的水仙花數,每個數字占一行。題目保證100≤m≤n≤10000。
1. 本題PTA提交列表
2. 設計思路
- 第一步:main()函數運行到:if ( narcissistic(m) ),開始調用函數int narcissistic( int number );
- 第二步:定義變量i用於循環,count存放冪的次數,x來計算出每一位的值,sum存放各個位數之和;
- 第三步:當n!=0時,進行求數的位數循環,得到count的值;
- 第四步:計算count的每一個對應的明確值,用for()循環實現,並計算出總的sum之和;
- 第五步:如果滿足:i*i==n,即為完全平方數,return 1;
- 第六步:將sum與原來給出的數相比,看是否相等,若等即滿足水仙花條件,return1;否則 return0;
- 第七步:調用void PrintN( int m, int n )函數,在滿足水仙花條件下進行從從小到大的順序打印出水仙花數;
- 第八步:返回主函數;
3.本題調試過程碰到的問題及PTA提交列表情況說明
- 寫完程序顯示編譯錯誤,檢查發現對於冪值沒有進行求值,只是求了位數,修改后,在DEV-C上運行不出來,不知道原因,弄個新的正確程序上去編譯運行是可以的,但對此程序還是沒有解決;
,
- 就自己思路上來說,寫到調用第二個函數時候,不知道怎么編寫,后來看同學代碼懂得了得新定義變量用以循環實現(m,n)之間的一個個水仙花數;
二、同學代碼結對互評
1.同學互評照片
2.我的代碼、互評同學代碼截圖
3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題
- 代碼量,我的相對較為復雜,把當n<0跟n>0兩種情況分開寫,兩個人互相品評后知道是自己的代碼不太簡潔,當n<0的時候直接使用返回值會簡便很多,而我說明我在對 return 的使用上不夠;我也總喜歡多定義變量來存放東西,再代入公式什么的,這樣明顯不需要,這是看了她的代碼后意識到的另一點;
- 在思路上我順着來,在理解上會更容易看懂,加上注釋她沒有很好的標注,可讀性較差;但相對來說我會傾向喜歡她的代碼,簡易;
- 她的能簡便敲寫代碼的想法值得我再后續寫程序中加以改變運用;她需要注意加注釋的問題;
三、截圖本周題目集的PTA最后排名
四、本周學習總結
1.你學會了什么?
1.1 C語言哪些數據類型?
- 基本的數據類型有:整型,如:int, 長整型long[int], 短整型short[int],unsigned[int];字符型:char,浮點型:單精度float和雙精度double;
1.2 字符型數據需要注意地方?
- 注意不同類型的數據采用不同的格式控制字符,如:int型使用%d,float和double都使用%f,double輸入格式控制說明必須用%lf;輸出長整型在格式控制說明中 加限定詞l(long首字母);
- 不同類型的數據可以混合運算,但數據首先要轉換成同一類型,再運算;
- scanf()函數輸入時候變量名前面需要加 &;
1.3 自增自減運算符?
- 作用是使變量值加1或減1,- -n 和 n- -都相當於n= n -1,++n 和 n ++都相當於n= n+1;但是++n 是先執行n = n+1,再將n 的值賦給++n,而n++是先把n賦值給n++,再執行n = n+1;
- 注意它們的對象只能是變量,不能是常量或表達式;
1.4 運算符優先級?
順序由高到低 : 邏輯運算符:!;
算術(單目)運算符: ++,--,+,-,* ;
(雙目):+,- ,%;
關系運算符:< ,<=,>,,>=,
邏輯運算符 :&&,
||,
條件表達式:?:;
賦值運算符:=,+=,- =,* =,/ =,%= ;
逗號運算符:,;
1.5 C語言哪些表達式?課堂派哪里做錯,做錯的請在這里分析原因?
- 賦值表達式:變量 = 表達式;(若兩側的數據類型不同,將會把右側的類型自動轉換成左側類型,再給變量進行賦值);
- 關系表達式:它的值反映關系運算的結果,其值是 1 或 0 ,類型是整型;
- 邏輯表達式:用邏輯運算符將關系表達式或邏輯量連接起來的式子,如:(x>=3)&&(x<=5);
- 條件表達式:一般形式是:表達式1?表達式2:表達式3 ;
- 逗號表達式:表達式1,表達式2,表達式3·····表達式n;
- 課堂派里面關於整型變量相除的題目,比如課堂派第六題,x = 10 / 4,我的答案一開始是2.5,做平常的運算處理,錯誤;
- 還有就是給定一些表達式求最后結果的選擇題,涉及到運算符的優先順序,對它們各自的關系不熟悉,就容易出錯;
1.6 其他內容?
- 就函數這一整章來說:懂得了使用函數能明顯減少代碼量,而且函數也可以方便代碼重用,增強了安全性;
- 函數定義:用以完成不同的功能,都可實現一個計算,得到明確計算結果; 函數調用:從main()函數開始,遇到函數調用主函數停止運行,先去執行相應的函數,等完成后返回主函數,繼續從暫停地方開始運行; 函數聲明與函數定義之間的區別:函數聲明是一條C語句,可跟分號,而函數定義不行,寫法順序:函數聲明 -- 函數調用 -- 函數定義;
- 實參與形參以及它們之間的辨別區分,實參與形參一一對應,數量相同,程序運行到函數調用時實參的值依次傳給形參實現參數傳遞;
2.本周的內容,你還不會什么?
- 不會數據類型里面提及的二進制數轉換及如何用代碼表示出來;
- 還有字母的遞增方法,A,B,C ·····;
- 對運算符的使用優先級還不熟悉,當運算符混合使用且多了后就會容易出錯,類似課堂派里的一些題目就出錯的很多:如:若a為int類型,且其值為3,則執行完表達式a+= a-= a*a 后,a的值是(?); 最后答案為-12;我的答案是-3;說明運算順序出錯了; 設x、y、t均為int型變量,則執行語句:x=y=3; t= ++x || ++y; 后,y的值為__,我的答案原來為4,現在覺得算出來是3,但不知道答案正不正確;
3.循環結構考試總結
1.哪題做錯了,怎么改
- 有試着寫出程序的題中做錯就是那道 7-4 小於m的最大的10個素數,這里面對判斷素數的條件沒弄清楚,在循環的那個地方會想用嵌套循環,就是想定義兩個變量,
一個循環外面m的遞減,另一個進行內部判斷素數;但是從這里開始就出現錯誤了,這樣的話,for內的循環條件及循環內的代碼都不知道怎么表示出來,事實上只
需要一個大循環,完成對m的遞減,然后對就是素數考慮的不夠周全,導致錯誤,判斷素數應該用 m % i==0;
2.考試結果滿意么,怎么改進?
- 對這次考試結果不滿意,改進方法最好的就是多打代碼,多看代碼,多思考鍛煉邏輯思維,遇到問題多提出求解,尋找自己學習C語言的方法跟其他人的差異,
努力改正並試着用這個寫寫算法;
3.其他總結
- 這次的上機考試跟上次情況差不多,沒有太多提高,說明對這循環結構上明顯存在很大問題,循環需要加強;
- 編程能力強的人,有的人在動手敲的時候有先寫寫算法,這樣會在編程開始后不容易卡殼,可以試試,漸漸養成寫偽代碼或算法的習慣;