我需要你的帮助。
首先,这不是一个我会得分的练习,它来自一个编程学校,但我只是为了训练而这样做。所以帮助我不会是不道德的。)
我正在尝试做一个练习(称为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中有一些概念,但并不多)。
再次,谢谢大家。
答案 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)
您在我们不了解的任意一组人为约束下工作。
我现在理解的规则是:
while
进行迭代,而不是for
语句stdlib.h:write()
以外的库函数ft_print_comb()
为了尽可能保守(详细!),我假设了以下未明确规定的规则:
if
必须使用大括号(在他们自己的行上)我已经编辑了几次,因为我正在玩它。这个似乎有效,并遵循我目前对规则的理解。
如果您调整循环边界,则原始代码中最内层的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 */ }