2023.10.22博客

有一段时间没写博客了,主要原因是忘了写了,哈哈哈。这段时间把分支与循环的内容收了尾,并开启了一个全新篇章函数,我会将我的笔记贴在下面:

库函数( cplusplus.com/reference/clibrary/库函数查询)
常见库函数
 
strcpy
//strcpy-string copy-字符串拷贝
#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[]="bit";//保证源头字符串长度比目的地长度短或者目的地空间足够大
    char arr2[20]="######";//否者会溢出
    //             bit\0##-实际上拷贝了4个字符,\0是字符串结束标志
    strcpy(arr2,arr1);
    printf("%s\n",arr2);
    return 0;
}
 
memset
即:把“ptr”所指向那块空间的前“num”个字节的内容设置成特定的“value”
 
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[]="hello world";
    memset(arr,'*',5);
    printf("%s\n",arr);
    return 0;
}
 
自定义函数
写一个函数,交换两个整型变量的内容
#include<stdio.h>
void Swep(int x,int y)//不需要返回值类型,用void
{
    int tmp=0;//临时变量tmp
    tmp=x;
    x=y;
    y=tmp;
}
int main()
{
    int a=10;
    int b=20;
    Swep(a,b);
    printf("%d %d",a,b);
    return 0;
}
//无法完成交换的原因:x,y与a,b储存空间不一样(没有关系),故:a,b无法完成交换
 
解决方案:使函数内外建立联系(解引用操作)
//解引用操作
#include<stdio.h>
int main()
{
    int a=0;
    int* pa=&a;//pa指针变量--->存储a的地址:16进制数字
    *pa=20;//解引用操作:从pa更改a的值
    printf("%d\n",a);
    return 0;
}
 
//解决方案:使内外建立联系--->应用 解引用操作
#include<stdio.h>
void Swep2(int*pa,int*pb)//不需要返回值类型,用void
{
    int tmp=0;
    tmp=*pa;//*pa:a的地址,*pb:b的地址
    *pa=*pb;
    *pb=tmp;
}
int main()
{
    int a=10;
    int b=20;
    Swep2(&a,&b);
    printf("%d %d",a,b);
    return 0;
}
 
函数的参数
 
 
函数的调用
 
//用函数的方法输出素数
#include<stdio.h>
#include<math.h>
int is_prime(int n)//是素数返回1,否则返回0
{
    //产生2--n-1的数字
    int j=0;
    for (  j=2; j<=sqrt(n); j++)//i=a*b,例如:16=2*8=4*4
                                //如果i不是素数,那么a或者b中一定有一个<=开平方i
    {
        if (n%j==0)//判断j能否被n整除
            return 0;//结束能力强于break,直接结束整个函数
    }
    return 1;//找遍了2——n-1的数字,发现没有其他因数,故为素数
}
int main()
{
    int i=0;
    for ( i = 0; i<=200; i++)
    {
        if(is_prime(i)==1)//专门用来判断素数的
        {
            printf("%d\n",i);
        }
    }
    return 0;
}
 
//用函数的方式判断是否为闰年
#include<stdio.h>
int is_leap_year(int x)
{
    if ((x%4==0 && x%100!=0)||(x%400==0))
        return 1;
    else
        return 0;
}
int main()
{
    int year=0;
    for (year=1000;year<=2000;year++)
    {
        if (1 == is_leap_year(year))
        {
            printf("%d\n",year);
        }
    }
    return 0;
}
 
//写一个函数,实现一个整形有序数组的二分查找
#include<stdio.h>
                //本质上这里的arr是个指针
int binary_search(int arr[],int k)
{
    //算法的真正实现
    int sz=sizeof(arr)/sizeof(arr[0]);
    int left=0;
    int right=sz-1;
    int mid=(left+right)/2;
    while (left<=right)
    {
        if(arr[mid]<k)
        {
            left=mid+1;
        }
        else if (arr[mid]>k)
        {
            right=mid-1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}
int main()
{
    //二分查找的前提
    //在一个有序数组中查找具体某个数
    //找到了返回下标,找不到返回-1
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int k=7;
    int ret=binary_search(arr,k);//ret——>接收返回值
    //                    实际上传递的是数组首元素的地址
    if (ret==-1)
    {
        printf("找不到指定的数字\n");
    }
    else
    {
        printf("找到了,下标是:%d\n",ret);
    }
    return 0;
}
 
纠正:
#include<stdio.h>
int binary_search(int arr[],int k,int sz)
{
    //算法的真正实现
    int left=0;
    int right=sz-1;
    while (left<=right)
    {
        int mid=(left+right)/2;//不能放在循环外
        //每次循环都得求一次mid
        if(arr[mid]<k)
        {
            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=7;
    int sz=sizeof(arr)/sizeof(arr[0]);
    int ret=binary_search(arr,k,sz);//ret——>接收返回值
    if (ret==-1)
    {
        printf("找不到指定的数字\n");
    }
    else
    {
        printf("找到了,下标是:%d\n",ret);
    }
    return 0;
}
 
//写一个函数,使其每调用一次,num的值增加1
#include<stdio.h>
void Add(int* p)//不需要用返回值,所以用void
{
    (*p)++;//++的优先级更高,故*p++中++作用于p,则应该写(*p)++
}
int main()
{
    int num=0;
    Add(&num);
    printf("num=%d\n",num);
    Add(&num);
    printf("num=%d\n",num);
    return 0;
}
 
函数的嵌套调用和链式访问
 
嵌套调用:(函数函数的有机组合)
#include<stdio.h>
void one_line()
{
    printf("hehe\n");
}
void three_line()
{
    int i;
    for ( i = 1; i <= 3; i++)
    {
        one_line();
    }
}
int main()
{
    three_line();
    return 0;
}
 
链式访问(把一个函数的返回值作为另一个函数的参数):
#include<stdio.h>
#include<string.h>
int main()
{
    int len=0;
    //1
    len=strlen("abc");
    printf("%d\n",len);
    //2--链式访问
    printf("%d\n",strlen("abc"));
    return 0;
}
 
对printf返回值的描述
返回值为打印的字符的个数
 
#include<stdio.h>
int main()
{
    printf("%d",printf("%d",printf("%d",43)));
    //由内到外依次打印
    return 0;
}
 
 
函数的声明和定义
 
#include<stdio.h>
//函数声明
int Add(int x,int y);//x,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;
}
函数的调用真正的作用观看函数(1)3:21:00
那对于函数的调用的真正用法我之前也是有了解的,但是今天学了之后才发现没有我想象那么简单(当然也没有那么难),我觉得最麻烦的是函数声明和函数体要放在两个文件中,也算是增加了一点工作量嘛。但是有一说一,这确实让我们写代码时省了不少功夫,码农们不再需要每次都去写一个新的函数,可以直接调用同伴们写好的函数,既可以减少重复的、无意义的工作,还可以加强我们之间的联系
 
 
 
 
 
 
 
 
 
posted @ 2023-10-22 19:18  Bitey  阅读(22)  评论(0)    收藏  举报