C【函数】

news2024/11/26 3:53:23

1.常用API

1.strcpy:#include<string.h>

char * strcpy ( char * destination, const char * source );
 int main()
 {
 	char arr1[] = "bit";
 	char arr2[20] = "###########";
 	//               bit\0########
 	strcpy(arr2, arr1);
 	printf("%s\n", arr2);
 	
 	//strcpy - string copy - 字符串拷贝
 	//strlen - string length - 字符串长度有关
 	return 0;
 }

2.menset

void * memset ( void * ptr, int value, size_t num );
int main()
{
	char arr[] = "hello world";
	memset(arr, '*', 5);
	printf("%s\n", arr);
	//***** world
	return 0;
}

3.参考网站

cppreference.com

2.自定义函数

2.1 函数的组成

ret_type fun_name(para1, * )
{
 statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1    函数参数
//定义函数
//形参-形式参数-形式上参数
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);
	max = get_max(100, 300+1);
	max = get_max(100, get_max(3, 7));

	printf("max = %d\n", max);

	return 0;
}

2.2 交换函数

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;

	//int tmp = 0;
	//
	printf("a=%d b=%d\n", a, b);
	//调用Swap1函数-传值调用
	Swap1(a, b);
	//调用Swap2函数
	Swap2(&a, &b);
	/*tmp = a;
	a = b;
	b = tmp;*/
	printf("a=%d b=%d\n", a, b);
	return 0;
}

3.函数的参数

3.1 实际参数(实参)

3.2 形式参数(形参)

4.函数的调用

4.1 传值调用

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

2.传址调用

  • 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
  • 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。

3.练习

1. 写一个函数可以判断一个数是不是素数。

//是素数返回1,不是素数返回0
#include <math.h>

int is_prime(int n)//9
{
	//2->n-1
	int j = 0;
	for(j=2; j<=sqrt(n); j++)
	{
		if(n%j == 0)
			return 0;
	}
	return 1;
}


int main()
{
	//打印100-200之间的素数
	int i = 0;
	for(i=100; i<=200; i++)
	{
		//判断i是否为素数
		if(is_prime(i) == 1)
			printf("%d ", i);
	}

	return 0;
}

2. 写一个函数判断一年是不是闰年。

 //2. 写一个函数判断一年是不是闰年。
int is_leap_year(int y)
{
	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;
}

3. 写一个函数,实现一个整形有序数组的二分查找。

  //本质上arr是一个指针
  //3. 写一个函数,实现一个整形有序数组的二分查找
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(arr[0]);
	//                     传递过去的是数组arr首元素的地址
	int ret = binary_search(arr, k, sz);
	if(ret == -1)
	{
		printf("找不到指定的数字\n");
	}
	else
	{
		printf("找到了,下标是:%d\n", ret);
	}
	return 0;
}

4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。

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


int main()
{
	int len = 0;
	//1
	//len = strlen("abc");
	//printf("%d\n", len);
	//2
	printf("%d\n", strlen("abc"));
	return 0;
}

5.函数的嵌套调用和链式访问

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

5.1 嵌套调用

#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;
}

函数可以嵌套调用,但是不可以嵌套定义

5.2 链式访问

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[20] = "hello";
 int ret = strlen(strcat(arr,"bit"));//这里介绍一下strlen函数
 printf("%d\n", ret);
 return 0;
}
#include <stdio.h>
int main()
{
    printf("%d", printf("%d", printf("%d", 43)));
    //结果是啥?
    //注:printf函数的返回值是打印在屏幕上字符的个数
    return 0;
}

6.函数的声明和定义

6.1 函数声明

6.2 函数定义

7.函数递归

7.1 递归的两个必要条件

存在限制条件,当满足这个限制条件的时候,递归便不再继续。

每次递归调用之后越来越接近这个限制条件

7.2 练习




int my_strlen(char* str)
{
	int count = 0;
	while(*str != '\0')
	{
		count++;
		//str+1:表示指向下一个地址
		str++;
	}
	return count;
}

//递归的方法
//把大事化小
//my_strlen("bit");
//1+my_strlen("it");
//1+1+my_strlen("t");
//1+1+1+my_strlen("")
//1+1+1+0
//3

int my_strlen(char* str)//char* str:str数组的首地址
{
	if(*str != '\0')//查看插入的数值的第一个是否为'\0'如果不是表示长度至少为1
		return 1+my_strlen(str+1);
	else
		return 0;
}

int main()
{
	char arr[] = "bit";
	//int len = strlen(arr);//求字符串长度
	//printf("%d\n", len);

	//模拟实现了一个strlen函数
  //arr是数组,数组传参,传过去的不是整个数组,而是第一个元素的地址
	int len = my_strlen(arr);
	printf("len = %d\n", len);

	return 0;
}

7.递归和迭代

1.求n的阶乘。(不考虑溢出)

int Fac1(int n)
{
	int i = 0;
	int ret = 1;
	for(i=1; i<=n; i++)
	{
		ret *= i;
	}
	return ret;
}

int Fac2(int n)
{
	if(n<=1)
		return 1;
	else
		return n*Fac2(n-1);
}

int main()
{
	//求n的阶乘
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = Fac2(n);//循环的方式
	printf("%d\n", ret);

	return 0;
}

2.求第n个斐波那契数。(不考虑溢出)

斐波那契数列
1 1 2 3 5 8 13 21 34 55 ....


描述第n个斐波那契数的时候
int count = 0;
int Fib(int n)
{
	if(n==3)//测试第3个斐波那契数的计算次数
	{
		count++;
	}
	if(n<=2)
		return 1;
	else
		return Fib(n-1)+Fib(n-2);
}

50
49 48
48 47 47 46
47 46 46 45 46 45 45 44



int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;

	while(n>2)
	{
		c = a+b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT的未来

随着人工智能的快速发展&#xff0c;ChatGPT作为一种自然语言生成模型&#xff0c;在各个领域都展现出了巨大的潜力。它不仅可以用于日常对话、创意助手和知识查询&#xff0c;还可以应用于教育、医疗、商业等各个领域&#xff0c;为人们带来更多便利和创新。 在教育领域&#…

【刷题篇】贪心算法(二)

文章目录 找出工作所需最短时间活动选择无重叠区间 找出工作所需最短时间 某工厂有n个独立的作业&#xff0c;由m台相同的机器进行加工处理。作业i所需的加工时间为ti&#xff0c;任何作业在被处理时不能中断&#xff0c;也不能进行拆分处理。现厂长请你给他写一个程序:算出n个…

LLM 04-大模型的数据

LLM 03-大模型的数据 到目前为止&#xff0c;我们已经讨论了大型语言模型的行为&#xff08;能力和损害&#xff09;。现在&#xff0c;我们要剥开洋葱的第一层&#xff0c;开始讨论这些模型是如何构建的。任何机器学习方法的起点都是训练数据&#xff0c;因此这就是我们开始的…

JDK10特性

文章目录 JAVA10概述语法层次的变化局部变量的类型推断不能使用类型推断的场景变量的声明初始值nulllambda表达式方法引用为数组静态初始化成员变量不能使用其他不可以的场景 API层次的变化集合的copyOf方法 总结 JAVA10概述 2018年3月21日&#xff0c;Oracle官方宣布JAVA10正…

sizeof和strlen求取数组指针之辨析

目录 一维数组中sizeof Vs strlen 整型数组sizeof 字符数组 sizeof strlen 字符串数组 sizeof strlen 字符串的指针char *p sizeof strlen 二维数组中sizeof 今天主要来讲题目主要是数组&指针辨析题和笔试题。&#x1f197;最近心情有点焦虑。大家一定专注…

进阶测试知识之风险基础测试

风险基础测试&#xff08;Risk-Based Testing&#xff09;是一种测试策略&#xff0c;其主要思想是根据产品或系统中各个部分的风险程度来优先进行测试。风险通常是由两个因素决定的&#xff1a;一是问题&#xff08;如缺陷或错误&#xff09;发生的可能性&#xff0c;二是如果…

嵌入式入门教学——模电基础概念

目录 1、模拟信号和模拟电路 2、研究领域 3、常用术语 3.1、共价键 3.2、电场 3.3、温度的电压当量 3.4、动态信号 3.5、直流电流和交流电流 3.6、内阻 3.7、信号频率 3.8、电容 3.9、电感 3.10、相位 3.11、信号失真 3.12、电导 3.13、跨导 3.14、电位 3.15…

【小沐学NLP】AI辅助编程工具汇总

文章目录 1、简介2、国内2.1 aiXcoder2.1.1 工具特点2.1.2 部署方式2.1.3 使用费用2.1.4 代码测试2.1.4.1 代码搜索引擎2.1.4.2 在线体验 2.2 CodeGeeX2.2.1 工具特点2.2.2 部署方式2.2.3 使用费用2.2.4 代码测试 2.3 Alibaba Cloud AI Coding Assistant&#xff08;cosy&#…

PCalc for Mac - 打开科学计算新世界的好用工具

无论您是学生、教师、科学家还是专业计算人员&#xff0c;一款强大而易于使用的科学计算器都是必不可少的工具。现在&#xff0c;我们向您介绍PCalc for Mac&#xff0c;这是一款功能齐全且界面精美的科学计算器&#xff0c;将为您带来卓越的计算体验。 PCalc for Mac是一款专…

第二章 进程与线程 五、线程(概念)

一、定义 &#xff08;1&#xff09;线程是一个基本的CPU执行单元&#xff0c;也是程序执行流的最小单位。 &#xff08;2&#xff09;引入线程后提升了系统的并发度。 &#xff08;3&#xff09;引入线程后&#xff0c;进程只作为除CPU之外的系统资源的分配单元。 二、引入…

POJ 3684 Physics Experiment 弹性碰撞

一、题目大意 我们有N个半径为R厘米的球&#xff0c;固定在距离地面高度为H的管道上&#xff0c;刚开始释放第一个&#xff0c;之后每过一秒释放一个&#xff0c;释放下面的球不会影响到上面的球的高度&#xff0c;忽略一切阻力&#xff0c;认为球之间的碰撞为弹性碰撞&#x…

传统生产者和消费者问题,Sychronized版和Lock版

1.生产者和消费者问题Synchronized版 面试&#xff1a;单例模式、排序算法、生产者消费者、死锁 package com.kuang.pc;/*** 线程之间的通信问题&#xff0c;生产者和消费者问题&#xff01; 等待唤醒 &#xff0c;通知唤醒* 线程交替执行 A B 操作同一个变量 num0* A num1;*…

无涯教程-JavaScript - ASINH函数

描述 ASINH函数返回数字的反双曲正弦值。反双曲正弦是其双曲正弦为number的值,即ASINH(SINH(number))等于number。 语法 ASINH (number)争论 Argument描述Required/OptionalNumberAny real number.Required Notes 如果指定的数字未被识别为数字值,则ASIN返回#VALUE!错误 …

想要精通算法和SQL的成长之路 - 填充书架

想要精通算法和SQL的成长之路 - 填充书架 前言一. 填充书架1.1 优化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 填充书架 原题链接 题目中有一个值得注意的点就是&#xff1a; 需要按照书本顺序摆放。每一层当中&#xff0c;只要厚度不够了&#xff0c;当前层最高…

Chatbase:AI客服聊天机器人工具

【产品介绍】 名称 Chatbase.co 具体描述 Chatbase.co 是一个智能的聊天机器人平台&#xff0c;它可以帮助用户快速地构建、部署和分析用户的聊天机器人&#xff0c;无论 用户是一个初学者还是一个专家。用户可以使用 Chatbase.co …

什么是边缘计算网关?

边缘计算网关&#xff08;简称 边缘网关&#xff09;将云端功能扩展到本地的边缘设备&#xff0c;使边缘设备能够快速自主地响应本地事件&#xff0c;提供低延时、低成本、隐私安全、本地自治的本地计算服务。 同时所有服务都以 Docker 镜像方式安装&#xff0c;真正做到了跨平…

基础算法---离散化

概念 离散化&#xff0c;把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。 通俗的说&#xff0c;离散化是在不改变数据相对大小的条件下&#xff0c;对数据进行相应的缩小。 也就是说当数据空间跨越太大,但是数据的个数却不多,我们可以使用…

Linux命令-文件展示

1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项&#xff0c;表示&#xff1a;all的意思&#xff0c;即列出全部文件&#xff08;包含隐藏的文件/文件夹&#xff09; -l选项…

Linux centos7 bash编程训练

训练编写一段代码&#xff0c;打印输出100之内的明7暗7&#xff0c;同时要求每5个数字打印在一行。 此项训练主要是考察for循环的使用&#xff0c;及条件判断表达式的设置和不同写法的应用。 常用的for循环有四种写法&#xff08;如打印1-100的整数&#xff09;&#xff1a; …

数据优化与可视化:3D开发工具HOOPS在BIM模型轻量化中的作用分析

在建筑和工程领域&#xff0c;BIM&#xff08;建筑信息建模&#xff09;是一种重要的数字化工具&#xff0c;但大型BIM模型往往需要大量的计算资源和存储空间。为了解决这一问题&#xff0c;HOOPS技术成为了一种关键工具&#xff0c;可以帮助实现BIM模型轻量化&#xff0c;提高…