1. 程式人生 > 實用技巧 >SLR(1)語法分析(JAVA實現)

SLR(1)語法分析(JAVA實現)

實驗1:

#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-%.2f\n\n", real, imag, real, imag); } } printf("Enter a,b,c: "); } return 0; }

實驗2:

//生成N個0~9之間的隨機整數,並列印輸出
#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; }

實驗3:

#include<stdio.h>
#include<math.h>
int main(){
    int n,i,k,j;
    
    for(n=101;n<=200;n++){
        for(i=2;i<=sqrt(n);++i){
          if(n%i==0){break;}
        }  
        
        if(i>sqrt(n)){
             printf("%4d",n);
             k=k+1;
             if(k%5==0){
                 printf("\n");
                 } 
            }

    }
      
    
    printf("\n101~200之間的素數有%d個",k);
        
    return 0;
    
} 

實驗4:

#include<stdio.h>
int main(){
    int s,p,k,t;
    k=1;
    t=0;
    
    printf("Enter a number: ");
    
    while(scanf("%d",&s)!=EOF){
        while(s>=10){
            p=s%10;
            s=s/10;
            
            if(p%2!=0){
                t=t+p*k;
                k=k*10;
            }
        }
        
        if (s%2!=0&&s!=1) {
            t=t+p*k;
        }
        
        if(s==1){
            t=t+k;
        }
        
        printf("new number is:%d\n",t);
        printf("\nEnter a number: ") ;
        t=0;
        k=1;
    
    }
    
    return 0;
}

演算法思路:首先輸入s後取s除以10的餘數得到各位的數p,將個位數除以2判斷是否為奇數,如果是,就作為新數的個位數,另外定義一個變數k作為新數的位數,新數t=t+p*k,再將k*10,然後重複將s對10取餘數除10得到s的每一位數,判斷並且給t

實驗5:

#include<stdio.h>
#include<math.h>
int main(){
    int n,i,k;
    float p,s,sum;
    p=1.0;
    k=1;
    
    printf("Enter n(1~10): ");
    
    while(scanf("%d",&n)!=EOF){
     for(i=1;i<=n;i++){
         p=p*i; 
         s=1/p;
         k++;
         
         if(k%2!=0){
             sum=sum-s;
        }
        else{
            sum=sum+s;
        }
        
        }
     
     p=1.0;
     k=1; 
     printf("\nn=%d,sum=%f\n\n",n,sum);
     printf("\nEnter n(1~10): ");
     sum=0.0;    
     }
    
    return 0;
} 

實驗6:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
    int n,date,a;
    
    printf("猜猜2020年12月哪一天會是你的lucky day~\n\n");
    printf("開始嘍,你有三次機會,猜吧: ");
    scanf("%d",&a);

    srand(time(0));
    date=rand()%31+1;

    for(n=1;n<=2;n++){
        if(a<date){
            printf("\n你猜的日期早了,lucky day還沒到呢\n");
        }
        if(a>date){
            printf("你猜的晚了,lucky day悄悄溜到前面啦\n");
        }
        if(a==date){
            break;
        }
        
        printf("\n再猜: ");
        scanf("%d",&a);
    }
    
    if(a!=date){
       printf("\n次數用完啦。偷偷告訴你,12月你的lucky day是:%d",date);
    }
    else{
        printf("\n恭喜你猜對了,12月你的lucky day是:%d",date);
    }
    
    return 0;
}

實驗總結:

我覺得這次實驗的難度在自己設計演算法上,大體上能寫出來但是有些細節還是沒有考慮清楚,就像實驗6一開始最後輸出想用次數等於3時候輸出次數用完了,但是很巧的是有次我剛好在第三次猜對了日期,就發現了這個bug,所以說好好考慮自己的程式到底嚴謹與否非常重要。還有就是要注意迴圈後如果繼續下一次迴圈有些數字需要清零,一開始實驗中碰到第一次計算是對的,後面幾次計算出錯也不知道是怎麼回事,對著演算法看了半天也不知道錯在哪兒了,頭都要禿了,朋友告訴我乾脆每計算一次就輸出一個值最終好歹是發現了錯誤。c語言學習,任重而道遠啊......