C語言I博客作業09


這個作業屬於哪個課程 https://edu.cnblogs.com/campus/zswxy/CST2020-2/
這個作業要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2020-2/homework/11635
這個作業的目標 了解c語言中函數的概率,熟悉自定義函數的用法,辨別好形參與實參,辨別局部變量與全局變量
學號 20208999
參考文獻 C Primer Plus,b站,csdn論壇

1.PTA實驗作業(20分/題)

1.1 6-2 統計各位數字之和是5的數 (20分)

本題要求實現兩個函數:一個函數判斷給定正整數的各位數字之和是否等於5;另一個函數統計給定區間內有多少個滿足上述要求的整數,並計算這些整數的和。。

1.1.1數據處理

數據表達:本題定義了sum,n,i三個整型變量,i是個通過for循環控制條件,並且用來賦值;n用來計算滿足條件的正整數個數,sum用來計算符合條件的數的和。
數據處理:	int is( int number ){
    int sum,i;
    sum=0;
    for(i=number;i>0;i/=10){
        sum+=i%10;
    }
    if(sum==5){
        return 1;
    }
    else{
        return 0;
    }
    
}

void count_sum(int a, int b) {
    int i, sum,n;
    sum = 0;
    n = 0;
        for (i = a; i <= b; i++) {
        if (is(i)) {
            sum += i;
            n++;
        }
    }
    printf("count = %d, sum = %d",n,sum);
}
本題利用自定義函數的調用,在定義其他函數時可以嵌套使用早已定義好的函數,利用for循環,將符合條件的數統計下來並求和

1.1.2實驗代碼截圖

1.1.3 造測試數據

輸入數據 輸出數據 說明
104 999 104 is counted.count = 15, sum = 3720 實驗樣例
0 1000 count = 21, sum = 3885 當區間最大時

1.1.4 PTA提交列表及說明

提交列表說明:

答案錯誤:輸出的格式沒有按照pta上的說明寫,並且在定義第一個函數時,返回值輸入錯誤
編譯錯誤:當自定義函數前有void時說明沒有返回值,而我寫了返回值
處理方式:將多余的返回值刪去

1.2 7-1 解一元二次方程 (10分)

1.2.1 數據處理

數據表達:本題用了a,b,c,d,x,p,q,x1,x2,這十個個變量,其中a,b,c是接受初始值,x,x1,x2是解一元一次方程的解,p和q都是用來判斷一元二次方程的根,
數據處理:    if (a == 0)  //判斷a的值是否為0 
    {
        if (b != 0) {    // 假設b的值不為為0 
            x = -c / b;  //解出方程的根 
            printf("x = %g", fabs(x)); //題目要求考慮實數的負零問題和誤差問題;所以用絕對值函數 
        }
        else if (b == 0 && c != 0)  //假設吧b的值為0,c的值不為0 
        {
            printf("無解");//方程無解 
        }
        else if (b == 0 && c == 0) {
            printf("無窮多解"); //方程有無窮多解 
        }
    }
    else if (a != 0) {
        d = b * b - 4 * a * c; // 判斷▲的值,看方程是否有實根 
        if (d > 0)  //假設方程有倆個不同實根 
        {
            x1 = (-b + sqrt(d)) / (2 * a);
            x2 = (-b - sqrt(d)) / (2 * a);
            if (x1 == -0) {
                x1 = 0;
            }
            if (fabs (x1-x2) < 0.001){
                  printf("x1 = x2 = %g\n", x1);
                }
            else {
                printf("x1 = %g, x2 = %g\n", x1, x2); //輸出倆個實根 
            }
        }
        if (d == 0) {   //假設方程有兩個相同實數根 
            p = -b / (2 * a);
            printf("x1 = x2 = %g\n", fabs(p)); // 題目要求考慮實數的負零問題和誤差問題;所以用絕對值函數 
        }

        else if(d<0) { //假設方程的兩個共軛的虛根。
            p = -b / (2 * a);
            q = fabs(sqrt(-d) / (2 * a));
            printf("x1 = %g+%gi, x2 = %g-%gi", fabs(p), q, fabs(p), q);//輸出方程的的兩個共軛的虛根。 
        }
    }
利用if與else if判斷各種情況並分別進行計算與輸出

1.2.2 實驗代碼截圖

1.2.3 造測試數據

輸入數據 輸出數據 說明
0 0 3.6 無解 b=0,c!=0,a=0
0 0 0 無窮多解 a,b,c都為0
-1 0.2 0 x1=0,x2=0.2 有兩個實根且其中一個為零時
1 0.4 0.04 x1=x2=0.2 兩個實根相等時

1.2.4 PTA提交列表及說明


提交列表說明:

部分錯誤1:當兩個實根相等時,x1與x2分開輸出了,而沒有一起輸出
解決方案:精度問題,添加一個if(fabs(x1-x2)<0.001)語句
部分錯誤2:當一個實根為零時,輸出了x1=-0
解決方案:輸入一個語句if(x1==-0){x1=0}
答案錯誤:沒有按題目要求輸出

2.代碼互評(5分)

題目:7-1 解一元二次方程 (10分)

同學代碼:


本人代碼:

  • 不同點:1.定義的數量不同,我定義了多個中間值用來存儲答案
    2.對於平方的計算,同學利用了pow()函數,而我只是簡單的相乘,看起來不夠簡潔
    3.我對輸出的值的精度沒做過多要求,而同學將輸出值精確在小數點后兩位,這樣使答案看起來更精確

3.學習總結(15分)

3.1 學習進度條(5分)

周/日期 這周所花時間 代碼行 學到的知識點簡介 目前比較疑惑的問題
第一周/11.2-11.8 15h 350 學習了for循環結構
第二周/11.9-11.15 21h 480 學習了自定義函數的調用
第二周/11.16-11.22 35h 540 學習了if else分支結構,字符型定義
第四周/11.23-11.29 46h 660 學習了switch語句
第五周/11.30-12.6 50h 780 學習了while語句與do while語句 在while內鑲嵌其他語句
第六周/11.7-12.13 60h 830 學習了嵌套循環,認識了continue和break的區別 在嵌套循環的用法
第七周/11.14-12.20 70h 900 對函數的概念更加輸入了,深入學習了自定義函數以及形參與實參,局部變量與全局變量 自定義函數時的返回值用法

3.2 累積代碼行和博客字數(5分)

3.3 學習內容總結和感悟(5分)

3.3.1 學習內容總結

3.3.2 學習體會

  • 作業越來越難了,空閑時間多看看書學習,練習代碼能力
  • 每天都要打一段時間的代碼,可以經常看看視頻教學
  • 要多去參考資料,打代碼不能只是照貓畫虎,那樣毫無作用
  • 這次作業還是比較有難度的,自己一很多不理解。
  • 同時這個應該是最后一次作業,自己還是認真的對待,努力做題。
  • 自己現在開始學會做一點筆記這個可以讓我們對自己的代碼感覺了解,有些不理解的還是問同學們好一點。
  • 不會的題目不要死杠着,可以多借鑒其他同學的代碼,避免浪費時間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM