1. 程式人生 > >新生練習(一) 題解

新生練習(一) 題解

Problem A:ASCII碼排序

 解題難點:對於字串的多組輸入,要考慮到每組資料輸入之後的回車符,利用getchar()來吸收回車符.

 AC程式碼:

#include<stdio.h>

int main(void){
    char a,b,c; //定義三個字元變數
    char temp; //定義一個用於交換的中間變數
    while(~scanf("%c%c%c",&a,&b,&c)){

        /*輸入格式:
          1、C語言格式:while(scanf("%c%c%c",&a,&b,&c)!=EOF)
          2、C++格式:while(~scanf("%c%c%c",&a,&b,&c))
        */

        getchar(); //getchar()用於吸收每組資料的回車符
        
        /*也可以不利用getchar()來吸收回車符
          而寫這樣的輸入格式:while(~scanf(" %c%c%c",&a,&b,&c))
          在scanf裡多加一個空格符用於接收每組資料的回車符
        */

        //因為是按照ASCII碼從小到大排序
        //用3個if來確保a>b>c
        
        if(a>b){
            temp=a;
            a=b;
            b=temp;
        }
        if(a>c){
            temp=a;
            a=c;
            c=temp;
        }
        if(b>c){
            temp=b;
            b=c;
            c=temp;
        }
        printf("%c %c %c\n",a,b,c); //輸出
    }
    return 0;
}

Problem B:求兩點間的距離

 解題難點:小數輸出格式

 AC程式碼:

#include<stdio.h>
#include<math.h>

int main(void){
	double x1,x2,y1,y2;  //定義兩點
	
	/*輸入看清是x1 y1 x2 y2
	  而不是x1 x2 y1 y2
	*/  
	
	while(scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=EOF){
		double x;
		
		//利用 math 庫呼叫sqrt()函式對計算資料開根號
		x=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
		
		printf("%.2lf\n",x);

		/*小數格式常考:
          結果保留 a 位小數:printf("%.alf\n",x);
          當題上未給明a的值要求自行輸入時的輸出格式:printf("%.*lf\n",a,x);
        */
        
	}
	return 0;
}

Problem C:計算球體積

 題目難點:對PI的定義(最好還是按照題上給的提示去定義)

 AC程式碼:

#include<stdio.h>
#define PI 3.1415927

//精準度更高的定義:#define PI acos(-1.0)

int main(void){
	double r,v;
	while(scanf("%lf",&r)!=EOF){
		//v=4.0/3*PI*r*r*r; //此處用r*r*r也可用pow(r,3)替換
		
		//注意:若使用pow()函式則需呼叫 math 庫
		
		printf("%.3lf\n",v);
	}
	return 0;
}