2013-11-24 3 views
3

Я работал, хотя некоторые проблемы начинаются с класса CS5 в Гарварде. У меня возникла проблема с тем, чтобы работать правильно, но мне было интересно, может ли быть более чистый или лучший способ заставить программу работать.Начало программы C

Цель программы - напечатать выровненную справа пирамиду, состоящую из хэш-тегов и пробелов. Любое руководство в отношении стиля или трюков было бы очень желанным.

/* Creating the mario program, whose goal is to create a 
* pyramid by accepting input from the user to get the 
* height then aligning the pyrimid to the right. 
* 
*/ 

#include <stdio.h> 
#include <cs50.h> 

int main(void) 
{ 

    // get user input and set to variable 
    printf("Height: "); 
    int height = GetInt(); 

    int i, j, k; 
    for(i = 1 ; i < height; i++) 
    { 

     // create n-1 spaces 
     for(k = (height - 2); k > (i-1); k--) 
     { 
      printf("%c", ' ');  
     } 

     // create n+1 hash tags 
     for(j = 0; j < (i+1); j++) 
     { 
      printf("#"); 
     } 

     printf("\n"); 
    } 
    return 0; 
} 
+5

Спросите себя, что вы имеете в виду, чище/лучше? Что делает эту программу грязной/плохой, на ваш взгляд. –

+0

В дополнение к комментарию от @PreetSangha, мой совет заключался бы в том, чтобы не слишком зацикливаться на чистоте/эффективности вашего кода, когда вы только начинаете. Ваше желание аккуратного кода будет автоматически развиваться по мере написания более сложных программ, но программирование в конечном итоге связано с написанием рабочих и полезных программ. Оптимизация и эффективность - это то, что нам нужно, поскольку наши программы становятся более сложными и интенсивными в ресурсах. – hammus

+1

@leemo Оптимизация и эффективность, но удобство чтения и основные передовые методы - это не так. –

ответ

2

Я предполагаю, что вы уборщиком вы подразумеваете «шипучий и изысканный».

Это выглядит Spiffy мне:

#include <stdio.h> 
#include <cs50.h> 

int main(void) { 
    // get user input and set to variable 
    printf("Height: "); 
    int height = GetInt(); 
    int hm2 = height - 2; 

    int j, k; 
    for(int i = 1 ; i < height; i++) { 
     // create n-1 spaces 
     for(k = hm2; k > (i-1); k--) 
      printf("%c", ' ');  

     // create n+1 hash tags 
     for(j = 0; j < (i+1); j++) 
      printf("#"); 

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

Однако, не слишком догнал в создании вашего кода фантазии. Хотя это хорошо, если вы работаете с другими, или на самом деле. Ваш пример выглядел отлично.

оптимизация -поиск, о чем беспокоиться. Просто помните, что слишком большая оптимизация может потенциально нарушить вашу программу.

+0

Но это не будет печатать * чище и лучше * [пирамида] (http: // ideone.com/pmoYvY) :) – haccks

+2

Не так важно, но я думаю, что удаление фигурных скобок в обеих внутренних циклах является склонным к ошибкам. – MByD

+0

Я думаю, мне нравится создавать переменную за пределами цикла for немного больше, возможно, немного очищает читаемость. Но я думаю, что я понимаю аргумент, что есть много способов обмануть этого кота. – bruin51

1

Я думаю, что с помощью более чистого и лучшего способа вы имеете в виду идеальную форму прямоугольной треугольной пирамиды.
Для этого вы должны сделать, как
Изменить

printf("Height: "); 

в

printf("Height: \n\n"); 

и

for(i = 1 ; i < height; i++) 

в

for(i = 0 ; i < height; i++) 

И посмотреть sample output.

+0

Ах да! Я думаю, вы правы. меня беспокоило, что для создания пространств я должен был иметь как «(высота -2)», так и «(i-1)». Казалось немного лишним – bruin51

2

Для рассмотрения каждого: это то, что «все в стиле и не читаемость» выглядит :)

i = 0; 
while (i++ < height*height) 
    printf ("%c%s", (i-1)/height < height-(i-1)%height-1 ? ' ' : '#', 
    i % height ? "" : "\n"); 

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


(позже) когда-нибудь чуть-чуть более аккуратно, чтобы поставить i++ в конце, так что два раза (i-1) получает обменены на несколько более сложный тест конца-строки:

i = 0; 
do 
    printf ("%c%s", i/height < height-i%height-1 ? ' ' : '#', 
    i % height==height-1 ? "\n" : ""); 
while (++i < height*height); 
0

Вот предложение:

#include <stdio.h> 
#include <cs50.h> 

int main(void) { 
    //initialize variables 
    int height, hm2, j, k, i; 

    printf("Height: \n"); 
    // Get user input 
    height = GetInt(); 
    hm2 = height - 1; 
    for(i = 0; i < height; i++) { 
     // create n spaces 
     for(k = hm2; k > i; k--) 
      printf("%c", ' ');  

     // create n+1 hash tags 
     for(j = 0; j < i+1; j++) 
      printf("#"); 

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

Результат, если пользователь ввел 5 для высоты:

Height: 
    # 
    ## 
    ### 
#### 
##### 

Пару вещей я считал эту версию кода:

-В C, это хорошая практика, чтобы объявить все переменные отдельно от предоставления им значения и присвоить значения позже. Некоторые компиляторы могут вызвать эту ошибку, если вы хотите объявить и присвоить значение в цикле for: «error:» для «начальных объявлений цикла» разрешено только в режиме C99 ». Эти изменения рассматриваются с учетом того, что я предоставил.

//initialize variables                
int height, hm2, j, k, i; 

-I добавил строку здесь

printf("Height: \n"); 

-Instead из HM2 = высота - 2 я изменил его:

hm2 = height - 1; 

-Первые петли, теперь мы даем ıA значение и установите его на 0, чтобы выполнить другие изменения, которые были сделаны:

for(i = 0; i < height; i++) { 

-для цикла создания русских пространств Я изменил его:

for(k = hm2; k > i; k--) 

-Наконец снятой скобки (нет необходимости в данном случае) в последнем цикл:

for(j = 0; j < i+1; j++) 

Приветствий

Смежные вопросы