實驗二10.31
-
EX1
//ex1 #include <stdio.h> #include <stdlib.h> int main() { int a = 5, b =7 , c = 100, d, e, f; d = a / b * c; e = a * c / b; f = c / b * a; printf("d=%d, e=%d, f=%d\n", d, e, f); system("pause"); return 0; }
line6運算:d=①a/b=5/7=0 ②0*c=0*100=0 ∴d=0
line7運算:e=①a*c=5*100=500 ②500/b=500/7=71 ∴e=71
line8運算:f=①c/b=100/7=14 ②14*a=14*5=70 ∴f=70
結果不同原因:1)abcdef均為int型,所得商均為整數 2)運算順序不同 3)運算方向為從左到右
- EX2
// ex2 #include <stdio.h> int main() { int x = 1234; float f = 123.456; double m = 123.456; char ch = 'a'; char a[] = "Hello, world!"; int y = 3, z = 4; printf("%d %d\n", y, z); printf("y=%d, z=%d\n", y, z); printf("%7.6d,%2d\n", x, x); printf("%f, %8f, %8.1f, %0.2f, %.2e\n", f, f, f, f, f); printf("%lf\n", m); printf("%3c\n", ch); printf("%s\n%15s\n%10.5s\n%2.5s\n%.3s\n", a, a, a, a, a); return 0; }
格式符用法總結(%[<修飾符>]<格式字元>):
1)%d
①%d→按十進位制整數輸出
②%md→當資料長度x≥m時,無論m取小數、負數、0等資料皆輸出原資料;
當x<m且m為整數時,m限制資料總長度,不夠時左補空格
2)%f
①%f→按單精度浮點數輸出,無修飾符時小數按6位小數輸出;
注:實驗中輸出123.456001而不是123.456000,因為在計算機內部資料以二進位制表示,輸出時要經過十進位制到二進位制的轉換,小數部分×2直到結果為0或指定精度時結束,不是所有小數都能或能在指定精度前達到結果為1,所以產生資料損失,如果要求前六位都是完全精確的值,可以使用double雙精度浮點,輸出用%lf而不是%f
②%mf→按單精度浮點數輸出,資料長度(資料長度為整數位數+小數6位+小數點1位)<m時,左補空格,否則按實際輸出,小數按6位小數輸出;
③%m.nf→按單精度浮點數輸出,資料長度(資料長度為整數位數+小數n位+小數點1位)<m時,左補空格,否則按實際輸出,小數按n位輸出(四捨五入);
④%.nf→按浮點數輸出,對整數部分長度無要求按實際輸出,小數部分保留n位(四捨五入);
⑤%.nef→整個資料留小數點後n位,且以指數形式輸出;
⑥%lf→按雙精度浮點數輸出,無其他修飾符時小數按6位小數輸出
3)%c
①%c→按字元輸出;
②%mc→按m位字元輸出;
4)%s
①%s→輸出字串;
②%ms→輸出佔m位的字串,資料長度<m時,左補空格,否則按實際輸出;
③%m.ns→保留n位字串,然後輸出佔m位的字串,n<m時,左補空格,否則按實際輸出
- EX3
// ex3 #include <stdio.h> int main()
{ double x, y; char c1, c2, c3; int a1, a2, a3; scanf_s("%d%d%d", &a1, &a2, &a3); printf("a1=%d,a2=%d,a3=%d\n", a1, a2, a3); scanf_s("%c%c%c", &c1,2, &c2,2, &c3,2); printf("c1=%c,c2=%c,c3=%c\n", c1, c2, c3); scanf_s("%lf,%lf", &x, &y); printf("x=%f,y=%lf\n", x, y); return 0; }
- EX4
// ex4-判斷字元型別 #include <stdio.h> int main()
{ char x; x = getchar(); if (x>=48&&x<=57) printf("%c是數字字元\n", x); else if (x>=65&&x<=122) printf("%c是英文字母\n", x); else printf("%c是其它字元\n", x); return 0; }
- EX5
// ex5 #include <stdio.h> int main() { char ans1, ans2; printf("複習了沒? (輸入y或Y表示複習了,輸入n或N表示沒複習) : "); ans1 = getchar(); getchar(); printf("\n動手敲程式碼了沒? (輸入y或Y表示敲了,輸入n或N表示木有敲) : "); ans2 = getchar(); if (ans1=='y'||ans1=='Y'&&ans2=='y'||ans2=='Y') printf("\n羅馬不是一天建成的:)\n"); else printf("\n羅馬不是一天毀滅的。。。\n"); return 0; }
getchar();單獨成行原因:消除緩衝區的字元
比如輸入ans1=getchar()後按下了回車,此時回車符會存在於緩衝區中,
這時繼續輸輸入ans2=getcha()的時候
此時這個gets()會把那個緩衝區的回車讀入到ans2(如下圖)
ans2還未輸入就自動判定為回車且輸出了結果。
所以在之前,我們可以用單獨的getchar()接收掉這個回車符,那麼就可以正確輸入了
- EX6
//ex6-等比數列前n項和 #include <stdio.h> #include <math.h> int main() { int n, sum; printf("輸入1-10之間的整數n\n"); scanf_s("%d", &n); sum = pow(2, n)+1; printf("當n=%d時,sum=%d",n,sum); return 0; }
實驗總結:遇到bug一定要深究,徹底搞懂,不留隱患。