C語言程序設計第四次作業


(一)改錯題
輸出三角形的面積和周長,輸入三角形的三條邊a、b、c,如果能構成一個三角形,輸出面積area和周長perimeter(保留2位小數);否則,輸出“These sides do not correspond to a valid triangle”。
輸入輸出樣例1:
  Enter 3 sides of the triangle: 5 5 3
  area = 7.15; perimeter = 13.00
輸入輸出樣例2:
  Enter 3 sides of the triangle: 1 4 1
  These sides do not correspond to a valid triangle
源程序(有錯誤的程序)
#include <stdio.h>
#include <math.h>
int main(void)
{
double a,b,c;
double area,perimeter,s;

    printf("Enter 3 sides of the triangle: ");
    scanf( "%lf%lf%lf",&a,&b,&c );

    if( a + b > c || b + c > a || a + c > b) 
        s = ( a + b + c ) / 2;
        area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c );
        perimeter = a + b + c;
        printf("area = %.2f; perimeter = %.2f\n",area,perimeter);

    else
        printf("These sides do not correspond to a valid triangle\n");

    return 0;        
}

錯誤信息1:

錯誤原因1:第13行中的初始括號沒有擴回
改正方法1:將括號擴回
錯誤信息2:

錯誤原因2:else上方的if語句沒有{ }
改正方法2:在if語句下方加上{ }
繼續編譯,無錯誤

繼續運行

與示例1相同


與示例2不符
經檢查,發現為判斷是否為三角形的語句錯誤

應修改為

再次編譯運行

與示例2相同,運行結果正確

(二)學習總結
1.在編程解決問題的過程中,我們會用到多個if語句,if...else if... 語句以及switch語句,查閱資料,總結一下這三種情況的區別何在,並分別舉例加以說明。給出你參考的資料鏈接。
①.if和else if
if是條件判斷語句,只有當if條件成立時,才會執行if下面的程序,否則執行else語句
如果有多個if和else語句,需要if和else語句一一配對,否則會出現編譯錯誤.並且if語句可以提高編程效率
②.if和else if后面都需要跟條件語句,而else后面不用跟
(2)if和switch
if每次執行語句時都要判斷條件表達式是否為真,若為真,則執行if語句,若為假,則執行else語句
switch語句只需要在入口處計算表達式的值,然后執行對應語句,否則為default
區別一:
switch...case...只用於case值為常量的分支結構,而if...else...更加靈活多變
區別二:
switch是判斷一次之間執行到底的語句,而if...else是需要有幾種判斷條件,就判斷幾次
區別三:
分支較多時,用switch更加效率高
參考鏈接:(https://zhidao.baidu.com/question/332651860.html)
2.對其他你認為需要進行總結的內容進行總結。
字符型變量只能存放字符變量,並且一次只能存放一個字符,一個字符變量占一個字節,字符型變量需要用單引號括起來,但字符型變量和整型可以相互轉換,既可以用字符型%c,也可以用%d。
在switch語句中default后面不需要加入case,就像if..else...中的else后不需要加判斷語句一樣,並且在寫關於時間的代碼時,要加入stdlib.h的頭文件,這是將時間作為種子的方法。並且一定要弄明白或,且,非這幾種邏輯的用法,以及什么時候該用,不然會造成很大的麻煩。

(三)實驗總結(我的學號為單號,需總結1,5,7,9題)
第一題:成績轉換
(1)題目:本題要求編寫程序將一個百分制成績轉換為五分制成績。
(2)流程圖

(3)源代碼

include <stdio.h>

int main(void)
{
int s,A,B,C,D,E;
scanf("%d",&s);
switch(s/10)
{
case 10:
case 9:printf("A\n");
break;
case 8:printf("B\n");
break;
case 7:printf("C\n");
break;
case 6:printf("D\n");
break;
default:printf("E\n");
}

return 0;

}

(4)實驗分析
問題1:PTA中成績須轉換判定
原因1:switch語句中需要在0-10之間判斷
方法1:對輸入的成績除以10
(5)本題PTA提交列表

第二題:三角形判斷
(1)題目:給定平面上任意三個點的坐標(x1,y1,x2,y2,x3,y3),檢驗它們能否構成三角形。
(2)流程圖

(3)源代碼

include<stdio.h>

include<math.h>

int main(void)
{
double x1 = 0.0,y1 = 0.0,x2 = 0.0,y2 = 0.0,x3 = 0.0,y3 = 0.0,a = 0.0,b = 0.0,c = 0.0,L = 0.0,A = 0.0,M = 0.0;
scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
a = pow((pow(x1 - x2,2)+pow(y1 - y2,2)),0.5);
b = pow((pow(x1 - x3,2)+pow(y1 - y3,2)),0.5);
c = pow((pow(x3 - x2,2)+pow(y3 - y2,2)),0.5);
if(a + b > c && a + c > b && b + c > a)
{
L = a + b + c;
M = L / 2.0;
A = pow(M * (M - a) * (M - b) * (M - c),0.5);
printf("L = %.2f, A = %.2f",L,A);
}
else
{
printf("Impossible");
}
return 0;
}

(4)實驗分析
問題1:坐標中求三角形面積的求法
原因1:公式記不清
方法1:背過公式
問題2:編譯錯誤
原因2:sqrt公式中少了一個括號擴回
方法2:將括號擴回
(5)本題PTA提交列表

第三題:兩個數的簡單計算器
(1)題目:本題要求編寫一個簡單計算器程序,可根據輸入的運算符,對2個整數進行加、減、乘、除或求余運算。題目保證輸入和輸出均不超過整型范圍。
(2)流程圖

(3)源代碼

include <stdio.h>

include <stdlib.h>

int main(void)
{
int a,b,result;
char c;
scanf("%d %c%d",&a,&c,&b);
switch(c)
{
case'+':
result = a+b;
break;
case'-':
result = a-b;
break;
case'':
result = a
b;
break;
case'/':
result = a/b;
break;
case'%':
result = a%b;
break;
default:
printf("ERROR");
exit(0);
}
printf("%d",result);
return 0;
}

(4)實驗分析
問題1:當除數為0時
原因1:除數為0沒有意義
方法1:用判斷條件排除除數為0時的情況
(5)本題PTA提交列表

第四題:求一元二次方程的根
(1)題目:本題目要求一元二次方程的根,結果保留2位小數。
(2)流程圖:

(3)源代碼:

include<stdio.h>

include<math.h>

int main(void)
{
double a = 0.0,b = 0.0,c = 0.0,t = 0.0, x1 = 0.0,x2 = 0.0,m = 0.0;
scanf("%lf%lf%lf",&a,&b,&c);
t = b*b - 4 * a * c;
if(a == 0 && b == 0 && c == 0)
{
printf("Zero Equation");
}
if(a == 0 && b == 0 && c != 0)
{
printf("Not An Equation");
}
if(t > 0 && a != 0)
{
x1 = (sqrt(t) - b) / (2 * a);
x2 = (-b - sqrt(t)) / (2 * a);
printf("%.2f\n%.2f",x1,x2);
}
else if(t == 0 && a !=0)
{
x1 = -b / (2 * a);
printf("%.2f",x1);
}
else if(t < 0 && a != 0 && b != 0)
{
b = -b / ( a * 2);
t = fabs(t);
x1 = sqrt(t) / (a * 2);
printf("%.2f+%.2fi\n",b,x1);
printf("%.2f-%.2fi",b,x1);
}
else if(a == 0 && b != 0)
{
x1 = -c / b;
printf("%.2f",x1);
}
else if(t < 0 && b == 0 && a !=0)
{
t = fabs(t);
x1 = sqrt(t) / 2;
printf("0.00+%.2fi\n",x1);
printf("0.00-%.2fi",x1);
}

return 0;

}

(4)實驗分析
一元二次方程和實數虛數根的問題沒有弄懂,先做流程圖可能會讓我寫C語言更容易一些,思維更加清楚,因為一元二次求根分類很多,還包括了復數求根
(5)本題PTA提交列表

(四)博客互評
對李攀同學的博客作業的建議:
對於switch case語句的分析對我很有幫助,讓我更加理解了switch語句的用法,但if和switch語句的區別讓我不是很明白,希望下一次可以語言更加簡練。第二題的流程圖和我的先后順序有一點不一樣,讓我想到了還可以這樣做,但是你的看上去有點長了,也許可以橫向發展一下(http://www.cnblogs.com/lipan123/p/7778208.html)

對趙培碩同學的博客作業的建議:
作業條理很清晰,並且總結中還舉例說明了switch和if的區別,讓別人讀起來更加明白。思維很嚴謹,但有時可能會犯一些不該有的小錯誤,導致結果錯誤。他的嚴謹思維和作業風格我需要學習,並加以改正。(http://www.cnblogs.com/abc15369938639/p/7773975.html)

對永恆破碎同學的博客作業的建議:
每道題后面最好加上實驗分析及總結,畢竟我們不能只做題不分析總結,這樣我們是沒有辦法進步的。分析總結可以讓我們對於上一周學過的知識再鞏固一遍,更加記憶深刻。你的學習總結其實可以再豐富一些的,比如可以拓展一下自己的知識面。(http://www.cnblogs.com/zhaochenyu/p/7769166.html)


免責聲明!

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



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