21天C语言代码训练营(第五天)

作者: 天花板 | 来源:发表于2015-11-26 22:45 被阅读2658次

上一篇中最后留了一个练习题,很多同学都用基本循环的方式解决了问题。我们今天介绍一种通过数据结构中顺序表的思想利用指针来实现这个问题。

1. 题目

10个小朋友围坐一圈分糖果,大家按照顺时针的方向从1报数到99,每次报到几就能领到几个糖果,问最终哪个小朋友分到的糖果最多。请编程实现。

2. 分析

这道题的解法总共分三步:

  • 首先需要有一段内存空间,保存十个小朋友的糖果数
  • 依次遍历这10个空间,按要求进行累加
  • 打印出每个小朋友的糖果数

3. 实现步骤

3.1. 创建内存空间

int main()
{
    int* pBuf = (int*)malloc(10 * sizeof(int));


    free(pBuf);

    return 0;
}

先做这两步,开辟空间用指针pBuf管理,再用free释放这段空间。在C语言中有一个malloc语句就一定要有一个free语句,这叫做代码的对称性。否则将会出现内存泄露。切记这一点。

3.2. 初始化空间

memset(pBuf, 0, 10 * sizeof(int));

这句话将这段内存全部用0填充。

3.3. 循环99次

int main()
{
    int* pBuf = (int*)malloc(10 * sizeof(int));
    int cnt = 0;

    memset(pBuf, 0, 10 * sizeof(int));

    while(++cnt)
    {
        if (cnt > 99)
        {
            break;
        }
    
    }

    free(pBuf);

    return 0;
}

在while循环中,我们用cnt每次自加1次。当cnt>99时,跳出循环。这样操作只是为了控制while循环出我们指定的次数。

3.4. 指针管理

设置一个在这段空间中反复循环遍历的指针

int main()
{
    int* pBuf = (int*)malloc(10 * sizeof(int));
    int* pCur = pBuf;
    int cnt = 0;

    memset(pBuf, 0, 10 * sizeof(int));

    while(++cnt)
    {
        if (cnt > 99)
        {
            break;
        }

        *pCur += cnt;
        pCur++;

        if (pCur - pBuf > 9)
        {
            pCur = pBuf;
        }

    }

    free(pBuf);

    return 0;
}

pCur这个指针负责依次指向每个空间。当pCur和pBuf的距离大于9时,说明pCur已经指向了这段空间的最后一个int空间之后,因此,我们需要让它重新指向这段空间的首部,即pBuf。

3.5. 打印最终结果

把pBuf指针当数组使用。

for (cnt = 0; cnt < 10; cnt++)
{
    printf("Child %2d : %d\n", cnt + 1, pBuf[cnt]);
}

4. 最终代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int* pBuf = (int*)malloc(10 * sizeof(int));
    int* pCur = pBuf;
    int cnt = 0;

    memset(pBuf, 0, 10 * sizeof(int));

    while(++cnt)
    {
        if (cnt > 99)
        {
            break;
        }

        *pCur += cnt;
        pCur++;

        if (pCur - pBuf > 9)
        {
            pCur = pBuf;
        }
    }

    for (cnt = 0; cnt < 10; cnt++)
    {
        printf("Child %2d : %d\n", cnt + 1, pBuf[cnt]);
    }

    free(pBuf);

    return 0;
 }

执行结果如下:

执行结果

大家自己动手实现一下,有任何问题欢迎来询。


练习题

今天出个相对复杂的问题,请用C语言在屏幕上打印出2015年的日历。类似下面这张图:

此图来自网络

这个题拥有一个微型项目的规模了,请大家先自行练习,下一篇中我们详细讲解。

我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。


上一篇:21天C语言代码训练营(第四天)
下一篇:21天C语言代码训练营(第六天)

相关文章

网友评论

  • printfkxm:1 #include <stdio.h>
    2 int main()
    3 {
    4 int m, d, i, b;
    5 int w[7] = { 0 };
    6 d = 0;
    7 i = 3;
    8 b = i;
    9 for (m = 1; m <= 12; m++)
    10 {
    11 printf(" %2d月 2015\n", m);
    12 printf("日 一 二 三 四 五 六\n");
    13 while (b)
    14 {
    15 printf(" ");
    16 b--;
    17 }
    18 for (d = 1; d < 32; d++)
    19 {
    20 w[i] = d;
    21 printf("%2d ", w[i]);
    22 i++;
    23 if (i == 7)
    24 {
    25 i = 0;
    26 printf("\n");
    27 }
    28 if (m == 2 && d == 28)
    29 {
    30 break;
    31 }
    32 if ((m == 4 || m == 6 || m == 9 || m == 11) && d == 30)
    33 {
    34 break;
    35 }
    36 }
    37 b = i;
    38 printf("\n");
    39 printf("\n");
    40 }
    41 return 0;
    42 }
  • GZTommy:10 * sizeof(int) 这不就是分配了40内存空间吗?为什么还要pCur - pBuf > 9 仅仅是大于9那么小啊
    茗聚茶行:@GZTommy 因为这里数据9份就相当于9*4个字节了,因为一开始定义的是int型,如果一开始定义的是char型那么-9就相当于移动9个字节
  • 本慈:居然看懂了,作者牛逼
  • 0db4cb6018c1:/*$n=0;
    for ($p=1; $p <10; $p++) {
    $num=0;
    for ($i=$p; $i < 100; $i=$i+9) {
    $num=$num+$i;
    }
    echo"第".$p."小孩有".$num."个</br>";
    $n=$num+$n;
    这样对么...
  • 2537330f8a14:使用memset 最好加上 #include<string.h> 头文件
  • 289391731944:加油希望更多更好
  • 4e68b59833b0:赞一个

本文标题:21天C语言代码训练营(第五天)

本文链接:https://www.haomeiwen.com/subject/jysdhttx.html