2014-05-20 3 views
0

[SOLVED] Недавно я задал вопрос о некотором коде, который, как я думал, я действительно хорошо понял.Невозможно понять подсчет слов в C

Но после нескольких дней, когда я оглянулся назад для пересмотра, возник новый вопрос из того же фрагмента кода (принятого на языке программирования C C ПРОГРАММИРОВАНИЕМ Второе издание Брайана В. Кернигнана (ISBN-13: 978-8131704943)). ,

Вот код:

#include <stdio.h> 

#define IN 1 
#define OUT 0 

main() 
{ 
    int nw, c, state; 
    state = OUT; 
    nw = 0; 
    while ((c = getchar()) != EOF) 
    { 
     if (c == ' ' || c == '\n' || c == '\t') 
      state = OUT; 
     else if (state == OUT) 
     { 
      state = IN; 
      ++nw; 
     } 
    } 
    printf("%d", nw); 
} 

Так что я сделал некоторые случайные испытания и нашел, что я не мог объяснить или понять:

  1. Почему код не работает, когда у меня есть

    state = OUT после nw = 0

Когда я обычно запускал этот код, он дал мне правильный нет. слов, но, когда я меняю порядок state = OUT and nw = 0, он всегда возвращал ответ, равный 0, почему это так? Я знаю, что порядок важен в C, но почему этот конкретный заказ только ??

2.Что такое значение if-else в строчке вкратце ???

3.Acc. к книге государство вар. было определено, чтобы определить, было ли getchar внутри слова или нет, но я не понимаю, как именно состояние var. Сделай так ??

4. Также, что с автором использует эквивалентность и равенство? Я заметил, что когда он делает условие, он использует эквивалентность, иначе использует равенство, правильно?

Спасибо ...

+4

Я думаю, вы неправильно скопировали код. Строка 'state == OUT;' после 'if (c == ...' должна использовать '=' вместо '=='. – jwodder

+0

Этот вопрос не соответствует теме, так как исправление опечатки решает проблему. –

+1

Извините, опечатка (исправленный сценарий), но мне очень хотелось узнать о скрипте, пожалуйста, не отмечайте это вне темы ......... – ArchKudo

ответ

3

Вот код, который вы размещены с некоторыми комментариями:

#include <stdio.h> 
#define IN 1 // in the code below, whenever you see IN, it's replaced by 1 
#define OUT 0 // same as IN, but for 0 

int main(void) { 
    int nw, c, state; // nw is the number of the words 
    // c stands for the character we get from input and state is the state that are 
    // currently. 

    // init state as OUT 
    state = OUT; 
    // init counter to 0 
    nw = 0; 

    // while user doesn't give EOF 
    while ((c = getchar()) != EOF) { 

    // we found whitespace, newline or tab 
    if (c == ' ' || c == '\n' || c == '\t') 
     state = OUT;       // put state as OUT, 
    // so that we do not count them as words 
    else if (state == OUT) {     // enter here only if state is OUT 
     // Now, we see that we found a letter/number, which means that a word 
     // was typed by the user. 

     // set state as IN, so that we remember that we are eating the characters of 
     // the word given (in the next loops) 
     state = IN; 

     // increase the counter of the words 
     ++nw; 
    } 
    } 

    // print the number of words received by the user 
    printf("%d", nw); 
    return 0; 
} 

Теперь, давайте посмотрим на пример ввода:

sam 
dad 

и конечно, выход (как следует догадываться из комментариев выше):

2

Запустим (интересный) шаг за шагом кода для ввода sam:

// input: "sam" (without the quotes) 

while ((c = getchar()) != EOF) { // eat first character, i.e. 's' 

    /****** 1st execution of the loop ********************/ 

    // 's' is not going into this if 
    if (c == ' ' || c == '\n' || c == '\t') 
    state = OUT; 
    // first time we execute the loop so state is OUT, 
    // thus we enter the loop 
    else if (state == OUT) { 

    // set state as IN 
    state = IN; 

    // increase the counter of the words 
    ++nw; 
    } 

    /****************************************************/ 

    /****** 2nd execution of the loop ********************/ 
    // while loop's getchar() gives as 'a' 

    // 'a' is not going into this if 
    if (c == ' ' || c == '\n' || c == '\t') 
    state = OUT; 
    // state is IN, so we don't go into this loop 
    else if (state == OUT) { 
    state = IN; 
    ++nw; 
    } 

    /****************************************************/ 


    /****** 3rd execution of the loop ********************/ 
    // same as 2nd, but for 'm' 

    /****************************************************/ 


    /****** 4rth execution of the loop ********************/ 
    // while loop's getchar() gives as '\n' 

    // '\n' is going into this if (the c == '\n' is true 
    if (c == ' ' || c == '\n' || c == '\t') 
    state = OUT;    // state sets to OUT 

    // we are not going into this if else, since we already entered the above if! 
    else if (state == OUT) { 
    state = IN; 
    ++nw; 
    } 

    /****************************************************/ 


    /****** 5th execution of the loop ********************/ 
    // while loop's getchar() gives as 'd' (first letter of dad) 

    // 'd' is not going into this if 
    if (c == ' ' || c == '\n' || c == '\t') 
    state = OUT; 
    // state is OUT, so we go into this loop 
    else if (state == OUT) { 
    // set state as IN 
    state = IN; 

    // increase counter 
    ++nw; 
    } 

    /****************************************************/ 

    // and so on :) 
} 

Сначала убедитесь, что вы это понимаете, а затем ответить на ваши собственные вопросы, которые вы сделали. :)

Также мы называем этот код, а не скриптом. Не спешите получать скрипты.

+0

Спасибо, но не могли бы вы рассказать мне, как состояние = в ест из персонажей ??? И я сожалею о том, что вызвал путаницу ... – ArchKudo

+0

@ArchKudo приветствую вас. Для меня нет проблем. :) 'getchar()' - это тот, который ест символы. Когда 'state' является' IN', часть 'else if' не будет выполнена (поскольку это условие будет ложным). Более того, если предположить, что мы читаем письмо в то время, 'state', равный' IN', будет делать так, чтобы он не вводил 'if' или' else if', тем самым пропуская эту букву. Надеюсь, что это поможет, и ответ достаточно хорош для того, чтобы вы его приняли. – gsamaras

+0

Oo, наконец, понял это, так что это больше похоже на то, что он входит в состояние = IN, когда набирается буква, поэтому он перестает считать буквы и снова начинает отсчет, когда выполняется пробел или новая строка ..... Большое вам спасибо .... .. – ArchKudo

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