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 奈奎斯特图、极坐标图、坎贝尔…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
