C,对于规范来说功能太长了

时间:2014-03-12 15:05:59

标签: c function

我需要你的帮助。

首先,这不是一个我会得分的练习,它来自一个编程学校,但我只是为了训练而这样做。所以帮助我不会是不道德的。)

我正在尝试做一个练习(称为ft_print_comb)。我的功能应该这样做:

$ ./a.exe | cat -e
012, 013, 014, 015, 016, 017, 018, 019, 023, 024, 025, 026, 027, 028, 029, 034, 035, 036, 037, 038, 039, 045, 046, 047, 048, 049, 056, 057, 058, 059, 067, 068, 069, 078, 079, 089, 123, 124, 125, 126, 127, 128, 129, 134, 135, 136, 137, 138, 139, 145, 146, 147, 148, 149, 156, 157, 158, 159, 167, 168, 169, 178, 179, 189, 234, 235, 236, 237, 238, 239, 245, 246, 247, 248, 249, 256, 257, 258, 259, 267, 268, 269, 278, 279, 289, 345, 346, 347, 348, 349, 356, 357, 358, 359, 367, 368, 369, 378, 379, 389, 456, 457, 458, 459, 467, 468, 469, 478, 479, 489, 567, 568, 569, 578, 579, 589, 678, 679, 689, 789
$

基本上它显示了000到999之间的每个数字,如果内部的三个数字的组合尚未出现。例如,没有978,因为7,8和9已经出现在789中。

我写了一些已经有用的东西,看起来像这样:

#include <unistd.h>


void            ft_putchar(char c)
{
    write ( 1, &c, 1);
}

void            ft_print_comb(void)
{
    int     a;
    int     b;
    int     c;

    a = 0;

    while (a < 8)
    {
            b = a + 1;
            while (b < 9)
            {
                    c = b + 1;
                    while (c <= 9)
                    {
                            ft_putchar('0' + a%10);
                            ft_putchar('0' + b%10);
                            ft_putchar('0' + c%10);
                            if (a < 7 || b < 8 || c < 9)
                            {
                                    ft_putchar(',');
                                    ft_putchar(' ');
                            }
                            c++;
                    }
                    b++;
            }
            a++;
    }
    ft_putchar('\n');
}


int             main()
{
    ft_print_comb();
    return(0);
}

但事实是,我有一个非常严格的规范要遵循(Epitech的规范):   - 我不允许使用librairies中的任何函数但写入(并且write将仅用于ft_putchar)(no printf);   - 我不允许使用'for';   - 我不允许写'int a,b,c = 0'或ft_putchar(a,b,c),它必须像我写的那样(意味着每次都在新行上重写ft_putchar) ;   - 我的功能最多必须是25行。   - 我在main中调用的函数必须是void ft_print_comb(void);   - 我最多可以有5个功能。

这就是它。这个练习是在这个学校第一天人们学习C语言的,所以理论上我不需要更多的循环和增量,但我已经尝试了几个小时才有25行功能,我觉得它不属于我的达到。我想在其他函数中划分函数,我将在我的'void ft_print_comb(void)'中调用,但这不是我掌握的东西(我在这里相当新)。

无论如何,谢谢你的帮助和时间,对不起我完美的英语。

(编辑) 我做到了,谢谢你的回答。这就是它的样子:

#include <unistd.h>


void            ft_putchar(char c)
{
    write ( 1, &c, 1);
}

void            ft_printabc(int a, int b, int c)
{
    ft_putchar('0' + a%10);
    ft_putchar('0' + b%10);
    ft_putchar('0' + c%10);
    if (a < 7 || b < 8 || c < 9)
    {
            ft_putchar(',');
            ft_putchar(' ');
    }
}

void            ft_print_comb(void)
{
    int     a;
    int     b;
    int     c;

    a = 0;

    while (a < 8)
    {
            b = a + 1;
            while (b < 9)
            {
                    c = b + 1;
                    while (c <= 9)
                    {
                            ft_printabc(a, b, c);
                            c++;
                    }
                    b++;
            }
            a++;
    }
    ft_putchar('\n');
}


int             main()
{
    ft_print_comb();
    return(0);
}

我不知道你是否理解我被允许这样做,解释这种规范很难用一种不是我母语的语言。在一天结束时,它远没有我们想要的那么复杂,但是你的评论帮助了我很多(让我说我在C中有一些概念,但并不多)。

再次,谢谢大家。

5 个答案:

答案 0 :(得分:6)

通过删除ft_putchar并使用递归辅助函数,我做到了:)

/* 01 */ #include <unistd.h>
/* 02 */
/* 03 */ void ft_helper(int a, int b, int c) {
/* 04 */     if (a == 10) return;
/* 05 */     else if (b == 10) ft_helper(a + 1, a + 2, a + 3);
/* 06 */     else if (c == 10) ft_helper(a, b + 1, b + 2);
/* 07 */     else {
/* 08 */         write(1, ", ", 2);
/* 09 */         write(1, "0123456789" + a, 1);
/* 10 */         write(1, "0123456789" + b, 1);
/* 11 */         write(1, "0123456789" + c, 1);
/* 12 */         ft_helper(a, b, c + 1);
/* 13 */     }
/* 14 */ }
/* 15 */
/* 16 */ void ft_print_comb(void) {
/* 17 */     write(1, "012", 3);
/* 18 */     ft_helper(0, 1, 3);
/* 19 */     write(1, "\n", 1);
/* 20 */ }
/* 21 */
/* 22 */ int main(void) {
/* 23 */     ft_print_comb();
/* 24 */     return 0;
/* 25 */ }
总共25行(计算空行)

答案 1 :(得分:3)

您在我们不了解的任意一组人为约束下工作。

我现在理解的规则是:

  1. 每行可能不会有多个语句
  2. 大括号必须在他们自己的行上
  3. 必须在单独的行上声明和初始化变量
  4. 您必须使用while进行迭代,而不是for语句
  5. 可以调用stdlib.h:write()以外的库函数
  6. 您必须在名为ft_print_comb()
  7. 的函数中实现该功能
  8. 最多可定义5个功能
  9. 任何功能都不得超过25行
  10. 空行计数
  11. 仅包含大括号的行数
  12. 禁止评论(!)
  13. 为了尽可能保守(详细!),我假设了以下未明确规定的规则:

    1. if必须使用大括号(在他们自己的行上)
    2. 我已经编辑了几次,因为我正在玩它。这个似乎有效,并遵循我目前对规则的理解。

      如果您调整循环边界,则原始代码中最内层的if是不必要的。

      我已定义ft_puts(),本地等效于stdio:puts(),并已移除ft_putchar()

      根据 chux 的建议,我删除了数字的单独变量以及从整数到字符的转换。

      void ft_puts(char *s)
      {
          char *p;
          p = s;
          while( *(p++) != '\0' )
              ;
          write(STDOUT_FILENO, s, (p-s));
      }                                              // 8 lines
      
      
      void ft_print_comb(void) 
      {
          char digit[6];                             // ="/--, " breaks Rule 3.
          digit[0] = '0'-1;
          digit[3] = ',';
          digit[4] = ' ';
          digit[5] = '\0';
          while (digit[0]++ < '7') 
          {
              digit[1] = digit[0];
              while (digit[1]++ < '8') 
              {
                  digit[2]=digit[1];
                  while (digit[2]++ < '9') 
                  {
                      if( digit[0]=='7' && digit[1]=='8' && digit[2]=='9' ) 
                      {
                          digit[3] = '\n';
                      }
                      ft_puts(digit);
                  }
              }
          }
      }                                              // 24 lines
      

      如果你完全忽略了愚蠢的规则,你可以在15行中做到相当可读:

      #include <unistd.h>
      int main(void) {
          char digit[6] = "/--, ";
          while (digit[0]++ < '7') {
              digit[1] = digit[0];
              while (digit[1]++ < '8') {
                  digit[2]=digit[1];
                  while (digit[2]++ < '9') {
                      if( digit[0]=='7' && digit[1]=='8' && digit[2]=='9' )
                          digit[3] = '\n';
                      write(STDOUT_FILENO, digit, 5);
                  }
              }
          }
      }
      

答案 2 :(得分:1)

我知道Epitech的声誉。

你能不能拆分这个功能?

#include <unistd.h>


void ft_putchar(char c)
{
    write ( STDOUT_FILENO, &c, 1); /*Magic numbers are evil*/
}

void ft_print_inner(int a, int b, int c)
{
    ft_putchar('0' + a%10);
    ft_putchar('0' + b%10);
    ft_putchar('0' + c%10);
    if (a < 7 || b < 8 || c < 9)
    {
        ft_putchar(',');
        ft_putchar(' ');
    }
}

void ft_print_comb(void)
{
    int     a;
    int     b;
    int     c;

    a = 0;

    while (a < 8);
    {
        b = a + 1;
        while (b < 9)
        {
            c = b + 1;
            while (c <= 9)
            {
                ft_print_inner(a, b, c);
                c++:
            }
            b++;
        }
        a++;
    }
    ft_putchar('\n');
}

答案 3 :(得分:0)

这真的很愚蠢,它可能违反了演习的精神,但是这种单线法律合法吗?

#include <unistd.h>

char *a = "012, 013, 014, 015, 016, 017, 018, 019, 023, 024, 025, 026, 027, 028, 029, 034, 035, 036, 037, 038, 039, 045, 046, 047, 048, 049, 056, 057, 058, 059, 067, 068, 069, 078, 079, 089, 123, 124, 125, 126, 127, 128, 129, 134, 135, 136, 137, 138, 139, 145, 146, 147, 148, 149, 156, 157, 158, 159, 167, 168, 169, 178, 179, 189, 234, 235, 236, 237, 238, 239, 245, 246, 247, 248, 249, 256, 257, 258, 259, 267, 268, 269, 278, 279, 289, 345, 346, 347, 348, 349, 356, 357, 358, 359, 367, 368, 369, 378, 379, 389, 456, 457, 458, 459, 467, 468, 469, 478, 479, 489, 567, 568, 569, 578, 579, 589, 678, 679, 689, 789\n";

void ft_putchar(char c)
{
    write ( 1, &c, 1);
}

void ft_print_comb(void)
{
    while(*a) ft_putchar(*a++);
}

答案 4 :(得分:0)

好的,这是基于我第一次尝试的另一个版本。

总行数:32
空白和#include行:5
main的行:4
ft_putchar的行:3

其余行:32 - 5 - 4 - 3 = 20

ft_helper行:13 ft_print_comb的行:7
&#34;个人&#34;的总行数功能:20

/* 01 */ #include <unistd.h>
/* 02 */
/* 03 */ void ft_putchar(char c) {
/* 04 */     write(1, &c, 1);
/* 05 */ }
/* 06 */
/* 07 */ void ft_helper(int a, int b, int c) {
/* 08 */     if (a == 10) return;
/* 09 */     else if (b == 10) ft_helper(a + 1, a + 2, a + 3);
/* 10 */     else if (c == 10) ft_helper(a, b + 1, b + 2);
/* 11 */     else {
/* 12 */         ft_putchar(',');
/* 13 */         ft_putchar(' ');
/* 14 */         ft_putchar("0123456789"[a]);
/* 15 */         ft_putchar("0123456789"[b]);
/* 16 */         ft_putchar("0123456789"[c]);
/* 17 */         ft_helper(a, b, c + 1);
/* 18 */     }
/* 19 */ }
/* 20 */
/* 21 */ void ft_print_comb(void) {
/* 22 */     ft_putchar('0');
/* 23 */     ft_putchar('1');
/* 24 */     ft_putchar('2');
/* 25 */     ft_helper(0, 1, 3);
/* 26 */     ft_putchar('\n');
/* 27 */ }
/* 28 */
/* 29 */ int main(void) {
/* 30 */     ft_print_comb();
/* 31 */     return 0;
/* 32 */ }