實驗任務四20.11.26
阿新 • • 發佈:2020-11-29
- EX1
ans:不能。因為 solve 函式返回值型別為 void,不能返回數值。將 void solve 宣告及定義改為 double solve 再返回值即可。
- EX2
//ex2_1 // 利用區域性static變數計算階乘 #include <stdio.h> #include <stdlib.h> long long fac(int n); // 函式宣告 int main() { int i, n; printf("Enter n: "); scanf("%d", &n); for (i = 1; i <= n; ++i) printf("%d! = %lld\n", i, fac(i)); system("pause"); return 0; } // 函式定義 long long fac(int n) { static long long p = 1; printf("p = %lld\n", p); p = p*n; return p; }
//ex2_2 // 練習:區域性static變數特性 #include <stdlib.h> #include <stdio.h> int func(int, int); int main() {int k = 4, m = 1, p1, p2; p1 = func(k, m); p2 = func(k, m); printf("%d,%d\n", p1, p2); system("pause"); return 0; } int func(int a, int b) { static int m = 0, i = 2; i += m + 1; m = i + a + b; return (m); }
執行前猜想:p1=8,p2=17 與結果一致
區域性static變數用法總結:
①編譯器一般不對普通區域性變數進行初始化,也就是說它的值在初始時是不確定的,除非對其顯式賦值。而靜態區域性變數使用static修飾符定義,即使在宣告時未賦初值,編譯器也會把它初始化為0。(此條在實驗中並未體現,為收集來的資料所知);
②普通區域性變數儲存於程序棧空間,使用完畢會立即釋放。而靜態區域性變數儲存於程序的全域性資料區,即使函式返回,它的值也會保持不變。(在實驗中,計算p2值時,帶入的m與i並不是0和2而是計算完p1後的m和i,所以P2結果與p1不同)
- EX3
//ex3 //尋找兩個整數之間的所有素數(包括這兩個整數),把結果儲存在陣列bb中,函式返回素數的個數。 #include <stdio.h> #define N 1000 int fun(int n,int m,int bb[N]) { int i,j,k=0,flag; for(j=n;j<=m;j++) //篩選素數 { flag = 1; for(i=2;i<j;i++) if(j%i == 0) { flag=0; break; } if(flag == 1) bb[k++]=j; } return k; } int main() { int n=0,m=0,i,k,bb[N]; printf("輸入n和m(n<m):"); scanf("%d",&n); scanf("%d",&m); for(i=0;i<m-n;i++) bb[i]=0; k=fun(n,m,bb); for(i=0;i<k;i++) printf("%4d",bb[i]); return 0; }
- EX4
//ex4 #include <stdio.h> long long fun(int n); // 函式宣告 int main() { int n; long long f; while(scanf_s("%d", &n) != EOF) { f = fun(n); // 函式呼叫 printf("n = %d, f = %lld\n", n, f); } return 0; } // 函式定義 long long fun(int n) { long long result; if (n == 0) result = 0; else result = 2 * fun(n - 1) + 1; return result; }
- EX5
//ex5 #include <stdio.h> void draw(int n, char symbol); // 函式宣告 #include <stdio.h> int main() { int n, symbol; while (scanf("%d %c", &n, &symbol) != EOF) { draw(n, symbol); // 函式呼叫 printf("\n"); } return 0; } // 函式定義 void draw(int n, char symbol) { int line, i; char blank = ' '; for (line = 1; line <= n; line++) { for (i = 1; i <= n - line; i++) putchar(blank); for (i = 1; i <= 2 * line - 1; i++) printf("%c", symbol); printf("\n"); } }
實驗總結:對for運用更熟練了,有時覺得do()while可以用的地方用了卻各種報錯,還是要繼續學習、好好練習。