【发布时间】:2014-03-13 07:04:24
【问题描述】:
我需要你的帮助。
首先,这不是我要评分的练习,它来自编程学校,但我这样做只是为了训练。所以帮助我不会是不道德的:)
我正在尝试做一个练习(称为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 的规范): - 我不允许使用库中的任何函数,但可以写入(并且写入仅用于 ft_putchar)(无 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);
}
我不知道你是否理解我被允许这样做,用一种不是我母语的语言来解释规范是相当困难的。归根结底,它远没有我们想要的复杂,但是您的 cmets 帮助了我很多(假设我在 C 中有一些概念,但不多)。
再次感谢大家。
【问题讨论】:
-
行可以折叠,C不介意:
} c++; } b++; } a++; } ft_putchar('\n'); } int main() { -
是的,但“他们”会。规范也不允许这样做。他们规范的目标是尽可能拥有最易读的代码,因此禁止破坏行。
-
尽管这是我看到的唯一方式,但我必须承认。
-
我认为,如果这个“Epitech 的规范”真的是一个东西,我可以获得比仅仅找到这个问题更好的搜索结果。还有,
while比for好多少? -
我足够好,可以有一个真实的意见,我认为这些规则中的大多数都非常愚蠢。我得到了其中一些的教学价值,但是“没有 cmets”、“空白行计数”、“声明时没有初始化”?这些与良好做法背道而驰。