Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

методички.C++ / С Fundamentals

.pdf
Скачиваний:
76
Добавлен:
24.02.2016
Размер:
1.38 Mб
Скачать

Упражнение. Модифицируйте листинг 1.18 в направлении обратного счета от 10 до 1.

Оператор do-while

Оператор do-while делай пока») является в некотором роде перевернутым циклом while.

do {

оператор;

} while (выражение);

Выполняется оператор, затем проверяется выражение. До тех пор пока значение выражения будет истинным, оператор будет выполняться.

Если цикл while вычисляет свое выражение прежде, чем выполнить операторы, то do-while всегда выполняет свои операторы, по крайней мере, один раз, т.к. проверка выражения осуществляется в конце цикла. Из этого следует основное правило выбора между этими циклами: если цикл должен быть выполнен хотя бы один раз (например, при вводе данных), то подойдет do-while, в противном случае while.

Условием цикла может быть любое логическое выражение. Чтобы продемонстрировать такую многогранность, листинг 1.19 использует цикл do-while для вывода на экран алфавита.

Листинг 1.19. dwalpha.c (вывод алфавита с помощью цикла do-while)

1: #include <stdio.h> 2:

3:int main(void)

4:{

5:char c;

6:

7:printf(″do-while alphabet\n″);

8:c = ′A′;

9:do {

10:c++;

11:printf(″%c″, c);

12:} while (c <= ′Z′);

13:return 0;

14:}

Выражение в строке 12 (с <= ‘Z’) истинно, если значение переменной c меньше или равно ASCII-значению буквы Z’ (т.е. ее номеру в таблице

ASCII, см. прил. 2).

Упражнение. Измените листинг 1.19 таким образом, чтобы программа выводила на экран русский алфавит.

© Кафедра информатики БГУИР. Мелещенко А.А.

41

Оператор for

Когда вам точно известно, сколько раз должны выполняться операторы цикла, лучше всего использовать третий оператор цикла языка С for.

for (выражение1; выражение2; выражение3) { оператор;

}

На первый взгляд, оператор for может показаться сложным, но он станет понятнее, если его представить в виде эквивалентного ему оператора while:

выражение1;

while (выражение2) { оператор; выражение3;

}

Например, для того чтобы с помощью цикла for посчитать от 1 до 10, можно взять переменную i типа int и записать:

for (i = 1;

i

<= 10;

i++)

/*

выражения 1, 2, и 3 */

printf(″i

=

%d\n″,

i);

/*

оператор */

Первое выражение цикла for в этом примере присваивает начальное значение переменной i, равное 1. Это действие выполняется только один раз, перед началом цикла. Второе выражение обычно является выражением отношения. В нашем случае оно будет равно «истине», если значение i меньше или равно 10. Третье, и последнее, выражение увеличивает на единицу значение переменной i, приближая, таким образом, цикл к концу.

Распространена ошибка, когда после закрывающей круглой скобки цикла случайно ставится точка с запятой:

for (i = 1; i <= 10; i++); /* ??? */ printf(″i = %d\n″, i);

Внимательно рассмотрите этот фрагмент. Цикл не выполняет никаких полезных действий десять раз выполняется «пустой» оператор (;). Оператор printf() выполнится только один раз.

Листинг 1.20 использует цикл for для отображения набора видимых символов из основной части таблицы ASCII (это символы со значениями от

32 до 127).

Листинг 1.20. fascii.c (отображение ASCII-символов с помощью цикла for)

1: #include <stdio.h> 2:

3:int main(void)

4:{

5:char c;

6:

7:for (c = 32; c < 127; c++) {

8:if ((c % 32) == 0) printf(″\n″);

9:printf(″%c″, c);

© Кафедра информатики БГУИР. Мелещенко А.А.

42

10:}

11:printf(″\n″);

12:return 0;

13:}

Когда вы запустите программу fascii, она отобразит на экране следующую таблицу символов:

!”#$%&’()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ ‘abcdefghijklmnopqrstuvwxyz{|}~

Цикл for (строки 7-10) первоначально устанавливает управляющую переменную с типа char равной ASCII-значению символа пробела (32). Управляющее выражение (с < 127) завершает цикл после того, как переменная с примет свое максимальное значение, равное 127. Выражение

с++ увеличивает управляющую переменную на каждом проходе цикла на единицу.

Оператор if, находящийся внутри оператора for, сравнивает выражение (с % 32), равное остатку от деления с на 32, с нулем. Если результат сравнения значение «истина», то оператор printf() начинает новую строку. Замените 32 на 16, и вы получите вывод по 16 символов в строке.

Упражнение. Замените цикл for в листинге 1.20 эквивалентным циклом while.

Оператор break

Иногда бывает нужно прервать выполнение цикла while, do-while или for. Листинг 1.21 демонстрирует, как оператор break может прервать программу подобно тому, как срочный выпуск новостей прерывает телевизионную передачу.

Листинг 1.21. breaker.c (действие оператора break)

1: #include <stdio.h> 2:

3:int main(void)

4:{

5:int count;

7:printf(″\n\nfor loop:\n″);

8:for (count = 1; count <= 10; count++) {

9:if (count > 5) break;

10:printf(″%d\n″, count);

11:}

12:

13:printf(″\n\nwhile loop:\n″);

14:count = 1;

15:while (count <= 10) {

16:if (count > 5) break;

© Кафедра информатики БГУИР. Мелещенко А.А.

43

17:printf(″%d\n″, count);

18:count++;

19:}

20:

21:printf(″\n\ndo/while loop:\n″);

22:count = 1;

23:do {

24:if (count > 5) break;

25:printf(″%d\n″, count);

26:count++;

27:} while(count <= 10);

28:

29:return 0;

30:}

Программа breaker выполняет операторы for (строки 8-11), while (строки 15-19) и do-while (строки 23-27). Каждый оператор считает от 1 до 10, используя переменную count. Каждый цикл также выполняет оператор break до того, как переменная count достигнет своего конечного значения (строки 9, 16, 24), поэтому эти циклы заканчиваются преждевременно.

Упражнение. В листинге 1.13, чтобы преобразовать не одно значение температуры, а несколько, вам приходится каждый раз заново запускать программу. Добавьте в программу цикл для повторения преобразований до тех пор, пока вы не захотите выйти из программы.

Бесконечный цикл

Выражения внутри оператора for можно и опустить, но в этом случае мы получаем бесконечный цикл:

for ( ; ; ) ; /* бесконечный цикл */

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

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

Широко распространен метод программирования, при котором бесконечный цикл использует оператор break, чтобы выйти из «вечности»:

for ( ; ; ) {

/* выполнять цикл ″вечно″ */

.............

/* различные операторы */

if (выражение)

/* если выражение окажется истинным */

break;

/* прервать цикл */

}

 

Так обычно пишется главный цикл приложений для Windows, программируются контроллеры, программы с пользовательским интерфейсом. Многие программисты предпочитают организовывать бесконечный цикл с помощью while:

while (1) { /* бесконечный цикл while */

© Кафедра информатики БГУИР. Мелещенко А.А.

44

.............

if (выражение) break;

}

Оператор continue

Оператор continue похож на break, но он заставляет цикл прервать текущую итерацию и начать следующую. Листинг 1.22 демонстрирует различие между этими операторами.

Листинг 1.22. continue.c (действие оператора continue)

1: #include <stdio.h> 2:

3:int main(void)

4:{

5:int count;

7:printf(″\nStarting for loop with continue...\n″);

8:for (count = 1; count <=10; count++) {

9:if (count > 5) continue;

10:printf(″%d\n″, count);

11:}

12:printf(″After for loop, count = %d\n″, count);

14:printf(″\n\nStarting for loop with break...\n″);

15:for (count = 1; count <= 10; count++) {

16:if (count > 5) break;

17:printf(″%d\n″, count);

18:}

19:printf(″After for loop, count = %d\n″, count);

20:return 0;

21:}

Чтобы посчитать от 1 до 10, программа continue использует два цикла for (строки 8-11 и 15-18). Строка 9 первого цикла for выполнит оператор continue, если переменная count будет больше 5. Строка 16 выполнит оператор break при том же условии. За исключением этого различия приведенные циклы идентичны.

Оператор continue прерывает последовательное выполнение программы и передает управление в начало цикла. Оператор printf() в строке 10, таким образом, пропускается. Оператор break немедленно осуществляет выход из цикла, передавая управление следующему после цикла оператору (строка 19).

Программа отображает значение переменной count внутри и снаружи циклов. После выхода из первого цикла оно равно 11, после выхода из второго – 6.

© Кафедра информатики БГУИР. Мелещенко А.А.

45

Оператор goto

Оператор goto позволяет перейти в указанное место программы. Поскольку goto позволяет «прыгать» в любое место, его использование

напоминает желание оставить проторенную дорогу ради замеченной извилистой тропинки в поле.

На первый взгляд, goto кажется очень полезным оператором. Однако на практике он дает программистам слишком большую свободу «скакать» по программе куда угодно. В лучшем случае, результаты программы, которая имеет несколько goto операторов, просто трудно понять, в худшем такая программа вообще работает плохо.

Если вы не можете обойтись без goto, поставьте метку (неиспользованный ранее идентификатор и двоеточие) в нужном месте программы (перед оператором, на который вы хотите «прыгнуть»). Выполните goto МЕТКА, и «течение» вашей программы будет направлено «по новому руслу». Листинг 1.23 продемонстрирует, как использовать goto для счета от 1 до 10.

Листинг 1.23. gcount.c (счет от 1 до 10 с помощью оператора goto)

1: #include <stdio.h> 2:

3:int main(void)

4:{

5:int count = 1;

7:printf(″\ngoto count\n″);

8:TOP:

9:printf(″%d\n″, count);

10:count++;

11:if (count <= 10) goto TOP;

12:return 0;

13:}

Метка TOP в строке 8 помечает «пункт назначения» для оператора goto. Оператор if на строке 11 проверяет значение целой переменной count. Если оно меньше или равно 10, goto передает управление на метку TOP, чтобы снова выполнить операторы printf() и count++, пока переменная count не станет больше 10.

Программа, конечно, работает, но ей не хватает наглядности циклов while, do-while и for, описанных в этой главе. Понимание goto-варианта требует отслеживания вручную работы каждого оператора. Отладка сложных программ с оператором goto это кропотливый и неблагодарный труд. Тем не менее вы должны знать, как использовать операторы goto, т.к. можете встретиться с ними в чужой программе. Но не используйте их в своих собственных это тот оператор, без которого вполне можно обойтись.

© Кафедра информатики БГУИР. Мелещенко А.А.

46

Резюме

Все С-программы должны иметь функцию main(). С этой функции начинается выполнение программы.

Сообщения об ошибках (Errors) указывают на серьезные проблемы в программе, предупреждения (Warnings) свидетельствуют о менее серьезных ошибках. И те, и другие следует исправить как можно скорее.

Включение в программу заголовочных файлов с помощью директивы #include позволяет вам получить доступ к объявлениям стандартных (или написанных вами) функций, константам и другим элементам.

Комментарии заключаются в ограничительные символы /* и */. Компилятор игнорирует эти ограничители и весь текст между ними.

Ключевые слова являются зарезервированными символами языка. Идентификаторы это слова, которые вы придумываете сами.

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

Язык С чувствителен к регистру букв. Идентификаторы myVar и MYVAR рассматриваются как разные слова.

Целыми типами данных являются, short, int и long, которые считаются знаковыми по умолчанию. Этим типам могут предшествовать ключевые слова signed или unsigned.

Типами данных с плавающей запятой являются float, double и long double. Используя их, вы не можете представить вещественные числа с абсолютной точностью. Для большинства приложений тип double является удачным компромиссом между размером и точностью.

Каждый символ имеет свой номер (код) в таблице ASCII. В программе символы записываются в одинарных кавычках – ‘a’, строки записываются

вдвойных кавычках – “abcdef”. Для работы с текстовой информацией предназначен тип char (внутренне реализован как целый тип).

Используйте оператор sizeof для определения объема памяти, занимаемого типами данных и переменными.

Будьте осторожны в использовании выражений, в которых смешиваются различные типы данных.

Используйте директиву #define для определения символических констант, ключевое слово enum для определения перечисляемых символических констант.

Операторы языка С *, /, +, – и % выполняют арифметические операции над операндами. Операторы отношений <, <=, >, >=, == и != сравнивают два операнда между собой. Логические операторы && и || объединяют

© Кафедра информатики БГУИР. Мелещенко А.А.

47

выражения в соответствии с правилами логического И и ИЛИ. Оператор отрицания ! инвертирует значение логического выражения.

Оператор инкремента ++ прибавляет единицу к своему операнду. Оператор декремента –– вычитает единицу из своего операнда. Эти операторы могут стоять как перед, так и после своих операндов.

Сокращенные операторы присваивания позволяют сократить операторы типа value = value + 10 до value += 10. Наиболее часто в языке С используются сокращенные операторы: *=, /=, +=, –= и %=.

Операторы if и if-else позволяют принимать решения в зависимости от того, является ли анализируемое выражение истинным или ложным.

Используйте операторы switch для упрощения длинных конструкций if- else. Убедитесь, что каждый блок case заканчивается оператором break.

Операторы while и do-while выполняются, пока проверяемое условие остается истинным. В цикле while условное выражение проверяется в самом начале и, следовательно, если оно изначально ложно, то операторы цикла выполняться не будут. В цикле do-while условное выражение вычисляется в конце, и, следовательно, операторы цикла выполняются, по крайней мере, один раз.

Оператор for, возможно, самый популярный оператор в языке С. Используйте его, когда вы знаете или можете вычислить заранее, сколько итераций должен иметь цикл.

Оператор break немедленно завершает цикл. Его часто используют для выхода из бесконечных циклов. Оператор continue заставляет цикл начать следующую итерацию.

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

Обзор функций

Примечание. В разделе «Обзор функций» приводятся только наиболее употребительные стандартные функции C. Для получения информации обо

всех доступных функциях и примерах их использования обратитесь к справочной системе (Help).

Функция printf() (stdio.h)

Прототип и краткое описание

int printf(const char *format, ...);

© Кафедра информатики БГУИР. Мелещенко А.А.

48

Функция выводит на печать форматированную строку и возвращает количество выводимых байтов информации. Если произошла ошибка вывода, printf() возвращает значение EOF.

Спецификаторы преобразования

C помощью спецификаторов преобразования функция printf() может выводить на печать значения различных типов данных. В табл. 1.6 представлены наиболее употребительные спецификаторы.

 

 

 

Таблица 1.6

Спецификаторы преобразования функции printf()

 

 

 

Спецификатор

Тип данных

Описание

%d

int

 

Десятичное целое число со знаком

%u

unsigned int

Десятичное целое число без знака

%ld

long int

 

Длинное десятичное целое число со

 

 

 

знаком

%lu

unsigned

long

Длинное десятичное целое число без

 

int

 

знака

%o

целые типы

 

Восьмеричное целое число без знака

%x или %X

целые типы

 

Шестнадцатеричное целое число без

 

 

 

знака. Спецификатор X используется

 

 

 

для вывода числа цифрами 0-9 и

 

 

 

буквами A-F, а х для вывода числа

 

 

 

цифрами 0-9 и буквами a-f

%f или %e

float

 

Число с плавающей точкой,

 

 

 

десятичное или экспоненциальное

 

 

 

представление

%lf или %le

double

 

Число с плавающей точкой двойной

 

 

 

точности, десятичное или

 

 

 

экспоненциальное представление

%Lf или %Le

long double

 

Число long double, десятичное или

 

 

 

экспоненциальное представление

char

 

Одиночный символ

%s

char *

 

Строка символов

%%

 

 

Печать знака процента

Задание ширины поля и точности представления

Точный размер поля, в котором печатаются данные, задается шириной поля. Если ширина поля больше, чем необходимо для печати данных, то данные выравниваются по его правому краю. Целое число, задающее ширину поля, может быть вставлено между знаком процента (%) и спецификатором преобразования.

© Кафедра информатики БГУИР. Мелещенко А.А.

49

Пример: ″%4d″ печать целого значения в поле шириной 4.

Чтобы задать точность представления, с которой будут напечатаны данные, поместите между знаком процента и спецификатором десятичную точку (.) с последующим числом.

Пример: ″%.4f″

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

Пример: ″%5.2Lf″ вывод значения типа long double в поле шириной 5 символов с двумя цифрами после десятичной точки.

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

Флаги

Чтобы использовать в спецификации флаг, поместите его непосредственно справа от знака процента. В одной спецификации могут быть объединены несколько флагов.

 

 

Флаги функции printf()

Таблица 1.7

 

 

 

 

 

 

 

 

 

 

 

Флаг

Описание

 

 

 

1

2

 

 

 

Выравнивание выводимой строки по левому краю в пределах

 

 

 

заданной ширины поля.

 

 

 

 

Пример: ″%-20s″

 

 

 

+

Значения со знаком печатаются со знаком «плюс», если они

 

 

 

положительны, и со знаком «минус», если они отрицательны.

 

 

 

Пример: ″%+6.2f″

 

 

 

Пробел

Значения со знаком «плюс» печатаются с пробелом (но без знака),

 

 

 

если они положительны, и со знаком «минус», если они

 

 

 

отрицательны.

 

 

 

 

Пример: ″% 6.2f″

 

 

 

#

Альтернативный формат. Выводит в начале 0 для спецификатора

 

 

 

%o и 0х или 0Х для спецификаторов %x и %X.

 

 

 

 

Пример: ″%#o″

 

 

 

0

Дополняет поле до заданной ширины нулями слева.

 

 

 

 

Пример: ″%04d″

 

 

 

 

 

 

 

 

© Кафедра информатики БГУИР. Мелещенко А.А.

50

 

Соседние файлы в папке методички.C++