2016年8月16日 星期二

C語言範例

題目1:輸入一數x 作x + 2 * 3 / 4之運算並顯示之結果(遵循先乘除後加減;因為int關鍵字,故2 * 3 / 4之結果為1)  
作法:
#include<stdlib.h>    /*巨集指令(macro)、前處理器指令(preprocessor directives)→以#(pound sign、number sign)+指令→Ex.#include、#define、#ifdef、#ifndef、#endif、...;<stdlib.h>數值與字串轉換、記憶體配置、亂數與其他有用函數標頭檔*/
#include<stdio.h>    /*前置處理器將標準輸入/輸出標頭檔(standard input/output header, <stdio.h>)引入程式*/
int main()
{
    int  x  ;     /*int是宣告x為整數(integer)*/
    while(scanf("%d", &x) !=EOF)     /*%d是十進位值(decimal)、&x是把輸入值儲存至x的位置*/
   {
    x = x + 2 * 3 / 4;
    printf("%d\n", x);    /*\n是跳逸字元,代表換行(newline)*/
    }
 return 0;
}

<補充>
%d用法延伸
1.%2d→同樣指十進位數,但唯一差異在於給該數兩個空格(若輸入的數字只有一個時,空格會在左邊,Ex.空格數字~指數字向右對齊)
2.%-2d→意思同上,但若輸入的數字只有一個時,空格會在右邊,Ex.數字空格~指數字向左對齊

%f用法概述
1.%f指以小數點表示的浮點數,
Ex.
#include<stdlib.h>
#include<stdio.h>
int main()
{
float x; 
  while(scanf("%f",&x)!=EOF) 
   {
    printf("%f\n", x);
    }
 return 0;
}
2.%.2f指小數點後只輸出2位數
Ex.
#include<stdlib.h>
#include<stdio.h>
int main()
{
    float  x  ;     
    while(scanf("%f", &x) !=EOF)    
   {
    printf("%.2f\n", x); 
    }
 return 0;
}
---------------------------------------------------------------------------------------------
題目2:輸入一數 將其分為y個50、z個10、u個5、t個1(以最少總個數) 
作法:
#include <stdio.h>
#include <stdlib.h>
int y,z,u,t;    /*變數型態第一個變數名稱 第二個變數名稱,中間以逗號隔開*/
int main ()
{
 int x = 0;
 int A[4];    /*A[4]:陣列(array)*/
 A[0] = 50;
 A[1] = 10;
 A[2] = 5;
 A[3] = 1;
while(scanf("%d",&x)!=EOF){    /* EOF:end of file 檔案的結尾 */
 y = x / A[0];
 x = x % A[0];    /* %取餘數:Ex.3 % 2  →   1 */
 z = x / A[1];
 x = x % A[1];
 u = x / A[2];
 x = x % A[2];
 t = x / A[3];
 printf("%d個50元\n",y);
 printf("%d個10元\n",z);
 printf("%d個5元\n",u);
 printf("%d個1元\n",t);
}
        return 0;
}
---------------------------------------------------------------------------------------------
題目3: 輸入五數找出五者之MAX & min 
作法:
#include <stdio.h>
#include <stdlib.h>
int main (){
 int x = 0, y = 0, z = 0, t = 0, u = 0;
 while(scanf("%d%d%d%d%d", &x, &y, &z, &t, &u)!=EOF){
 if(x >= y){
 if(x >= z){
 if(x >= t){
 if(x >= u){
 printf("MAX%d\n", x);
 }
 else{
 printf("MAX%d\n", u);
 }
 }
 else{
 if(t >= u){
 printf("MAX%d\n", t);
 }
 else{
 printf("MAX%d\n", u);
 }
 }
 }
 else{
 if(z >= t){
 if(z >= u){
 printf("MAX%d\n", z);
 }
 }
 else{
 if(t >= u){
 printf("MAX%d\n", t);
 }
 else{
 printf("MAX%d\n", u);
 }
 }
 }
 }
 else{
 if(y >= z){
 if(y >= t){
 if(y >= u){
 printf("MAX%d\n", y);
 }
 else{
 printf("MAX%d\n", u);
 }
 }
 else{
 if (t >= u){
 printf("MAX%d\n", t);
 }
 else{
 printf("MAX%d\n", u);
 }
 }
 }
 else{
 if(z >= t){
 if(z >= u){
 printf("MAX%d\n", z);
 }
 else{
 printf("MAX%d\n", u);
 }
 }
 else{
 if(t >= u){
 printf("MAX%d\n", t);
 }
 else{
 printf("MAX%d\n", u);
 }
 }
 }
 }
 if(x <= y){
 if(x <= z){
 if(x<= t){
 if(x <= u){
 printf("min%d\n", x);
 }
 else{
 printf("min%d\n", u);
 }
 }
 else{
 if(t <= u){
 printf("min%d\n", t);
 }
 else{
 printf("min%d\n", u);
 }
 }
 }
 else{
 if(z <= t){
 if(z <= u){
 printf("min%d\n", z);
 }
 }
 else{
 if(t <= u){
 printf("min%d\n", t);
 }
 else{
 printf("min%d\n", u);
 }
 }
 }
 }
 else{
 if(y <= z){
 if(y <= t){
 if(y <= u){
 printf("min%d\n", y);
 }
 else{
 printf("min%d\n", u);
 }
 }
 else{
 if (t <= u){
 printf("min%d\n", t);
 }
 else{
 printf("min%d\n", u);
 }
 }
 }
 else{
 if(z <= t){
 if(z <= u){
 printf("Min%d\n", z);
 }
 else{
 printf("min%d\n", u);
 }
 }
 else{
 if(t <= u){
 printf("min%d\n", t);
 }
 else{
 printf("min%d\n", u);
 }
 }
 }
 }
 }
 return 0;
}
---------------------------------------------------------------------------------------------
題目4:重複輸入數字(利用do while迴圈) 當奇數時結束(用"!"反向敘述之結果) 
作法1:
#include <stdio.h>
#include <stdlib.h>
int main(){
int x = 0;
do{
scanf("%d", &x);
}while(!(x % 2));    /*當while括號內回傳非0的值時,會繼續重複"do{}while();"之大括號內的動作,直到回傳值為0止*/
system("pause");
}

作法2:
<說明>
由於取餘數%於電腦運算較耗時(∵此%於電腦中還需做除法、減法等運算) 可改用位元操作"!(x&1)" (對x之第一個位元看看是否為1,若是則結束該迴圈) 
#include <stdio.h>
#include <stdlib.h>
int main(){
int x = 0;
do{
scanf("%d", &x);
}while(!(x & 1));    /*x & 1→位元操作,回傳第一個位元的值;!()→反向敘述,將()內結果0變1、1變0;&→取變數位置*/
system("pause");
}
---------------------------------------------------------------------------------------------
題目5:輸入字元"xxx",輸出字元"hello, xxx"
題源:a001~http://zerojudge.tw/
作法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
   char h[9999];    /*char 字元宣告(c語言中沒有字串的變數型態(c++中有string),故以字元陣列形式來儲存字串)*/
    while(scanf("%s", &h)!=EOF){    /*%s 字串;h本身為該字元陣列位置,故可以不加&*/
    printf("hello, %s\n",h);
    }
    return 0;
}
<補充>
上面宣告了一個字串h,長度為9999字元,事實上每個字串後面都有一個隱藏的字元"\0"。
例:一字串"test",實際上共用了5個字元(Bytes)。
---------------------------------------------------------------------------------------------
題目6:輸入一數 將其數值一個個加起來求得總和 
<測資>輸入1234567→輸出1+2+3+4+5+6+7=28
作法1:
#include<stdio.h>
#include<stdlib.h>
int main(){
int n ,x ,u ;
while(scanf("%d",&n) != EOF){
for(u = 0,x = 0;n>0;u = u + x){    /*for(每次迴圈運行前之初始值;每次迴圈運行前之判斷式;每次迴圈運行後之指令)*/
if(n>=10){
printf("%d+",x = n % 10);
}
else{
printf("%d",x = n % 10);
}
n = n / 10;
}
printf("=%d\n",u);
}
}

作法2:
#include<stdio.h>
#include<stdlib.h>
main(){
int n ;
while(scanf("%d",&n) !=EOF){
int m = n ,k = 1;
while(m >= 10){
k *= 10;
m /= 10;
}
int sum = 0 ;
while(n > 0){
int d = n / k;
sum += d;
printf("%d", d);
n %= k;
if(n > 0) printf("+");
k /= 10;
}
printf("=%d\n", sum);
}
}
---------------------------------------------------------------------------------------------
題目7:找質數
作法1:
#include<stdio.h>
#include<stdlib.h>
int main(){
int n,IsPrime(int);
while(scanf("%d",&n) !=EOF){
if(IsPrime(n)){printf("質數\n");}
else{printf("非質數\n");}
}
}
int IsPrime(int n){
if(n<2)return 0;
for(int i=2;i<n;i++)
if(n % i == 0)return 0;
return 1;
}

作法2:
#include<stdio.h>
#include<stdlib.h>
int main(){
int n,IsPrime(int);
while(scanf("%d",&n) !=EOF){
if(IsPrime(n)){printf("質數\n");}
else{printf("非質數\n");}
}
}
int IsPrime(int n){
if(n<2)return 0;
for(int i=2;i*i<=n;i++)  /*利用矛盾證明法增加程式運算效率 */
if(n % i == 0)return 0;
return 1;
}
<補充>矛盾證明法(找質數)~觀念:線性代數之矛盾法(歸謬證法)、反證法
If n=ab,a<=b
Assuming that a>n開根號
Then, n=ab>=aa>n causes contrary.
Therefore, a<=n開根號
---------------------------------------------------------------------------------------------
題目8:a、b兩數四則運算(加、減、乘、取餘數、除)(p.s.除法要顯示小數);算BMI值(用浮點數、到小數點第二位)
作法:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b;
float c,d;
printf("請輸入兩個整數數字\n");
scanf("%d %d",&a,&b);
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("a+b=%d\n",a+b);
printf("a-b=%d\n",a-b);
printf("a*b=%d\n",a*b);
printf("a%b=%d\n",a%b);
printf("a/b=%f\n\n\n",(float)a/b);
printf("請輸入身高(公尺)\n");
scanf("%f",&c);
printf("請輸入體重(公斤)\n");
scanf("%f",&d);
printf("BMI=%.2f\n",d/(c*c));
    system("pause");
return 0;
}
---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------

沒有留言:

張貼留言