SLR(1)語法分析(JAVA實現)
阿新 • • 發佈:2020-11-18
實驗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(){ intx,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語言學習,任重而道遠啊......