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);❌//因为这里会-k-1会跳转到k>0,就不是(1/n)了
}
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

  • 能把函数处理结果的两个数据返回给主调函数有哪些办法?
  1. 形参用两个指针
  2. 形参用数组
  3. 用两个全局变量_全局变量可以给各个函数直接使用,所以全局变量的控制就比较难,我们建议再自己的代码中尽量减少全局变量的使用
  4. 注意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博客icon-default.png?t=N7T8https://blog.csdn.net/m0_74841364/article/details/132018109?spm=1001.2014.3001.5502

  • 在一个函数内定义的变量只在本函数范围内有效。
  • 在一个函数内复合语句中定义的变量只能在复合语句中使用。
  • C语言规定,在一个源程序中,main函数的位置可以任意。
  • 存在限制条件,当满足这个限制条件的时候,递归便不在继续。
  • 每次递归调用之后越来越接近这个限制条件。
  • 递归层次太深,会出现死循环和栈溢出现象。
  • 递归解体的思路:
  1. 将问题转化为其子问题,子问题要与原问题具有相同的解法
  2. 递归的出口
  • 编写函数的方法:TDD_测试驱动开发_test drived development
  • 关于指针类型+1
  • 关于判断条件反起写
  • 数组字符串坐标
  • strlen-1 == sz-2 VS strlen == sz-1

关于以上练习题,大家可以动手写一写。🙂🙂🙂

✔✔✔✔✔感谢大家的阅读,若有错误和不足,欢迎指正!

代码----------→【gitee:https://gitee.com/TSQXG】

联系----------→【邮箱:2784139418@qq.com】

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

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

相关文章

微力同步私人网盘部署教程:利用端口映射实现远程访问的解决方案

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其…

六、Kafka-Eagle监控

目录 6.1 MySQL 环境准备6.2 Kafka 环境准备6.3 Kafka-Eagle 安装 6.1 MySQL 环境准备 Kafka-Eagle 的安装依赖于 MySQL&#xff0c;MySQL 主要用来存储可视化展示的数据 6.2 Kafka 环境准备 修改/opt/module/kafka/bin/kafka-server-start.sh 命令 vim bin/kafka-server-sta…

IDEA打开一个项目时,idea左侧project模式下,不显示项目工程目录的解决方法

在IDEA打开一个一个已有的项目chapter3时&#xff0c;idea左侧project模式下&#xff0c;左侧也没有project按钮&#xff0c;如下问题截图&#xff1a;&#xff08;ps:项目结构可以显示&#xff0c;但是src等目录不见&#xff09; 在网上查了一些方法&#xff1a; 1、解决办法…

结构化日志记录增强网络安全性

日志是一种宝贵的资产&#xff0c;在监视和分析应用程序或组织的 IT 基础结构的整体安全状况和性能方面发挥着至关重要的作用。它们提供系统事件、用户活动、网络流量和应用程序行为的详细记录&#xff0c;从而深入了解潜在威胁或未经授权的访问尝试。虽然组织历来依赖于传统的…

混合动力汽车耐久测试

一 背景 整车厂可通过发动机和电机驱动的结合为多款车型提供混合动力驱动技术。汽车集成电机驱动可大大减少二氧化碳的排放&#xff0c;不仅如此&#xff0c;全电动驱动或混合动力驱动的汽车还将使用户体验到更好的驾驶感受&#xff0c;且这种汽车可通过电动机来实现更快的加速…

本地启动若依微服务版本

前置工作&#xff1a; 1.导入sql文件 2.安装完nacos 3.安装完redis 启动步骤&#xff1a; 1.开启nacos&#xff0c;在bin目录下 startup.cmd -m standalone 注意&#xff1a;在这之前要配置nacos持久化&#xff0c;修改conf/application.properties文件&#xff0c;增加支持…

抽象轻松的C语言

#include <stdio.h> /* 预处理指令*/ /* 函数 */ int main() {int log 3.14;printf("hello word * %d\n easy", log);getchar();/* 获取键盘输入的字母&#xff0c;在这个程序中的作用是防止程序瞬间关闭 */return 0; } 上一篇说过&#xff0c;C程序是C语言的…

Ansible学习笔记7

user模块&#xff1a; user模块用于管理用户账户和用户属性。 如果是windows要换一个win_user模块。 创建用户&#xff1a;present&#xff1a; [rootlocalhost ~]# ansible group1 -m user -a "nameaaa statepresent" 192.168.17.106 | CHANGED > {"ansi…

【数据分享】2006-2021年我国省份级别的燃气相关指标(免费获取\20多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况&#xff0c;在之前的文章中&#xff0c;我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国省份级别的市政设施水平相关指标、2006-2021年我国省份级别的各类建设用地面积数…

【包过滤防火墙——iptables静态防火墙】的简单使用

文章目录 规则链的分类--五链处理的动作iptables常用参数和作用 防火墙就是堵和通的作用 iptables &#xff1a;包过滤防火墙&#xff0c;是内核防火墙netfilter的管理工具 核心&#xff1a;四表五链 规则链的分类–五链 在进行路由选择前处理的数据包&#xff1a;PREROUTIN…

校园用电安全管理系统可以识别违规电器吗

校园用电安全管理系统是处理恶意用电问题有效手段之一&#xff0c;系统具有实时监测、异常预警、监测设备运行状态、远程控制用电等功能&#xff0c;可以从根本上管理学校用电量&#xff0c;制定合理的用电计划&#xff0c;限制用电成本&#xff0c;避免各种恶意用电行为&#…

基于ssm+vue汽车售票网站源码和论文

基于ssmvue汽车售票网站源码和论文088 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让…

Android RecyclerView 之 吸顶效果

前言 上一篇文章已经实现了列表跟宫格布局的动态切换&#xff0c;这篇文章主要来说通过 CoordinatorLayout 和 AppbarLayout 的配合&#xff0c;以及 NestedScrollView 来实现吸顶效果 。效果如下。 一、CoordinatorLayout 是什么&#xff1f; CoordinatorLayout 是 Androi…

plumelog介绍与应用-一个简单易用的java分布式日志系统

官方文档&#xff1a;http://www.plumelog.com/zh-cn/docs/FASTSTART.html 简介 无代码入侵的分布式日志系统&#xff0c;基于log4j、log4j2、logback搜集日志&#xff0c;设置链路ID&#xff0c;方便查询关联日志基于elasticsearch作为查询引擎高吞吐&#xff0c;查询效率高全…

漏洞修复:在应用程序中发现不必要的 Http 响应头

描述 blablabla描述&#xff0c;一般是在返回的响应表头中出现了Server键值对&#xff0c;那我们要做的就是移除它&#xff0c;解决方案中提供了nginx的解决方案 解决方案 第一种解决方案 当前解决方案会隐藏nginx的版本号&#xff0c;但还是会返回nginx字样&#xff0c;如…

分页功能实现

大家好 , 我是苏麟 , 今天聊一聊分页功能 . Page分页构造器是mybatisplus包中的一个分页类 . Page分页 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</ver…

Centos误删系统自带python2.7,yum报错恢复方法

使用wget分别下载python以及yum的rpm包 资源地址如下&#xff1a; http://vault.centos.org mkdir /usr/local/src/pythoncd /usr/local/src/pythonwget http://vault.centos.org/7.6.1810/os/x86_64/Packages/python-backports-1.0-8.el7.x86_64.rpmwget ht…

【C++历险记】面向对象|菱形继承及菱形虚拟继承

个人主页&#xff1a;兜里有颗棉花糖&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

Go 官方标准编译器中所做的优化

本文是对#102 Go 官方标准编译器中实现的优化集锦汇总[1] 内容的记录与总结. 优化1-4: 字符串和字节切片之间的转化 1.紧跟range关键字的 从字符串到字节切片的转换&#xff1b; package mainimport ( "fmt" "strings" "testing")var cs10086 s…

解决 .csv 文件上传到 pgsql 的字符报错问题

目录 背景问题解决办法 背景 上传 .csv 文件进行数据导入到 pg 时&#xff0c;报错显示如下&#xff1a; ods.tbl_inp_fee_detail.csv数据上传失败 报错信息:org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Where: C…