Программирование >>  Элементы языков с и с++ 

1 ... 8 9 10 [ 11 ] 12 13 14 ... 200


Листинг 1.3

5.СРР : Defines the entry point for the console application.

#include stdafx.h #include <conio.h> tdefine lower 0 tdefine upper 300 tdefine step 20

int tmain 0 {

int fahr;

for{fahr=lower; fahr <= upper; fahr= fahr + step) printf( %4d %6.1f\n ,fahr,(5.0/9.6)*(fahr-32.0)); getch();

Теперь, когда начнется компиляция, компилятор просмотрит текст программы и заменит в нем все символические константы (в данном случае это - lower, upper, step) на их значения, заданные оператором tdefine. Заметим, что после этого оператора никаких точек с запятой не ставится, т. к. это оператор не языка С, а компилятора. И если нам понадобится изменить значения переменных lower, upper, step, ТО не придется разбираться в тексте программы, а достаточно будет посмотреть в ее начало, быстро найти изменяемые величины и выполнить их модификацию.

оператор компилятора #def ine, который позволяет соотнести с каждым конкретным числом или выражением набор символов - символических (не символьных, символьные - это другое) коиспшит. В этом случае на местах конкретных чисел в программе будут находиться символические константы, которые в момент компиляции программы будут заменены на соотвеютвую-щие им числа, но это уже невидимо для программиста. Отсюда и название символические константы - это не переменные, имеющие свой адрес и меняющие свое значение по мере работы программы, а постоянные, которые один раз получают свое значение и не меняют его. С учетом сказанного, наша программа из листинга 1.2 примет следующий вид (листинг 1.3).



Глава 2

Si l l

Программы для работы с символьными данными

Рассмотрим некоторые полезные программы для работы с символьными данными, использующие операторы условного перехода. Символьные данные в языке С имеют тип char. Переменная, которая будет содержать один символ (точнее- его код по таблице кодирования символов ASCII), должна описываться как char с.

( Примечание

Здесь с - это обычное имя переменной, вместо которого можно было бы написать, например, abcde. Компилятор присвоит имени необходимый адрес, если количество символов в имени не превышает допустимое.

Среда VC++ обладает еще одним типом данных для описания символа, но по таблице Юникод. В отличие от таблицы ASCII, в соответствии с которой код символа занимает один байт, кодирование по Юникоду размещает символ в двух байтах. С таким кодированием мы встретимся позднее.

Компилятор С++ трактует переменные типа char как signed char (символьная со знаком) и как unsigned char (символьная без знака), причем подразумевается, что это данные разных типов. Переменные типа char по умолчанию рассматриваются компилятором в качестве переменных типа signed char. Такие переменные могут преобразовываться в переменные типа int. Теперь после введения типа char можно определить и тип short или short int. Этим типом описывают короткие переменные целого типа. Такие переменные занимают памяти больше или равно, чем переменные типа char, и меньше или равно, чем переменные типа int.

В библиотеке С наряду с функциями getch() и printf о, с которыми мы познакомились ранее, существуют и другие функции ввода/вывода. Две из



них - это getchar () и putchar (). К переменной char с эти функции применяются так:

c=getchar(); putchar(с);

Функции getchar о и putchar () описаны В файле stdio.h, который, как мы видели, подключается к заготовке консольной программы автоматически через файл stdafx.h.

Первая функция не имеет параметров- в круглых скобках ничего нет. Функция getchar о, начав выполняться, ожидает ввода символа с клавиатуры. Как только символ с клавиатуры введен, его значение присваивается переменной с.

Если говорить точнее, функция getchar о работает несколько иначе. Фактическая обработка символа начнется только тогда, когда ввод закончится нажатием клавиши <Enter> (а до этого вводимые символы накапливаются в буфере функции). Поэтому если присвоение символов происходит в некотором цикле (например, если мы хотим сформировать строку из символов, вводя их через функцию getchar () по одному символу в цикле), то следует ввести строку символов, нажать клавишу <Enter>, и только тогда мы увидим результат ввода - строка будет состоять из символов, введенных функцией.

Тут возникает вопрос: а как дать знать программе, что ввод группы символов закончен? Ввод данных, как мы в дальнейшем увидим, может осуществляться и из файла. В этом случае на окончание ввода указывает так называемый признак конца файча, присутствующий в файле, который формируется функциями ввода файла после окончания его ввода, когда выполняется функция закрытия файла. Этот признак потом при чтении файла обнаруживается с помощью специальной функции eof о (находится в файле <io.h>). Аббревиатура eof означает end of file.

Но как быть с признаком конца ввода при вводе данных с клавиатуры? Хотелось бы, чтобы и при вводе с клавиатуры был бы такой же порядок формирования признака конца данных. И он действительно имеется: среда рассматривает ввод символов с клавиатуры в виде специального потока данных, который можно завершить нажатием комбинации клавиш <Ctrl>+<z?>. При этом формируется символ, значение которого равно -1. Это и будет признаком конца данных, вводимых с клавиатуры функцией ввода. Когда мы в программе поймаем этот символ, то должны завершить ввод. Это и будет для нас eof.

Но такой признак можно и самостоятельно сформировать в программе: задать в ней некий символ (например, знак вопроса ?), который будет означать конец ввода с клавиатуры. Тогда при вводе символов последним надо будет набрать символ знака вопроса. А в самой программе проверять каждый вве-



1 ... 8 9 10 [ 11 ] 12 13 14 ... 200

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика