一、表格
問題 | 答案 |
---|---|
這個作業屬於那個課程 | C語言程序設計II |
這個作業要求在哪里 | 點擊此處查看本次作業要求 |
我在這個課程的目標是 | 深入了解C語言,爭取掌握更多的數據類型及結構,熟練地編譯有效代碼 |
這個作業在那個具體方面幫助我實現目標 | 學習到了循環的嵌套,深入學習了循環,更加提升使用循環的能力 |
參考文獻 | C語言程序設計、百度 |
二、本周作業
1. PTA實驗作業
1.1 題目名1
6-2 統計各位數字之和是5的數 (20分)
本題要求實現兩個函數:一個函數判斷給定正整數的各位數字之和是否等於5;另一個函數統計給定區間內有多少個滿足上述要求的整數,並計算這些整數的和。
函數接口定義:
int is( int number );
void count_sum( int a, int b );
函數is判斷number的各位數字之和是否等於5,是則返回1,否則返回0。
函數count_sum利用函數is統計給定區間[a, b]內有多少個滿足上述要求(即令is返回1)的整數,並計算這些整數的和。最后按照格式
count = 滿足條件的整數個數, sum = 這些整數的和
進行輸出。題目保證0<a≤b≤10000。
裁判測試程序樣例:
#include <stdio.h>
int is( int number );
void count_sum( int a, int b );
int main()
{
int a, b;
scanf("%d %d", &a, &b);
if (is(a)) printf("%d is counted.\n", a);
if (is(b)) printf("%d is counted.\n", b);
count_sum(a, b);
return 0;
}
/* 你的代碼將被嵌在這里 */
輸入樣例:
104 999
輸出樣例:
104 is counted.
count = 15, sum = 3720
1.1.1 數據處理
定義整型變量int(number是形參、s=0賦初始值為0用於求和、remainder存放余數)
int is( int number )
自定義函數
while(number!=0){//此循環用於計算一個數的各位數之和,當不等於0就一直循環,不滿足條件就跳出循環。
remainder=number%10;//計算余數
number=number/10;//去掉最后一位數
s+=remainder;//求和
if(s==5)
return 1;//滿足條件返回1
else
return 0;//否則返回0
此定義函數結束
void count_sum( int a, int b )
自定義函數
定義整型變量(a,b都是形參,用於接收上面傳遞的數值。x賦初始值為a,用於控制循環。count賦初始值為0用於計數。sum賦初始值為0用於求和)
for(;x<=b;x++){//x從a到b一次循環
if(is(x)){
count++;
sum+=x;//滿足條件則計數、求和
printf("count = %d, sum = %d",count,sum);//打印輸出
此定義函數結束
1.1.2 實驗代碼截圖
1.1.3 造測試數據
輸入 | 輸出 | 說明 |
---|---|---|
104 999 | ![]() |
驗證題目數據 |
23 41 | ![]() |
a\b都滿足條件 |
104 104 | ![]() |
a=b的情況 |
1.1.4 PTA提交列表及說明
部分正確:第二個函數除了錯誤。原因是x<=b忘記=的情況了。之后加上就對了。
1.2 題目名2
7-1 解一元二次方程(*) (10分)
請編寫程序,解一元一次方程 ax
2
+bx+c=0 。
要求:
若a=0,則解一元一次方程。
若方程有唯一解,則輸出方程的根;
若方程無解,則輸出“無解”;
若方程有無窮多解,則輸出“無窮多解”。
若a≠0,則解一元二次方程。
若Δ>0,則輸出方程的兩個不等的實根;
若Δ=0,則輸出方程的兩個相等的實根;
若Δ<0,則輸出方程的兩個共軛的虛根。
所有實數均以%g輸出。
輸入樣例1
0 4.5 -3.6
輸出樣例1
x = 0.8
輸入樣例2
0 0 3.6
輸出樣例2
無解
輸入樣例3
0 0 0
輸出樣例3
無窮多解
輸入樣例4
-2 0.8 -0.06
輸出樣例4
x1 = 0.1, x2 = 0.3
輸入樣例5
-3 1.2 -0.12
輸出樣例5
x1 = x2 = 0.2
輸入樣例6
-0.2 0.04 -0.01
輸出樣例6
x1 = 0.1-0.2i, x2 = 0.1+0.2i
提示:注意實數的負零問題和誤差問題。
1.2.1 數據處理
定義雙精度浮點型變量double(a\b\c分別為一元二次方程的三個系數)
輸入變量
if(a==0){//當a=0的情況為大條件
if(b!=0)
if(-c/b!=0)
printf("x = %.2g",-c/b);//a=0的條件下b不等於0且x不等於0,則輸出,
if(-c/b==0||-c/b==-0)
printf("x = %.2g",fabs(-c/b));x等於0或-0,加絕對值號是考慮負零的問題
if(b==0){//b等於0的情況
if(c!=0)
printf("無解");b=0的條件下c不等於0,則輸出
else
printf("無窮多解");c等於0,則輸出
else{//a不等於0的情況,考慮到誤差問題,這里用delt與0.000001比較不直接與0 比較
if(-0.000001<=(b*b-4*a*c)&&(b*b-4*a*c)<=0.000001)
printf("x1 = x2 = %.2g",fabs(-b/(2*a)));//delt接近於0時輸出
else if(b*b-4*a*c>0.000001)
printf("x1 = %.2g, x2 = %.2g",fabs((-b+sqrt(b*b-4*a*c))/(2*a)),(-b-sqrt(b*b-4*a*c))/(2*a));
//delt大於0.000001時輸出
else
printf("x1 = %.2g+%.2gi, x2 = %.2g-%.2gi",fabs(-b/(2*a)),fabs(sqrt(-b*b+4*a*c)/(2*a)),fabs(-b/(2*a)),fabs(sqrt(-b*b+4*a*c)/(2*a)));
//delt小於0.000001時輸出
程序結束
1.2.2 實驗代碼截圖
1.2.3 造測試數據
輸入 | 輸出 | 說明 |
---|---|---|
0 2 3 | x = -1.5 | a=0有解的情況 |
0 0 0 | 無窮多解 | 驗證題目數據 |
0 0 3.6 | 無解 | 驗證題目數據 |
0 2 0 | x = 0 | 0的情況 |
-2 0.8 -0.06 | x1 = 0.1, x2 = 0.3 | 驗證題目數據 |
-0.2 0.04 -0.01 | x1 = 0.1+0.2i, x2 = 0.1-0.2i | 驗證題目數據 |
1.2.4 PTA提交列表及說明
答案正確:這最后一個點是前面有一個題的正負問題,加上絕對值號就可以了
部分正確:沒找到錯誤,就隨便試試,也沒解決問題
部分正確:應該是解決誤差問題的,之前是按照高中數學思維讓delt與0比較,但由於誤差就給了一個范圍,讓dele與0.000001比較
部分正確:考慮到負零的問題,就加了絕對值號
部分正確:只考慮到題目上給的六種情況,結果就對了六個測試點
2. 代碼互評
自己代碼①
同學代碼①
評論:
1.這道題我和這位同學的方法有很大的差別,他用到了數組,而我只是根據學到的知識來解決這個問題。
2.我在第一個函數中用while(number!=0)來控制循環的,在第二個函數多定義一個變量給其賦值為a。
3.這位同學是用數組的次數來運算的,其實我也不是很理解,我對於數組這個知識還是很陌生的。這位同學很厲害,看來是自己學習到新的知識並加以運用。
自己代碼②
同學代碼②
評論:
- 這道題是個簡單卻不容易全對的題目,因為它有10個測試點,還有需要注意但不容易想到的點。
- 我就是在能想到的就直接根據數學知識寫的,在同學那里了解到要注意負零和誤差問題后就加上絕對值和0.000001這個誤差值。
- 這位同學運用了一個陌生的知識點就是宏,應該是用於解決誤差問題的,但是我卻不是很能理解。
3. 學習總結
3.1 學習進度條
周/日期 | 這周所花的時間 | 代碼行 | 學到的知識點簡介 | 目前比較困惑的問題 |
---|---|---|---|---|
1/9-21 | 2天 | 30 | 初步接觸編程,學習編譯Hello,World! | 無 |
2/9-30 | 2天 | 20 | 學習了浮點型變量,及溫度轉換 | 無 |
3/9-15 | 3天 | 76 | 使用分段函數了解到if-else語句以及數據類型 | 對於定義數值還是不太清楚 |
4/10-16 | 3天 | 100 | for語句 | for循環進行中不清楚循環的細節 |
5/10-24 | 3 天 | 155 | 學習到了自定義函數 | 自定義函數的具體定義過程,實參形參有些迷惑 |
6/11-1 | 3天 | 250 | 學習使用if-else與for語句的嵌套,初步了解了字符型變量 | 對於字符型變量不是很懂,不明白其作用 |
7/11-7 | 2天 | 200 | 這周學習了新的分支結構switch結構,這也適用於選擇的情況,其作用類似於if-else。 | switch后面的變量表達式和case后的常量表達式弄不清。 |
8/11-15 | 3天 | 150 | 學習了新的循環結構while語句和do-while語句,和for語句有不一樣的地方,但其作用是一樣的,他們循環的條件不一樣。 | 不能熟練運用while語句去解決實際問題 |
9/11-22 | 3天 | 151 | 這周學習了循環的嵌套,可以多次循環。可以解決行與列這種類型的題、以及需要多次循環一個數一個數來的題型等等 | 感覺知識掌握的還行,但是運用的時候弄不清循環的次數和條件 |
10/11-27 | 2天 | 203 | 這周沒有學習新知識,在練習上周學的。更加熟練的運用循環嵌套了 | 知識上的疑惑沒有了,但是在刷題還是會遇到困難 |
11/12-6 | 3天 | 100 | 這周學習了一些基礎知識,只要是全局變量和局部變量的使用范圍和生存時間。 | 靜態變量,動態變量的一些特殊作用還沒記住,有疑惑 |
3.2 累計代碼行和博客字數
3.3 學習內容總結
3.4 學習體會
1.這周詳細學習了兩大內容:①函數、②變量。函數只要分為庫函數和自定義函數。庫函數由C語言系統提供定義的,可直接調用。自定義函數之前學習過,只要就是函數的聲明、定義、調用,這些都是學習過的。而變量這次主要學習了全局變量和局部變量的生存周期和作用范圍。其中還具體學習了自動變量、靜態變量他們的存儲區及作用。
2.目前自己對於這部分內容還有些疑惑,有些分不清靜態變量和自動變量的具體作用,特別在靜態局部變量和全局變量上很是迷惑。需要自己私下里多研究一下課本上的內容,掌握基礎知識。
3.截至到這周,這一學期的C語言學習就結束了,雖然仍有知識存在疑惑,但是的確學到了很多專業知識,盡管只是初級的,但還是充滿收獲感。下周就考試了,雖然是選擇題但仍然不能放松,還是要堅持學習。加油吧!