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


(一)改錯題
輸出三角形的面積和周長,輸入三角形的三條邊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
源程序(有錯誤的程序)

對源程序進行編譯:
錯誤信息1:

錯誤原因:少了一個括號
改正方法:添加上括號。
繼續進行編譯:
錯誤信息2:

錯誤原因:if else語句中沒有加入{ }花括號
改正方法:在將if語句加上{ } 再將else的語句加上{ }。

繼續編譯:輸入第一個值:
輸入第二個值:
與預計的答案不相符說明有錯誤。
錯誤信息3:輸入第二個值與答案不相同
錯誤原因:判斷是否為三角形時條件編寫錯誤
改正方法:把或改成且
(二)學習總結
1.在編程解決問題的過程中,我們會用到多個if語句,if...else if... 語句以及switch語句,查閱資料,總結一下這三種情況的區別何在,並分別舉例加以說明。禁止大段復制,要自己對資料進行歸納總結,並給出你參考的資料鏈接。
(1)switch與if語句的效率區別
if else if 與switch語句的區別
如果純粹比較數字或字符,建議使用
switch,因為它只會在一開始的switch括號中取出變量值一次,然后將這個值與下面所設定的case比較,但如果使用if,每次遇到條件式時,都要取出變量值,效率的差異就 在這兒。
例如:
 
 
 
if(a == 1) 
 
//... 
 
else if(a == 2) 
 
//... 
 
else if(a == 3) 
 
//...

如果換成
switch

 
 
 
switch(a) 
 

 
case 1: 
 
//... 
 
break; 
 
case 2: 
 
//... 
 
break; 
 
case 3: 
 
//... 
 
break; 
 

(2)switch...case語句與if...else性能比較
1.case后面一定要是常量就是一個不可變的量)
2.當條件的分支很多時(通常超過六個)使用switch...case的效率將高於多重if_else語句(在匯編層switch...case是查找表,if語句是跳轉:)  
https://wenku.baidu.com/view/a22a85442b160b4e767fcf7b.html
if else 與switch的使用
A:if語句的格式:
  if(比較表達式1) {
     語句體1;
  }else if(比較表達式2) {
     語句體2;
  }else if(比較表達式3) {
     語句體3;
  }
     ...
  else {
    語句體n+1;
  }
例如:

B:switch格式:
  switch(表達式) {
        case 值1:
      語句體1;
      break;
       case 值2:
      語句體2;
      break;
          …
       default:
      語句體n+1;
      break;
        }

例如:
總結:switch建議判斷固定值的時候用
  if建議判斷區間或范圍的時候用    
  *用switch能做的,用if都能做,單反過來則不行
http://www.cnblogs.com/bluesky365/p/5631517.html
其他個人總結:(1)無論如何都要保持程序的健壯性。
(2)記住條件運算符,復合語句的表達形式
(3)swith語句的穿透性
(4)記住PPT里的switch語句常見錯誤
(三)實驗總結
1.成績轉換
(1)題目:
本題要求編寫程序將一個百分制成績轉換為五分制成績。轉換規則:
大於等於90分為A;
小於90且大於等於80為B;
小於80且大於等於70為C;
小於70且大於等於60為D;
小於60為E。
(2)流程圖:
(3)源程序:

    #include<stdio.h>
    int main()
    {
int a;
scanf("%d",&a);
if(a>=90)
{
	printf("A");
}
else if(a<=90 && a>=80)
{
	printf("B");
}
else if(a<=80 && a>=70)
{
	printf("C");
}
else if(a<=70 && a>=60)
{
	printf("D");
}
else
{
	printf("E");
}
return 0;
    }

(4)實驗分析:
問題1:對於&&和||搞不太清楚。
原因:粗心
解決辦法:認真一點。
(5)本題PTA提交列表

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

(3)源程序:

#include<stdio.h>
#include<math.h>
int main()
{
double x1,y1,x2,y2,x3,y3,a,b,c,s,L,A;
scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
a=sqrt(pow(x1-x2,2)+pow(y2-y1,2));
b=sqrt(pow(x2-x3,2)+pow(y2-y3,2));
c=sqrt(pow(x1-x3,2)+pow(y3-y1,2));
if(a+b>c&&a+c>b&&b+c>a)
{
L=a+b+c;
s=(a+b+c)/2;
A=sqrt(s*(s-a)*(s-b)*(s-c));
printf("L = %.2f, A = %.2f",L,A);
}
else
{printf("Impossible");}

return 0;
}

(4)實驗分析:本題沒有問題但是有一些需要注意的地方。
1.

要注意自己所定義的是double還是int類型。以及輸出時需要用到的格式。
2.
熟練運用數學函數 以及&&和||的用法。
(5)本題PTA提交列表

7簡單的計算器
(1)題目:本題要求編寫一個簡單計算器程序,可根據輸入的運算符,對2個整數進行加、減、乘、除或求余運算。題目保證輸入和輸出均不超過整型范圍。
輸入格式:
輸入在一行中依次輸入操作數1、運算符、操作數2,其間以1個空格分隔。操作數的數據類型為整型,且保證除法和求余的分母非零。
輸出格式:
當運算符為+、-、*、/、%時,在一行輸出相應的運算結果。若輸入是非法符號(即除了加、減、乘、除和求余五種運算符以外的其他符號)則輸出ERROR。
(2)流程圖:
運行結果:



(3)源程序:

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
int a,b,c;
char d;
scanf("%d %c%d",&a,&d,&b);
switch(d)
{
	case '+':
		c = a + b;
		break;
	case '-':
		c = a - b;
		break;
	case '*':
		c = a * b;
		break;
	case '/':
		c = a / b;
		break;
	case '%':
		c = a % b;
		break;
	default :
		printf("ERROR");
		exit(0);
}
printf("%d",c);
return 0;
    }

(4)實驗分析:這個題真的很讓人費勁哦!!!!!
問題1:
原因:“%c”輸入時,空格字符和“轉義字符”作為有效字符輸入。
解決辦法:在%c前邊加一個空格。
問題2:無法強制結束
原因:缺少頭文件#include<stdlib.h> 和exit(0);
解決辦法:添加上
(5)本題PTA提交列表:
本題雖然都是正確的,但是在C++上運行和整改了好多次。
9.求一元二次方程的根
(1)題目:本題目要求一元二次方程的根,結果保留2位小數。
輸入格式:
輸入在一行中給出3個浮點系數a、b、c,中間用空格分開。
輸出格式:
根據系數情況,輸出不同結果:
1)如果方程有兩個不相等的實數根,則每行輸出一個根,先大后小;
2)如果方程有兩個不相等復數根,則每行按照格式“實部+虛部i”輸出一個根,先輸出虛部為正的,后輸出虛部為負的;
3)如果方程只有一個根,則直接輸出此根;
4)如果系數都為0,則輸出"Zero Equation";
5)如果a和b為0,c不為0,則輸出"Not An Equation"。
(2)流程圖:
(3)源程序:

            #include<stdio.h>
            #include<math.h>
            int main()
            {
        double a,b,c,x,y,q,w,e;
        scanf("%lf%lf%lf",&a,&b,&c);
        if(a==0&&b!=0)
        {
	y=(0-c)/b;
	printf("%.2f",y);
        }
        else
        {
	x=((0-b)+sqrt(b*b-4*a*c))/(2*a);
	y=((0-b)-sqrt(b*b-4*a*c))/(2*a);
	if(a==0&&b==0&&c==0)
	{
		printf("Zero Equation");
	}
	else if(a==0&&b==0)
	{
		printf("Not An Equation");
	}
	else if(b*b-4*a*c==0)
	{
		printf("%.2f",x);
	}
	else if(b*b-4*a*c<0)
	{
		q=(0-b)/(2*a);
		w=sqrt(4*a*c-b*b)/(2*a);
	printf("%.2f+%.2fi\n",q,w);
	printf("%.2f-%.2fi\n",q,w);
	}
	else if(x!=y)
	{
	  if(x<y)
	  {e=x;x=y;y=e;}
	  else
	  printf("%.2f\n%.2f",x,y);
	}
	return 0;
        }
            }

(4)實驗分析:這個題可以說是我做實驗來最麻煩的一個,也是讓我最頭疼的一個。恐怖!
問題:結果不完全正確。
原因:沒有考慮純虛根
改正方法:純虛根的情況,即有虛根的時候,如果實部為0,則實部應該輸出0.00.然后輸出虛部,不能只輸出虛部而沒有實部的內容。
C++里無數次的改正,整了一個小時。
(5)本題PTA提交列表

(四)博客互評
1.吳晗
2.劉長森
3.賀博濤


免責聲明!

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



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