關於第一次實踐課作業
實驗結論
task1_1.c
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 printf(" O \n"); 6 printf("<H>\n"); 7 printf("I I\n"); 8 printf(" O \n"); 9 printf("<H>\n"); 10 printf("I I\n"); 11 12 system("pause"); 13 return 0; 14 }
task1_2.c
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main() 4 { 5 printf(" O \t O \n"); 6 printf("<H>\t<H>\n"); 7 printf("I I\tI I\n"); 8 system("pause"); 9 return 0; 10 }
task2.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 int main() 5 { 6 double a, b, c; 7 scanf("%lf %lf %lf", &a, &b, &c); 8 if (a + b > c && a + c > b && b + c > a) { 9 printf("能構成三角形\n"); 10 } 11 else { 12 printf("不能構成三角形\n"); 13 } 14 system("pause"); 15 return 0; 16 }
task3.c
1 #include<stdio.h> 2 int main() 3 { 4 char ans1, ans2;//用於儲存使用者輸入的答案 5 printf("每次課前認真預習,課後及時複習了沒?(輸入y或Y表示有,輸入n或N表示沒有):"); 6 ans1 = getchar(); 7 getchar(); 8 printf("\n動手敲程式碼實踐了沒?(輸入y或Y表示敲了,輸入n或N表示木有敲):"); 9 ans2 = getchar(); 10 if ((ans1 == 'y' || ans1 == 'Y') && (ans2 == 'y' || ans2 == 'Y')) { 11 printf("\n羅馬不是一天建成的,繼續保持哦:)\n"); 12 } 13 else { 14 printf("\n羅馬不是一天毀滅的,我們來建設吧\n"); 15 } 16 return 0; 17 }
回答問題
當我將原始碼中line7去掉後,重新編譯執行時:
當我輸入第一個字元後,終端跳過了輸入第二個字元,直接得到了結果
事實上,第一次呼叫 getchar()
後,立即再次呼叫 getchar()
可能是為了消耗掉使用者輸入後的換行符
(即使用者按下 Enter 鍵後產生的)即確保每次需要讀取字元前,輸入緩衝區都是乾淨的
task4.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 int main() 4 { 5 double x, y; 6 char c1, c2, c3; 7 int a1, a2, a3; 8 9 scanf("%d %d %d", &a1, &a2, &a3);//scanf的輸入需要取地址符& 10 printf("a1=%d,a2=%d,a3=%d\n", a1, a2, a3); 11 12 scanf("%c %c %c", &c1, &c2, &c3); 13 printf("c1=%c,c2=%c,c3=%c\n", c1, c2, c3); 14 15 scanf("%lf %lf", &x, &y);//scanf輸入double型資料時需要%lf, 16 printf("x=%f,y=%f\n", x, y);//printf輸出double型資料時可以用%f,也可以用%lf 17 18 return 0; 19 }
task5.c
1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int year; 6 7 double second = pow(10, 9); 8 double every = 365 * 24 * 60 * 60; 9 double all =(second / every)+0.5; 10 year = (int)all; 11 12 printf("10億秒約等於%d年\n", year); 13 return 0; 14 }
task6_2.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<math.h> 4 int main() 5 { 6 double x, ans; 7 while(scanf("%lf", &x)!=EOF){ 8 ans = pow(x, 365); 9 printf("%.2f的365次方:%.2f\n", x, ans); 10 printf("\n"); 11 } 12 13 return 0; 14 }
task7.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 int main() 4 { 5 double c; 6 while (scanf("%lf", &c) != EOF) { 7 double f = 9 * c / 5 + 32; 8 printf("攝氏度c=%.2f時,華氏度f=%.2f", c, f); 9 } 10 return 0; 11 }
task8.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<math.h> 4 int main() 5 { 6 int a, b, c; 7 double s; 8 while (scanf("%d %d %d",&a,&b,&c) != EOF) { 9 s = (a + b + c) / 2.0; 10 double area; 11 area = sqrt(s * (s - a) * (s - b) * (s - c)); 12 printf("a = %d,b = %d,c = %d,area = %.3f", a, b, c, area); 13 } 14 return 0; 15 }
實驗總結
1.關於double型別資料的輸入以及輸出的具體格式是:
輸入是必須使用%lf,輸出時既可以使用%lf,也可以使用%f
2.任務5和任務7編寫過程中邏輯都出現了相同的問題:具體體現在對於浮點型資料的忽略
如果想要獲得浮點型資料,不能只令變數的型別為double,而是要利用浮點型資料進行計算
兩個整數相除最終只能得到整數(即取整),想要得到浮點數只能透過a*1.0/b
3.字元型變數注意要在字元外面加上'',否則字元會顯示為沒有定義
4.可以利用getchar(); 消耗掉換行符:
【第一次呼叫 getchar()
後,立即再次呼叫 getchar()
可能是為了消耗掉使用者輸入後的換行符
(即使用者按下 Enter 鍵後產生的)即確保每次需要讀取字元前,輸入緩衝區都是乾淨的】