C语言之函数题
目录
1.乘法口诀表
2.交换两个整数
3.函数判断闰年
4.函数判断素数
5.计算斐波那契数
6.递归实现n的k次方
7.计算一个数的每位之和(递归)
8.字符串逆序(递归实现)
9.strlen的模拟(递归实现)
10.求阶乘
11.打印一个数的每一位
12.概念辨析总结tips
今天分享一些练习题🙂🙂,快开学了,烦躁的很。
1.乘法口诀表
2.交换两个整数
3.函数判断闰年
4.函数判断素数
5.计算斐波那契数
6.递归实现n的k次方
7.计算一个数的每位之和(递归实现)
8.字符串逆序(递归实现)
9.strlen的模拟(递归实现)
10.求阶乘
11.打印一个数的每一位
12.使用函数实现数组操作
13.冒泡排序
14.【一维数组】交换数组
1.乘法口诀表
//题目1
//乘法口诀表
//实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。//乘法口诀表
//1*1=1
//2*1=2 2*2=4 ....
//3*1=3 3*2=6 ....
//....
//嵌套循环
//先打印行再打印列//美观
//2d占两个位置,d占一个位置
//-2d是左对齐两个位置
//题目1
#include<stdio.h>
void test(int n)//实现乘法口诀
{int i = 1;int j = 1;for (i = 1; i <= n; i++)//1 2...{for (j = 1; j <= i; j++)//1 2...{printf("%-d*%-d=%-2d ", i, j, i * j);//-2d左对齐两个空位}printf("\n");}
}
int main()
{int n = 0;scanf("%d", &n);//输入一个数字test(n);return 0;
}

2.交换两个整数
//题目2
//交换两个整数
//实现一个函数来交换两个整数的内容。
//传值VS传址
//题目2
//交换两个整数
#include<stdio.h>
void test1(int a, int b)//传值不能改变ab
{int tmp = 0;tmp = a;a = b;b = tmp;
}void test2(int* pa, int* pb)//传值不能改变ab
{int tmp = 0;tmp = *pa;*pa = *pb;*pb = tmp;
}
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);test1(a,b);printf("a=%d b=%d\n", a, b);test2(&a, &b);printf("a=%d b=%d", a, b);return 0;

3.函数判断闰年
//题目3
//函数判断闰年
//实现函数判断year是不是润年。
//能被4整除同时不能被10整除
//或者能被40整除
//题目3
//判断闰年
#include<stdio.h>
int test(int year)
{if (((year % 4 == 0) && (year % 10 != 0 ))|| (year % 40 == 0))return 1;elsereturn 0;
}
int main()
{int year = 0;scanf("%d", &year);int ret=test(year);if (ret == 1)printf("是闰年\n");if (ret == 0)printf("不是闰年\n");return 0;
}

4.函数判断素数
//题目4
//函数判断素数
//实现一个函数is_prime,判断一个数是不是素数。
利用上面实现的is_prime函数,打印100到200之间的素数。//除到sqrt(i)
//奇数
//题目四
//函数判断素数
#include<stdio.h>
#include<math.h>
void is_prime(int i)
{int j = 0;int flag = 0;for (j = 2; j < sqrt(i); j++){if (i % j == 0)//(0==i%j){flag = 1;break;//不是素数} }if (flag == 0)printf("%d ", i);
}
int main()
{int i = 0;for (i = 100; i <= 200; i++)//进入100~200之间的数{is_prime(i);//函数实现}return 0;
}

5.计算斐波那契数
//题目5
//计算斐波那契数
//递归和非递归分别实现求第n个斐波那契数
例如:
输入:5 输出:5
输入:10, 输出:55
输入:2, 输出:1//1 1 2 3 5 8 13 21....
//a b c
// a b c
//题目五
//计算斐波那契数
//递归
//1 1 2 3 5 8 13....
#include<stdio.h>
int test(int n)
{if (n <= 2)return 1;elsereturn test(n - 2) + test(n - 1);
}
int main()
{int n = 0;scanf("%d", &n);int ret = test(n);printf("%d", ret);return 0;
}
//非递归
#include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);//输入查找的数int a = 1;int b = 1;int c = 2;while(n>3){//进入循环c必须是2a = b;b = c;c = a + b;n--;}printf("%d",c);return 0;
}#include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);//输入查找的数int a = 1;int b = 1;int c = 1;//当n<2 输出1while (n > 2){//进入循环c必须是2c = a + b;a = b;b = c;n--;}printf("%d", c);return 0;
}

6.递归实现n的k次方
//题目6
//递归实现n的k次方
//编写一个函数实现n的k次方,使用递归实现。//n的k次方==n*n的k-1次方==n*n*n的k-2次方
//如果k=0无论k是几都输出1
//如果n>0,则return n*test(n,k-1)
//如果n<0,则1/n的k次方也就是。1/n的k次方→转化成正数计算
//题目六
//递归实现n的k次方
#include<stdio.h>
double test(int n, int k)
{if (k == 0)return 1;else if (k > 0)return n * test(n, k - 1);elsereturn 1.0 / test(n, -k);//转化成k>0去计算//return (1.0 / n) * test(1.0 / n, k-1);❌
}
int main()
{int n = 0;int k = 0;scanf("%d %d", &n, &k);double ret=test(n, k);printf("%lf", ret);return 0;
}


7.计算一个数的每位之和(递归)
//题目7
//计算一个数的每位之和(递归)
//写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19
//题目七
//计算一个数的每位之和
#include<stdio.h>
int test(int n)
{if (n <= 9)//个位数return n;elsereturn test(n / 10)+n%10;
}
int main()
{int n = 0;scanf("%d", &n);int ret = test(n);printf("%d", ret);return 0;
}

8.字符串逆序(递归实现)
//题目8
//字符串逆序(递归实现)
//编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = "abcdef";
逆序之后数组的内容变成:fedcba
非递归

//非递归
#include<stdio.h>
void reverse_string(char arr[], int sz)
{int left = 0;int right = sz-2;//易错while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}
int main()
{char arr[] = "abcdef";int sz = sizeof(arr)/sizeof(arr[0]);reverse_string(arr,sz);printf("%s\n", arr);return 0;
}
递归
//递归
#include<stdio.h>
void reverse_string(char s[])
{size_t len = strlen(s);//计算的是\0前面的字符串的长度char tmp = s[0];s[0] = s[len - 1];s[len-1] = '\0';if (strlen(s + 1) >= 2)//需要加上\0,因为把置换right修改成了\0//逆序元素个数必须大于等于2才可以逆序reverse_string(s + 1);s[len - 1] = tmp;}
int main()
{char arr[] = "abcdef"; reverse_string(arr);printf("%s\n", arr);return 0;
}

9.strlen的模拟(递归实现)
//题目9
//strlen的模拟(递归实现)
//递归和非递归分别实现strlen
//题目九
// strlen模拟
// strlen的含义是:求字符串中有效字符的长度,不包括\0。
//递归
#include<stdio.h>
int test(char arr[])
{if (*arr == '\0')//('\0' != *arr)return 0;elsereturn 1 + test(arr+1);
}
int main()
{char arr[] = "abcdef";int ret = test(arr);printf("%d", ret);return 0;
}
// strlen模拟
// strlen的含义是:求字符串中有效字符的长度,不包括\0。
//非递归
#include<stdio.h>
int test(char arr[])
{int count = 0;//while (*arr != '\0')while ('\0'!=*arr){count++;arr++;//arr+1;}return count;
}
int main()
{char arr[] = "abcdef";int ret=test(arr);printf("%d", ret);return 0;
}

10.求阶乘
//题目10
//求阶乘
//递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
//题目十
//求阶乘
//递归
#include<stdio.h>
int test(int n)
{if (n == 1)return 1;elsereturn n * test(n - 1);
}
int main()
{int n = 0;scanf("%d", &n);int ret = test(n);printf("%d", ret);return 0;
}
//非递归
#include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);int i = 0;int ret = 1;for (i = 1; i <= n; i++){ret = ret * i;}printf("%d", ret);return 0;
}

11.打印一个数的每一位
//题目11
//打印一个数的每一位
//递归方式实现打印一个整数的每一位
//题目十一
//打印一个数的每一位
#include<stdio.h>
void test(int n)
{if (n <= 9)printf("%d ", n);else//n>9{test(n / 10);printf("%d ", n%10);}
}
int main()
{int n = 0;scanf("%d", &n);test(n);return 0;
}

12.概念辨析总结tips
- 能把函数处理结果的两个数据返回给主调函数有哪些办法?
- 形参用两个指针
- 形参用数组
- 用两个全局变量_全局变量可以给各个函数直接使用,所以全局变量的控制就比较难,我们建议再自己的代码中尽量减少全局变量的使用
- 注意return不能返回两个数,return只能带回一个数。🆗🆗🆗🆗🆗!
#include<stdio.h>
//指针
void test1(int* pa, int* pb)
{*pa = 4;*pb = 3;
}
//数组
void test2(int arr[5])
{arr[0] = 4;arr[1] = 3;
}
int main()
{int a = 0;int b = 0;int arr[5] = { 0 };test1(&a, &b);test2(arr);printf("a=%d b=%d\n", a, b);printf("arr[0]=%d arr[1]=%d\n", arr[0], arr[1]);return 0;
}
//全局变量
int a = 1;
int b = 2;
int main()
{printf("a=%d b=%d", a, b);
}
- 函数可以传值调用,传值调用的时候形参是实参的一份零临时拷贝。
- 函数可以传址调用,传址调用的时候,可以通过形参操作实参。
- 函数可以嵌套调用,但是不能嵌套定义。
- 函数调用后不一定带回返回值,例如只是想把某部分代码封装起来,避免与其他代码进行交互的过程,所以函数不一定有返回值。
- 实际参数和形式参数可以同名。
- 形参是在函数调用的时候才实例化,才开辟内存空间的。
- 按照传值的方式传递,形参和实参各自有各自的空间,改变形参不能改变外部的实参。
- 按照传址的方式传递,改变形参就是改变实参。
- 函数间的数据传递可以使用全局变量。
- 主调函数和被调函数不一定在同一个函数里。
- 函数的定义可以放在任意位置,函数声明必须放在函数使用之前。
- 函数必须保证先声明在使用。
- 函数声明:告诉编译器函数返回值类型函数名字和函数所需要的参数。
- 函数定义:说明函数是怎么实现的。
- 函数设计应该最求高内聚低耦合。
- 高内聚低耦合:函数体内部实现修改了,尽量不要对外部产生影响,否则:代码不方便维护。
- 尽量少使用全局变量,全局变量每个方法都可以访问,但是很难保证数据的正确性和安全性。
- 函数的参数不易过多。
- 设计函数时,尽量做到谁申请的资源就由谁释放,否则如果交给外部者释放,外部使用者可能不知道或者忘记,就会造成资源泄露。
- 函数的参数可能是变量,也可能是常量,也可能是宏,也可能是指针等等。
- 库函数的使用必须要包含对应的头文件。
- 函数中的形式参数是在栈中保存 (见下面)
函数栈帧的创建与销毁_唐棣棣的博客-CSDN博客
https://blog.csdn.net/m0_74841364/article/details/132018109?spm=1001.2014.3001.5502
- 在一个函数内定义的变量只在本函数范围内有效。
- 在一个函数内复合语句中定义的变量只能在复合语句中使用。
- C语言规定,在一个源程序中,main函数的位置可以任意。
- 存在限制条件,当满足这个限制条件的时候,递归便不在继续。
- 每次递归调用之后越来越接近这个限制条件。
- 递归层次太深,会出现死循环和栈溢出现象。
- 递归解体的思路:
- 将问题转化为其子问题,子问题要与原问题具有相同的解法
- 递归的出口
- 编写函数的方法:TDD_测试驱动开发_test drived development
- 关于指针类型+1
- 关于判断条件反起写
- 数组字符串坐标
- strlen-1 == sz-2 VS strlen == sz-1
关于以上练习题,大家可以动手写一写。🙂🙂🙂
✔✔✔✔✔感谢大家的阅读,若有错误和不足,欢迎指正!
代码----------→【gitee:https://gitee.com/TSQXG】
联系----------→【邮箱:2784139418@qq.com】
相关文章:
C语言之函数题
目录 1.乘法口诀表 2.交换两个整数 3.函数判断闰年 4.函数判断素数 5.计算斐波那契数 6.递归实现n的k次方 7.计算一个数的每位之和(递归) 8.字符串逆序(递归实现) 9.strlen的模拟(递归实现) 10.求…...
SpringBoot的四种handler类型
Controller ReuestMapping 实现Controller接口 使用Component将该类封装成一个Bean 实现HttpRequestHandler 实现RouterFunction...
基于KNN算法的鸢尾花种类预测
导入数据 iris_data load_iris() iris_data.data[0:5, :]array([[5.1, 3.5, 1.4, 0.2],[4.9, 3. , 1.4, 0.2],[4.7, 3.2, 1.3, 0.2],[4.6, 3.1, 1.5, 0.2],[5. , 3.6, 1.4, 0.2]])# 特征值名称 iris_data.feature_names[sepal length (cm),sepal width (cm),petal length (cm…...
英语-面试
自我介绍 hi,my name is tzh,26 years old.I major in software engineering. I participate in the design and development of the social project and e-commerce project. I master java and algorithm. Im familiar with gateway,spring,springboot,springcloud,redis…...
文件传输协议
文章目录 一、FTP1. 定义2. 端口3. 数据传输方式主动方式被动方式 二、TFTP三、常用命令 首先可以看下思维导图,以便更好的理解接下来的内容。 一、FTP 1. 定义 文件传输协议(FTP)是一种用于在客户端和服务器之间进行文件传输的标准网络协…...
Llama-2大模型本地部署研究与应用测试
最近在研究自然语言处理过程中,正好接触到大模型,特别是在年初chatgpt引来的一大波AIGC热潮以来,一直都想着如何利用大模型帮助企业的各项业务工作,比如智能检索、方案设计、智能推荐、智能客服、代码设计等等,总得感觉…...
白嫖idea
白嫖idea 地址 https://www.jetbrains.com/toolbox-app/...
PyCharm切换虚拟环境
PyCharm切换虚拟环境 为了满足不同任务需要不同版本的包,可以在Anaconda或者Miniconda创建多个虚拟环境文件夹,并在PyCharm下切换虚拟环境。 解决方案 1、打开Ananconda Prompt 2、创建自己的虚拟环境 格式:conda create -n 虚拟环境名字…...
自动化运维工具-----Ansible入门详解
目录 一.Ansible简介 什么是Ansible? Ansible的特点 Ansible的架构 二.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程 三.Ansible配置解析 ansible的安装方式 ansible的程序结构(yum安装为例) ansibl…...
一、Mycat2介绍与下载安装
第一章 入门概述 1.1 是什么 Mycat 是数据库中间件。 1、数据库中间件 中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟 通。 例子:Tomcat,web中间件。 数据库中间件:连接java应用程序和数据库…...
链表的介绍
链表是一种常用的数据结构,它可以动态地添加、删除、查找和遍历元素。链表由多个节点组成,每个节点包括一个数据项和一个指向下一个节点的指针。这种数据结构可以高效地插入和删除元素,但相对于数组来说,查找元素的效率较低。 插…...
深度剖析:数据服务API的安全性与隐私保护
随着互联网技术的飞速发展,数据服务API已经成为了企业和个人获取、处理和分析数据的重要工具。然而,数据服务API的安全问题也日益凸显,尤其是在用户隐私保护方面。本文将深入剖析数据服务API的安全性与隐私保护问题,并结合产品FDL…...
MediaPlayer音频与视频的播放介绍
作者:向阳逐梦 Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频。 它支持三种不同的媒体来源…...
【Terraform学习】Terraform模块基础操作(Terraform模块)
本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…...
改进的KMeans 点云聚类算法 根据体元中的点数量计算点密度,并获取前K个点密度最大的体元作为初始聚类中心(附 matlab 代码)
KMeans函数的主要逻辑如下: 使用InitCenter函数初始化聚类中心,该函数根据体元密度选择初始聚类中心。该函数的输入参数包括数据(data)、聚类中心数量(centerNum)和体元数量(voxelNum)。根据点云的取值范围计算包围盒的体积(V)和体元边长(d)。根据体元边长将点云数…...
php user.ini详解
0x00 前言 本篇主要是讲解分析一下user.ini相关的内容。因为这个知识点涉及到文件上传的绕过 0x01 正文 .user.ini 文件是PHP的配置文件,用于自定义PHP的配置选项。该文件通常位于PHP安装目录的根目录下,或者在特定的网站目录下。 .user.ini 文件是一…...
用 PHP 和 JavaScript 显示地球卫星照片
向日葵 8 号气象卫星是日本宇宙航空研究开发机构设计制造的向日葵系列卫星之一,重约 3500 公斤,设计寿命 15 年以上。该卫星于 2014 年 10 月 7 日由 H2A 火箭搭载发射成功,主要用于监测暴雨云团、台风动向以及持续喷发活动的火山等防灾领域。…...
Ubantu安装mongodb,开启远程访问和认证
最近因为项目原因需要在阿里云服务器上部署MongoDB,操作系统为Ubuntu,网上查阅了一些资料,特此记录一下步骤。 1.运行apt-get install mongodb命令安装MongoDB服务(如果提示找不到该package,说明apt-get的资源库版本比…...
高手速成|数据库脚本生成工具
高手速成|数据库脚本生成工具 文章目录 高手速成|数据库脚本生成工具前言1、软件的安装及使用2、建立新工程3、创建Conceptual Data Model(概念数据模型)4、将E-R图转化为其他数据库模型5、导出DBMS代码(Sql执行脚本)6、执行sql脚…...
振动国标2009GB/T 19873.2-2009/ISO 13373-2:2005笔记
国标原文 1.时域,要求,采样率大于最高频率10倍(最低频率?) 2.频域,要求采样率大于最高频率2倍。 3.3.2 积分和微分,二次积分。 3.3.3 均方根。 3.4 滤波 4.1 奈奎斯特图、极坐标图、坎贝尔…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...
Vue.js教学第二十一章:vue实战项目二,个人博客搭建
基于 Vue 的个人博客网站搭建 摘要: 随着前端技术的不断发展,Vue 作为一种轻量级、高效的前端框架,为个人博客网站的搭建提供了极大的便利。本文详细介绍了基于 Vue 搭建个人博客网站的全过程,包括项目背景、技术选型、项目架构设计、功能模块实现、性能优化与测试等方面。…...
迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命
一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中,每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战: 效率瓶颈:工人每小时仅能处理200-300件,且存在间歇性疲劳安全隐患:20kg以上重箱搬运导致年…...
