5.14_练习

1、字符串逆序

编写一个函数reverse_string(char* string)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印

要求:不能使用C函数库中的字符串操作函数

比如:

char arr[ ]="abcdef";

逆序之后数组的内容变成:fedcba

第一次代码:

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "abcdef";int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;//左下标//int right =sz-2 ;//右下标,要减去\0的个数,且下标是从0开始的,所以还得减一,所以是减2.int right = strlen(arr) - 1;while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}printf("%s\n", arr);return 0;
}

sizeof计算字符串包含\0;strlen计算字符串不包含\0,且还要包含头文件string.h。

sizeof不可以用在主函数之外;strlen可以用在主函数之外。

写成函数的方式:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
void reverse(char arr[])
{//int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;//左下标//int right =sz-2 ;//右下标,要减去\0的个数,且下标是从0开始的,所以还得减一,所以是减2.int right = strlen(arr) - 1;while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}int main()
{char arr[] = "abcdef";reverse(arr);printf("%s\n", arr);return 0;
}

递归实现:

可以看成拆成两部分,假设是逆序abcdef,首先交换a和f的位置,再逆序bcde,然后再把bcde看成一个字符串,也就是逆序字符串bcde,交换b和e,再把cd看成一个字符串。。。。。。

1、设置一个中间变量tmp,把a传给tmp,f传给a,此时本来应该是把tmp里面的a传给f,但是如果把tmp里面的a传给f,中间的部分bcde就不能看成一个字符串了,因为字符串是以\0结束的,所以,应该是先把\0传给f,那从b开始,看到的bcde\0就是一个字符串了,这个时候从中间开始的字符串就又可以用reverse把它逆序了,把中间的逆序成edcb的时候,再把tmp里面的a拿上来放到这最开始f的地方。

还差个停止递归的条件,其实就是看最后中间字符串的长度。

#include<stdio.h>
#include<string.h>
void reverse(char* str)
{char tmp = *str;//1int len = strlen(str);//字符串长度*str = *(str + len - 1);//str + len - 1这是最后一个字符f的位置  ,2*(str + len - 1) = '\0';//3if(strlen(str+1)>=2)reverse(str + 1);//4*(str + len - 1) = tmp;//最后
}int main()
{char arr[] = "abcdef";reverse(arr);printf("%s\n", arr);return 0;
}

题目中不能使用C函数,这里用了strlen,就自己实现一个。

参考答案:

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;str++;}return count;
}
void reverse(char* str)
{char tmp = *str;//1int len = my_strlen(str);//字符串长度*str = *(str + len - 1);//str + len - 1这是最后一个字符f的位置  ,2*(str + len - 1) = '\0';//3if(strlen(str+1)>=2)reverse(str + 1);//4*(str + len - 1) = tmp;//最后
}int main()
{char arr[] = "abcdef";reverse(arr);printf("%s\n", arr);return 0;
}

如果参数给的多:

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;str++;}return count;
}
void reverse(char arr[], int left, int right)
{char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;if (left+1 < right-1)reverse(arr, left+1 , right-1);
}int main()
{char arr[] = "abcdef";int left = 0;int right = my_strlen(arr) - 1;reverse(arr,left,right);printf("%s\n", arr);return 0;
}

2、计算和

计算一个数的每位之和(递归实现)

写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和。

例如:调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入:1729 ,输出:19

假设输入1234

那DigitSum(1234)的话,这个4很容易得到,那就把4拆出来,先算DigitSum(123)然后再加上4,

然后算DigitSum(12)再加上3加上4,再拆成DigitSum(1)+2+3+4,这个时候1没法拆了,它的每一位数之和就是它自己,

#include<stdio.h>
int DigitSum(unsigned int n)//1234
{if (n > 9)//这个n是两位数return DigitSum(n / 10) + n % 10;  //n/10去掉个位数,n%10就是得到n的个位数elsereturn n;
}
int main()
{unsigned int n = 0;scanf("%u", &n);int sum=DigitSum(n);printf("%d\n", sum);return 0;
}

3、次方

递归实现n的k次方

题目:

编写一个函数实现n的k次方,使用递归实现。

#include<stdio.h>
//Pow(n,k)  ->n*Pow(n,k-1)
//k=0  => n=1
//k>0  => n=Pow(n,k)  ->n*Pow(n,k-1)
//k<0  =>1.0/Pow(n,-k) 
double Pow(int n, int k)
{if (k > 0)return n * Pow(n, k - 1);else if (k == 0)return 1;elsereturn 1.0 / Pow(n, -k);
}
int main()
{int n = 0;int k = 0;scanf("%d%d", &n, &k);double ret=Pow(n,k);printf("%f\n", ret);return 0;
}

4、交换数组

将数组A中的内容和数组B中的内容进行交换。(数组一样大)

#include<stdio.h>
int main()
{int arr1[] = { 1,3,5,7,9 };int arr2[] = { 2,4,6,8,0 };int i = 0;int sz = sizeof(arr1) / sizeof(arr1[0]);for (i = 0; i < sz; i++){int tmp=arr1[i];arr1[i] = arr2[i];arr2[i] = tmp;}for (i = 0; i < sz; i++){printf("%d ", arr1[i]);}printf("\n");for (i = 0; i < sz; i++){printf("%d ", arr2[i]);}return 0;
}

5、数组操作

创建一个整型数组,完成对数组的操作

1、实现函数init(),初始化数组全为0

2、实现print(),打印数组的每一个元素

3、实现reverse(),函数完成数组元素的逆置

要求:自己设计以上函数的参数,返回值

#include<stdio.h>
void init(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){arr[i] = 0;}
}
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
void reverse(int arr[], int sz)
{int left = 0;int right = sz - 1;while (left < right){int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);reverse(arr, sz);print(arr, sz);init(arr,sz);print(arr, sz);return 0;
}

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

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

相关文章

SV-7045VP sip广播网络草坪音箱 室外网络广播POE供电石头音箱

SV-7045VP sip广播网络草坪音箱 室外网络广播POE供电石头音箱 SV-7045VP SIP网络草坪音箱 sip POE石头音箱 描述18123651365 SV-7041VP是深圳锐科达电子有限公司的一款防水网络草坪音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播…

直播用什么领夹麦比较好?多款音质出色的无线领夹麦克风推荐

近年来&#xff0c;随着网络直播、短视频、网课等新兴行业的蓬勃发展&#xff0c;大家对领夹麦克风的需求量也在不断增加&#xff0c;因为一款优质的领夹麦克风不仅方便携带&#xff0c;而且能够带来更清晰、更真实的录音效果&#xff0c;让我们在各种场景下都能获得满意的录音…

代码随想录—— 填充每个节点的下一个右侧节点指针(Leetcode116)

题目链接 层序遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, Node _right, Node _next) {val _val;left _…

Python-VBA函数之旅-zip函数

目录 一、zip函数的常见应用场景 二、zip函数使用注意事项 三、如何用好zip函数&#xff1f; 1、zip函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、zip函数的常见…

Linux day5

su - root 切换到超级管理员模式 sudo 可以让单条语句拥有超级管理员的权限。效果对比如下图 但能这样使用的前提是&#xff0c;要通过root模式下&#xff0c;开启这种功能。方式步骤如下&#xff1a; 1. 进入root模式 2.输入 &#xff1a;用户名 ALL (ALL) NOPASSWD…

php代码审计参考

代码审计思路&#xff1a; 从个人角度出发&#xff0c;如果环境允许的话&#xff0c;可以先选择做一个”程序员“再来做代码审计。因为从开发者的位置去思考问题&#xff0c;可以快速定位问题。学习面向对象编程以及面向过程编程&#xff0c;编写一些 项目提升对代码的理解能力…

JAVA实验项目(一):JAVA面向对象特征性实验

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

从0到1,百亿级任务调度平台的架构与实现

尼恩&#xff1a;百亿级海量任务调度平台起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#x…

如何从集装箱的标准化启发软件的模块化设计?

目录 一、集装箱的历史发展 1、早期设想与萌芽 2、英国铁路初步应用 3、美欧多国发展 4、国际组织推动 5、海运集装箱兴起 6、标准化进程加速 7、联运格局形成 8、后续发展与影响 二、集装箱的标准化意义 三、集装箱的标准化与软件设计的模块化 1、集装箱标准化 2…

Vue的学习 —— <vue事件处理>

前言 事件指的就是用户和网页交互的行为&#xff0c;这些行为&#xff0c;包括&#xff1a;鼠标单击、鼠标双击、键盘按下、抬起等。为了简化开发&#xff0c;Vue为开发者提供了事件修饰符&#xff0c;它可以与v-on配合使用&#xff0c;以便于对事件进行控制和处理&#xff0c…

【回眸】git VS repo 区别

git VS repo 区别 1. git&#xff1a;Git是一个开源的分布式版本控制系统&#xff0c;用以有效、高速的处理从很小到非常大的项目版本管理。 2. Repo: Repo是谷歌用Python脚本写的调用git的一个脚本,Repo实现管理多个git库。 Git 常用命令 1. git init&#xff1a;在当前目…

QT部分学习笔记

文章目录 1.前言注意问题2.学习历程2.0 创建项目 快捷键&#xff1a;2.1 创建按钮2.2 对象树2.3 调试输出2.4 QT坐标系2.5 信号和槽 3.Qmainwindow3.1 窗口菜单栏创建3.2 工具栏3.3 状态栏3.4 铆接部件3.5 对话框 4. 1.前言 版本&#xff1a; 5.9.9 注意问题 Qstring类型通多…