1. 程式人生 > 實用技巧 >實驗任務四20.11.26

實驗任務四20.11.26

  • 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可以用的地方用了卻各種報錯,還是要繼續學習、好好練習。