- •Введение
- •Глава 1. Основы.
- •Int main()
- •1.2. Методика создания программ в Microsoft Visual Studio.
- •Void main(){
- •1.3. Ввод-вывод.
- •1.4. Переменные и константы.
- •Int I; // объявление целочисленной переменной
- •42 // Десятичная константа
- •0X42 // шестнадцатеричная константа, начинается с 0х
- •042 // Восьмеричная константа, начинается с 0
- •1.5. Арифметические операции.
- •Void main()
- •1.6. Встроенные функции. Математические функции. Состав math.H.
- •Void main()
- •Int rand(void); // функция используется без аргумента
- •Глава 2. Операторы и выражения.
- •2.1. Логические выражения и операторы
- •2.1.1. Оператор if else
- •If (условие)
- •If (условие)
- •2.1.2. Конструкция if else if
- •Int number;
- •Int number;
- •2.1.3. Условный оператор.
- •2.1.4. Оператор switch.
- •Int dvalue;
- •2.2. Операторы цикла.
- •2.2.1. Оператор for
- •Void main()
- •Int I; // создаем переменную цикла
- •Void main()
- •Int I; // переменную цикла можно определить и вне цикла
- •2.2.2. Изменение шага цикла
- •Void main()
- •2.2.3. Цикл while.
- •2.2.4. Цикл do while
- •Void main()
- •2.3. Операторы break и continue
- •Void main()
- •Void main()
- •2.4. Типичные ошибки при использовании операторов цикла
- •Глава 3. Производные типы данных.
- •3.1. Ссылки и указатели.
- •Int test; // объявили целочисленную переменную
- •Int & s_test; // ошибка! ссылка не связана с переменной
- •Int *p1; // объявлен указатель на целое с именем p1
- •3.2. Массивы и строки.
- •Int z[10]; //массив из 10 целых чисел
- •Int ar[3]; // объявлен целочисленный массив из 3 элементов
- •Int varr[4]; // объявление массива
- •3.2.2. Многомерные массивы.
- •Int z[3][4]; //массив из 12 целых чисел
- •3.2.3. Строки
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •If(strstr(st,st2)) //если подстрока встречается, выводим
- •3.1.5. Динамическое определение одномерных массивов.
- •3.1.6. Динамические двумерные массивы.
- •3.1.7. Указатели, массивы и арифметика указателей.
- •Int tacs[3];
- •Void main()
- •3.2. Структуры
- •Int age; // элементы структуры
- •Int hours;
- •Int mins;
- •Void main()
- •Int hours;
- •Int mins;
- •Void main()
- •4. Функции, определяемые пользователем
- •4.1. Объявление и определение функции
- •Int max(int , int ); // в прототипе достаточно указать только тип и
- •Void main() {
- •Int MyRand(){
- •Int func(){ return 1;} // правильное выражение
- •Int func2(){return 0.146;} // неправильно, 0.146 преобразуется к int с
- •Void swap(int p, int q)
- •Int bigger(int a,int b)
- •4.2. Передача параметров функций
- •5. Заголовочные файлы.
- •6. Работа с файлами
- •6.1 Простой файловый ввод/вывод
- •6.2 Тонкости работы с файлами
- •7.1. Определение классов.
- •Void main()
- •7.2. Как объявлять функции класса?
- •7.3. Конструкторы и деструкторы классов.
- •8. Графика OpenGl.
- •Void callback Draw()
- •Void main()
- •8.1. Создание анимации с помощью библиотеки xgl
- •Приложения Управление выводом
- •Управление шириной вывода
6.2 Тонкости работы с файлами
Открывая файл на чтение, мы подразумеваем, что файл реально существует и находится в текущей папке с проектом (если мы запускаем программу из Visual Studio) или в папке с exe-файлом программы (если программа запускается вне Visual Studio).
Помните – в имя файла можно включать и путь к нему, если это, конечно, нужно. Например: “c:\tmp|test.txt”
А что произойдет, если файл по указанному пути не найден? В приведенных выше примерах, объявленные на чтение файлы будут созданы пустыми, а значения переменных, которые из него считываются – неопределенными. В результате при выполнении программы возникнет ошибка. Поможет предотвратить эту ситуацию использование функции is_open(). Функция возвращает значение TRUE, если файл был корректно открыт и FALSE в противном случае1. Вот как можно улучшить код чтения из файла, добавив проверку:
fstream fin("test.txt",ios::in);
if(!fin.is_open()) // если файл не открыт…
{
cout<<”Ошибка открытия файла”<<endl;
return; // окончание работы программы
}
Пока мы ограничивались случаями только чтения (in) или только записи (out) из/в файлы. А как быть в других случаях, например, добавления данных в конец файла? В таблице 6.1 приведены константы режимов работы с файлом.
Таблица 6.1. Константы режимов работы с файлами.
Константа |
Значение |
ios::in |
Открыть файл для чтения |
ios::out |
Открыть файл для записи |
ios::ate |
Переместить указатель в конец файла |
ios::app |
Добавлять информацию к концу файла |
ios::trunc |
Содержимое существующего файла удаляется |
ios::binary |
Двоичный файл |
Комбинация режимов чтения/записи создается при помощи оператора | (или):
ios::in|ios::out |
Открыть файл для чтения и записи |
ios::out|ios::app |
Открыть файл для записи, но только для добавления |
Очевидно, есть множество комбинаций режимов. Некоторые комбинации недопустимы: ios::in|ios::trunc - нельзя открыть файл для чтения, удалив его содержимое.
7. Классы в C++.
7.1. Определение классов.
Одним из основных отличий C++ от С является концепция классов. Классы похожи на структуры, но структура описывает только данные, связанные с ней, или свойства. Например:
#include <iostream.h>
// объявление структуры:
struct circle { int radius; int color; };
Void main()
{
circle MyCircle; // переменная типа circle MyCircle.radius = 18; // свойство окружности ‑ радиус MyCircle.color = 255; // свойство цвет cout<< MyCircle.radius<< MyCircle.color;
}
Класс в C++ имеет как ассоциированные с ним свойства, так и функции (методы), которые выполняют некоторые действия. Например, вывода окружности на экран. Следовательно, в программе, которая использует объект MyCircle класса circle, можно написать следующий код:
MyCircle.radius = 20; MyCircle.color = 255; MyCircle.DisplayCircle() ;
Имя класса, согласно общепринятому, но не обязательному правилу, начинается с заглавной буквы.
Первые два оператора присваивают значения свойствам radius и color объекта MyCircle, а третий ‑ вызывает функцию DisplayCircle(). Перед тем как работать с классом, его следует объявить. Вот возможное объявление класса Сircle:
class Circle {
public:
Circle () ; // конструктор
void SetRadius(void) ; // прототипы функций классов (методов)
void GetRadius(void) ;
~Circle () ; // деструктор
private:
void CalculateArea(void); // прототип функции класса (метода) int radius;
int color;
}; // не забывайте про точку с запятой!
Ключевое слово class показывает компилятору, что все находящееся в фигурных скобках принадлежит объявлению класса. Объявление класса содержит объявление элементов данных (например, int radius) и прототипы функций ‑ элементов класса. В объявлении класса Circle содержатся следующие элементы данных:
int radius; int color;
Объявление также содержит пять прототипов функций-элементов:
Circle();
void SetRadius(void) ; void GetRadius(void) ; ~Circle () ; void CalculateArea(void);
Первый и четвертый прототипы выглядят странно. Первый из них является прототипом функции конструктора1:
Circle();
а другой – деструктора:
~Circle ();
Обратите внимание на символ тильды (~), который предшествует прототипу функции деструктора.
Запомните синтаксические правила для конструктора:
каждое объявление класса должно включать прототип функции конструктора;
имя функции конструктора должно совпадать с именем класса, а после него должны следовать круглые скобки;
не упоминайте никакого возвращаемого значения для функции конструктора (функция конструктора должна иметь тип void, но не нужно это указывать.);
функция конструктора должна располагаться под ключевым словом public.
и деструктора:
имя функции деструктора должно совпадать с именем класса и ему должен предшествовать символ ~;
не указывайте никакого возвращаемого значения для функции деструктора;
функция деструктора не имеет никаких параметров;
Прототипы функций и объявления элементов данных включаются в объявлении класса в разделы public (открытый) или private (закрытый). Ключевые слова public и private говорят компилятору о доступности элементов-функций и данных. Например, функция SetRadius() определена в разделе public, и это означает, что любая функция программы может вызвать функцию SetRadius(). Функция CalculateArea() определена в разделе private, и эту функцию можно вызвать только в коде функций-элементов класса Circle.
Аналогично, поскольку элемент данных radius объявлен в разделе private, прямой доступ к нему (для установки или чтения его значения) возможен только в коде функций-элементов класса Circle.
После того, как в программе дано определение класса, можно объявить и другой объект, класса Circle, например, с именем HerCircle. Делается это так:
Circle HerCircle;
Следующие операторы присваивают значения элементам данных HerCircle - radius и color:
HerCircle.radius = 30; HerCircle.color = 0;
HerCircle.DisplayCircle(); // рисование окружности.