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

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

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

目录

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

题目:

代码思路:

代码表示:

第2关:冰雹数:

题目:

代码思路:

代码表示:

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

题目:

代码思路:

代码表示:

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

题目:

代码思路:

代码表示:

第5关:递归实现逆序 :

题目:

代码思路:

代码表示:

第6关:最大公约数

题目:

代码思路:

代码表示:


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

题目:

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

例一:

和为11,则显示:'Round 1: Score:11 Success!' 若和为2、3或12则输了,失败结束,

例二:

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

'Round 1: Score:8 Continue!'

'Next rounds: Score 8:Success, Score 7:Failed, others:Continue'

'Round 2: Score:4 Continue!'

'Round 3: Score:6 Continue!'

'Round 4: Score:9 Continue!'

'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个数)

input a number:Hailstone generated by 77:

77 232 116 58 29 88

44 22 11 34 17 52

26 13 40 20 10 5

16 8 4 2 1

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;
            else
                n = 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关:输出整数中指定位数的数值 :

题目:

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

将求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);
}
  else
   return 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  **********/
}


相关文章
|
2月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
74 23
|
7天前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
12 1
一文彻底搞清楚C语言的函数
|
2月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
82 15
|
2月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
65 24
|
2月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
75 16
|
2月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
43 3
|
2月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
30 2
|
2月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
58 1
|
3月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
80 9
|
3月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
72 6