C программирование: пирамида со звездочками - PullRequest
0 голосов
/ 15 октября 2018

Что я делаю правильно?Я пытаюсь выучить функцию.

Это должно быть похоже на следующий вывод:

   *
  ***
 *****
*******

Мой код:

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

void pyramid (int n)
{
    int width = 0;

    if ( n )
    {
        ++width;
        pyramid( f, n - 1 );

        for ( unsigned int i = 0; i < 2 * n - 1; i++ )
        {
            fprintf( f, "%*c", i == 0 ? width : 1, '*' );
        }

        fputc( '\n', f );
        --width;
    }
}

int main (int argc, char *argv[])
{
    if (argc < 2)
    {
        printf ("usage: h4 <number>\n");
        return 1;
    }
    pyramid (atoi (argv[1]));

    return 0;
}

ВЫХОД:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux

Traceback (most recent call last):
  File "python", line 4
    void pyramid (int n) {
               ^
SyntaxError: invalid syntax

Почему эта проблема?Пожалуйста, помогите мне и объясните.Спасибо.Я глухой начинающий программист.

Ответы [ 4 ]

0 голосов
/ 23 декабря 2018

Я написал гораздо более короткую и простую версию, используя функции форматирования printf

#include <stdio.h>

int main(void) {
    int height = 15;
    char s[2*height-1];
    memset(s,'*',2*height-1);

    for(int i = 0; i<height; ++i)
    {
        printf("%*.*s\n", height+i,2*i+1,s);
    }
    return 0;
}

Вывод

Success #stdin #stdout 0s 9424KB
              *
             ***
            *****
           *******
          *********
         ***********
        *************
       ***************
      *****************
     *******************
    *********************
   ***********************
  *************************
 ***************************
*****************************
0 голосов
/ 15 октября 2018

Не обращая внимания на минуту, как вы, кажется, запускаете его с python, вы рекурсивно вызываете функцию здесь:

pyramid( f, n - 1 );

Однако вы определяете ее только с одним параметром, а не с двумя.

Также, f не определено.

0 голосов
/ 15 октября 2018

Еще один способ приблизиться к выводу пирамиды (по центру) - использовать модификатор width field для вашей printf строки формата для padding чем сам символ заполнения.Затем вы можете просто циклически выводить количество символов, необходимое для каждой строки (которое увеличивается на 2 в каждой строке, например, 1, 3, 5, ...).

Например, принимая количество строк вывода в качестве первого аргумента дляВ вашей программе (или используя 4 по умолчанию, если аргумент не указан), вы можете сделать что-то похожее на следующее:

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

#define FILL '*'

void pyramid (int n)
{
    if (n < 1)              /* validate positive value */
        return;

    int l = 1,              /* initial length of fill chars */
        max = n * 2 - 1,    /* max number of fill chars */
        pad = max / 2;      /* initial padding to center */

    for (int i = 0; i < n; i++) {       /* loop for each line */
        if (pad)                        /* if pad remains */
            printf ("%*s", pad--, " "); /* output pad spaces */
        for (int j = 0; j < l; j++)     /* output fill chars */
            putchar (FILL);
        putchar ('\n');                 /* output newline */
        l += 2;             /* increment fill by 2 */
    }
}

int main (int argc, char **argv) {

    int n = argc > 1 ? (int)strtol (argv[1], NULL, 0) : 4;

    pyramid (n);

    return 0;
}

( примечание: вы можете использовать unsigned введите везде, чтобы обеспечить положительные значения, или вы можете просто подтвердить, что у вас есть положительные значения. Вы должны также включить errno.h и проверить преобразование strtol, хотя оно вернет 0, если не предоставлены цифры)

Это также помогает #define заполнить ваш символ в верхней части кода, так что у вас есть удобное место для изменения, если вам нужен другой символ.Это предотвращает копание в вашей функции для последующего поиска константы.

Пример использования / Вывод

$ ./bin/pyramidtop 1
*

$ ./bin/pyramidtop 5
    *
   ***
  *****
 *******
*********

$ ./bin/pyramidtop 10
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************
0 голосов
/ 15 октября 2018

Ваш файл является файлом C, попробуйте скомпилировать его с gcc, не выполняя его с python


И у вас есть некоторая переменная f, которая не объявлена ​​используемой, выможно исправить это:

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

void pyramid (FILE *f, int n) {
    int width = 0;

    if ( n )
    {
        ++width;
        pyramid(f, n - 1 );

        for ( unsigned int i = 0; i < 2 * n - 1; i++ )
        {
            fprintf( f, "%*c", i == 0 ? width : 1, '*' );
        }

        fputc( '\n', f );

        --width;
    }
}

int main (int argc, char *argv[])
{
    if (argc < 2)
    {
        printf ("usage: h4 <number>\n");
        return 1;
    }
    pyramid (stdout, atoi (argv[1]));

    return 0;
}

Даст

*
***
*****

Ваш код можно обновить, добавив пробелы перед звездами и упростив:

  1. Используйте чистые имена переменных (stars вместо n) 2. Не используйте fprintf, если достаточно простого fputc
  2. Одна переменная используется для подсчета звезд, другая - дляколичество пробелов.

При таком рассмотрении ваш код должен выглядеть следующим образом:

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

/* use clear variable names */
void pyramid (FILE *f, int stars, int spaces) {

    if ( stars>0 )
    {
        pyramid(f, stars -2, spaces + 1  );
        for ( unsigned int i = 0; i < spaces; i++ )
        {
            /* use fputc when enough */
            fputc(' ', f );
        }

        for ( unsigned int i = 0; i < stars; i++ )
        {
            fputc('*', f );
        }

        fputc( '\n', f );

    }
}

int main (int argc, char *argv[])
{
    if (argc < 2)
    {
        printf ("usage: h4 <number>\n");
        return 1;
    }
    pyramid (stdout, atoi (argv[1]), 0);

    return 0;
}

Это дает:

   *
  ***
 *****
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...