Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ_ПО_ПРОГРАММИРОВАНИЮ_ПРЕПОД_3403_220301.doc
Скачиваний:
27
Добавлен:
06.11.2018
Размер:
845.31 Кб
Скачать

10.5 Приоритеты операций отношения.

Приоритет операций отношения меньше, чем у операций + и -, и больше, чем у операции присваивания =. Поэтому:

  • Значение выражения: х > y + 2 то же, что и выражения х > (у + 2).

  • Выражение условия while(ch = getchar() != EOF) эквивалентно выражению условия while(ch = (getchar() != EOF)), т.к. наличие у операции !=, более высокого приоритета говорит о том, что она выполняется перед присваиванием. Значение переменной ch может стать либо 1, либо 0. Это зависит только от истинности выражения getchar() != EOF.

  • Поскольку в примерах программ рассмотренных до сих пор, предполагалось, что переменная ch получает свое значение от функции getchar(), использовались скобки, чтобы организовать выполнение операций в нужном порядке. while((ch = getchar()) != EOF).

Сами операции отношения можно разбить на две группы:

  • группа операций более высокого приоритета: < <= => >

  • группа операций более низкого приоритета: == !=

Операции отношения выполняются слева направо. Поэтому под записью:

ех != wye == zee подразумевается (ex != wye) == zee. Следовательно, сначала проверяется, равны ли значения переменных ех и wye. Результирующая величина, равная 1 или 0 (истина или ложь), затем сравнивается со значением zee. Лучше не использовать такие конструкции, а применять скобки для четкого задания порядка выполнения операций.

10.6 Логические операции (and, or, not).

В языке Си имеются три основные логические операции:

ЛОГИЧЕСКИЕ ОПЕРАЦИИ.

Логическая операция

Смысл логической операции

&&

И (AND)

||

ИЛИ (OR)

!

НЕ (NOT)

Операндами логических операций обычно являются условные выражения. У операции NOT ! имеется только один операнд. Остальные логические операции имеют по два операнда - один слева от знака логической операции другой справа от него.

/* ПРОГРАММА:

count_char.с – подсчет непустых символов (подсчет символов, которые не являются пробелами, знаками табуляции, знаками новая строка). */

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= main() */

main()

{/*.---------------------------.begin main() */

int ch;

int charcount = 0;

while ((ch = getchar()) != EOF)

if(ch !=' ' && ch !='\n' && ch != '\t') charcount++;

printf(" Всего %d непустых символов. \n", charcount);

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

Количество непустых символов.

ПОЯСНЕНИЯ К ПРОГРАММЕ.

  • Программа начинает свое выполнение с чтения символа и проверки, является ли он признаком конца файла (EOF). Дальше появляется оператор, использующий логическую операцию И, обозначаемую &&. Смысл действий, осуществляемых оператором if в данном случае, можно пояснить следующим образом: Если прочитанный символ не пробел, И не символ новая строка \n, И не символ табуляции \t, то происходит увеличение значения переменной charcount на единицу. Все выражение будет истинным, если указанные три условия истинны.

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

***************************************************************

Логические выражения – это выражения, включающие логические операции. Истинность логических выражений вычисляется по следующим правилам:

Предположим, что expl и ехр2 - два простых условных выражения, имеющие, например, вид cat > rat и debt = = 1000.

Тогда:

  • expl && ехр2: истинно в том и только в том случае, когда оба выражения expl и ехр2 истинны.

  • expl || ехр2: истинно в том случае, если какое-нибудь из выражений expl или ехр2 истинно или оба истинны.

  • !expl: истинно, если выражение expl ложно, и наоборот.

Например:

  • 5 > 2 && 4 > 7: ложно, т.к. истинно только одно подвыражение.

  • 5 > 2 || 4 > 7: истинно, т.к., по крайней мере, одно из подвыражений истинно.

  • !(4 > 7): истинно, потому что 4 не больше 7.

Операция ! имеет очень высокий приоритет, он выше, чем у умножения *, такой же, как у операций увеличения ++, и только круглые скобки ( ) имеют более высокий приоритет. Приоритет операции && больше чем операции ||, а обе они имеют более низкий приоритет, чем операции отношения < <= == >= > !=, но более высокий, чем операция присваивания =. Поэтому выражение: а > b && b > c || b > d интерпретируется так: ((a > b) && (b > с)) || (b > d),т. е. b содержится между с и а ИЛИ b больше d.

ПРИМЕЧАНИЕ.

В языке Си не определяется, какие части сложного выражения будут вычисляться вначале. Так, в операторе: apples = (5 + 3)*(9 + 6); выражение 5 + 3 может быть вычислено до вычисления выражения 9 + 6, или наоборот. Приоритеты, присвоенные операциям, гарантируют только, что оба выражения будут вычислены перед выполнением операции умножения *. Эта неопределенность была оставлена в языке, чтобы создатели компиляторов имели возможность в конкретной системе осуществлять наиболее эффективный выбор.

Исключением из этого правила является выполнение логических операций. Язык Си гарантирует, что логические выражения всегда вычисляются слева направо. Более того, гарантируется также, что, как только обнаруживается элемент, значение которого устанавливает ложность всего выражения как целого, вычисление данного выражения прекращается. Это дает возможность использовать конструкции типа:

while((c = getchar()) != EOF && с != '\n').

В результате вычисления первого подвыражения c = getchar() переменная с получает свое значение, которое затем можно использовать во втором подвыражении != EOF && с != '\n'. Если бы такой порядок вычислений не гарантировался, при выполнении программы компьютер, возможно, проверял бы истинность второго выражения перед нахождением значения переменной с.

Приведем еще один пример:

if (number !=0 && 12/number ==2) printf(" Число равно 5 или 6.\n" );

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

Некоторые машинные языки не обеспечивают выполнения подобного требования, и, выяснив, что number равно 0, компьютер переходит к проверке следующего условия.

/* ПРОГРАММА:

count_text_elements.c – программа подсчета символов, слов, строк в тексте.

*/

/*#############################################*/

/*============================= include */

#include<stdio.h>

/*============================= define */

#define YES 1

#define NO 0

/*============================= main() */

main()

{/*.---------------------------.begin main() */

int ch; /* введенный символ */

long nc = 0L; /* число символов */

int nl = 0; /* число строк */

int nw = 0; /* число слов */

int word = NO; /* = YES, если содержимое сh - часть слова */

while((ch = getchar()) != EOF)

{/*.---------------------------.begin while 1*/

nc++ ; / * подсчет символов * /

if (ch = = '\n' ) nl++; /* подсчет строк */

if (ch != ' ' && ch != '\n' && ch !='\t' && word ==NO)

{/*.-------------------.begin if*/

word = YES; /* начало нового слова */

nw++; /* подсчет слов */

}/*.-------------------.end if*/

if ((ch = = ' ' || ch = = '\n' || ch = = '\t' ) && word == YES)

word = NO; /* достигнут конец слова */

}/*.---------------------------.end while 1*/

printf(" символов = %1d, слов = %d, строк = %d\n", nc, nw, nl);

return 0;

}/*.---------------------------.end main() */

/*#############################################*/

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.

Количество символов, слов, строк в тексте.

ПОЯСНЕНИЯ К ПРОГРАММЕ.

Решающим моментом является разработка способа, с помощью которого программа будет распознавать слова. Определим слово как последовательность символов, которая не содержит пустых символов (пробела, знака табуляции, перевода строки). Тогда последовательности символов "glymxck" и "r2d2" - это слова. Переменная word используется для хранения указания о том, является ли введенный символ частью данного слова или началом следующего. Появление пустого символа является признаком конца слова. Поэтому следующий непустой символ будет означать начало нового слова, и можно увеличить значение счетчика слов на 1. Поскольку существуют три различных "пустых символа", необходимо использовать логические операции для проверки всех трех возможностей. Рассмотрим строку:

if(ch != ' ' && ch != '\n' && ch != '\t ' && word == NO).

В ней говорится: "если содержимое ch - не пробел, и не новая строка, и не табуляция, и не первый символ слова". Первые три условия эквивалентны проверке, не является ли содержимое ch пустым символом. Выполнение всех четырех условий служит признаком начала нового слова, и значение переменной nw увеличивается. Если мы в середине слова, то первые три условия оказываются выполненными, но значением переменной word окажется признак YES, и значение переменной nw не увеличивается. Когда в процессе ввода встретится очередной "пустой" символ, переменной word будет вновь присвоен признак NO.

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

***************************************************************