函数:库函数、自定义函数、封装函数、函数的(嵌套)调用和链式访问、声明和定义、递归、求n的阶乘、斐波那契额数列

!!!!!!!函数!!!!!!!
//#include<stdio.h>
//int Add(int x, int y)
//{
//    int z = 0;
//    z = x + y;
//    return z;
//}
//int main()
//{
//    int a = 10;
//    int b = 20;
//    int sum=Add(a, b);//Add为自定义函数
//    printf("%d\n", sum);
//    return 0;
//}
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//    char arr1[] = "bit";
//    char arr2[20] = "#######";
//    strcpy(arr2, arr1);
//    printf("%s\n", arr2);
//    //strcpy——stringcopy-字符串拷贝
//    //strlen——string length-跟字符串长度有关
//    return 0;
//}

#define _CRT_SECURE_NO_WARNINGS 1
memset-内存设置
//#include <cstring>
//#include<stdio.h>
//int main()
//{
//    char arr[] = "hello world";
//    memset(arr, '*', 5);//arr为要被设置的对象,‘’里面为更换成的内容,5为数组前几位{被更换掉的}
//    printf("%s\n",arr);
//    return 0;
//}
// //写一个函数可以找出两个整数的最大值
//#include<stdio.h>
//int getmax(int x, int y)
//{
//    if (x > y)
//        return x;
//    else
//        return y;
//}
//int main()
//{
//    int a = 100;
//    int b = 20;
//    int max = getmax(a, b);
//    printf("max=%d\n", max);
//    return 0;
//}
// //写一个函数可以交换两个整型变量的内容
// 方法@1(无函数)
//#include<stdio.h>
//int main()
//{
//    int a = 10;
//    int b = 20;
//    int tmp = 0;
//    printf("a=%d,b=%d\n", a, b);
//    tmp = a;
//    a = b;
//    b = tmp;
//    printf("a=%d,b=%d\n", a, b);
//    return 0;
//}
// //方法@2(有函数)
// 使用自定义函数
//#include<stdio.h>
//void swap1(int x, int y)
//{
//    int tmp = 0;
//    tmp = x;
//    x = y;
//    y = tmp;
//}
//void swap2(int* pa, int* pb)
//{
//    int tmp = 0;
//    tmp = *pa;
//    *pa = *pb;
//    *pb = tmp;
//}
//int main()
//{
//    int a = 10;
//    int b = 20;
//    printf("a=%d,b=%d\n", a, b);
//    swap2(&a, &b);
//    printf("a=%d,b=%d\n", a, b);
//    return 0;
//}
//#include<cmath>
//#include<stdio.h>
//int is_prime(int n)
//{
//    int a = 0;
//    for(a=2;a<n;a++)//优化后改为for(a=2;a<=sqrt(n);a++)
//    {
//        if (n % a==0)
//            return 0;
//    }//8、9、10行不可改为else形式,因为这样会产生代码漏洞,从而结果错误。eg:当i=9,a=2时会导致i为素数,而9并不是!!
//    return 1;
//}
//int main()
//{
//    int i = 0;
//    for(i=100;i<=200;i++)
//        if (is_prime(i)==1)
//            printf("%d\n",i);
//    return 0;
//}
///#define _CRT_SECURE_NO_WARNINGS 1
// //写一个函数判断一年是否为闰年
//#include<stdio.h>
//#include<ctype.h>
//int is_leap_year(int n)
//{
//    if (n % 4 == 0 && n% 100 != 0)//或者写成y%400==0
//        return 1;
//    else
//        return 0;
//}
//
//int main()
//{
//    int year = 0;
//    for (year = 1000; year<=2000; year++)
//    {
//        判断是否为闰年
//        if (is_leap_year(year) == 1)
//            printf("%d\n", year);
//    }
//    return 0;
//}
写一个函数,实现一个整型有序数组的二分查找
//#include<stdio.h>
//int binary_search(int arr[],int k,int sz)//本质上此处的arr是一个指针而并非数组
//{                                             //sizeof(arr)作为指针大小的时候为4(win32)或8(x64)
//    //算法的正式执行                           sizeof(arr[0])是第一个元素并且为整形,则大小也为4
//    //int sz = sizeof(arr) / sizeof(arr[0]);   //导致ine sz值为1,不能得到元素个数
//    int left = 0;
//    int right = sz - 1;
//    while (left <= right)
//    {
//        int mid = (left + right)/2;//中间元素的下标//每次循环第一步都是求被查找范围的中间元素的下标
//        if (arr[mid] < k)             //int mid = (left + right)/2;此句代码不可放在循环外面
//        {
//            left = mid + 1;
//        }
//        else if (arr[mid] > k)
//        {
//            right = mid - 1;
//        }
//        else
//        {
//            return mid;
//        }
//    }
//    return -1;
//}
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    int k = 17;
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int ret = binary_search(arr, k,sz);//此处传递过去的是arr首元素的地址
//    if (ret == -1)
//    {
//        printf("找不到指定的数字\n");
//    }
//    else
//    {
//        printf("找到了,下标是:%d\n", ret);
//    }
//    return 0;
//}
//#include<stdio.h>
//void Add(int*p)
//{
//    (*p)++;
//}
//int main()
//{
//    int num = 0;
//    Add(&num);
//    printf("num=%d\n", num);
//    Add(&num);
//    printf("num=%d\n", num);
//    Add(&num);
//    printf("num=%d\n", num);
//    return 0;
//}

//#include<stdio.h>
//void new_line()
//{
//    printf("hehe\n");
//}
//void three_line()
//{
//    int i = 0;
//    for (i = 0; i < 3; i++)
//    {
//        new_line();
//    }
//}
//int main()
//{
//    three_line();
//    return 0;
//}
//#include<string.h>
//#include<stdio.h>
//int main()
//{
//    int len = 0;
//    len = strlen("abc");//@1
//    printf("%d\n", len);//@2@1、@2可替换为printf("%d\n",strlen("abc"))
//    return 0;
//}
//#include<stdio.h>
//int main()
//{
//    printf("%d\n",printf("%d\n",printf("%d\n", 44)));
//    return 0;
//}//"printf("%d\n", 44)"返回的值为“打印字符的个数”
//#include<stdio.h>
函数的声明
//int Add(int x, int y);
//int main()
//{
//    int a = 10;
//    int b = 20;
//    int sum = 0;
//    //函数的调用
//    sum = Add(a, b);
//    printf("%d\n", sum);
//    return 0;
//}
函数的定义
//int Add(int x, int y)
//{
//    int z = x + y;
//    return z;
//}
//#include<stdio.h>
//#include"add.h.cpp"//引用自己写的头文件用双引号
//int main()//如果“加法”是一个独立的模块,写一个“add.h.cpp”和“add.c.cpp”
把函数的声明放在add.h.cpp里边去,把函数的定义(实践)放到“add.c.cpp”里边去。
如果要使用,则用双引号引用一下自己创建的头文件
//{
//    int a = 10;
//    int b = 20;
//    int sum = 0;
//    //函数的调用
//    sum = Add(a, b);
//    printf("%d\n", sum);
//    return 0;
//}
拆开的理由:拆分复杂功能,将每种功能分开存放,更利于编写。

函数的递归
// //最简单的递归函数
//#include<stdio.h>
//int main()
//{
//    
//    printf("hehe\n");
//    main();
//    return 0;
//}
接受一个整型值(无符号),按照顺序打印它的每一位。eg:输入1234,输出1 2 3 4
// //方法1
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int main()
//{
//    int num = 0;
//    scanf("%d", &num);//1234
//    printf("%d ",num/1000); 
//    printf("%d ",(num%1000)/100);
//    printf("%d ",(num%100)/10);
//    printf("%d ",num%10);
//    return 0;
//}
// //方法2
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//void XXX(int n)//eg:1234
//{
//    if (n > 9)//为了判断是否为两位数
//    {
//        XXX(n / 10);
//    }
//    printf("%d ", n % 10);
//}
//
//int main()
//{
//    unsigned int num = 0;
//    scanf("%d", &num);
//    XXX(num);//自定义函数XXX
//    return 0;
//}
编写函数创建临时变量,求字符串长度
//#include<stdio.h>
//#include<string.h>
//int my_strlen(char* str)//str为指针变量,str存的是arr(bit)的地址
//{
//    int count = 0;//计数器count(变量)
//    while (*str != '\0')//str不等于\0指的是还没有到字符串的结束位置//if语句不能循环,需要换成while变成循环
//    {                 //到”\0“的时候循环与递归停止
//        count++;//统计一个字符
//        str++;//地址+1,就是向字符串后走了一步到了“i”(起初在“b”)(分别为“b”“i”“t”“\0”)
//    }//当*str=\0时,“/0!=\0”为假,跳出代码块,因此count里放的就是元素个数了
//    return count;
//}
//int main()
//{
//    char arr[] = "bit";
//    //int len = strlen(arr);//strlen求字符串长度
//    //printf("%d\n", len);
//    int len = my_strlen(arr);//arr是数组,数组传参数,传过去的不是整个数组,而是第一个元素的地址
//    //模拟了实现了一个strlen函数
//    printf("len=%d\n", len);
//    return 0;
//}
编写函数不允许创建临时变量,求字符串长度
用递归的方法(把大事化小)
my_strlen("bit");
1+my_strlen("it");
1+1+my_strlen("t");
1+1+1+my_strlen("\0");
1+1+1+0
3
//#include<stdio.h>
//#include<string.h>
//int my_strlen(char* str)//
//{
//    if (*str != '\0')
//        return 1 + my_strlen(str + 1);//str+1指向i的地址则my_strlen从i的地方向后找字符串
//    else
//        return 0;//若发现第一个字符就是\0,则长度为0
//}
//int main()
//{
//    char arr[] = "bit";
//    //int len = strlen(arr);//strlen求字符串长度
//    //printf("%d\n", len);
//    int len = my_strlen(arr);//arr是数组,数组传参数,传过去的不是整个数组,而是第一个元素的地址
//    //模拟了实现了一个strlen函数
//    printf("len=%d\n", len);
//    return 0;
//}

求n的阶乘(不考虑溢出)
循环法
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int Ax(int n)
//{
//    int i,ret = 1;
//    for (i = 1; i <= n; i++)
//    {
//        ret *= i;
//    }
//    return ret;
//}
//int main()
//{
//    int n = 0;
//    int ret = 0;
//    scanf("%d", &n);
//    ret= Ax(n);//循环方式
//    printf("%d\n", ret);
//    return 0;
//}
递归法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Ax1(int n)
{
    int i,ret,sum = 1;
    for (i = 1; i <= n; i++)
    {
        sum += ret*i;
    }
    return sum;
}
int Ax2(int n)
{
    if (n <= 1)
        return 1;
    else
        return n * Ax2(n - 1);
}
int main()
{
    int n = 0;
    int sum=1;
    int ret = 0;
    scanf("%d", &n);
    ret= Ax2(n);//循环方式
    printf("%d\n", sum);
    return 0;
}
求第n个斐波那契数(不考虑溢出)
斐波那契数列:()前两个数之和等于第三个数
1 1 2 3 5 8 13 21 34 55 ........
方法1(递归方法存在效率低的问题)
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int count = 0;//56、59、60、61、62、76为的是测试代码中有多少重复且多余性操作
//int FBNQ(int n)
//{
//    if (n == 3)//测试第3个斐波那契数的计算次数
//    {
//        count++;
//    }
//    if (n <= 2)
//        return 1;
//    else
//        return FBNQ(n - 1) + FBNQ(n - 2);
//}
//int main()
//{
//    int n = 0;
//    int ret = 0;
//    scanf("%d", &n);
//    //TDD:测试驱动开发
//    ret = FBNQ(n);
//    printf("ret=%d\n", ret);
//    printf("count=%d\n", count);
//    return 0;
//}
方法2(优化)(循环方法可以有效增加代码效率)
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int FBNQ(int n)
//{
//    int a = 1;
//    int b = 1;
//    int c = 1;//此处的c最好为1,由于当c=0时,会导致斐波那契数的第一位和第二位出错(第1、2位都为1)
//                                            //而当c=1时,while不会执行,return c正好为1
//    while (n > 2)
//    {
//        c = a + b;
//        a = b;
//        b = c;
//        n--;//此行代码的意义;为了保证在n=3时循环一次后,n--;变成2,就不再进行循环;
//    }
//    return c;
//}
//int main()
//{
//    int n = 0;
//    int ret = 0;
//    scanf("%d", &n);
//    //TDD:测试驱动开发
//    ret = FBNQ(n);
//    printf("ret=%d\n", ret);
//    return 0;
//}
/测试题
//1.青蛙跳台阶
//共n个台阶
//1次可以跳一个台阶
// 一次也可以跳2个台阶
//这只青蛙要跳到第n个台阶,求一共几种跳法?
//2.汉诺塔问题
//塔1(a,b,c)、塔2()、塔3()a,b,c为三个铁盘且a<b<c,要求在挪动的过程中,
//始终保持从上到下(由大到小)的顺序,可以借助塔2,最终将a,b,c三个塔放在c上

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值