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)

改正方法:講if語句后的“,”去掉。
錯誤信息:(2)

改正方法:
在y=1/x語句后加上“;”
錯誤信息:(3)

改正方法:去掉else語句后的(x!=10)
錯誤信息:(4)

改正方法:在printf的 \n后邊加上“,”在x y中間加上“,”
編譯正確:

運行

發現運行結果不正確,對程序進行修改。
修改1
運行格式不對
去掉printf里的\n,將scanf里的“=”去掉。

運行結果

發現還是不對,繼續修改。
修改2
將%f改為%lf,在x前加上取地址符

運行結果

依然不對,需要繼續修改。
修改3
發現printf后的%.1f錯寫成了%.lf。

運行結果


發現輸入10.0時結果正確,但234時結果不對,繼續修改。
修改4
x=10處不對,應該改為x==10。

運行結果


發現還是不符要求,還需繼續修改。
修改5
將f(%.2f)改為(%.1f)

運行結果


發現符合要求。
(二)學習總結
1.if(a)if(b) x=x+1;else y=y+1; 的確切含義是什么?這個else應該和哪個if配對?如何明確表達這種配對方法?將該段代碼按照規范化的格式進行書寫。
他的確切含義是,判斷如果是a和b,則輸出x=x+1,如果不是則輸出y=y+1。else應該與離着else最近的if配對。在與else配對的if下面加上大括號。
規范化的格式為

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

2.C語言的表達式 (-10< x <10)能夠表達x在區間(-10,10)嗎?為什么?如果不能,正確的表達式應該怎么寫?
不能,因為在C語言中,只有0和1,如果這種格式,若x>-10,則為真命題,會輸出1,同理1<10,也為真命題,則最后結果為1。不能表示x在區間(-10,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;
}
輸出結果

b被賦予一個沒有意義的數字,所以輸入123a,a是非法字符,所以會輸出a=123,b=1。
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;
}

輸出結果


a,b都是整型數據,當輸入123 45時,會成功讀入數據的個數,123 45是兩個數據,所以會輸出2。但當輸入123a時,a是非法字符,123是一個能夠成功讀入的數據,所以會輸出1。
修改程序(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;
}

運行結果

4.對其他你認為需要進行總結的內容進行總結。
在做第一題改錯的時候,通過改錯就發現了自己的許多不足,比如,改錯題中x前沒有加取地址符就一直沒有找出這個錯誤,還是通過問其他同學才改正過來,其實像這種比較低級的錯誤,是不應該犯的。還有在使用if else 語句時,總是忘記if下加上大括號,導致編譯總出錯。總之,在這些細致的知識點處應該多加注意。而且對switch case語句應用很不熟練,應該多加練習。
(三)實驗總結

本次實驗總結,學號末位數是單數的同學完成選擇結構(1)中的3、5、7、9題,學號末位數是雙數的同學完成選擇結構(1)中的2、4、6、8題。
3.回文數
(1)題目
判斷一個5位數是不是回文數。例如12321是一個回文數,即它的個位與萬位相同,十位與千位相同。。
(2)流程圖

(3)源代碼

# include<stdio.h>
int main()
{
    int a,m,n,p,q;
    scanf("%d",&a);
    m=a/10000;
    n=(a%10000)/1000;
    p=(a/1000)%10;
    q=(a%100)%10;
    if(m==q && n==p)
    {printf("yes");}
    else
    {printf("no");}

    return 0;
}

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


(5)實驗分析
問題1:
總是輸不出想要的值。
原因:對求余應用的不太好,if后的語句沒有加兩個等號。
解決辦法:
像同學求助,解決問題。
5. 計算火車運行時間
(1)題目
本題要求根據火車的出發時間和達到時間,編寫程序計算整個旅途所用的時間。
(2)流程圖

(3)源代碼

# include <stdio.h>
int main(void)
{
    int a,b,c,d,e,f,minute,hour;
    scanf("%d %d",&a,&b);
    c=a/100;
    d=a%100;
    e=b/100;
    f=b%100;
    if(f>=d)
    {
	    hour = e-c;
	    minute = f-d;
     } 
     else
     {
 	    hour = e-c-1;
 	    minute = 60-(d-f);
     }
     printf("%02d:%02d",hour,minute);
     return 0;

}

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


(5)實驗分析
問題1:在f<d時,求不出所希望的值。
原因:忘記了時間是60進制的
解決辦法:仔細檢查,解決問題。
7.三天打魚兩天曬網
(1)題目
中國有句俗語叫“三天打魚兩天曬網”。假設某人從某天起,開始“三天打魚兩天曬網”,問這個人在以后的第N天中是“打魚”還是“曬網”?
(2)流程圖

(3)源代碼

# include <stdio.h>
int main(void)
{
    int N,a;
    scanf("%d",&N);
    a=N%5;
    if(a==1 || a==2 || a==3)
    {
	    printf("Fishing in day %d",N);
    }
    else if(a==4 || a==0)
    {
	    printf("Drying in day %d",N);
    }

    return 0;
}

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

(5)實驗分析
改題比較簡單,沒有太大問題
9.階梯電價
(1)題目
為了提倡居民節約用電,某省電力公司執行“階梯電價”,安裝一戶一表的居民用戶電價分為兩個“階梯”:月用電量50千瓦時(含50千瓦時)以內的,電價為0.53元/千瓦時;超過50千瓦時的,超出部分的用電量,電價上調0.05元/千瓦時。請編寫程序計算電費。
(2)流程圖

(3)源代碼

# include <stdio.h>
# include <math.h>
int main(void)
{
    double q,c;
    scanf("%lf",&q);
    if(q>=0 && q<=50)
    {
	    c=0.53*q;
	    printf("cost = %.2f",c);
    }
    else if(q>50)
    {
	    c=0.53*50+(q-50)*0.58;
	    printf("cost = %.2f",c);
    }
    else if(q<0)
    {
	    printf("Invalid Value!");
 	}
    return 0;

}

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


(5)實驗分析
問題1:算不出數。
原因:有數學函數時,要定義數學類型的。
解決辦法向同學請教,解決問題。
(四)PTA提交列表




免責聲明!

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



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