|
Программирование >> Элементы языков с и с++
Листинг 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. Но такой признак можно и самостоятельно сформировать в программе: задать в ней некий символ (например, знак вопроса ?), который будет означать конец ввода с клавиатуры. Тогда при вводе символов последним надо будет набрать символ знака вопроса. А в самой программе проверять каждый вве-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |