注册 登录
编程论坛 C语言论坛

大佬们看看为什么我输出不对呢?

第五先生 发布于 2020-05-15 13:10, 3508 次点击
【问题描述】用递归打印K型图案
【输入形式】一个正整数
【输出形式】K字型的图案
【样例输入】

  5

【样例输出】

  *********

  *******

  *****

  ***

  *

  ***

  *****

  *******

  *********

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

void  showK(int  n,char  ch){
    int m,i,j;
    for(n;n>=1;n--)
    {
        for(m=1;m<=2*n-1;m++){
            printf("*");
        }
        printf("\n");
    }
    for(i=2;i<=n;i++){
        for(j=1;j<=2*i-1;j++)
        {
            printf("*");
        }
        printf("\n");
    }
}
int    main(){
              int    n;
              scanf("%d",&n);
              showK(n,'*');
              return  0;
}
这是我写的代码,我总是输出上半部分。就像这样
  *********

  *******

  *****

  ***

  *
哪里错了,请大家看一看,谢谢!
13 回复
#2
纯蓝之刃2020-05-15 13:29
程序代码:
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>

void  showK(int  n,char  ch)
{
    int m,i,j;
    for(i=n; i>=1; i--)             //这里使用i或者其他变量,不要更改n的值
    {
        for(m=1; m<=2*i-1; m++)
        {
            printf("*");
        }
        printf("\n");
    }
    for(i=2; i<=n; i++)
    {
        for(j=1; j<=2*i-1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    showK(n,'*');
    return  0;
}
#3
lin51616782020-05-15 13:48
程序代码:
#include <stdio.h>

void print(int n)
{
    n = n * 2 - 1;
    while(n--)
        putchar('*');
    puts("");
}

void showK(int n)
{
    if(n == 1)
    {
        puts("*");
        return;
    }
    print(n);
    showK(n - 1);
    print(n);
}

int main(int argc, char *argv[])
{
    int n;
    scanf("%d", &n);
    showK(n);   
    return 0;
}


[此贴子已经被作者于2020-5-15 15:13编辑过]

#4
第五先生2020-05-15 13:56
回复 2楼 纯蓝之刃
解决了,谢谢
#5
第五先生2020-05-15 13:57
回复 3楼 lin5161678
嗯嗯,好的,谢谢帮助修改。
#6
fulltimelink2020-05-15 14:06
循环减2,单独处理下负数
程序代码:

#define _CRT_SECURE_NO_WARNINGS

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

void  showK(int  n, char  ch) {
    int cols = 2 * n - 1;
    for (int i = cols; i > -cols; i-=2) {
        int c = i > 0 ? i : -i+2;
        for (int j = 0; j < c; j++) putchar('*');
        putchar('\n');
    }
}
int main() {
    int    n;
    scanf("%d", &n);
    showK(n, '*');
    return  0;
}
#7
fulltimelink2020-05-15 14:26
再少一个子循环
程序代码:

#define _CRT_SECURE_NO_WARNINGS

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

void  showK(int  n, char  ch) {
    int cols = 2 * n - 1;
    for (int i = cols; i > -cols; i -= 2) {
        int c = i > 0 ? i : -i + 2;
        printf("%*.*s%c\n", c-1,c-1, "***************************", '*');
    }
}
int main() {
    int    n;
    scanf("%d", &n);
    showK(n, '*');
    return  0;
}
#8
lin51616782020-05-15 15:10
题目要求递归 结果没人看得见吗
#9
fulltimelink2020-05-15 15:32
递归版
程序代码:

#define _CRT_SECURE_NO_WARNINGS

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

void  showK(int  n, char  ch) {
    int curCols = 2 * n - 1;
    int c = curCols > 0 ? curCols : -curCols+2;
    printf("%*.*s%c\n", c - 1, c - 1, "***************************", '*');
    if (curCols != 1) {
        showK(n - 1, ch);
        printf("%*.*s%c\n", c - 1, c - 1, "***************************", '*');
    }
   
}
int main() {
    int    n;
    scanf("%d", &n);
    showK(n, '*');
    return  0;
}


[此贴子已经被作者于2020-5-15 15:42编辑过]

#10
lin51616782020-05-15 15:37
回复 9楼 fulltimelink
参数* 多余的
看不懂你为什么要单独输出一个%c
#11
lin51616782020-05-15 15:38
回复 9楼 fulltimelink
%.*s 就能处理了
#12
fulltimelink2020-05-15 15:44
回复 10楼 lin5161678
按你的那个递归,双向改了一下,
%c那个是因为我第一次学习%*.*的写法,还不熟悉,  学习了!
#13
fulltimelink2020-05-15 16:00
回复 11楼 lin5161678
学习了!
一直在找 strpad类似的方式,因为php printf 是支持的,所以想看下C下printf有没有类似的方式,但是发现当n比较大时,这种处理方式还是有问题!

php -r "printf(\"%'*20s\",'');"

#14
ddc232020-12-24 09:39
1