c# C编程模式打印以下模式

vd2z7a6w  于 2023-05-05  发布在  C#
关注(0)|答案(3)|浏览(242)

我试着打印下面的图案,但我只能从一面减少字母,而不是从两面
请大家帮帮我:来打印这个图案

这是我使用的代码:

#include <stdio.h>
#include <string.h>

int main() {
   char str[] = "Programming";
   int len = strlen(str);

   for (int i = 0; i < len; i++) {
      for (int j = i; j<len; j++) {
              printf("%c", str[j]);
      }
      printf("\n");
   }

   return 0;
}
hkmswyz6

hkmswyz61#

有几个逻辑错误。
首先,外部for循环

for (int i = 0; i < len; i++) {

指定了错误的迭代次数。根据循环,迭代次数等于len。然而,实际上迭代次数应该等于( len + 1 ) / 2
其次是内部for循环

for (int j = i; j<len; j++) {
          printf("%c", str[j]);
  }

输出的字符最大值为len,而len在内部for循环后每次都应减少。
您可以编写一个单独的函数,例如

#include <stdio.h>
#include <string.h>

void print_pattern( const char *s )
{
    for (const char *first = s, *last = s + strlen( s ); first < last; ++first, --last )
    {
        printf( "%.*s\n", ( int )( last - first ), first );
    }
}

int main( void )
{
    const char *s = "Programming";

    print_pattern( s );
}

程序输出为

Programming
rogrammin
ogrammi
gramm
ram
a

如果传入的字符串的长度适合int类型的对象,则该函数将工作。否则,您可以使用嵌套的for循环,类似于嵌套的for循环,如

void print_pattern( const char *s )
{
    for (const char *first = s, *last = s + strlen( s ); first < last; ++first, --last )
    {
        for (const char *current = first; current != last; ++current)
        {
            putchar( *current );
        }
        putchar( '\n' );
    }
}

简而言之,你的for循环应该看起来像下面这样

for ( size_t i = 0, n = strlen( str ); i < n; i++, n-- )
{
    for ( size_t j = i; j < n; j++ )
    {
        putchar( str[j] );
    }
    putchar( '\n' );
}
tvz2xvvm

tvz2xvvm2#

KISS Principle解决方案具有运行速度快和易于一次性读取的优点:

#include <stdio.h>
#include <string.h>

int main (void)
{
  char str[] = "Programming";
  int len = strlen(str);

  for (int i = 0; str[i]!='\0'; i++) 
  {
    puts(&str[i]);
    str[len-i-1] = '\0';
  }
}

首先复制str,以防需要保留数据。

pcww981p

pcww981p3#

我的解决方案与Vlad的类似,但使用了%*.*s,而不仅仅是%.*s

#include <stdio.h>
#include <string.h>

int main(void) {
    char txt[] = "Programming";
    int len = strlen(txt);
    
    for(int i=0; i<=len/2; ++i)
    {
        printf("%*.*s\n", len-2*i, len-2*i, txt+i);
    }
    return 0;
}

相关问题