Может кто-нибудь выяснить, почему моя программа (в C) для разделения предложения на слово не работает? - PullRequest
0 голосов
/ 25 октября 2018

Я написал два кода для разбиения предложений на слова, один из которых работал, а другой - нет.Разница только в условии if в цикле for.Первый не дал никакого выхода.В то время как второй дает ожидаемый результат.Пожалуйста, объясните логически, не учите законы ДеМоргана.Я просто применил свою логику в обоих из них, что я думаю, также правильно в первом коде.

НЕ РАБОТАЕТ ОДИН:

  #include <stdio.h>
  void main(void){
  int i=0, m=0, n=0, j, l=0;
  char sen[500], wrd[500][500];

  printf("Input a sentence:\n");
  gets(sen);

  while(sen[i]!='\0'){
  l++;
  i++;
  }

  for(i=0;i<=l;i++){
    if(sen[i] != ' '||sen[i] != '\0'){    //Here is the difference.
        wrd[m][n]=sen[i];
        n++;
    }
    else{
        wrd[m][n]='\0';
        puts(wrd[m]);
        printf("\n");
        m++;
        n=0;
    }
    }
}

РАБОТАЕТ ОДИН:

 #include <stdio.h>
 void main(void){
 int i=0, m=0, n=0, j, l=0;
 char sen[500], wrd[500][500];

 printf("Input a sentence:\n");
 gets(sen);

 while(sen[i]!='\0'){
 l++;
 i++;
 }

 for(i=0;i<=l;i++){
    if(sen[i] == ' '||sen[i] == '\0'){        //Here is the difference.
        wrd[m][n]='\0';
        puts(wrd[m]);
        printf("\n");
        m++;
        n=0;

    }
    else{
        wrd[m][n]=sen[i];
        n++;
    }
    }
}

Разница только в условии if цикла for.Первый имеет: if(sen[i] != ' '||sen[i] != '\0') Второй имеет: if(sen[i] == ' '||sen[i] == '\0')

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Первый не дал вывода, потому что if(sen[i] != ' '||sen[i] != '\0') всегда оценивается как Верно .
Хорошо, я попытаюсь объяснить вас логически, не пройдя законы ДеМоргана.Предположим, введена строка:
This is a string.
Управление будет проходить через цикл.
Рассмотрим i=3, при индексирование 3 символ 's' (sen[3]='s').
Теперь будет проверено состояние if.
sen[3] != ' ' == True
sen[3] != '\0' == True
Теперь, if(sen[i] != ' '||sen[i] != '\0') >>> True||True>>> True.
Итак, тело блока if будет выполнено.Следовательно, нет вывода.
Сейчас i=4, при индексирование 4 символ равен ' ' (sen[3]=' ').
Теперь будет проверено условие if.
sen[4] != ' ' == False
sen[4] != '\0' == True
Сейчас if(sen[i] != ' '||sen[i] != '\0') >>> False||True >>> True.Снова будет выполнено тело блока if.Следовательно, блок вывода.
else никогда не будет выполнен, который содержит операторы для вывода.Более логично, Вы хотите добавить к wrd, если любой sen [i] не является пробелом OR sen[i] не является нулевым символом. Каждый символ не является пробелом или переводом строки, поэтому это условие всегда будет выполнено. В вашей логике блок else будет выполняться только при обнаружении такого символа, который равен space и \0 (ноль).Так как такого символа не существует, else блок в вашем коде никогда не будет выполняться.Следовательно, НЕТ ВЫХОДА.

0 голосов
/ 25 октября 2018

Вот эквиваленты:

if(sen[i] == ' '||sen[i] == '\0'){
  // code block #1
} else {
  // code block #2
}

равно логически эквивалентно следующему:

if(sen[i] != ' ' && sen[i] != '\0'){
  // code block #2
} else {
  // code block #1
}

В основном, когда вы инвертировали отдельные условия, вы также забыли изменитьИЛИ в И.

0 голосов
/ 26 октября 2018

О логике в вашем коде, в коде, который НЕ работает, в предложении:

if(sen[i] != ' '||sen[i] != '\0'){ 

Если был найден пустой пробел, вы получаете первый параметр как ложный, но второйсравнивает с концом строки, но это НЕ равно!Таким образом, это сравнение становится правдой ... false or true дает вам правду ... Так что код делает то, что вы ожидаете сделать с символом или словом

0 голосов
/ 25 октября 2018

Похоже, у вас сложилось впечатление, что условие:

(sen[i] != ' '||sen[i] != '\0')

является логическим отрицанием:

(sen[i] == ' '||sen[i] == '\0')

Это не так. Законы Деморгана диктуют логическую эквивалентность логических выражений.

Общий случай того, что вы хотите, это !(A || B) == (!A && !B).Таким образом, вы можете переместить отрицание внутри сгруппированного выражения, но логическое ИЛИ превращается в логическое И, и наоборот.

В вашем конкретном случае обратное последнее условие имеет вид:

!(sen[i] == ' ' || sen[i] == '\0')

Что становится:

(sen[i] != ' ' && sen[i] != '\0')

Говоря через это, вы хотите добавить к wrd, если оба sen[i] не являются пробелом И sen[i] не является новой строкой.Вместо этого вы сказали, что хотите добавить к wrd, если либо sen[i] не является пробелом, ИЛИ sen[i] не является новой строкой. Любой символ не является пробелом или переводом строки, поэтому это условие всегда будет истинным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...