本文將大資料學習門檻降到了地平線
實驗二
1.實驗任務1
#include <stdio.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); return 0; }
6.(5/7)*100
7.(5*100)/7
8.(100/7)*5
*和/都是左結合,從左向右運算,而a,b,c,d,e,f都是整型變數,進行/運算時只會保留整數部分,所以d,e,f三個值不同
2.實驗任務2
#include <stdio.h> intmain() { int x=1234; float f=123.456; double m = 123.456; char ch = 'a'; char a[] = "Hello, world!"; // 定義一個數組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; }
printf()中
(1.%d:以十進位制輸出
%nd:輸出n列十進位制數,不足n列左邊用空格補齊,足夠n列則正常輸出(n為數字)
%-nd:輸出n列十進位制數,不足n列從右邊用空格補齊
(2.%f:以小數形式輸出,預設保留六位小數(單精度)
%.nf:保留小數點後n位
%.e:以指數形式輸出
%lf:以雙精度輸出
(3.%c:以字元輸出
%nc:輸出n列,不足n列左邊用空格補齊
(4.%s:以字串輸出
%.ns:輸出字串前n位(n為數字)
%ns:輸出n列字串,不足在左邊用空格補齊,足夠則正常輸出
3.實驗任務3
// ex3.cpp #include <stdio.h> int main() { double x,y; char c1,c2,c3; int a1,a2,a3; scanf("%d%d%d",&a1,&a2,&a3); printf("%d,%d,%d\n",a1,a2,a3); scanf("%c%c%c",&c1,&c2,&c3); printf("%c%c%c\n",c1,c2,c3); scanf("%lf%lf",&x,&y); printf("%.1lf,%.1lf\n",x,y); return 0; }
4.實驗任務4
// ex4.cpp // 判斷字元型別 #include <stdio.h> int main() { char x; x = getchar(); if (x>='0'&&x<='9') // 判斷x是數字字元表示式 printf("%c是數字字元\n", x); else if ((x>='a'&&x<='z')||(x>='A'&&x<='Z')) // 判斷x是大寫或小寫英文字母的表示式 printf("%c是英文字母\n", x); else printf("%c是其它字元\n", x); return 0;
5.實驗任務5
// ex5.cpp #include <stdio.h> int main() { char ans1, ans2; printf("複習了沒? (輸入y或Y表示複習了,輸入n或N表示沒複習) : "); ans1 = getchar(); // 從鍵盤輸入一個字元,賦值給ans1 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; }
6.實驗任務6
#include<stdio.h> #include<math.h> int main() { int sum, n; scanf("%d", &n); if(n>=1&&n<=10) { sum = (1 - pow(2,n)) /(1 - 2); printf("n=%d,sum=%d",n,sum); } else printf("n³¬³öÏÞ¶¨·¶Î§"); return 0; }
7.實驗任務7
#include <stdio.h> void print(char*,int,int); int main() { int n=5,i,layer=1; char head[] =" O",body[] = "<H>", leg[] = "I I"; for (i = n;i>0;i--) { print(head, 2 * i - 1,layer); print(body, 2 * i - 1,layer); print(leg, 2 * i - 1,layer); printf("\n"); layer++; } return 0; } void print(char*string, int i,int n) { for (;n - 1 > 0;n--) printf("%10s"," "); for (int j = 0;j < i;j++) printf("%-10s",string); printf("\n"); }
實驗總結
1.實驗任務5中getchar()的作用是清除緩衝區中的‘\n’字元。用鍵盤輸入時,輸入的字元會儲存在緩衝區內,按下enter後緩衝區清空,但是保留著'\n'而getchar()是從緩衝區讀取字元,如果不加上一行getchar,ans2=getchar()會直接把'\n'賦值給ans2。同樣的,scanf函式也是從緩衝區讀取,實驗任務3中如果在輸入a1,a2,a3的值後換行那麼c1就會為'\n',如果想要換行輸入可以新增一行getchar()或者fflush(stdin)來達到清空緩衝區的目的,也可以在scanf中"和第一個%c之間加上\n。
於是我找到了這樣的一篇文章,裡面解釋了C語言中scanf函式與函式空格
http://blog.csdn.net/xia7139/article/details/14522493
在VS2019中,scanf_s函式有三個引數scanf_s( , , )最後一個是所分配記憶體的大小.
2.實驗任務7中,因為小人是重複的,可以用到迴圈。我的思路是先打印出頭再換行打印出身體最後再換行打印出腿,然後把這個過程放入另一個迴圈中。考慮到列印頭、身體和腿的步驟實際上是相同的,於是我寫了個函式print,有三個引數,第一個是列印的字串,第二個是列印的次數,第三個是小人所處的層數。一共五層,小人從上向下每次在兩邊各減少一個,很容易歸納出規律,下面為第一排,上面為最後一排,若小人處在第x排,則此排小人的數量為(2x-1)。最後,小人前面的空格符也需要考慮進去,在列印小人身體前先列印空格,而空格符的數量和小人所處的層數是相關的,所以print函式的最後一個引數就是用來打印出空格的。