實驗三11.14
- EX1
// 一元二次方程求解 // 重複執行, 直到按Ctrl+Z結束 #include <stdio.h> #include <math.h> int main() { float a, b, c, x1, x2; float delta, real, imag; printf("Enter a, b, c: "); while(scanf("%f%f%f", &a, &b, &c) != EOF) { if(a == 0) printf("not quadratic equation.\n\n"); else { delta = b*b - 4*a*c; if(delta >= 0) { x1 = (-b + sqrt(delta)) / (2*a); x2 = (-b - sqrt(delta)) / (2*a); printf("x1 = %.2f, x2 = %.2f\n\n", x1, x2); } else { real = -b/(2*a); imag= sqrt(-delta) / (2*a); printf("x1 = %.2f + %.2fi, x2 = %.2f - %.2fi\n\n", real, imag, real, imag); } } printf("Enter a, b, c: "); } return 0; }
備註:
①while(變數 != EOF)用法
EOF是一個計算機術語,為EndOfFile的縮寫,在作業系統中表示資料源無更多的資料可讀取。在while迴圈中以EOF作為檔案結束標誌,這種以EOF作為檔案結束標誌的檔案,必須是文字檔案。在文字檔案中,資料都是以字元的ASCII程式碼值的形式存放。我們知道,ASCII程式碼值的範圍是0~127,不可能出現-1,因此可以用EOF作為檔案結束標誌。還有很多檔案處理函式處錯誤後的返回值也是EOF,因此常被用來判斷呼叫一個函式是否成功。在終端(黑框)中手動輸入時,系統並不知道什麼時候到達了所謂的“檔案末尾”,因此需要用<Ctrl + z>組合鍵然後按 Enter 鍵的方式來告訴系統已經到了EOF,這樣系統才會結束while。
- EX2
//ex2 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 int main() { int x, n; srand(time(0)); n = 0; do { n++; x = rand()%10; printf("%3d", x); }while(n<N); printf("\n"); return 0; }
複習:
① #define 識別符號 常量 //注意, 最後沒有分號
備註:
①srand函式
srand函式是隨機數發生器的初始化函式,srand和rand()配合使用產生偽隨機數序列。
②x = rand()%10
對10取餘數 這樣0≤x≤9
③關於srand(time(0))的解釋
計算機沒有辦法產生真正的隨機數的,是用演算法模擬,所以你只調用rand,每次出來的東西是一樣的。設定一個種子後,根據種子的不同,就可以產生不同的數了。而怎麼保證種子的不同呢?最簡單的辦法當然是用永遠在向前的時間。
srand(time(0)) ; //先設定種子
rand(); //然後產生隨機數
Srand是種下隨機種子數,你每回種下的種子不一樣,用Rand得到的隨機數就不一樣。為了每回種下一個不一樣的種子,所以就選用Time(0),Time(0)是得到當前時時間值(因為每時每刻時間是不一樣的了)。
- EX3
//ex3 #include <stdio.h> #include <math.h> int main() { int i, m, n, x; x = 0; for(n = 101; n <= 200; n++) { m = sqrt(n); for(i = 2; i <= m; i++) if(n % i == 0)break; if(i > m) { printf("%5d",n); x++; if(x % 5 == 0) printf("\n"); } } printf("\n"); printf("100~200之間共有%d個素數",x); return 0; }
- EX4
//ex4 #include <stdio.h> #include <stdlib.h> int main() { long a, b, c; printf("輸入一個數字:"); while(scanf("%ld",&a) != EOF) { long d = 0, sum = 0; while(a != 0) { b = a%10; a = a/10; if(b % 2 != 0) c = c*10+b; } while(c != 0) { d = c%10; c = c/10; if(d % 2 != 0) sum = sum*10+d; } printf("新的數字是:%ld\n",sum); printf("輸入一個數字:"); } return 0; }
設計思路:運用%和/,將輸入的數字最後一位不斷取出,若為奇數則儲存,並用“c=c*10+b”來組成新的數,但此時新數字高低位排列與原數字相反,需要再次抽取組成新數,此時不用再判斷奇偶數。
- EX5
//ex5 #include <stdio.h> #include <math.h> int main() { int n, i, factorial = 1; double s = 0, sign = 1.00000; printf("輸入n(1~10):"); while(scanf("%d",&n) != EOF) { for(i=1;i<=n;i++) { factorial = factorial * i; sign = pow(-1,i+1); s = s + sign/factorial; continue; } printf("n = %d s = %f\n", n, s); s = 0; factorial = 1; sign = 1.00000; printf("輸入n(1~10):"); } return 0; }
備註:一定要注意整型資料和浮點型資料在計算裡的區別!
- EX6
//ex6 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int n, i = 1, x ; printf("猜猜2020年12月哪一天會是你的luck day\n"); printf("開始嘍,你有三次機會,開始猜吧(1~31):"); srand(time(0)); x = rand()%32; scanf("%d",&n); while(i < 3) { if(n == x){ printf("猜中啦!你的luck day是%d號",x); break;} else if(n < x){ printf("你猜的日期早了,luck day還在後面呢\n"); i++;} else if(n > x){ printf("你猜的日期晚了,luck day悄悄溜到前面啦\n"); i++;} printf("再猜(1~31):"); scanf("%d",&n); } if(i = 3) { printf("次數用完啦,偷偷告訴你,12月,你的luck day是%d號\n",x); } return 0; }
//ex6#include <stdio.h>#include <stdlib.h>#include <time.h>
int main(){ int n, i = 1, x ; printf("猜猜2020年12月哪一天會是你的luck day\n");printf("開始嘍,你有三次機會,開始猜吧(1~31):");srand(time(0));x = rand()%32; scanf("%d",&n); while(i < 3){ if(n == x){printf("猜中啦!你的luck day是%d號",x);break;}else if(n < x){printf("你猜的日期早了,luck day還在後面呢\n");i++;}else if(n > x){printf("你猜的日期晚了,luck day悄悄溜到前面啦\n");i++;}printf("再猜(1~31):");scanf("%d",&n);} if(i = 3) { printf("次數用完啦,偷偷告訴你,12月,你的luck day是%d號\n",x);}return 0;}