头歌c语言实训项目-函数(2)

news/2024/5/21 0:35:49/文章来源:https://blog.csdn.net/weixin_73295475/article/details/129500149

 (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录

第1关:模拟投掷骰子游戏:

题目:

代码思路:

代码表示:

第2关:冰雹数: 

题目:

代码思路:

代码表示:

第3关:输出整数中指定位数的数值 :

题目:

代码思路:

代码表示:

第4关:递归实现标准库函数strlen(s) 

题目:

代码思路:

代码表示:

第5关:递归实现逆序 :

题目:

代码思路:

代码表示:

第6关:最大公约数 

题目:

代码思路:

代码表示:


第1关:模拟投掷骰子游戏:

题目:

本关任务:模拟掷双骰子游戏,游戏规则:每轮投两次骰子,取两次的和,第一轮若和为711则获胜,游戏结束。

  • 例一:

和为11,则显示:'Round 1: Score:11 Success!' 若和为2312则输了,失败结束,

  • 例二:

和为12,则显示:'Round 1: Score:12 Failed!' 若和为其他数字,则将第一轮两次骰子点数的和(假定为8)作为自己的点数,继续第二轮,第三轮,……,直到某轮两次骰子点数的和等于该点数(第一轮两次投掷点数和)则获胜,若中间某轮两次投掷骰子点数的和为7,则输掉游戏。对应显示:

  1. 'Round 1: Score:8 Continue!'
  2. 'Next rounds: Score 8:Success, Score 7:Failed, others:Continue'
  3. 'Round 2: Score:4 Continue!'
  4. 'Round 3: Score:6 Continue!'
  5. 'Round 4: Score:9 Continue!'
  6. 'Round 5: Score:7 Failed!'

测试输入:

1 

预期输出:

Round 1: Score:7 Success!

测试输入:

18

预期输出:

  1. 'Round 1: Score:8 Continue!'
  2. 'Next rounds: Score 8:Success, Score 7:Failed, others:Continue'
  3. 'Round 2: Score:4 Continue!'
  4. 'Round 3: Score:6 Continue!'
  5. 'Round 4: Score:9 Continue!'
  6. 'Round 5: Score:7 Failed!'

代码思路:

关于rand():
首先我们须了解:
①rand()函数包含在<stdlib.h>中。
②rand()函数定义:int rand(void);
②rand()函数产生的随机数范围为0-0x7fff,即0-32767。(事实上根据编译器的不同范围也会不同,但都为0~RAND_MAX )
注意:虽然rand()可以产生随机数,但每次的随机数值都是一样的,这个时候我们就需要srand()设置随机函数种子来使每一次的随机数都不同
 

关于srand():
首先我们须了解:
①srand()函数包含在<stdlib.h>中。
②srand()函数定义 : void srand (unsigned int seed);
③在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。
 

本题的随机函数种子已经给出:参数randSeed为随机数种子。所以我们可以直接用srand(randSeed)表示。而抛骰子游戏要求每一次的随机数在1~6之间,所以我们可以用rand()%6+1实现。在实现完随机数的设定后,后面的代码只需要根据题意编程即可

代码表示:

#include<time.h>
#include<stdio.h>
#include<stdlib.h>
/***在下面Begin至End间,按原型 void diceGame(int randSeed) 定义函数***/
/********** Begin **********/
void diceGame(int randSeed)
{srand(randSeed);int x, y, z, i;x = rand();x = x % 6 + 1;y = rand();y = y % 6 + 1;z = x + y;if (z == 7 || z == 11) printf("Round 1:  Score:%d  Success!", z);else if (z == 2 || z == 3 || z == 12) printf("Round 1:  Score:%d  Failed!", z);else{printf("Round 1:  Score:%d  Continue!\n", z);printf("Next rounds: Score %d:Success, Score 7:Failed, others:Continue\n", z);int a, b, c;for (i = 2; i < 10; i++){a = rand();a = a % 6 + 1;b = rand();b = b % 6 + 1;c = a + b;if (c != z && c != 7) printf("Round %d:  Score:%d  Continue!\n", i, c);else if (c == z){printf("Round %d:  Score:%d  Success!\n", i, c);break;}else if (c == 7){printf("Round %d:  Score:7  Failed!", i);break;}}}
}

第2关:冰雹数: 

题目:

本关任务(习题5.11):n0​是一个给定的正整数,对于i=0,1,2...,定义:

(1)若ni​是偶数,则ni+1​=ni​/2

(2)若ni​是奇数,则ni+1​=3ni​+1

(3)若ni​1,则序列结束。

用该方法产生的数称为冰雹(hailstone)

编写产生一些冰雹的程序,程序应该用函数void hailstone(int n);计算冰雹并显示由n产生的序列

测试输入:77 //输入为给定的整数

预期输出:(每个冰雹数占5位宽,一行输出6个数)

  1. input a number:Hailstone generated by 77:
  2. 77 232 116 58 29 88
  3. 44 22 11 34 17 52
  4. 26 13 40 20 10 5
  5. 16 8 4 2 1
  6. Number of hailstone generated:23

代码思路:

本题我的思路是先用while循环将冰雹数全部列出,当n==1时break跳出循环,每行6个数只需要用for循环即可,换行的话在每次for循环以后输出\n即可,唯一的难点就是当1是第六个数时for循环会自动跳出,导致1可能无法打印出来,所以我在for循环后面又加了两层if语句来避免这种情况。

代码表示:

#include <stdio.h>
//请根据主程序流程,补全此函数
//冰雹产生并输出函数
//注意:输出每个冰雹数时,请按5位对齐输出
void hailstone(int n)
{printf("Hailstone generated by %d:\n", n);/**********  Begin **********/int count = 0;while (n){int i;for (i = 0; i < 6; i++){if (n == 1)break;printf("%5d", n);if (n % 2 == 0)n = n / 2;elsen = 3 * n + 1;count++;}if (n == 1){if (i == 6){printf("\n");}printf("%5d\n", n);count++;break;}printf("\n");}printf("Number of hailstone generated:%d", count);
}

第3关:输出整数中指定位数的数值 :

题目:

本关任务:输入整数nk,输出n中从右端开始的第k个数字的值(k1开始)。

将求n中右端第k个数字定义成函数digit(n,k),如果k超过了n的位数,则函数返回-1;否则返回n中第k个数字。

例如:

digit(345876,4)=5

digit(345,4)=-1

测试输入:345876 4 //输入的是n = 345876 , k = 4

预期输出:5

代码思路:

这题我的思路就是用while循环得出n的位数,然后与k比较,如果k>b就返回-1,k<b就打印出对应的值,这里有一个细节就是当n在0~9之间时需要额外考虑,因为0~9之间while循环无法得出其位数(困惑了我好久o(╥﹏╥)o)。

代码表示:


#include <stdio.h>
#include<string.h>
//请根据step3_main.cpp中的主函数流程,补全此函数
int digit(long n, int k)
{/**********  Begin  **********/int b = 0;int a = 0;int c = n;if (n < 10 & n >= 0 & k == 1){return n;}while (c){c = c / 10;b++;}if (k > b)return -1;else{for (int i = 1; i < k; i++){n = n / 10;}}a = n % 10;return a;/**********  End  **********/
}

第4关:递归实现标准库函数strlen(s) 

题目:

本关任务:用递归实现标准库函数strlen(s)

测试输入:husterNB!

预期输出:9

代码思路:

题目要求我们用递归的思路,我们可以用if语句判断s的首元素地址是否存在,存在就b++,然后通过递归判断第二个元素是否存在,存在就继续加一,一直循环下去,直到字符串的位置不存在时,表明该字符串已经结束,则返回之前递归循环得到的b的值(这里的b我设的是全局变量,防止在递归过程中b的值一直被刷新)

代码表示:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>//请根据step4_main.c中主函数流程
//使用递归的方法补全此函数
int b = 0;
int  mystrlen(char *s)
{/**********  Begin  **********/if(*s)
{b++;mystrlen(s+1);
}elsereturn b;/**********  End  **********/
}

第5关:递归实现逆序 :

题目:

本关任务:将输入的一行字符逆序输出。

例如,输入string,则输出gnirts。将逆序输出用递归函数实现。

测试输入:

string

预期输出:

gnirts

代码思路:

这题我使用scanf(“%c”)的形式,每次读取一个字符,然后用if判断该字符串是否结束,然后利用递归将字符串从后往前一次打印出来。

代码表示:

#include<stdio.h>
void myrever(void)
{/**********  Begin  **********/char a;scanf("%c", &a);if (a != '\n'){myrever();printf("%c", a);}/**********  End  **********/
}

第6关:最大公约数 

题目:

本关任务:用辗转相除法计算两个数的最大公约数,要求用递归函数实现求最大公约数。

测试输入:

24 16

预期输出:

24 16

16 8

8 0

8

代码思路:

辗转相除法法求最大公约数:


给定两个数,求这两个数的最大公约数

欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。

例如:假如需要求 100 和18 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
100 / 18 = 5 (余 10)
18 / 10= 1(余8)
10 / 8 = 1(余2)
8 / 2 = 4 (余0)
至此,最大公约数为2
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 100 和 18 的最大公约数2。

关于最大公因数求法,我在之前博客里有讲到(http://t.csdn.cn/63j7w),至于为什么要加入新的变量i,并用静态变量修饰,是为了打印出第一次计算时的初始数24,16(题目要求打印出每一次的计算过程,我在这方面被困了好久o(╥﹏╥)o)

代码表示:


#include<stdio.h>
/**按任务要求补全该函数用递归实现辗转相除法**/
int gcd(int x, int  y)
{/**********  Begin  **********/static int i = 0;if (i == 0){printf("%d %d\n", x, y);}if (y == 0){return x;}else{int r = x % y;printf("%d %d\n", y, r);i++;return gcd(y, r);}/**********  End  **********/
}

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

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

相关文章

20230322英语学习

Why Are So Many Gen Z-Ers Drawn to Old Digital Cameras? 老式数码相机&#xff1a;Z世代的复古潮流 The latest digital cameras boast ever-higher resolutions, better performance in low light, smart focusing and shake reduction – and they’re built right into …

牛客C/C++刷题笔记(五)

122、对于"int *pa[5]&#xff1b;"的描述中&#xff0c;&#xff08; &#xff09;是正确的。 123、以下叙述中正确的是&#xff08;&#xff09; C语言的源程序中对缩进没有要求,所以A选项错误。C语言中区分大小写,main函数不能写成Main或_main,所以B选项错误。一…

声声不息,新“声”报到

魅力声音大家庭总群&#xff08;10&#xff09;大玲&#xff0c;刚见到新来的四川孩儿——樱桃&#xff0c;真是太可爱了&#xff01;可不就是&#xff0c;这孩儿真是招人稀罕&#xff0c;我现在就把她拉到咱大群里“大玲” 邀请 “樱桃” 加入群聊所有人 咱们大家庭迎来了第一…

【字符串】刷题

P4173残缺的字符串心得&#xff1a;这道题&#xff0c;我觉得是不难的&#xff0c;代码逻辑很清晰&#xff0c;但是提交就是有问题最后发现两个问题&#xff1a;scanf输入字符后要用getchar() 吞回车 !!!!&#xff08;天坑用 scanf 输入时&#xff0c;不管输入什么&#xff0c;…

C语言小程序:通讯录(静态版)

哈喽各位老铁们&#xff0c;今天给大家带来一期通讯录的静态版本的实现&#xff0c;何为静态版本后面会做解释&#xff0c;话不多说&#xff0c;直接开始&#xff01;关于通讯录&#xff0c;其实也就是类似于我们手机上的通讯录一样&#xff0c;有着各种各样的功能&#xff0c;…

30天从零到1创业螺旋式

趁梦想还在&#xff0c;想去的地方&#xff0c;现在就去&#xff1b;想做的事情&#xff0c;现在就做。一开始立刻启动的你的项目&#xff0c;安排好时间计划&#xff0c;拆分微模块&#xff0c;每天花20分钟去完善产品&#xff0c;去改变世界。可以为自己的创意设置临时办公室…

RK3588平台开发系列讲解(显示篇)DP显示调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看 connector 状态二、强制使能/禁⽤ DP三、DPCP 读写四、Type-C 接口 Debug五、查看 DP 寄存器六、查看 VOP 状态七、查看当前显示时钟八、调整 DRM log 等级沉淀、分享、成长,让自己和他人都能有所收获!😄…

【数据结构】链队列的C语言实现

队列 1.队列的概念 队列 和栈一样&#xff0c;是一个 特殊的线性表。 队列只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。进行 插入操作 的一端称为 队尾&#xff0c;进行 删除操作 的一端称为队头。 队列中的元素遵守 先进先出(First I…

【类的继承与派生的知识点】

文章目录类的继承与派生的知识点类的继承与派生&#xff1a;类成员的访问&#xff1a;类型兼容规则&#xff1a;一个公有派生类的对象在使用上可以被当成基类的对象&#xff0c;反之不行单继承与多继承派生类的构造与析构类成员的标识与访问类的继承与派生的实验结果类型兼容规…

Baumer工业相机堡盟相机如何使用Sharpening图像锐化功能( Sharpening图像锐化功能的优点和行业应用)(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

【计算机网络】如何解决TCP粘包问题?

【计算机网络】如何解决TCP粘包问题&#xff1f; 文章目录【计算机网络】如何解决TCP粘包问题&#xff1f;如何理解字节流&#xff1f;如何解决粘包&#xff1f;固定长度的消息特殊字符作为边界自定义消息结构如何理解字节流&#xff1f; 之所以会说 TCP 是面向字节流的协议&a…

RK3588编译环境Ubuntu20.04编译配置-增加交换内存

迅为提供的编译环境 Ubuntu20.04 默认配置了交换内存是 9G&#xff0c;如果在编译过程中&#xff0c;因内 存不够而编译报错&#xff0c;可以参考本小节进行设置。 这里举例分配 5G 交换内存。 在开始之前&#xff0c;使用命令检查一下您的 ubuntu 的 swap 分区。 sudo swa…

Android进阶面经,面试10余家经验分享,拿到offer真不难~

前言 我们都知道面试大厂主要就是考察程序员技术方向的专业技能&#xff0c;Java开发主要考察的就是Java方面的专业技能&#xff0c;而Android岗位的 专业技能 就是Android程序员面试的重要考察方向。 大厂的招聘条件是明牌的&#xff0c;但技术这一块却难倒了大部分的人。 面…

蓝桥杯刷题冲刺 | 倒计时18天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录0.知识点1.乳草的入侵今天写 搜索题 0.知识点 DFS 设计步骤 确定该题目的状态&#xff08;包括边…

服务器boa移植

服务器boa移植 文章目录服务器boa移植1.下载boa2.解压3.安装词法解析器4.修改源码5. 编译、创建配置文件6.修改配置文件boa.conf7.运行测试1.下载boa Boa Webserver http://www.boa.org/ 2.解压 tar -xf boa-0.94.13.tar.gz3.安装词法解析器 sudo apt-get install bisonsud…

我们为什么不能忽视业务只讲数据治理?_光点科技

数据治理是一项重要的业务实践&#xff0c;可以帮助组织更好地管理和利用数据。然而&#xff0c;一些企业错误地将数据治理视为一项独立的技术实践&#xff0c;而忽略了业务需求。那么&#xff0c;为什么不能忽视业务&#xff0c;只讲数据治理呢&#xff1f;首先&#xff0c;数…

网络基础知识和常用命令

IP、子网掩码、网关、DNS、端口号网络的基本概念客户端:应用 C/S&#xff08;客户端/服务器&#xff09; B/S&#xff08;浏览器/服务器&#xff09;服务器&#xff1a;为客户端提供服务、数据、资源的机器请求&#xff1a;客户端向服务器索取数据响应&#xff1a;服务器对客户…

H2数据库

H2是一个用Java开发的嵌入式数据库&#xff0c;它本身只是一个类库&#xff0c;可以直接嵌入到应用项目中。 H2简介 H2是一个Java编写的关系型数据库&#xff0c;它可以被嵌入Java应用程序中使用&#xff0c;或者作为一个单独的数据库服务器运行。 H2数据库的前身是 Hypersoni…

线段树SegmentTree

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349;&#x1f95d; 什么是线段树&#xff0c;它能解决什么样的问题&#xff1f; 文章目录&#x1f36d;问题引入&#x1f95d;线段…

代码随想录|day21|二叉树part07 ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 链接&#xff1a;代码随想录 需要领悟一下二叉树遍历上双指针操作&#xff0c;优先掌握递归 第一次做&#xff0c;理解错误&#xff0c;认为只需要以节点为单位&#xff0c;认为由于是二叉搜索树&#xff0c;所以中序遍历一定是一个连续的有序序列…