实验四

#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);
        }
    }    
}

根不能一次性以函数返回值的形势返还给主函数,每个函数返回值只有一个,若要返还可以存入数组或者将x1,x2分为两个子函数分别计算和返还

#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;
}

插入前:

插入后:

#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);
}

理论分析与实验结果一致

局部static变量的特性:

该变量在全局数据区分配内存;
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
#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];
    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;
}

#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 k;
    if (n == 0)
        k = 1;
    else
        k = 2*(fun(n-1)+1);
    k = k-1;
return k;
}

 

#include <stdio.h>

void fun(int n,int a[]); 

int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        int a[1000]={1,0};
        fun(n,a); 
        printf("\n");    
    }
    return 0;
}

void fun(int n,int a[]){
    int i,j,k=0,c=0;
    for(i=1;i<=n;i++){
        for(j=0;j<=k;j++){
            a[j]=a[j]*2+c;
            c=a[j]/10;
            a[j]=a[j]%10; 
        }
        if(c){
            a[++k]=c;
        }
        c=0;
    }
    printf("n = %d,f =", n);
    for(i=k;i>=0;i--){ 
        if (i==0)
            a[i]-=1; 
        printf("%d",a[i]);
        } 
}

算法思路:因为数太大,所以不能直接输出计算;

设立一个足够大的数组,每一个元素储存一位数,判定低位数超过十则下一位加一;

最后将个位的数组减一,因为不存在个位数字为零需要借位,所以直接按位数依次输出

#include <stdio.h>

void draw(int n, char symbol); 

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 i,j,m,k;
    for(i=1;i<=n;i++){
        j=n-i;
        m=2*i-1;
        for(k=1;k<=j;k++)
            printf(" ");
        for(k=1;k<=m;k++){
            printf("%c",symbol);
            if(k==m)
                printf("\n");
        }
    }
}

posted @ 2020-11-25 15:55  GHao831  阅读(61)  评论(0编辑  收藏  举报