【问题标题】:C programming: A pyramid with asterisksC 编程:带星号的金字塔
【发布时间】:2018-10-15 06:31:39
【问题描述】:

我做对了什么?我正在尝试学习一个功能。

这应该是这样的输出:

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

我的代码:

#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

为什么会出现这个问题?请帮我解释一下。谢谢你。我是聋 C 程序员初学者。

【问题讨论】:

  • 等等...你在这里使用 C 还是 Python?代码看起来是 C,但错误消息似乎来自 Python。
  • 假设您的代码位于名为 prog.c 的文件中,您应该执行 1) 使用 gcc -Wall prog.c -o prog 编译程序和 2) 使用 ./prog 运行程序(注意:但首先您需要修复编译器报告的问题)
  • @Devin Morlan as 4386427 上面提到你必须使用“gcc -Wall prog.c -o prog”编译文件并修复所有错误。
  • 您还需要测试if (n &gt; 0) 而不仅仅是if (n)
  • @DavidC.Rankin,我编译时它们是一样的。

标签: c function printing


【解决方案1】:

另一种输出金字塔(居中)的方法是使用 field width 修饰符作为 printf 格式字符串 作为 padding em> 而不是填充字符本身。然后你可以简单地循环输出每行所需的字符数(每行增加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
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************

【讨论】:

    【解决方案2】:

    暂时不管你是如何使用python 运行它的,你在这里递归调用该函数:

    pyramid( f, n - 1 );
    

    但是,您只定义了一个参数,而不是两个。

    另外,f 未定义。

    【讨论】:

      【解决方案3】:

      你的文件是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;
      }
      

      它给出:

         *
        ***
       *****
      

      【讨论】:

      • 我怎样才能把空间金字塔?
      【解决方案4】:

      我使用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
                    *
                   ***
                  *****
                 *******
                *********
               ***********
              *************
             ***************
            *****************
           *******************
          *********************
         ***********************
        *************************
       ***************************
      *****************************
      

      【讨论】:

        猜你喜欢
        • 2015-03-30
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多