导航

C语言程序设计基础 实验3 函数

Posted on 2021-11-24 18:26  pipipapi  阅读(87)  评论(1编辑  收藏  举报
C语言程序设计基础 实验3 函数
 
一、实验目的
1. 理解函数的本质:模块化,实现代码复用
2. 掌握函数定义、声明、调用的语法
3. 理解并掌握函数的形参、实参,以及函数调用和返回的过程
4. 综合应用分支、循环和函数编程解决常见实际问题
 
实验一
(1)
#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;
}

 

 感悟:这个代码非常的细节,考虑到了同学们可能会输入较大的n从而导致对应的阶乘超出int的范围。已知long long的范围下最大的阶乘表示为26

 

在line22之后插入打印

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

 

 

 (2)

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

 

 
实验二

#include <stdio.h>
void printSymbol(int n, char symbol); 
int main() {
    int n;
    char symbol;
    while( scanf("%d %c", &n, &symbol) != EOF ) {
        printSymbol(n, symbol); 
        printf("\n");
    }
    return 0;
}

void printSymbol(int n, char symbol){
    if(!n) return ;
    printf("%c",symbol);
    printSymbol(n-1,symbol);
}

递归版

#include <stdio.h>
void printSymbol(int n, char symbol); 
int main() {
    int n;
    char symbol;
    while( scanf("%d %c", &n, &symbol) != EOF ) {
        for(int i=1;i<=n;++i) printf("%c",symbol); 
        printf("\n");
    }
    return 0;
}

void printSymbol(int n, char symbol){
    if(!n) return ;
    printf("%c",symbol);
    printSymbol(n-1,symbol);
}

 

 

 

我认为递归好一点,因为代码短

 

 
实验三
#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){
    if(n==1) return 1ll;
    return 2ll*fun(n-1)+1;
}
 
 
实验四
#include <stdio.h>
#define true 0
#define false 1
#define bool int
bool is_prime(int x) {
    for(int i=2; i<=x/i; ++i)
        if(x%i==0)
            return true;
    return false;
}

int main() {
    int cnt = 0;
    for(int i=101; i<=200; ++i) {
        if(!is_prime(i)) {
            cnt ++;
            printf("%d ",i);
            if(cnt%20 == 0) puts("");
        }
    }
    puts("");
    printf("101~200之间一共有%d个非素数\n",cnt);
    return 0;
}
 

 

   

实验五
#include <stdio.h>
long fun(long s); 
int main() {
    long s, t;
    printf("Enter a number: ");
    while (scanf("%ld", &s) != EOF) {
        t = fun(s); 
        printf("new number is: %ld\n\n", t);
        printf("Enter a number: ");
    }
    return 0;
}

long fun(long s){
    long base = 1,ans=0;
    while(s){
        long num = s%10;
        if(num&1){
            ans += base*num;
            base*=10;
        }
        s/=10;
    }
    return ans;
}
 

 

 

实验六
#include <stdio.h>
double fun(int n); // 函数声明
int main() {
    int n;
    double s;
    printf("Enter n(1~10): ");
    while (scanf("%d", &n) != EOF) {
        s = fun(n); // 函数调用
        printf("n = %d, s= %f\n\n", n, s);
        printf("Enter n(1~10): ");
    }
    return 0;
}
double fun(int n){
    if(n==1) return 1;
    double ans = 1.0;
    for(int i=1;i<=n;++i) ans*=i;
    if(n&1) return fun(n-1) + 1.0/ans;
    else return fun(n-1) - 1.0/ans;
}