2015-02-20 2 views
1

Im работая на факультативной задаче теста обзора для введения в класс C, и мне нужно иметь программу, которая выводит следующее на основании того, что когда-либо номер пользователь входит:Программирование перевернутой пирамиды с

Enter a number: 5 
    5 
    44 
    333 
    2222 
11111 
000000 
11111 
    2222 
    333 
    44 
    5 

до сих пор это код, который я написал

#include <stdio.h> 
int main(void){ 
    int row,column,space; 
    int number; 

    printf("Enter a number: "); 
    scanf_s("%d",&number); 

    for (row = 1; row <= number + 1; row++){ 
    for (space = number; space >=row; space--){ 
     printf(" "); 
    } 
    for(column = 1;column <= row; column++){ 
     printf("%d",space); 
    } 
    printf("\n"); 
    } 
    for (row = 1; row <=number;row++){ 
    for(space = 1;space <= row;space++){ 
     printf(" "); 
    } 
    for(column = number;column >=row;column--){ 
     printf("%d",space); 
    } 
    printf("\n"); 
    } 
    return 0; 
} 

Это выход, который я получаю

Enter a number: 5 
    0 
    11 
    222 
    3333 
44444 
555555 
22222 
    3333 
    444 
    55 
    6 

Я потратил немало часов, пытаясь понять, как напечатать верхнюю половину полуфинала, используя введенные пользователем цифры, но я не могу понять это. Может ли кто-нибудь указать мне в правильном направлении?

ответ

2

Ваши номера просто прочь немного, исправить printf звонки, и вы сделали:

Первый один:

printf("%d", number - space); 

Второй один:

printf("%d", space - 1); 

Немного лучше (более читаемым и более логичным) будет использовать вместо этого другие переменные:

Первый один:

printf("%d", number + 1 - row); 

Второй один:

printf("%d", row); 

Также обратите внимание, что некоторые основные математике может помочь вам реализовать следующее:

  • Общее количество строк: 2 * number + 1
  • Количество пробелов: 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5 =>abs(number - row) (Если вы начинаете свои строки с 0)
  • Номер для печати: То же, что "Число пространств"
  • Количество кол-во: 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1 =>6 - number_of_spaces

Это дает гораздо более чистый, более читаемый вариант только с одной петлей:

#include <stdio.h> 
#include <math.h> 

int main(void){ 
    int row,column,space; 
    int number; 

    printf("Enter a number: "); 
    scanf_s("%d",&number); 

    for (row = 0; row <= number * 2; row++){ 
    int number_of_spaces = abs(number - row); 
    int number_to_print = number_of_spaces; 
    int number_count = 6 - number_of_spaces; 
    for (space = 1; space <= number_of_spaces; space++){ 
     printf(" "); 
    } 
    for(column = 1;column <= number_count; column++){ 
     printf("%d", number_to_print); 
    } 
    printf("\n"); 
    } 
    } 
    return 0; 
} 
+0

использовать номер + 1 вместо 6 –

+0

Спасибо, @nh_, исправлено. – schnaader

2

Чтобы расширить на ответ schnaader (который прекрасно подходит и полная), вы можете улучшить ваш код еще больше, позволяя printf() сделать интервал для вас вместо выполнения цикла и нескольких вызовов printf():

printf("%*s", width, ""); 

Здесь width заменен на расчетное пространство, которое вы хотите заполнить. Точность * является специальным заполнителем, который сообщает функции принимать фактическую точность/длину из списка параметров. Поскольку строка для печати пуста, она всегда заполняет весь диапазон символами пробела.

+0

Ах, ладно, спасибо за эту информацию, мы пока не рассмотрели строки или указатели. Вот почему я использовал петли. – Christopher

0

Есть множество способов, я только изменил свой код

#include <stdio.h> 
int main(void){ 
    int row,column,space; 
    int number; 

    printf("Enter a number: "); 
    scanf("%d",&number); 

    for (row = 1; row <= number + 1; row++){ 
     for (space = number; space >=row; space--){ 
      printf(" "); 
     } 
     for(column = 1;column <= row; column++){ 
      printf("%d",number -space); //change1 
     } 
     printf("\n"); 
    } 
    for (row = 1; row <=number;row++){ 
     for(space = 0;space < row;space++){ //change 2 
      printf(" "); 
     } 
     for(column = number;column >=row;column--){ 
      printf("%d",space); 
     } 
     printf("\n"); 
    } 
    return 0; 
} 
0
for (row = 0; row <= number + number; row++) { 
    int t = row * (row <= number) + (number + number - row) * (row > number); 
    printf("%*c", number - t, ' '); 
    printf("%*d\n", t + 1, t); 
} 
0
the following code outputs the first half of the problem. 
Notice the checking for errors in the call to scanf() 
It compiles cleanly and works correctly 
I leave it to you to complete the function for the second half of the output 
which should be easy now that you have the first half 

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

int main() 
{ 
    int row; 
    int i; // loop counter/index 
    int n; // user input 

    printf("\nEnter the wedge width: "); 
    if(1 != scanf(" %d", &n)) 
    { // then, scanf failed 
     perror("scanf failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, scanf successful 

    for(row = 0; row <= n; row++) 
    { 
     // print n-row ' ' 
     for(i=0; i<(n-row); i++) 
     { 
      printf(" "); 
     } 

     // print row+1 '(n-row)' 
     for(i=0; i<(row+1); i++) 
     { 
      printf("%1d", (n-row)); 
     } 
     printf("\n"); 
    } 

    // reverse the calculations to print the lower half 
    return 0; 
} // end function: main 
Смежные вопросы