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

37.ИНФОРМАТИКА Book си

.pdf
Скачиваний:
37
Добавлен:
23.03.2016
Размер:
1.14 Mб
Скачать

Часть 2. Язык Си++

71

 

 

терфейс класса могут находиться либо в одном файле, либо в разных. В последнем случае файл с интерфейсом имеет расширение .H или

.НРР, а файл с реализацией имеет расширение .СРР.

Поскольку в тексте программы могут присутствовать интерфейсы многих классов, в реализации класса перед именем функции должно быть указано имя класса, в который функция входит. За именем класса следует оператор подключения области видимости класса :: (двойное двоеточие). Приведем в качестве примера описание класса Rectangle (прямоугольник):

//----------------

Интерфейс класса ------------

class Rectangle

 

{

 

Point a,b; // недоступные переменные public:

Rectangle (Point &A, Point &B); Rectangle (float, float, float, float); void Move (float, float);

void Move (Point &D);

float Height() { return b.y-a.y; }; float Width() { return b.x-a.x; }; Point FirstPoint() { return a; };

};

//---------------- Реализация класса -----------

Rectangle::Rectangle (Point &A, Point &B)

{

if (A.x<B.x) {a.x=A.x; b.x=B.x; } else {a.x=B.x; b.x=A.x; }

if (A.y<B.y) {a.y=A.y; b.y=B.y; } else {a.y=B.y; b.y=A.y; }

}

Rectangle::Rectangle (float x1, float y1, float x2, float y2)

{

if (x1<x2) {a.x=x1; b.x=x2; } else {a.x=x2; b.x=x1; }

if (y1<y2) {a.y=y1; b.y=y2; } else {a.y=y2; b.y=y1; }

71

72

Си и Си++

}

void Rectangle::Move(float dx, float dy) { a.x+=dx; b.x+=dx;

a.y+=dy; b.y+=dy;

}

void Rectangle::Move(Point &D) { a.x+=D.x; b.x+=D.x;

a.y+=D.y; b.y+=D.y;

}

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

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

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

72

Приложение 1. Стандартные заголовочные файлы

Каждая библиотечная функция, определенная стандартом языка Си, имеет прототип в соответствующем заголовочном файле. В соответствии со стандартом ANSI язык Си имеет 15 заголовочных файлов, в число которых входят:

ctype.h Преобразование и проверка символов math.h Математическая библиотека

stdio.h Библиотека стандартного ввода/вывода stdlib.h Функции общего назначения string.h Функции работы со строками символов time.h Функции работы с датой и временем

На самом деле каждый из компиляторов содержит, как правило, больше заголовочных файлов. Компилятор Borland C++ содержит библиотеки, ориентированные на работу с MS-DOS и WINDOWS, дополнительные библиотеки языка C++ и некоторые другие.

Далее приводится список функций с кратким описанием их действия. Более подробно об их работе можно узнать либо из справочной литературы, либо из HELP-системы оболочки Borland C. В крайнем случае можно попытаться понять, что написано непосредственно в заголовочных файлах (*.h).

П1.1 Функции ввода/вывода высокого уровня

(stdio.h)

Операции ввода/вывода в языке Си организованы посредством библиотечных функций. Важно понять, что такое файл и поток и каково различие между этими понятиями. Система ввода/вывода языка Си поддерживает интерфейс, не зависящий от того, какое в действительности используется физическое устройство ввода/вывода, т.е. существует абстрактный уровень между программистом и физическим устройством. Эта абстракция и называется потоком. Способ же хранения информации на физическом устройстве называется файлом.

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

74

Си и Си++

 

 

ту или выводить ее на экран.

В стандарте языка Си существует пять стандартных потоков. Нас интересуют только два из них:

stdin поток ввода (по умолчанию — клавиатура) stdout поток вывода (по умолчанию — дисплей)

Файл в языке Си — это понятие, которое может быть приложено ко всему — от файла на диске до терминала. Поток может быть связан с файлом с помощью оператора открытия файла. Как только файл открыт, то информация может передаваться между ним и вашей программой.

Для данных потоков существуют стандартные функции ввода/вывода:

Функция

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

getchar

чтение символа из потока stdin

gets

чтение строки из потока stdin

printf

запись данных в поток stdout по формату

putchar

запись символа в поток stdout

puts

запись строки в поток stdout

scanf

чтение данных из потока stdin по формату

Прототипы данных функций содержатся в файле stdio.h. Кроме приведенных выше функций, в этом файле находятся прототипы функций, позволяющих работать с файлами на потоковом уровне.

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

Форматный вывод (printf)

Форматный вывод осуществляется функцией printf:

printf( <строка> [, <аргумент>...

] );

―Строка‖ является управляющей строкой, имеющей свой формат. Рассмотрим самый простой случай вывода строки ―Привет!‖.

printf("Привет!");

/* write('Привет!'); */

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

'\n':

74

Приложение 1. Стандартные заголовочные файлы

75

printf("Привет!\nЭто Си\n");

/* writeln('Привет!'); writeln('Это Паскаль'); */

Заметим, что в Си, в отличие от Паскаля, можно сразу вывести несколько строк. Есть еще ряд специальных символов. Они состоят из обратного слеша, за которым следует либо буква, либо знак пунктуации, либо комбинация цифр.

Символ

Наименование

Символ

Наименование

\n

Новая строка

\\

Обратный слеш ―\

\t

Горизонтальная табуляция

\v

Вертикальная табуляция

\b

Забой

\r

Возврат каретки

\f

Новая страница

\a

Звуковой сигнал

\'

Апостроф

\"

Двойная кавычка

\ddd*

Код символа в восьмеричном

\xdd*

Код символа в шестнадцате-

 

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

 

ричном представлении

* d — цифра 0-7 в восьмеричном представление, или 0-F в шестнадцатеричном.

Особенность форматного вывода состоит в том, что в символьную строку можно вставить текстовое представление значения переменной, находящейся в списке аргументов. Для этого используются спецификации формата. В качестве символа начала спецификации формата используется символ процента '%'. Обычно спецификация формата имеет следующий вид:

%[<длина>][.< min длина>][h|l]<тип>

Спецификация формата не содержит внутри себя пробелов. Зачастую используют только ―тип‖. Основные символы, используемые в качестве ―типа‖, и их смысловая нагрузка приведены далее в таблице. Флаг ―h‖ или ―l‖ сообщает компилятору, что используется короткий (short) или длинный (long) тип данных.

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

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

75

76

Си и Си++

 

 

значения с плавающей точкой.

Интерпретация значения ―min длины‖ в зависимости от заданного типа показана в следующей таблице.

Тип

Сим-

Формат

Действие “min длина”

По умолча-

вол

нию

 

d

десятичное

 

 

 

i

со знаком

Задает минимальное число цифр,

 

 

u

дес. без знака

которые будут напечатаны. Если

 

целое

o

восьмеричное

число цифр в аргументе меньше,

 

без знака

чем ―min длина‖, выводимое зна-

1

 

 

 

 

x

шестнадцатер.

чение добавляется слева нулями.

 

 

(abcdef)

Значение не сжимается, когда чис-

 

 

 

 

 

X

шестнадцатер.

ло цифр превышает ―min длина‖.

 

 

(ABCDEF)

 

 

 

 

 

 

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

е

Со знаком,

 

 

[-]d.dde[-|+]dd

Задает число цифр, которые будут

 

f

 

 

 

 

 

Е

Со знаком,

напечатаны после десятичной точ-

6

 

[-]d.ddE[-|+]dd

ки. Последняя напечатанная цифра

 

 

 

 

 

Со знаком,

округляется.

 

 

 

[-]ddd.dddd

 

 

симв

c

Одиночный

——

——

символ

 

 

 

 

строка

 

Строка

Задает максимальное число сим-

До символа

s

волов, которые будут напечатаны.

конца стро-

 

 

символов

 

 

Лишние символы не печатаются.

ки ('\0').

 

 

 

Приведем несколько фрагментов программ. Выводятся целые числа:

int a=45;

printf("a=%3d\n%5d+%d=%d\n", a, a, 35, a+35); /* writeln('a=',a:3);

writeln(a:5,'+',35,'=',a+35); */

На экран будет выведено:

a= 45 45+35=80

Выводятся действительные числа:

float pi= 3.1415926535; printf("pi=%.10f\n%f+%d=%e\n",pi,pi,35,pi+35);

76

Приложение 1. Стандартные заголовочные файлы

77

 

 

На экран будет выведено:

pi=3.1415927410

3.141593+35=3.814159e+01

Следует обратить внимание на то, что при выводе числа pi, равного 3.1415926535, на экран выдается значение 3.1415927410. Это связано с недостаточной в данном случае точностью, обеспечиваемой типом float. Для увеличения точности будем использовать тип double.

double pi= 3.1415926535; printf("pi =%.10f\n%f+%d=%E\n",

pi, pi, 35, pi+35);

На экран будет выведено:

pi=3.1415926535

3.141593+35=3.814159E+01

Следует обратить внимание на то, что длинные (long) и короткие (short) целые нельзя вывести, используя конструкции типа %d, для этих целей используются флаги l и h соответственно.

long int a= 319415; printf("a=%ld\n%ld+%d=%ld\n", a, a, 35, a+35);

На экран будет выведено:

a=319415

319415+35=319450

В третьем случае число 35 воспринимается компилятором как число типа int.

Функция printf возвращает значение типа int, равное числу напечатанных символов.

Форматный ввод (scanf)

Форматный ввод осуществляется функцией scanf.

scanf( <строка> [, <аргумент>...

] );

―Строка‖, как и для printf, является управляющей строкой, в которой задаются спецификации форматов вводимых значений. Рас-

77

78

Си и Си++

 

 

смотрим самый простой случай ввода целого числа.

int a;

 

scanf("%d",&a);

/* read(a); */

Заметим, что здесь символ ―&‖ означает передачу параметров по адресу (см. Передача параметров функции по адресу). Здесь нет никаких сложностей, просто операция ―&‖ ставится перед идентификатором любой вводимой переменной, кроме символьной строки.

Если требуется ввести несколько чисел, то их можно ввести за один вызов функции:

int a,b;

scanf("%d %d",&a,&b);

Пробельные символы в ―строке‖ игнорируются, а при вводе признаком разделения двух чисел служат пробельные символы, т.е. при вводе после введения значения переменной a можно нажать ―пробел‖, а можно ―Enter‖, результат ввода будет одинаков.

Печатные символы — все прочие ASCII-символы, за исключением символа процента ―%‖. Если печатные символы встречаются в ―строке‖, то из потока ввода считываются символы, которые не участвуют в выработке присваиваемых переменным значений, но которые должны соответствовать печатным символам, встретившимся в ―строке‖. Если последовательность печатных символов из потока ввода не соответствует последовательности печатных символов в ―строке‖, работа функции scanf завершается. Например:

scanf("%dabc%d",&a,&b);

Введем следующую строку:

45abc76

результатом будет a=45 и b=76, а если ввести:

45art76

результатом будет a=45, а переменная b не изменит своего значения, в частности, если ее значение не было определено, то оно и после ―ввода‖ останется неопределенным.

Обычно спецификация формата для функции scanf имеет следующий вид:

%[<длина>][h|l]<тип>

78

Приложение 1. Стандартные заголовочные файлы

79

 

 

Спецификация ―длина‖ является положительным десятичным целым, определяющим максимальное число символов, которые будут прочитаны из потока stdin согласно текущему описанию формата ввода элемента. Считываются и участвуют в получении значения не более чем ―длина‖ символов. Может быть прочитано меньше, чем ―длина‖ символов, если пробельный символ или символ, который не может быть преобразован согласно заданному формату, встретится раньше.

Функция scanf возвращает значение типа int, равное числу полей, которые были успешно присвоены.

Функции getchar и putchar

Самый простой механизм ввода заключается в чтении по одному символу за раз, обычно с терминала пользователя, с помощью функции getchar. Функция getchar при каждом обращении к ней возвращает следующий вводимый символ. Вывод можно осуществлять с помощью функции putchar, помещающей символ в поток стандартного вывода, который по умолчанию является терминалом. Часто вместо этих функций применяют функции getch и putch, прототипы которых находятся в заголовочном файле conio.h.

П1.2 Функции ввода/вывода

с консольного терминала (conio.h)

Функции ввода/вывода для консольного терминала выделены в отдельную группу, потому что они используют специфические особенности компьютера IBM PC и не являются переносимыми на другие типы компьютеров.

Функция

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

cgets

чтение строки с консоли

cprintf

вывод на консольный терминал по формату

cputs

вывод строки на консольный терминал

getch

чтение символа с консоли

getche

чтение символа с консоли c эхопечатью

cscanf

чтение с консоли по формату

kbhit

проверка нажатия клавиши на консоли

putch

вывод символа на консольный терминал

window

создание окна заданного размера и определенного местополо-

 

жения

clrscr

очистка активного окна

79

80

Си и Си++

 

 

 

 

 

 

 

gotoxy

позиционирование курсора

 

wherex

возвращает x координату курсора

 

wherey

возвращают y координату курсора

 

textcolor

изменяет цвет выдаваемого текста

Функции getch, getche, cgets, cscanf, cprintf, cputs и putch работают почти так же, как соответствующие функции в потоковом вводе/выводе, за тем исключением, что связаны с активным окном.

Прототипы данных функций содержатся в файле conio.h.

П1.3 Работа со строками (string.h)

Для работы со строками существуют следующие библиотечные функции:

Функция

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

strcat

конкатенация (склеивание) строк

strchr

поиск первого вхождения заданного символа в строку

strcmp

сравнение двух строк

strcpy

копирование одной строки в другую

strdup

дублирование строки

stricmp

сравнение двух строк, считая символы нижнего и верхнего реги-

 

стров эквивалентными

strlen

вычисление длины строки

strlwr

приведение латинских букв строки в нижний регистр (пропис-

 

ные буквы)

strncat

добавление n символов в строку

strncmp

сравнение n символов в двух строках

strncpy

копирование n символов из одной строки в другую

strnicmp

сравнение n символов двух строк

strnset

присваивание n символам в строке заданного значения

strrchr

поиск последнего вхождения заданного символа в строке

strrev

инвертирование (переворачивание) строки

strset

присваивание всем символам строки заданного значения

strstr

поиск первой подстановки одной строки (более короткой) в дру-

 

гой

strupr

приведение латинских букв строки в верхний регистр (заглавные

 

буквы)

Прототипы данных функций содержатся в файле string.h. Все функции работают со строками, завершающимися нулевым байтом

'\0'.

80