首页 > 其他分享 >学习C语言第三弹:函数(1)

学习C语言第三弹:函数(1)

时间:2023-03-08 18:32:18浏览次数:32  
标签:arr return 函数 int mid 第三 printf C语言

函数是什么?

数学中我们常见到函数的概念。维基百科中对函数的定义:子程序。

      ·在计算机科学中,子程序(英语:Subroutine,procedure,function,routine,method,subprogram,callable,unit),是一个大型程序中的某部分的代码,由一个或多个语句组成。它负责完成某项特定的任务,而且相较于其他代码,具备相对的独特性。

      ·一般会议输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码停车被集成为软件库。

C语言中函数的分类

      1.库函数:C语言本身提供给我们的函数。

      2.自定义函数

库函数:

库函数学习:打开网站:www.cplusplus.com、http://en.cppreference.com

简单的总结,C语言常用的库函数都有:

IO函数;

字符串操作函数;

字符操作函数

内存操作函数

时间/日期函数

数学函数

其他库函数

自定义函数:

      自定义函数和库函数一样,有函数名,返回值类型和函数参数。但不一样的是这些都是我们自己来设计的。这给程序员一个很大的发挥空间。

ert_type fun_name(para1,*)
{
statement;//语句项
}
//ret_type-返回类型
//fun_name-函数名
//paral-函数参数

示例1:写一个函数找出两个整数中的较大值

#include<stdio.h>
//定义函数
int get_max(int x, int y)
{
if(x>y)
return x;
else
return y;
}

int main()
{
int a = 10;
int b = 20;
int max = get_max(a, b);
printf("max = %d\n", max);
return 0;
}

示例2:写一个函数交换两个整型变量的内容

#include<stdio.h>
void Swap(int* pa, int* pb)//void表示没有返回值
{
int tmp = 0;
tmp = *pa;//*pa、*pb解地址
*pa = *pb;
*pb = tem;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);//取a、b的地址
printf("a=%d b=%d\n", a, b);
return 0;
}

函数的参数:

实际参数(实参):

真是传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传给形参。

形式参数(形参):

形式参数是指函数后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成后就自动销毁了。因此形式参数只在函数中有效。

当实参传给形参的时候,形参其实是实参的一份临时拷贝,对形参的修改是不会改变实参的。

函数的调用:

传值调用

函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。

传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

这种传参方式可以让函数和函数外部的变量建立起真正的联系,也就是函数内部可以直接操作外部的变量。

示例3:写一个函数打印100-200之间的素数

#include<stdio.h>
#include<math.h>
//是素数返回1,不是素数返回0
int is_prime(int n)
{
int j = 0;
for(j=2; j<=sqrt(n); j++)
{
if(n%j == 0)
return 0;
}
return 1;
}
int main()
{
int i = 0;
for(i=100; i<=200; i++)
{
if(is_prime(i) == 1)
printf("%d", i);
}
return 0;
}

示例4:写一个函数判断一年是不是闰年

#include<stdio.h>
#include<math.h>
int is_leap_year(int year)
{
if((y%4==0 && y%100!=0) || (y%400==0))
return 1;
else
return 0;
}

int main()
{
int year = 0;
for(year = 1000; year<=2000; year++)
{
//判断year是否为闰年
if(1 == is_leap_year(year))
{
printf("%d", year);
}
}
return 0;
}

示例5:写一个函数实现一个整形有序数组的二分查找

#include<stdio.h>
#include<math.h>
// 本质上arr是一个指针
int binary_search(int arr[], int k)
{
//算法的实现
int sz = sizeof(arr)/sizeof(err[0]);
int left = 0;
int right = sz - 1;

while(left <= right)
{
int mid = (left + right)/2;
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;
// 传过去的实际是数组arr首元素的地址
int ret = binary_search(arr, k);
if(ret == -1)
{
printf("找不到指定的数字\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}

改:

#include<stdio.h>
#include<math.h>
// 本质上arr是一个指针
int binary_search(int arr[], int k, int sz)
{
//算法的实现
int left = 0;
int right = sz - 1;

while(left <= right)
{
int mid = (left + right)/2;
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 sz = sizeof(arr)/sizeof(err[0]);
// 传过去的实际是数组arr首元素的地址
int ret = binary_search(arr, k, sz);
if(ret == -1)
{
printf("找不到指定的数字\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}

示例6:写一个函数,每调用一次这个函数,就会将num的值增加1

#include<stdio.h>
#include<math.h>
void Add(int* p)
{
(*p)++;
}
int main()
{
int num = 0;
Add(&num);
printf("num = %d\n", num);//1
Add(&num);
printf("num = %d\n", num);//2
Add(&num);
printf("num = %d\n", num);//3
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;
}

链式访问

把一个函数的返回值作为另一个函数的参数

int main()
{
int len = 0;
//1
len = strlen("abc");
printf("%d\n", len);
//2
printf("%d\n", strlen("abc"));
return 0;
}
int main()
{
printf("%d", printf("&d", printf("&d", 43)));
return 0;
}//输出结果为4321

函数的声明和定义

函数的声明:

1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧要。

2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。

3.函数的声明一般要放在头文件中。

函数的定义:

函数的定义是指函数的具体实现,教导函数的功能实现。

test.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;
}

学习C语言第三弹:函数(1)_#include

标签:arr,return,函数,int,mid,第三,printf,C语言
From: https://blog.51cto.com/u_15979874/6108613

相关文章

  • 嵌入式C语言九大数据结构操作方式详解
          数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织......
  • 函数
                           return与break区别break只会结束循环,return会结束函数          ......
  • SQL 开窗函数
    一、开窗函数开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:1、over(orderbysalary)按照salary排序进行累计,orderby是......
  • [常用函数]模拟单击双击
    小程序需要模拟双击事件,如果一个元素既绑定了单击事件,又绑定了模拟的双击事件,如何区分两个事件何时触发呢? 1.设计一个点击事件分发函数如果用户两次点击的时间间隔不......
  • leetcode刷题--两数之和/两数相加/关于class/enumerate()函数/TypeError: creat() mis
    Python中的self详细解析-初识CV的文章-知乎https://zhuanlan.zhihu.com/p/356325860关于classleetcode里面给出的class部分是不能删除的,否则会执行出错。关于class......
  • Linux & 标准C语言学习 <DAY9_1>
    //补08_2函数  2、函数传参:    1.函数中定义的变量属于该函数,出了该函数就不能再被别的函数直接使用    2.实参与形参之间是以赋值的方式进行......
  • python学习-第三方库综合程序设计实验报告
    目录实验四: Python综合程序设计实验名称:Python综合程序设计              指导教师:      实验日期:2022年 12 月 5 日......
  • 实验1 C语言开发环境使用和数据类型、运算符、表达式
    //打印一个字符小人#include<stdio.h>intmain(){printf("o\n");printf("<H>\n");printf("II\n");return0;}#include<stdio.h>......
  • 耗资百万的TPS第三人称射击『赛博朋克』游戏,免费开源啦!下载攻略奉上
    Cocos引擎最近开源了《赛博朋克》游戏源码,这是一个TPS第三人称视射击游戏。项目包含13W行源代码,50W外包美术资源,并且它演示了CocosCreator引擎最新的渲染能力。喜欢3D......
  • C++自定义比较函数的bug
    autocmp=[](intx,inty){returntrue;};priority_queue<int,vector<int>,cmp>q;报错第三个参数失配,需要一个类型,而不是对象。平时用sort直接传cmp习惯了,才发......