C語言程序設計第三次作業——選擇結構(1)


(一)改錯題
計算f(x)的值:輸入實數x,計算並輸出下列分段函數f(x)的值,輸出時保留1位小數。

輸入輸出樣例1:
  Enterr x: 10.0
  f(10.0) = 0.1
輸入輸出樣例2:
  Enter x: 234
  f(234.0) = 234.0
源程序(有錯誤的程序)

 #include <stdio.h> 
 int main(void)
 { 
    double x,y;
    printf("Enter x: \n"); 
    scanf("=%f", x);
    if(x = 10);
    { 
        y = 1 / x
    }
    else (x != 10)
    {
       y = x;
    }
    printf("f(%.2f) = %.lf\n" x y); 
    return 0; 
 }

 錯誤信息1:
 錯誤原因:第9行最后沒加分號。
 改正方法:在“x”后加分號。
 錯誤信息2:
 錯誤原因:第7行的if括號里的語句后加了分號,無法與else配對。
 改正方法:去掉if一行中的分號。
 錯誤信息3:
 錯誤原因:else后邊不能加語句。
 改正方法:去掉else后括號里的語句。
 錯誤信息4:
 錯誤原因:輸語句中引號后要加逗號。
 改正方法:在15行的“x”前加逗號。
 錯誤信息5:
 錯誤原因:x與y兩個變量之間要用逗號隔開。
 改正方法:在x與y之間加上逗號。
 錯誤信息6:
 錯誤原因:題目要求輸出時保留一位小數,且把“l”錯寫成“1”。
 改正方法:將“%.lf”改為“%.1f”。
 錯誤信息7:
 錯誤原因:if后不用賦值單等號而用等於雙等號。
 改正方法:將單等號改為雙等號。
錯誤信息8:
錯誤原因:輸入語句里不能有等號。
改正方法:去掉等號。
錯誤信息9:
錯與原因:輸入語句中要加地址符。
改正方法:在x前加&。
錯誤信息10:
錯與原因:運行后發現輸入10.0后,括號里是10.00。
改正方法:將第15行的括號里的“%.2f”改為“%.1f”。
錯誤信息11:
錯與原因:運行后發現格式與所給示例不同,換行了,“\n”多余。
改正方法:將“\n”去掉。
錯誤信息12:
錯誤原因:第一個輸入示例運行正確后,輸入第二個事例結果錯誤,x,y定義為double型,輸入語句里應用“%lf”。
改正方法:輸入語句里將“%f”改為“%lf”。
改正后運行結果正確,如圖:


正確源程序為:

(二)學習總結
1.if(a)if(b) x=x+1;else y=y+1; 的確切含義是什么?這個else應該和哪個if配對?如何明確表達這種配對方法?將該段代碼按照規范化的格式進行書寫。
答:此程序段的確切含義是若a且b,則執行x=x+1;否則,則執行y=y+1。else應和第二個if配對。
正確表達:

if(a&&b)
{
    x=x+1;
}
else
{
    y=y+1;
}

2.C語言的表達式 (-10< x <10)能夠表達x在區間(-10,10)嗎?為什么?如果不能,正確的表達式應該怎么寫?
答:不能,C語言中自左向右判斷,所以先判斷x>-10是否正確,而無法判斷x<10。
正確表達式為:

(x>-10 && x<10)

3.C語言中輸入數據時,如果遇到非法字符,則認為輸入結束。運行程序(1),輸入123a,看看輸出結果是什么?你能解釋是為什么嗎?,
程序(1)

#include <stdio.h>
int main()
{   
    int  a, b;
    scanf("%d %d", &a, &b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

答:輸入后得到結果如圖:

當輸入123a時,a為非法字符,輸入結束,則a=123,而b被賦值為1。若想b=a,則輸入輸出語句中d所對應的%d改為%c。如圖:
scanf()函數的返回值是成功讀入數據的個數,如果沒有讀取任何數據,則返回0。運行程序(2),分別輸入123 45和123a,看看輸出結果是什么?為什么?
程序(2)

#include <stdio.h>
int main()
{   
    int  a, b,n;
    n = scanf("%d %d", &a, &b);
    printf("n = %d\n", n);
    return 0;
}

答:輸出結果如圖:

輸入123 45后n=2,說明成功讀入2個數據,scanf()函數的返回值為2。

輸入123a后n=1,說明只成功讀入1個數據,因為有一個非法字符a,所以停止輸入,所以只有一個數據。
修改程序(1),當輸入非法數據時,輸出“Input error!".樣例如下:


答:修改后的程序如圖:

#include <stdio.h>
int main()
{   
    int  a, b,n;
    n = scanf("%d %d", &a, &b);
    if(n==2)
    {
	    printf("a = %d,b = %d\n",a,b);
    }
    else
    {
	    printf("Input error!");
    }
    return 0;
}

輸入123 45和123a后結果如圖:


4.總結:
(1)判斷條件是否成立要用到關系運算符,關系運算符的結合方向為自左向右,關系運算符的優先級低於算術運算符,高於賦值運算符。
(2)邏輯運算符中“且”用“&&”表示,“或”用“||”表示。
(3)復合語句的分支中要使用花括號,使if與else一 一對應。
(4)字符常量用來存放字符常量,只能放一個字符,用char聲明,輸入輸出時用“%c”表示。
(三)實驗總結
1.計算分段函數[2]
(1)題目
本題目要求計算下列分段函數f(x)的值:

(2)流程圖

(3)源代碼

#include <stdio.h>
#include <math.h>
int main (void)
{
    double x,relust;
    scanf("%lf",&x);
    if (x>=0)
    {
	    relust=pow(x,0.5);
    }
    else
    {
	    relust=pow((x+1),2)+2*x+1/x;
    }
    printf("f(%.2f) = %.2f",x,relust);
    return 0;
}

(4)測試數據及運行結果


(5)實驗分析
問題:流程圖中無法賦值。
原因:流程圖與源程序的算術運算符弄混了。
解決辦法:記牢流程圖與源程序運算符的區別。
2.算術入門之加減乘除
(1)題目
對於輸入的兩個整數,按照要求輸出其和差積商。
(2)流程圖

(3)源代碼

#include <stdio.h>
int main (void)
{
    int a,b,c,d,f,h;
    double g;
    scanf("%d %d",&a,&b);
    c=a+b;
    d=a-b;
    f=a*b;
    printf("%d + %d = %d\n%d - %d = %d\n%d * %d = %d\n",a,b,c,a,b,d,a,b,f);
    g=(double)a/b;
    h=a%b;
    if (h==0)
    {
        printf("%d / %d = %.0f",a,b,g);
    }
    else
    {
        printf("%d / %d = %.2f",a,b,g);
    }
    return 0;
}

(4)測試數據及運行結果


(5)實驗分析
問題:a與b的商為小數。
原因:沒有判斷a/b的余數是否為0。
解決辦法:注意判斷a/b的余數是否為0。
3.輸出三角形面積和周長
(1)題目
本題要求編寫程序,根據輸入的三角形的三條邊a、b、c,計算並輸出面積和周長。注意:在一個三角形中, 任意兩邊之和大於第三邊。三角形面積計算公式:area=√s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。
(2)流程圖

(3)源代碼

#include <stdio.h>
#include <math.h>
int main (void)
{
    int a,b,c;
    double s,area,perimeter;
    scanf("%d %d %d",&a,&b,&c);
    perimeter=a+b+c;
    s=perimeter/2;
    area=sqrt(s*(s-a)*(s-b)*(s-c));
    if ((a+b>c)&&(a+c>b)&&(b+c>a))
    {
        printf("area = %.2f; perimeter = %.2f",area,perimeter);
    }
    else
    {
        printf("These sides do not correspond to a valid triangle");
    }
    return 0;
}

(4)測試數據及運行結果


(5)實驗分析
問題:輸入第二個示例后,運行結果與示例不同。
原因:是否為三角形的條件應用&&而不是||。
解決辦法:將||改為&&。
4.出租車計價
(1)題目
本題要求根據某城市普通出租車收費標准編寫程序進行車費計算。具體標准如下:
• 起步里程為3公里,起步費10元;
• 超起步里程后10公里內,每公里2元;
• 超過10公里以上的部分加收50%的回空補貼費,即每公里3元;
• 營運過程中,因路阻及乘客要求臨時停車的,按每5分鍾2元計收(不足5分鍾則不收費)。
(2)流程圖

(3)源代碼

#include <stdio.h>
int main (void)
{
    int t;
    double x,y;
    scanf("%lf %d",&x,&t);
    if (x<=3)
    {
        y=10;
    }
    else if (x<=10)
    {
        y=10+2*(x-3);
    }
    else if (x>10)
    {
        y=10+(10-3)*2+(x-10)*3;
    }
    if (t>=5)
    {
        y=y+t/5*2;
    }
    else
    {
        y=0+y;
    }
    printf("%.0f",y);
    return 0;
}

(4)測試數據及運行結果



(5)實驗分析
問題:流程圖過於復雜。
原因:判斷完x<=10后多加了一個選擇框,判斷是否x>10。
解決辦法:去掉判斷是否x>10的選擇框。
(四)PTA提交列表
PTA中完成選擇結構(1)習題集的提交列表截圖。
如圖:


免責聲明!

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



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