- •ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ С И С++
- •СОДЕРЖАНИЕ
- •ВВЕДЕНИЕ
- •1. ЛЕКСИКА ЯЗЫКА C
- •1.1. РАЗДЕЛИТЕЛИ
- •1.2. КОММЕНТАРИИ
- •2. ДАННЫЕ И ОПЕРАЦИИ
- •2.1. БАЗОВЫЕ ТИПЫ ДАННЫХ
- •Наименование
- •Диапазон
- •2.2. КОНСТАНТЫ
- •Целые константы
- •Константы с плавающей точкой
- •Символьные константы
- •2.3. ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХ И ТИПИЗИРОВАННЫХ КОНСТАНТ
- •2.4. ОДНОМЕРНЫЙ МАССИВ
- •2.5. СТРОКИ, СТРОКОВЫЕ КОНСТАНТЫ
- •2.6. УКАЗАТЕЛИ
- •2.7. ПЕРЕИМЕНОВАНИЯ ТИПОВ
- •2.8. СТРУКТУРЫ
- •2.9. МАССИВЫ СТРУКТУР
- •2.10. МНОГОМЕРНЫЕ МАССИВЫ
- •2.11. ОБЪЕДИНЕНИЕ
- •2.12. ПЕРЕЧИСЛЕНИЕ
- •2.13. БИТОВОЕ ПОЛЕ ( ЗАПИСЬ )
- •3. ОПЕРАЦИИ И ВЫРАЖЕНИЯ
- •3.1. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
- •3.2. ОПЕРАЦИИ СРАВНЕНИЯ
- •3.3. ЛОГИЧЕСКИЕ ОПЕРАЦИИ
- •3.4. ПОБИТОВЫЕ (ПОРАЗРЯДНЫЕ) ОПЕРАЦИИ
- •3.5. ОПЕРАЦИИ ПРИСВАИВАНИЯ
- •3.6. АДРЕСНЫЕ ОПЕРАЦИИ
- •3.7. ДОСТУП К ПОЛЯМ СТРУКТУР, ОБЪЕДИНЕНИЙ И ЗАПИСЕЙ
- •3.8. ДРУГИЕ ОПЕРАЦИИ
- •3.9. ПОРЯДОК ВЫПОЛНЕНИЯ ОПЕРАЦИЙ В ВЫРАЖЕНИИ
- •4. ОПЕРАТОРЫ
- •4.1. ОПЕРАТОР-ВЫРАЖЕНИЕ
- •4.2. ПУСТОЙ ОПЕРАТОР
- •4.3. СОСТАВНОЙ ОПЕРАТОР
- •4.4. УСЛОВНЫЕ ОПЕРАТОРЫ
- •4.5. ОПЕРАТОРЫ ЦИКЛА
- •while( выражение) оператор;
- •do оператор while ( выражение );
- •for( выражение1; выражение2; выражение3 ) оператор;
- •4.6. ОПЕРАТОРЫ ПЕРЕХОДА
- •break;
- •switch
- •continue;
- •goto метка;
- •5. ФУНКЦИИ. КЛАССЫ ПАМЯТИ
- •5.1. ФУНКЦИИ
- •5.2. КЛАССЫ ПАМЯТИ
- •класс памяти
- •ключевое слово
- •существование
- •видимость
- •5.3. ВОЗВРАЩЕНИЕ ЗНАЧЕНИЙ
- •5.4. АРГУМЕНТЫ ФУНКЦИИ
- •6. ФУНКЦИИ ВВОДА С КЛАВИАТУРЫ И ВЫВОДА НА ДИСПЛЕЙ
- •6.1. ФОРМАТИРОВАННЫЙ ВЫВОД
- •6.2. ФОРМАТИРОВАННЫЙ ВВОД
- •6.3. ВВОД СТРОКИ
- •6.4. ВЫВОД СТРОКИ
- •6.5. ВВОД СИМВОЛА
- •6.6. ВЫВОД СИМВОЛА
- •7. ПРЕПРОЦЕССОР
- •7.1. ВКЛЮЧЕНИЕ ФАЙЛОВ
- •7.2. ВЫПОЛНЕНИЕ ПОДСТАНОВОК
- •7.3. УСЛОВНАЯ КОМПИЛЯЦИЯ
- •8. ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ, СПИСКИ
- •8.1. ВЫДЕЛЕНИЕ И ОСВОБОЖДЕНИЕ ДИНАМИЧЕСКОЙ ПАМЯТИ
- •8.2. СПИСКИ
- •Рис.1. Структура однонаправленного линейного списка
- •9. ФАЙЛЫ
- •9.1. ОТКРЫТИЕ И ЗАКРЫТИЕ ФАЙЛОВ
- •9.2. ЧТЕНИЕ И ЗАПИСЬ В ФАЙЛ
- •9.3. ПРОИЗВОЛЬНЫЙ ДОСТУП К ФАЙЛУ
- •10. ЛАБОРАТОРНЫЕ РАБОТЫ
- •10.1. МАССИВЫ И СИМВОЛЬНЫЕ СТРОКИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.2. ФУНКЦИИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.3. СТРУКТУРЫ И МАССИВЫ СТРУКТУР
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.4. ДИНАМИЧЕСКОЕ РАСПРЕДЕЛЕНИЕ ПАМЯТИ, СПИСКИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •10.5. РАБОТА С ФАЙЛАМИ
- •Цель работы
- •Пример выполнения работы
- •Варианты заданий
- •11. ВВЕДЕНИЕ В C++
- •12. КЛАССЫ
- •12.1. ОБЩИЕ ПОЛОЖЕНИЯ
- •12.2. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ
- •12.3. СОЗДАНИЕ И ВЫЗОВ ОБЪЕКТОВ
- •12.4. ДРУЖЕСТВЕННЫЕ ФУНКЦИИ
- •12.5. ПЕPЕГPУЖЕННЫЕ ОПЕPАЦИИ И ФУНКЦИИ
- •12.6. ПАРАМЕТРИЗИРОВАННЫЕ КЛАССЫ
- •12.7. ПРЕОБРАЗОВАНИЕ ТИПОВ
- •12.8. СТАТИЧЕСКИЕ КОМПОНЕНТЫ КЛАССА
- •13. ПРОИЗВОДНЫЕ КЛАССЫ, НАСЛЕДОВАНИЕ
- •13.1. ИЕРАРХИЯ КЛАССОВ
- •13.2. ДОСТУП К НАСЛЕДУЕМЫМ КОМПОНЕНТАМ
- •Доступ в базовом классе
- •Модификатор доступа
- •14. ВИРТУАЛЬНЫЕ ФУНКЦИИ
- •14.1. ОБЩИЕ ПОЛОЖЕНИЯ
- •14.2. ВИРТУАЛЬНЫЕ ДЕСТРУКТОРЫ
- •14.3. АБСТРАКТНЫЕ КЛАССЫ
- •15.1. ВЫВОД ДАННЫХ
- •15.2. ВВОД ДАННЫХ
- •15.3. ВВОД-ВЫВОД ДАННЫХ, ОПРЕДЕЛЕННЫХ ПОЛЬЗОВАТЕЛЕМ
- •15.4. РАБОТА С ДИСКОВЫМИ ФАЙЛАМИ
- •15.5. ОБРАБОТКА ИСКЛЮЧЕНИЙ
- •ЛИТЕРАТУРА
– 53 –
При выполнении программы в случае выхода индекса массива за объявленный диапазон появляется соответствующее сообщение.
15.2. ВВОД ДАННЫХ
Перегруженная операция >> в классе iostream обеспечивает стандартный ввод и называется извлечением. Как и операция вставки, операция >> действует аналогично соответствующему оператору языка C (scanf), но не требует указаний форматов ввода.
int i; double d; cin>>i>>d;
Левые пробелы, встречающиеся при вводе строковых значений, пропускаются; ввод идет до первого пробела справа, после чего добавляется символ завершения строки. Если при вводе строки пробелы считаются ее частью, то следует воспользоваться функцией cin.read(arg,n), которая вводит n символов. Функция get вводит одиночный символ.
15.3. ВВОД-ВЫВОД ДАННЫХ, ОПРЕДЕЛЕННЫХ ПОЛЬЗОВАТЕЛЕМ
Вставки и извлечения могут переопределяться для классов (типов), введенных пользователем. Так как они возвращают ссылку на тип собственного класса, то формат перегруженных операций следующий:
istream& operator >>(istream& s, cсылка_на_тип) ostream& operator <<(ostream& s, cсылка_на_тип)
Пример для класса комплексных чисел: class Complex { double re, im;
........
friend istream& operator>>(istream&, Complex&); friend ostream& operator<<(ostream&, Complex&);
........
};
istream& operator>>(istream& s, Complex& t) { double a,b;
s>>a>>b; t.re=a; t.im=b; return s;
}
ostream& operator<<(ostream& s, Complex& t) { double a,b;
s<<t.re<<","<<t.im<<"\n"; return s;
}
}
15.4. РАБОТА С ДИСКОВЫМИ ФАЙЛАМИ
Для действий с дисковыми файлами используются 2 заголовочных файла ofstream.h и ifstream.h или один – fstream.h.
Последовательность действий следующая.
Объявляются объекты (потоки) входного и выходного типа: ifstream f1; ofstream f2;
Файлы открываются на ввод или вывод функцией-компонентой open(имя_файла, аргументы_открытия);
Вкачестве аргументов открытия используются следующие опции:
•ios::app – добавление данных в файл;
•ios::ate – поиск конца файла;
•ios::in – открытие на ввод;
•ios::out – открытие на вывод;
•ios::trunc – уничтожение содержимого, если файл существует;
•ios::nocreate – отказ от создания файла.
Функция open(...) создает буфер ввода и связывает физический поток с буфером.
© 1998 Калачев Д.П., Лутай В.Н.
– 54 –
Функция seekg(int k, аргументы_режима) позволяет устанавливать указатель файла на любую позицию. Аргументы режима могут быть следующие:
•ios::beg – указатель устанавливается на k позиций от начала;
•ios:: end – указатель устанавливается на k позиций от конца;
•ios::cur – перемещается на k позиций к концу.
После окончания работы файлы закрываются функцией close(). Пример программы копирования файлов:
#include <iostream.h> #include <process.h> #include <fstream.h>
void error (char* p) {cerr<<p<<endl; exit (-1);} void main(int argc,char*argv[]) {
ifstream S; ofstream D;
S.open(argv[1],ios::nocreate);
if(!S) error("Не могу открыть файл для ввода"); D.open(argv[2]);
if(!D) error("Не могу открыть файл для вывода”); char ch;
while(S.get(ch)) D.put(ch);
if( !S.eof() && !D.bad() ) error("Несчастный случай"); S.close();
D.close();
}
Переменные S и D принимают значение «ложь» в одном из двух случаев: если достигнут конец файла (это проверяет метод eof()), или в результате сбоя в файле – bad(). Кроме того, S=0, если файл не может быть открыт.
15.5. ОБРАБОТКА ИСКЛЮЧЕНИЙ
Под исключением понимается некоторая ситуация, возникающая при выполнении программы, вследствие появления которой нормальное продолжение программы невозможно. Дальнейшее выполнение программы определяется программистом на этапе проектирования программы и носит название обработки исключения. К исключительным ситуациям относятся и ошибки выполнения.
Выше были приведены программы с использованием потока error. Исключительные ситуации возникали при выходе индекса за пределы массива или в результате дефектов в дисковых файлах. Обработка заключается в генерировании соответствующего сообщения и приостановке программы.
В последней версии С++ введен специальный механизм обработки исключений. Работу этого механизма для обнаружения выхода индекса за пределы массива рассмотрим на примере уже рассмотренного и несколько упрощенного класса String. Ключевые слова, относящиеся к механизму обработки исключения, выделены курсивом.
class String{ char *charPtr; int length;
public:
String(int size=80){ // Конструктор
length=size; charPtr=new char[length + 1]; *charPtr =‘\0’;} ~String(){delete charPtr;};
class range { }; // Локальный класс - индикатор исключения char& operator[](int);
};
char& String::operator [] (int i) {
if (i<0 || this->length<i) throw range(); // Генерация исключения
© 1998 Калачев Д.П., Лутай В.Н.