Flink實戰(一):監控(一)Metrics監控原理與實戰
以下實驗都在Visual Studio 2019 Preview平臺完成
———————————————————————————————————————————————————————————————————————————————————————————
實驗2-1
#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\ne=%d\nf=%d", d, e, f); return 0; }
理論分析:
1.由於都是整型,a/b=0.....5,所以值取0,再乘100結果還是0。
2.a*c得500,500/7=71.....3,所以值取71。
3.100/7=14.....2,取值14,14*5得70。
由於整型的運算中沒有小數(只取兩數的商的整數部分),所以在運算過程中運算的位序改變以後會對之後的運算產生影響。
———————————————————————————————————————————————————————————————————————————————————————————
實驗2-2
#include <stdio.h> #include<stdlib.h> int main() { system("color 2"); 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("%8d,%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; }
line12/13:%d即輸出整型。
line14:%xd指在輸出整型時佔位寬x位,多餘位寬會空出,而位寬少了也會補上,使輸出的值不改變。
line15:%a.bf指在輸出浮點型時佔位寬a位,保留b位小數(遵循四捨五入),而%e指以指數形式輸出。
line16:%lf指輸出雙精度型。
line17:%xc指在輸出字元型時佔位寬x位。
line18:%a.bs指在輸出字串時佔位寬a位,多餘位寬會空出,而位寬少了也會補上,使輸出的字串不改變。.b指保留b個字元。
————————————————————————————————————————————————————————————————————————————————————————————
實驗2-3
#include <stdio.h> #include<stdlib.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,",a1, a2, a3); scanf_s("%c %c %c ", &c1,1, &c2,1, &c3,1); printf("c1='%c',c2='%c',c3='%c',", c1, c2, c3); scanf_s("%lf %lf", &x, &y); printf("x=%.1lf,y=%.1lf\n", x, y); return 0; }
實驗中會犯的錯誤:沒有在輸入行末尾“%d %d %d”和“%c %c %c"後加空格,導致輸入時回車佔了一個字元的位置,使輸出結果出錯。
————————————————————————————————————————————————————————————————————————————————————————————、
實驗2-4
#include<stdio.h> #include<stdlib.h> int main() { char x; while (printf("請輸入一個字元:"), scanf_s(" %c", &x, 1) != 0) if (x >= '1' && x <= '9') printf("%c是數字字元\n", x); else if ((x >= 'a' && x <= 'z')||(x>='A'&&x<='Z')) printf("%c是英文字母\n", x); else printf("%c是其它字元\n", x); return 0; }
———————————————————————————————————————————————————————————————————————————————————————————
實驗2-5
#include <stdio.h> #include<stdlib.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()後,結果如圖
無論第一個輸入的字元是Y(y)或N(n),輸出的結果都是”羅馬不是一天毀滅的。。。“,
應該是在輸入第一個字元後按回車,程式將回車賦給了ans2,而第八行的getchar()消除的回車產生的影響。
———————————————————————————————————————————————————————————————————————————————————————————
實驗2-6
#include<stdio.h> #include<stdlib.h> #include<math.h> int main() { int n, q, sum; q = 2; while(printf("請輸入一個數(數字在1-10之間):"), scanf_s("%d", &n), sum = pow(q,n)-1, printf("n = %d時,sum = %d\n", n, sum)!=0);
return 0; }
———————————————————————————————————————————————————————————————————————————————————————————
實驗2-7
#include<stdio.h> #include<stdlib.h> int main() { printf(" O \n<H>\n1 1"); return 0; }
由於對小人的迴圈列陣輸入不是很清楚,所以直接暴力輸出所有小人:
#include<stdio.h> #include<stdlib.h> int main() { printf(" O O O O O O O O O \n"); printf("<H> <H> <H> <H> <H> <H> <H> <H> <H>\n"); printf("1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n"); printf(" O O O O O O O \n"); printf(" <H> <H> <H> <H> <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 \n"); printf(" O O O O O \n"); printf(" <H> <H> <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 1 1 1 1 \n"); printf(" O O O \n"); printf(" <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 \n"); printf(" O \n"); printf(" <H> \n"); printf(" 1 1 \n"); return 0; }
通過新增while函式,可以實現顏色的迴圈。
#include<stdio.h> #include<stdlib.h> #include<Windows.h> int main() { int a; printf(" O O O O O O O O O \n"); printf("<H> <H> <H> <H> <H> <H> <H> <H> <H>\n"); printf("1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n"); printf(" O O O O O O O \n"); printf(" <H> <H> <H> <H> <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 \n"); printf(" O O O O O \n"); printf(" <H> <H> <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 1 1 1 1 \n"); printf(" O O O \n"); printf(" <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 \n"); printf(" O \n"); printf(" <H> \n"); printf(" 1 1 \n"); while (1) { for (a = 0; a < 1; a++) system("color 1"), Sleep(1000); system("color 2"), Sleep(1000); system("color 3"), Sleep(1000); system("color 4"), Sleep(1000); } return 0; }
或者使用while+if函式,通過特定條件也可以實現顏色迴圈變化:
int a=1;
while (a <= 1000000)
{
a = a++;
{if (a % 10 == 0) system("color 1"); }
{if (a % 10 == 1) system("color 2"); }
{if (a % 10 == 2) system("color 3"); }
{if (a % 10 == 3) system("color 4"); }
{if (a % 10 == 4) system("color 5"); }
{if (a % 10 == 5) system("color 6"); }
{if (a % 10 == 6) system("color 7"); }
{if (a % 10 == 7) system("color 8"); }
{if (a % 10 == 8) system("color 9"); }
{if (a % 10 == 9) system("color a"); }
}
關於小人移動的思考:
在小人左邊或右邊列印字元,使字元移動,產生小人移動的效果。
——————————————————————————————————————————————————————————————————————————————————————————
存在的不足:
1.不會列陣輸出小人,只能手動輸入。
2.不會小人的移動(不知道該用什麼程式碼實現),以及如何讓所有小人都可以移動(而不是隻有一個小人)。
3.在實驗2-4和2-6中使用迴圈輸入時使用while((xxx)!=0);或while((xxx)!=EOF);時,無法用Ctrl+E或Ctrl+D以及Ctrl+Z結束程式,特別在實驗2-6中結束時會出現無限迴圈。