2014-10-31 2 views
3

Я очень новичок в программировании в целом, поэтому, пожалуйста, несите мою нехватку знаний.Что это за последние строки кода, выполняемые в упражнении 1-13 языка программирования C & R?

Я провел пару часов в упражнении 1-13. Наконец я решил найти ответ, который я нашел по этой ссылке https://github.com/ccpalettes/the-c-programming-language-second-edition-solutions/blob/master/Chapter1/Exercise%201-13/word_length.c.

Поскольку я не хотел полностью копировать его ради изучения, я попытался понять код, а затем переделать его. (Это привело к почти полной копии, но я понимаю, это лучше, чем я бы в противном случае.)

Это то, что я до сих пор:

#include <stdio.h> 

#define IN 1 
#define OUT 0 
#define LARGEST 10 

main() 
{ 
    int c, state, l, i, j; 
    int length[LARGEST + 1]; 

    for (i = 0; i <= LARGEST; ++i) 
    length[i] = 0; 

    state = OUT; 

    while ((c = getchar()) != EOF) { 
     if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 
      if (state == OUT) { 
       l = 0; 
       state = IN; 
      } 
     ++l; 
     } 
     else 
      if (state == IN) { 
       if (l <= LARGEST) 
        ++length[l - 1]; 
        //minus 1 because the nth term of an array is actually array[n-1] 
       else //if (l > LARGEST) 
        ++length[LARGEST]; 
       state = OUT; 
      } 
      if (c == EOF) 
       break; 
    } 

    for (i = 0; i <= LARGEST; ++i) { 
     if (i != LARGEST) //because array[10] refers to the 11th spot 
      printf("\t %2d |", i + 1); //plus one because 1st is array [0] 
      //this actually results in 1-10 because the 0-9 plus one makes the highest 10 
     else 
      printf("\t>%2d |", LARGEST); 
     for (j = 0; j < length[i]; ++j) 
      putchar('x'); 
     putchar('\n'); 
    } 


    return 0; 
} 

Пожалуйста, игнорируйте мои комментарии. Они были предназначены для меня, чтобы я мог объяснить программу себе.

Я имею два вопроса, которые я просто не могу понять, и они меня с ума:

  1. Выход всегда приходится на одно слово меньше, чем на входе, что означает «мое имя не боб»приводит:

    ... 
    2 |xx 
    3 |x 
    4 |x 
    ... 
    
  2. Кроме того, я не понимаю, что происходит в конце программы. В частности, я не понимаю, почему здесь переменная j используется:

    for (j = 0; j < length[i]; ++j) 
        putchar('x'); 
    

Большое спасибо за вашу помощь, и мне очень жаль, если это слишком начинающему для сообщества.

+3

Для вашего вопроса # 2 это то, что печатает 'x' и' xx' в вашем примере вывода. Это не сложно понять - посмотрите, что говорит 'putchar()' output ('x'), и посмотрите на свой вывод, чтобы увидеть, где появляется' x'. На вопрос №1 вы пытались использовать отладчик для выполнения кода, чтобы узнать, что он делает, и где это происходит неправильно? –

+3

Для вопроса # 1 - в качестве альтернативы использованию отладчика попробуйте добавить дополнительные инструкции 'printf' для регистрации состояния переменных в разных точках вашего кода. Затем вы можете сравнить результат с ожиданием того, как код должен работать. Это может быть чрезвычайно эффективным инструментом для отладки кода. – James

+3

'j' - простой целочисленный счетчик, который повторяется от' 0 до 'length [i]' раз, увеличивая ('++ j') каждый раз через цикл. Это основной синтаксис цикла for. На первом проходе 'j == 0', на следующем проходе' j == 1', на следующем проходе 'j == 2' и т. Д. До' j == length [i] ', при котором точка останавливается. Просмотрите свои уроки по циклам, особенно 'for'. –

ответ

1

Ну, пытаясь суммировать все ответы, так как вопрос не закрыт. Во-первых, нам нужно исправить основной() линия:

int main(void) { 
    ... 
    return 0; 
    } 

INT необходимо, потому что возвращает значение в конце функции, а пустота означает, что функция Безразлично Нет никаких аргументов.

  1. Я скопировал ваш код и выполнил его на своей машине (Ubuntu 12.04), и он отлично работал. Не могли бы вы привести несколько примеров для генерации ошибки?

  2. Как все говорили, j - это просто переменная, проходящая через вектор. длина [i] - вектор, который содержит в каждой позиции i количество слов длиной i. Например, если позиция 3 имеет значение 4, например. длина [3] = 4, то это означает, что существуют 4 слова с длиной 3.

Наконец, если позволите, я хотел бы дать вам совет. Хорошая практика выбора значимых имен для ваших переменных. Код, который вы связали here, помог мне понять, что должна делать программа. Переменные имена такие, длина или определение IN, OUT или LARGEST слишком расплывчаты.

Надеюсь, что это все ответы до сих пор и помогло вам еще больше.