1. 程式人生 > 實用技巧 >實驗4~函式與陣列

實驗4~函式與陣列

實驗任務1

//一元二次方程求解(函式實現方式)
//重複執行,直到按下ctrl+z結束 
#include <math.h>
#include <stdio.h>

void solve(double a,double b,double c);

int main(){
    double a, b, c;
    
    printf("Enter a, b, c:");
    while(scanf("%lf%lf%lf",&a, &b, &c)!=EOF){
        solve(a ,b , c);
        printf(
"Enter a, b, c:"); } return 0; } //函式定義 //功能:求解一元二次方程,列印輸出結果 void solve(double a, double b, double c){ double x1, x2; double delta, real, imag; if(a == 0) printf("not quadratic equation.\n"); else{ delta = b*b - 4*a*c; if(delta >= 0
){ x1 = (-b + sqrt(delta)) / (2*a); x2 = (-b - sqrt(delta)) / (2*a); printf("x1 = %f, x2 = %f\n", x1, x2); } else{ real = -b/(2*a); imag = sqrt(-delta) / (2*a); printf("x1 = %f + %fi, x2 = %f - %fi\n",real, imag, real, imag); } } }

一元二次方程當Δ不等於0時會有兩個根,而函式返回值只有一個值,所以不能設定成以函式為返回值的方式返回給主調函式。

實驗任務2

//利用區域性static變數計算階乘

#include <stdio.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));
       
       return 0;} 
       
//函式定義
long long fac(int n){
    static long long p = 1;
    
    p = p*n;
    return p;
} 

//利用區域性static變數計算階乘

#include <stdio.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));
       
       return 0;} 
       
//函式定義
long long fac(int n){
    static long long p = 1;
    printf("p = %lld\n",p);//新增程式碼 
    p = p*n;
    return p;}

插入程式碼後ex2.1執行圖示

ex2.2原始碼

//區域性static變數特性

#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);
    
    return 0;
    
} 
int func(int a,int b){
    static int m=0,i=2;
    
    i += m+1;
    m = i+a+b;
    
    return (m);
}

ex2.2執行圖示

有程式碼可得i=i+m+1;m=i+a+b;定義中m與i已賦值,所以i=3,a=4,b=1,m=8,返回值m即為8;同理,第二個返回值m為17.

static變數可分為靜態區域性變數和靜態全域性變數。區域性變數特點:1.佔據一個永久性的儲存單元,與檔案一起存在;2.在編譯時賦初值,一旦儲存值改變,不會再執行賦初值語句;3.未賦值變數值為0.

實驗任務3

//尋找兩個整數之間的所有素數(包括這個整數),把結果儲存至陣列bb中,函式返回素數的個數。
//例如:輸入6和21,則輸出:7 11 13 17 19.

#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];
    bb[N]={0};
    
    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; 
}

執行圖示6 21

6 30

實驗任務4

原始碼

#include<stdio.h>
long long fun(int n);

int main(){
    int n;
    long long f;
    
    while (scanf("%d",&n)!=EOF){
        f = fun(n);
        printf("n = %d, f = %lld\n", n, f);
        
    }
    return 0;
}
long long fun(int n){
    long long f;
    if (n==1){
    return 0;
    }
    else {
    f = fun(n-1)*2+1;return 0;
}
    
}

執行圖示

實驗任務5

原始碼

#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, x, y;
   for (line=1;line<=n;line++){
   
    for (x=1;x<=n-line;x++)
    {
    printf(" ");
    } 
    for(y=1;y<=2*line-1;y++){ 
    printf("%c",symbol);
    } 
    printf("\n");
}
}
    

執行圖示