1. 程式人生 > 實用技巧 >實驗三11.14

實驗三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;}