Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Наиболее запутанная часть программы касается идентификации слов. Прежде всего, необходимо дать определение, что понимается под словом. Давайте выберем относительно простой подход и определим слово как последовательность символов, которая не содержит пробельных символов (символов пробела, табуляции и новой строки). В этом смысле “glymxck” и “r2d2” являются словами. Слово начинается, когда программа впервые встречает символ, отличный от пробельного, и заканчивается, когда появляется следующий пробельный символ. Ниже показано простейшее проверочное выражение, которое обеспечивает обнаружение символов, отличных от пробельных:
с ! = ' ' && с ! = ‘\n' && с ! = '\t' /* истинно, если с - не пробельный символ */
Наиболее прямолинейное проверочное выражение, обеспечивающее выявление пробельных символов, имеет следующий вид:
с != ' ' || с == ‘\n' || с == '\t' /* истинно, если с - пробельный символ */
Однако проще применить функцию isspace() из ctype.hr которая возвращает значение true, если переданный ей аргумент представляет собой пробельный символ. Таким образом, функция isspace (с) возвращает истинное значение, если с — пробельный символ, и ! isspace (с) будет истинным, если с таковым не является.
Чтобы отслеживать, входит ли символ в слово, при считывании первого символа слова можно устанавливать в 1 некоторый флаг (назовем его inword). В этой точке можно также инкрементировать счетчик слов. Затем до тех пор, пока значение inword остается равным 1 (или истинным), последующие непробельные символы не помечают начало слова. При появлении следующего пробельного символа флаг понадобится сбросить в 0 (или ложь), после чего программа будет готова к поиску следующего слова. Представим все сказанное в виде псевдокода:
если с не является пробельным символом и inword ложно установить inword в истину и посчитать слово
if с является пробельным символом и inword истинно установить флаг inword в ложь
При таком подходе inword устанавливается в 1 (истина) в начале каждого слова и в 0 (ложь) в конце каждого слова. Слова подсчитываются только в момент, когда значение inword меняется с 0 на 1. Если вам доступен тип _Bool, можете включить заголовочный файл stdbool.h и использовать ключевое слово bool для типа флага inword, а также true и false для его значений. В противном случае применяйте тип int и значения 1 и 0.
Управляющие операторы С: ветвление и переходы 269
При работе с булевской переменной в качестве условия проверки обычно используют значение этой переменной. То есть применяйте
if (inword) вместо
if (inword == true)
и
if ( ! inword) вместо
if (inword == false)
Причина в том, что выражение inword == true получает значение true, если inword равно true, и false, если inword равно false, поэтому в качестве условия проверки можно применять просто inword. Аналогично, ! inword имеет то же значение, что и выражение inword == false (не истинно — false, а не ложно — true).
В листинге 7.7 описанные идеи (идентификация строк, неполных строк и слов) реализованы на языке С.
270 глава 7
Ниже показан результат выполнения этой программы:
Введите текст для анализа (| для завершения) :
Reason is а
powerful servant but
an inadequate master.
I
символов = 55, слов = 9, строк = 3, неполных строк = О
Для трансляции псевдокода в код С используются логические операции. Например
если с не является пробельным символом и inword ложно преобразуется в следующий код:
if (!is space (с) && !inword)
Еще раз обратите внимание, что ! inword эквивалентно выражению inword == false. Полное проверочное выражение определенно более читабельно, чем индивидуальная проверка для каждого пробельного символа:
if (с != ' ' && с != ‘\n' && с != '\t' && ! inword)
Обе эти формы означают: “если с не является пробельным символом, и если мы не находимся внутри слова”. Если оба условия удовлетворены, вы должны быть в начале нового слова, и n words инкрементируется. Если вы находитесь посредине слова, то первое условие выполняется, но inword будег равно true, и n words не инкрементируется. Когда достигается следующий пробельный символ, inword снова устанавливается в false. Проверьте, правильно ли работает программа в ситуации, когда между словами находится несколько пробелов. В главе 8 будет показано, как модифицировать программу, чтобы она могла подсчитывать слова в файле.
Условная операция ?:
В языке С предлагается сокращенный способ представления одной из форм оператора if else — уемвнпе выражение, для которого применяется условная операция ? :. Эта операция состоит из двух частей и работает с тремя операндами. Вспомните, что операции с одним операндом называются унарными, а с двумя операндами — бинарными. Следуя данной традиции, операции с тремя операндами называют тернарными, и условная операция является в С единственной в такой категории. Вот пример, выдающий абсолютное значение числа:
х = (у < 0) ? -у: у;
Все, что находится между знаком = и точкой с запятой, представляет собой условное выражение. Смысл этого оператора можно выразить так: “если у меньше нуля, то х = -у, иначе х = у”. С помощью оператора if else это можно выразить следующим образом:
if (У < 0) х = -у;
else
х = у;
Ниже показана общая форма условного выражения:
выражение! ? выражение2 : выражениеЗ
Если выражение1 имеет истинное (ненулевое) значение, то все условное выражение принимает то же значение, что и выражение2. Если выражение! имеег ложное (нулевое) значение, то все условное выражение получает то же значение, что и выражениеЗ.
Управляющие операторы С: ветвление и переходы 271
Условное выражение можно использовать в ситуации, когда переменной необходимо присвоить одно из двух возможных значений. Типичным примером может служить установка переменной в большее из двух значений:
max = (а > b) ? а: b;
Здесь переменной max присваивается значение а, если оно большеb, и b в противном случае.
Обычно с помощью оператора if else можно достичь того же самого, что и посредством условной операции. Однако версия с условной операцией короче и в зависимости от компилятора может дать в результате более компактный код.
Давайте для примера рассмотрим программу в листинге 7.8. Эта программа вычисляет, сколько банок краски необходимо для того, чтобы покрасить заданное количество квадратных футов поверхности. Основной алгоритм прост: нужно разделить общее число квадратных футов на количество квадратных футов, которые можно покрасить содержимым одной банки. Тем не менее, предположим, что ответом будет 1,7 банки. В магазине можно купить только полные, а не частично заполненные банки, поэтому придется приобрести две банки. Следовательно, программа должна округлять ответ до следующего целого числа. Для обработки такой ситуации применяется условная операция, и она также используется при выводе слова “банка” или “банки”.
Читать дальшеИнтервал:
Закладка: