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
那对于函数的调用的真正用法我之前也是有了解的,但是今天学了之后才发现没有我想象那么简单(当然也没有那么难),我觉得最麻烦的是函数声明和函数体要放在两个文件中,也算是增加了一点工作量嘛。但是有一说一,这确实让我们写代码时省了不少功夫,码农们不再需要每次都去写一个新的函数,可以直接调用同伴们写好的函数,既可以减少重复的、无意义的工作,还可以加强我们之间的联系

浙公网安备 33010602011771号