《C和指针》学习笔记[第七章 函数]

7.10 问题

1.

可以在函数中做一些信息输出的工作,可以清晰的看到函数的调用

2.

我在本地使用测试中,如果没有函数原型,入参检测默认都会int。

3.

编译无法通过报错

4.

会转换成整形

5.

会转换成整形

6.

会转换成整形

7.

经过测试,该函数参数int array[10] 与int array[]效果一样,这样的话,这个函数无法

处理大于或者小于10个元素的整形数组,一个会可能越界,一个可能会没有处理全部元素

8.

都是重复做一件事情,然后达到一定的条件停止.

9.

便于管理,方便维护

10

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <stdarg.h>
#include <time.h>

long count;

long
fiboncci(int i)
{
    count++;
    if (i <= 2) {
        return 1;
    }
    else
        return fiboncci(i - 1) + fiboncci( i - 2);
}


int main(void)
{
    long f_res;
    int i = 2;
    time_t start, end;
    start = time(NULL);
    do {
        count = 0;
        f_res = fiboncci(i);
        printf("i = %d, res = %ld, count = %ld\n", i, f_res, count);
        i++;
        
    } while (i<=50);
    
    end = time(NULL);
    
    printf("运行时间 = %ld\n", end - start);
    
    return EXIT_SUCCESS;
}

 

7.11

1.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>


int hermite(int n, int x)
{
    if (n <= 0 ) {
        return 1;
    }
    else if (n == 1)
        return 2 * x;
    else
        return 2 * x * hermite(n - 1, x) - 2 * (n -1) * hermite(n -2, x);
}

int main(void)
{
    
    int i;
    i = hermite(3, 2);
    printf("result = %d\n", i);

    
    return EXIT_SUCCESS;
}

2.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>


int gcd(int m , int n){
    if (m <= 0 || n <= 0) {
        return 0;
    }
    else{
        if (m % n == 0) {
            return n;
        }
        else{
            return gcd(n, m % n);
        }
    }
}

int main(void)
{
    
    int i;
    i = gcd(77, 35);
    printf("result = %d\n", i);

    
    return EXIT_SUCCESS;
}

 3.

 这是用递归写的不完善版本。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <math.h>


int ascii_to_integer(char *string){
    if (string[0] == '\0') {
        return 0;
    }
    else if (string[0] >= '0' && string[0] <= '9'){
        return (string[0] - '0') * pow(10, strlen(string)-1)  + ascii_to_integer(++string);
    }
}

int main(void)
{
    
    char string[1000];
    
    gets(string);
    
    printf("result = %d\n", ascii_to_integer(string));

    return EXIT_SUCCESS;
}

这是用循环写

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <math.h>


int ascii_to_integer(char *string){
    char ch = *string;
    int r_num = 0;
    while (ch) {
        if (ch >= '0' && ch <= '9') {
            r_num = r_num * 10 + ch - '0';
        }
        else
            return 0;
        ch = *(++string);
    }
    return r_num;
}

int main(void)
{
    
    char string[1000];
    
    gets(string);
    
    printf("result = %d\n", ascii_to_integer(string));

    return EXIT_SUCCESS;
}

4.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <stdarg.h>


int max_list(int f_num, ...){
    int max_num = f_num;
    int num;
    
    va_list vararg;
    
    va_start(vararg, f_num);
    
    while (1) {
        num = va_arg(vararg, int);
        if (num >= 0 ) {
            if (num > max_num) {
                max_num = num;
            }
        }
        else{
            break;;
        }
    }
    
    return max_num;
}

int main(void)
{
    
    printf("result = %d\n", max_list(1,2,3,4,99,6,-1));

    return EXIT_SUCCESS;
}

5.

 

//
//  t_c.c
//  pointers_on_c
//
//  Created by sidian on 2022/5/27.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <stdarg.h>


void print_integer(int n)
{
    printf("%d", n);
}

void print_float(double n)
{
    printf("%f", n);
}

int my_print(char *string, ...)
{
    va_list var_arg;
    
    va_start(var_arg, string);
    
    int r_num = 0;
    char * t_string;
    while (*string++ != '\0') {
        if (*(string-1) == '%') {
            switch (*string) {
                case 'd':
                    print_integer(va_arg(var_arg, int));
                    string++;
                    r_num++;
                    break;
                case 'f':
                    print_float(va_arg(var_arg, double));
                    string++;
                    r_num++;
                    break;
                case 's':
                    t_string = va_arg(var_arg, char *);
                    while (*t_string++ != '\0') {
                        putchar(*(t_string - 1));
                    }
                    string++;
                    r_num++;
                    break;
                case 'c':
                    putchar(va_arg(var_arg, int));
                    string++;
                    r_num++;
                    break;
                default:
                    putchar(*string);
                    break;
            }
        }else
        {
           putchar(*(string-1));
        }
    }
    putchar('\n');
    
    return r_num;;
}



int main(void)
{
    int num;
    char *string = "ab%dcd, %s,%f,!!%c!!";
    
    num = my_print(string, 15,"hjkl",1.234,'p');
    
    printf("r_num = %d\n", num);
    

    return EXIT_SUCCESS;
}

 

6.

//
//  t_c.c
//  pointers_on_c
//
//  Created by sidian on 2022/5/27.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <stdarg.h>


static char *number[] = {"", "ONE ", "TWO ", "THREE ", "FOUR ", "FIVE ",
                            "SIX ", "SEVEN ", "EIGHT ", "NINE ","TEN ",
                            "ELEVEN ", "TWELVE ", "THIRTEEN ", "FOURTEEN ", "FIFTEEN ",
                            "SIXTEEN ", "SEVENTEEN ", "EIGHTEEN ", "NINETEEN "
                           };
static char *degree[] = {"HUNDERS ", "THOUSAND ", "MILLION ", "BILLION " };
static char *tens[] = {"", "", "TWENTY ", "THIRTY ", "FORTY ", "FIFTY ",
                               "SIXTY ", "SEVENTY ", "EIGHTY ", "NINETY "
                            };


char* string_copy(char *des, const char *sou){
    while (*sou != '\0'){
        *des++ = *sou++;
    }
    return des;
}

// 输出大单位数字前面的数值
char* cal_quotient(int quotient, char *buffer)
{
    char hunders_quotient,hunders_remainer, ten_quotient, ten_remainer;
    hunders_quotient = quotient / 100;
    hunders_remainer = quotient % 100;
    
    if (hunders_quotient) {
        buffer = string_copy(buffer, number[hunders_quotient]);
        buffer = string_copy(buffer, degree[0]);
    }

    if (hunders_remainer) {
        ten_quotient = hunders_remainer / 10;
        ten_remainer = hunders_remainer % 10;
        if (ten_quotient >= 2) {
            buffer = string_copy(buffer, tens[ten_quotient]);
            if (ten_remainer) {
                buffer =  string_copy(buffer, number[ten_remainer]);
            }
        }
        else if (ten_quotient == 1){
            buffer = string_copy(buffer, number[ten_remainer + 10]);
        }
        else {
            buffer = string_copy(buffer, number[ten_remainer]);
        }

    }
    
    
    return buffer;
    
}

// 计算billion的输出,并输出指针位置
char *cal_billion(unsigned int amount, char *buffer)
{
    char *r_string = buffer;
    int quotient;
    quotient = amount / 1000000000;
    if (quotient) {
        r_string = cal_quotient(quotient, buffer);
        r_string = string_copy(r_string, degree[3]);
    }
    return r_string;
}

// 计算million的输出
char *cal_million(unsigned int amount, char *buffer)
{
    char *r_string = buffer;
    int quotient;
    amount %= 1000000000;
    quotient = amount / 1000000;
    if (quotient) {
        r_string = cal_quotient(quotient, buffer);
        r_string = string_copy(r_string, degree[2]);
    }
    return r_string;
}

// 计算thousand的输出
char *cal_thousand(unsigned int amount, char *buffer)
{
    char *r_string = buffer;
    int quotient;
    amount %= 1000000;
    quotient = amount / 1000;
    if (quotient) {
        r_string = cal_quotient(quotient, buffer);
        r_string = string_copy(r_string, degree[1]);
    }
    return r_string;
}

char *cal_digit(unsigned int amount, char *buffer)
{
    char *r_string = buffer;
    int quotient;
    quotient = amount % 1000;
    if (quotient) {
        r_string = cal_quotient(quotient, buffer);
    }
    return r_string;
}

void written_amount( unsigned int amount, char *buffer){
    buffer = cal_billion(amount, buffer);
    buffer = cal_million(amount, buffer);
    buffer = cal_thousand(amount, buffer);
    buffer = cal_digit(amount, buffer);
    
    buffer[0] = '\0';
    
}

int main(void){
    
//    unsigned int num =4017483648;
    unsigned int num = 16312;

    char string[200];
    
    written_amount(num, string);
    
    printf("%u\n%s\n",num, string);
    
    return EXIT_SUCCESS;
}

 

posted @ 2022-06-19 00:30  就是想学习  阅读(22)  评论(0编辑  收藏  举报