【问题标题】:how to make a abc pyrmid如何制作 abc 金字塔
【发布时间】:2021-08-02 14:15:50
【问题描述】:

我写了一个代码,但我不知道如何从这里继续......例如,我想从头到尾构建一个 abc 金字塔(a,aba,abcba..etc)

a
a b a
a b c b a
a b c d c b a 

等等。

这是我的代码,谢谢 :)

void aba(int lines)
{
    //int i = 97;
    char a = 97;
    
    for (int i = 97;i <= lines + 97;i++)
    {
        printf("%c",i);
        for (int j = 97;j <= lines + 97;j++)
        {
            if (j == i)
                break;
            
            printf("%c%c", j,i);
        }

        printf("\n");
    }

void main()
{
aba(3);
}
 

【问题讨论】:

  • 欢迎来到 StackOverflow!当您提出问题并展示您的代码时,您应该描述代码中的哪些内容不起作用或显示它产生的输出,并说明输出中哪些内容不好。它看起来像你得到的一个任务,所以我不会只写答案,你应该自己尝试并获得特定问题的帮助。您可以编辑您的问题以添加更多信息。同时删除 C 或 C# 标记,并保留正确的标记。
  • 您在寻找 c 还是 c# 解决方案?这些语言是不同的
  • ac 解决方案,是的,这是我得到的一个任务.. 我已经为此工作了 4 个小时,但我无法通过.. 我尽了最大的努力,没有比这更好的了。
  • 比什么更好?运行该代码时会发生什么?为什么这是错误的或不足的?无论如何,你怎么称呼它?你需要展示一个完整的例子。
  • 当我添加一个主函数时,函数aba 不会产生预期的输出。请edit 您的问题以创建minimal reproducible example 或添加请求的信息。不要为此目的使用 cmets。在编写代码之前,您应该考虑算法。你必须做什么?第四行输出?它与第三行有何不同?顺便说一句:使用'a' 而不是97 会使您的代码更清晰。

标签: c loops output alphabetical


【解决方案1】:

如果您在解决给定任务时遇到问题,请始终尝试将其拆分为较小的工作:

首先为金字塔的每一行打印一个a

void aba(int lines) {
    for (int i = 0; i < lines; i++) {
        printf("%c\n", a);
    }
}

现在你想要一个金字塔,第一行有一个字符,第二行有 3 个,第三行有 5 个,以此类推。您可以使用(i * 2) + 1 生成此序列:

void aba(int lines) {
    for (int i = 0; i < lines; i++) {
        for (int j = 0; j < (i * 2) + 1 ; j++) {
            printf("%c", a);
        }
        printf("\n");
    }
}

最后一步是增加前半行的字符并减少后半行的字符:

void aba(int lines) {
    for (int i = 0; i < lines; i++) {
        char a = 'a';
        for (int j = 0; j < (i * 2) + 1 ; j++) {
            printf("%c", a);
            if (j <= i - 1)
                a += 1;
            else
                a -= 1;
        }
        printf("\n");
    }
}

【讨论】:

  • 太棒了,我从来没有想过这一点。两件事我没有抓住,如果它表示为一个字符,它是如何作为一个 assci 代码工作的,以及第二个问题:为什么在 if(j
  • 您的char a = 97char a = 'a' 相同。 char a 等于整数 97。没有减号,字符的增加不会在中间之前停止,而是在中间之后停止。第二行将是 abc 而不是 aba
  • 哦,所以它相当于 a++ 而不是 a+=1 ?顺便说一句,这只是前的一半。第二部分是到达 i 的行,输出更改为拉丁字符。我什至不知道他们在 assci 中的代码是什么
  • 是的,如果您的编译器允许,a++ 等于 a+=1。拉丁字符是什么意思?您可以将所有 128 个 ascii 字符放入一个字符中。
  • 那是我不明白的。问题说要制作这个金字塔,当行达到数字“i”时,输出变为拉丁字符。我不知道他是否提到了“我”的 assci 代码……无论如何,非常感谢!应用它:)
【解决方案2】:

因为是作业,我给你一个提示,而不是解决方案:

您应该观察到模式:所有行都以a 开头。

当您以0 开头从上到下计算行时,0 行有一个a0 附加字符。
1a 开头,并有1 更多向上计数字符(b),然后是1 向下计数字符(a)。
2 行以 a 开头,并有更多的 2 向上计数字符 (b c),然后是 2 向下计数字符 (b a)。
...
所以,i 行以 a 开头,有更多的 i 向上计数字符 (b c d ....),然后是 i 向下计数字符 (... c b a)。

现在你必须把它翻译成代码。

void aba(int n)
{
    for (int i = 0; i < n; i++)
    {
        //print here what all lines have in common
        for (int j = 1; j <= i; j++)
        {
            //print the upcounting characters
        }
        for (int j = 1; j <= i; j++)
        {
            //print the downcounting characters
        }
    }
}

【讨论】:

  • 我仍然不知道该怎么做。我试图对第二个循环进行倒计时我的意思是第二个循环将是 j = i 而不是 j>lines ; j——;但它会每行输出一个字符。我必须使用另一个for循环吗?
【解决方案3】:

对于初学者请注意,根据 C 标准,不带参数的函数 main 应声明为

int main( void )

小写字母没有必要连续无间隔。例如,这对于 EBCDIC 表不正确。

这是一个演示程序,展示了如何获得所需的输出。

#include <stdio.h>

int main(void) 
{
    const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    const size_t N = sizeof( alphabet ) - 1;
    
    while ( 1 )
    {
        size_t n = 0;
        
        printf( "Enter a non-negative number not greater than %zu (0 - exit ): ", N );
        
        if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;

        n %= N + 1;
        
        putchar( '\n' );
        
        for ( size_t i = 0; i < n; i++ )
        {
            const char *p = alphabet;
            
            do { printf( "%c ", *p++ ); } while ( p != alphabet + i + 1 );
            
            if ( --p != alphabet )
            {
                do  { printf( "%c ", *--p ); } while ( p != alphabet );
            }               
            
            putchar( '\n' );
        }
        
        putchar( '\n' );
    }
    
    return 0;
}

程序输出可能看起来像

Enter a non-negative number not greater than 26 (0 - exit ): 26

a 
a b a 
a b c b a 
a b c d c b a 
a b c d e d c b a 
a b c d e f e d c b a 
a b c d e f g f e d c b a 
a b c d e f g h g f e d c b a 
a b c d e f g h i h g f e d c b a 
a b c d e f g h i j i h g f e d c b a 
a b c d e f g h i j k j i h g f e d c b a 
a b c d e f g h i j k l k j i h g f e d c b a 
a b c d e f g h i j k l m l k j i h g f e d c b a 
a b c d e f g h i j k l m n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r s r q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r s t s r q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r s t u t s r q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r s t u v u t s r q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r s t u v w v u t s r q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r s t u v w x w v u t s r q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r s t u v w x y x w v u t s r q p o n m l k j i h g f e d c b a 
a b c d e f g h i j k l m n o p q r s t u v w x y z y x w v u t s r q p o n m l k j i h g f e d c b a 

Enter a non-negative number not greater than 26 (0 - exit ): 10

a 
a b a 
a b c b a 
a b c d c b a 
a b c d e d c b a 
a b c d e f e d c b a 
a b c d e f g f e d c b a 
a b c d e f g h g f e d c b a 
a b c d e f g h i h g f e d c b a 
a b c d e f g h i j i h g f e d c b a 

Enter a non-negative number not greater than 26 (0 - exit ): 4

a 
a b a 
a b c b a 
a b c d c b a 

Enter a non-negative number not greater than 26 (0 - exit ): 3

a 
a b a 
a b c b a 

Enter a non-negative number not greater than 26 (0 - exit ): 2

a 
a b a 

Enter a non-negative number not greater than 26 (0 - exit ): 1

a 

Enter a non-negative number not greater than 26 (0 - exit ): 0

程序中输出模式的部分可以放在一个单独的函数中,这样模式就可以在任何文件中输出。

你来了。

#include <stdio.h>

FILE * display_pattern( size_t n, FILE *fp )
{
    static const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    static const size_t N = sizeof( alphabet ) - 1;
    
    n %= N + 1;
    
    for ( size_t i = 0; i < n; i++ )
    {
        const char *p = alphabet;
            
        do { fprintf( fp, "%c ", *p++ ); } while ( p != alphabet + i + 1 );
            
        if ( --p != alphabet )
        {
            do  { fprintf( fp, "%c ", *--p ); } while ( p != alphabet );
        }               
            
        fputc( '\n', fp );
    }
    
    return fp;
}


int main(void) 
{
    while ( 1 )
    {
        size_t n = 0;
        
        printf( "Enter a non-negative number (0 - exit ): " );
        
        if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;
        
        putchar( '\n' );
        
        display_pattern( n, stdout );
        
        putchar( '\n' );
    }
    
    return 0;
}

同样,程序输出可能看起来像

Enter a non-negative number (0 - exit ): 5

a 
a b a 
a b c b a 
a b c d c b a 
a b c d e d c b a 

Enter a non-negative number (0 - exit ): 4

a 
a b a 
a b c b a 
a b c d c b a 

Enter a non-negative number (0 - exit ): 3

a 
a b a 
a b c b a 

Enter a non-negative number (0 - exit ): 2

a 
a b a 

Enter a non-negative number (0 - exit ): 1

a 

Enter a non-negative number (0 - exit ): 0

如果你真的想输出一个金字塔,那么函数可以看起来像下一个演示程序中显示的那样。

#include <stdio.h>

FILE * display_pattern( size_t n, FILE *fp )
{
    static const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    static const size_t N = sizeof( alphabet ) - 1;
    
    n %= N + 1;
    
    for ( size_t i = 0; i < n; i++ )
    {
        const char *p = alphabet;
            
        fprintf( fp, "%*c ", ( int )( 2 * ( n - i) - 1 ), *p++ );           
        while ( p != alphabet + i + 1 ) fprintf( fp, "%c ", *p++ );
            
        if ( --p != alphabet )
        {
            do  { fprintf( fp, "%c ", *--p ); } while ( p != alphabet );
        }               
            
        fputc( '\n', fp );
    }
    
    return fp;
}


int main(void) 
{
    while ( 1 )
    {
        size_t n = 0;
        
        printf( "Enter a non-negative number (0 - exit ): " );
        
        if ( scanf( "%zu", &n ) != 1 || n == 0 ) break;
        
        putchar( '\n' );
        
        display_pattern( n, stdout );
        
        putchar( '\n' );
    }
    
    return 0;
}

现在程序输出可能看起来像

Enter a non-negative number (0 - exit ): 5

        a 
      a b a 
    a b c b a 
  a b c d c b a 
a b c d e d c b a 

Enter a non-negative number (0 - exit ): 4

      a 
    a b a 
  a b c b a 
a b c d c b a 

Enter a non-negative number (0 - exit ): 3

    a 
  a b a 
a b c b a 

Enter a non-negative number (0 - exit ): 2

  a 
a b a 

Enter a non-negative number (0 - exit ): 1

a 

Enter a non-negative number (0 - exit ): 0

【讨论】:

  • 谢谢! ,感谢您抽出时间来写这一切。
猜你喜欢
  • 2023-01-25
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
相关资源
最近更新 更多