我想将*输出为数字,并重复输入多次

时间:2018-09-30 08:24:08

标签: c

我在完成下面的代码时遇到问题。

#include <stdio.h>

void triR(void) 
{
    int size, repeat;
    scanf("%d %d", &size, &repeat);
    printf("Hello world\n");

    // ...
    // Complete this function
    // ...

    printf("Bye world\n");
}

Example of function excution

以上三个是输入值。

我认为第一个是数字的最小大小(我不知道为什么如果不输入1也不起作用),中间是数字的最大大小,最后一个是迭代次数的输入值。

查看示例后,我创建了以下代码

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

void triR(void)     
{    
   int size, repeat;    
   int num;    
      scanf("%d %d", &size, &repeat);    
      printf("Hello world\n");            
     for (int b = 0; b < size; ++b) //b = horizontal line, a = number    
     {    
         for (int a = 0; a <= b; ++a)    
        {    
            for (num = 1; num <= a; ++num)     - failed sentences
               {    
                   printf("%d", num);    
               }    
         }    
         printf("\n");    
     }              
    for (int k = size; k > 0 ; --k) //k = horizontal line, i = number     
    {    
        for (int i = 1; i < k; ++i)    
        {    
               {    
                   printf("*");     -Sentences that were successfully run using *
                }    
         }    
             printf("n");    
    }    
    // for (int c =o; )           - sentences tried to make about repeating output value

    printf("Bye world\n");    
    return 0;    
}

我知道我的代码看起来很奇怪。 我没有信心用数字制作该代码,因此我尝试制作它并进行转换。 它成功地用*开头,但是在执行该部分时仍然无法通过数字执行。

没有人寻求帮助,但是即使在周末我一个人,我也无法解决问题。我什至无法将数字转换成重复的输出。即使您能给我一个提示,我也非常感谢。

The above code I created(Failed)

Code with *

2 个答案:

答案 0 :(得分:-1)

我想说的是,即使我管理了一个实现,它肯定也不有效也不实用。我不得不将您的大小变量限制为数字,因为我使用ASCII将数字转换为字符,并且由于它不是标准的,所以无法使用itoa()函数。

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

void triR(void) {
    int size, repeat;
    scanf("%d %d", &size,&repeat);
    printf("Hello world\n");

    // string size of n^2+2n-1
    char* print_string = malloc((size*size+2*size-1)*sizeof(char));
    unsigned int number = 1;
    unsigned int incrementer = 1;
    while (number < size) {
        for (int i = 0; i < number; i++) {
            *(print_string+i+incrementer-1) = 48+number;
        }
        incrementer+=number;
        number++;
        *(print_string+incrementer-1) = '\n';
        incrementer++;

    }
    while (number > 0) {
        for (int i = 0; i < number; i++) {
            *(print_string+i+incrementer-1) = 48+number;
        }
        incrementer+=number;
        number--;
        *(print_string+incrementer-1) = '\n';
        incrementer++;
    }

    for (int i = 0; i < repeat; i++) {
        printf("%s\n", print_string);
    }

    printf("Bye world\n");
    free(print_string);
}    

我分配了一个char *,其大小为size ^ 2 + 2size-1,因为这是换行符和数字字符所需的大​​小。

变量数字和增量器是无符号的,并且从1开始,因为它们不需要低于1。

我在其中放入了两个具有相似代码块的while循环:

    while (number < size) {
        for (int i = 0; i < number; i++) {
            *(print_string+i+incrementer-1) = 48+number;
        }
        incrementer+=number;
        number++;
        *(print_string+incrementer-1) = '\n';
        incrementer++;

    }
    while (number > 0) {
        for (int i = 0; i < number; i++) {
            *(print_string+i+incrementer-1) = 48+number;
        }
        incrementer+=number;
        number--;
        *(print_string+incrementer-1) = '\n';
        incrementer++;
    }

第一个循环达到最大大小,并将字符插入到char *中的位置。完成数字后,它会递增增量器并添加换行符。

第二个循环的次数减少,执行相同的操作,但是这次减少了number变量。这两个变量从1开始,因为那是“金字塔”的开始。

*(print_string+i+incrementer-1) = 48+number;

这里有一个限制,即如果您超过数字9,则输出将输出58的ASCII表示形式,因此,如果要超过9,则需要进行更改。

for循环仅按需要输出最终字符串“重复”次数。不需要printf()函数中的换行符,因为最后一个字符串的末尾包含一个换行符,但我还是把它留了下来。此实现的缺点是您使用的是char *而不是其他一些复杂的方法。

完成操作后,不要忘记释放char *,也不要忘记添加用户输入错误检查。

答案 1 :(得分:-1)

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

void clear(FILE *stream)
{
    int ch;  // read characters from stream till EOF or a newline is reached:
    while ((ch = fgetc(stream)) != EOF && ch != '\n');
}

int main(void)
{
    int min, max, count;
    while (scanf("%d %d %d", &min, &max, &count) != 3 ||  // repeat till all 3 fields read successfully and
        !min || !max || !count || min > max) { // only accept positive numbers as input
        fputs("Input error!\n\n", stderr);     // and make sure that the max is greater than the min
        clear(stdin);  // remove everything from stdin before attempting another read for values
    }

    puts("Hello world\n");

    for (int i = 0; i < count; ++i) {  // output the triangle count times

        for (int row = min; row <= max; ++row) {  // count row from min to max
            for (int n = min; n <= row; ++n)  // print row (row-min) times
                printf("%d ", row);
            putchar('\n');  // add a newline after every row
        }

        for (int row = max - 1; row >= min; --row) {  // count from max-1 to min
            for (int n = min; n <= row; ++n)  // same as above: print row (row-min) times
                printf("%d ", row);
            putchar('\n');  // add a newline after every row
        }

        putchar('\n');  // add a newline between repetitions
    }

    puts("Bye world\n");
}
相关问题