- •1.1. Что такое программа и как она выглядит?
- •1.2. Комментарии
- •1.3. Зарезервированные слова и типы данных
- •1.4. Объявление переменных
- •1.5. Операции и выражения
- •1.6. Ввод и вывод
- •1.7. Переменные и константы
- •1.8 Логические операторы
- •1.9. Управляющие операторы
- •1.10. Операторы циклов
- •1.11. Операторы перехода
- •2. Функции
- •2.1. Передача параметров
- •2.2. Библиотечные функции
- •2.3. Локальные и глобальные переменные
- •Объявления функций
- •Время жизни и область видимости программных объектов
- •Int local_var; /* по умолчанию auto */
- •2.4. Перегрузка
- •3. Массивы
- •4. Структуры
- •Int numberPeriod; //число переодов начисления процентов
- •Int page; //Количество страниц
- •Void print(); /*Внимание, записывается только прототип функции */
- •Int yearBorn; //год рождения
- •Int yearBorn; //год рождения
- •4.1. Демонстрационные программы
- •Int done;/*переменная, которая информирует о конце списка файлов */
- •6. Объединения
- •Info;//Обявление переменной типа объединение
- •Info;//Обявление переменной типа объединение
- •7. Объектно-ориентированное программирование
- •7.1. Классы и объекты
- •Демонстрационные программы
- •Результат работы программы
- •7.2. Конструкторы и деструкторы
- •Конструктор копирования
- •7.5. Наследование
- •7.3. Создание объектов и обращение к членам объекта
- •8. Абстрактные типы данных
- •9. Пространство имен
- •Void greeting();/*это пространство имен содержит функцию с тем же именем*/
- •Void big_greeting(); /*эта функция не попадает ни в одно из созданных подпространств,т.Е. Принадлежит пространству имен std */
- •//Определение функций
- •Void big_greeting() /* определение данной функции не принадлежит ни одному из созданных пространств имен, следовательно дальнейший код помещается в глобальное пространство имен */
- •10. Строки
- •4.3 Демонстрационные программы
- •4.10. Класс string
- •Класс AnsiString
- •Класс AnsiString
- •Класс Set
- •4.9. Перегрузка операторов
- •Использование "умных" указателей
- •4.8. Полиморфизм
- •Главное меню — компонент MainMenu
- •Диалоги
- •Файлы и потоки
- •Ввод-вывод в файл
- •Ifstream inStream; //Объявление входного потока
- •InStream.Open("character.Dat"); /*присоединение файла к входному потоку */
- •InStream.Close(); //закрытие входного потока
- •If(!out){ //при неудачной попытке
- •If(in.Fail()){ //поток не создан, то сообщение и выход
- •Управление потоком ввода-вывода
- •5.2. Ввод имен файлов
- •5.3. Манипуляторы
- •5. Указатели
- •5.1.Типы указателей и операции с указателями
- •Адресная арифметика
- •Сравнение указателей
- •Преобразование типа указателя
- •Указатель void
- •5.2. Динамические массивы
- •Int array[10]; //объявляется массив с именем array
- •Int a[10]; //объявляется массив с именем a
- •Int *array1; //указатель типа int с именем array1
- •Int *array[5];/*массив с именем array, его элементы указатели*/
- •Int (*point)[4][5]; /*объявление указателя на двумерный массив без имени */
- •Использование указателей в функциях и указатели на функции
- •Указатель классов
- •Шаблоны
- •Шаблоны функций
- •Void Swap (t& X, t& y) /* к моменту обращения тип т будет известен и заменен, например, на int */
- •Void sort(t array[], int maxIndex){ /*передали массив и его размер */
- •6.2. Шаблоны классов
- •6.3 Демонстрационные программы
- •7.1 Обработка исключений
- •Исключения и их стандартная обработка
- •Базовый класс исключений vcl Exception
- •Упражнения
- •Обработка исключительных ситуаций, возбуждаемых оператором new
- •Исходные файлы и объявление переменных
- •Связаные списки
- •Void newHead( //прототип функции создающей узел
- •Void newHead(//прототип функции создания узла
- •Поиск в связанных списках
- •Void newHead(PtrNode& head, //адрес головного узла
- •Директивы препроцессора.
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Особенности программирования под Windows.
- •Функция WinMain
- •Создание проекта Win32Application.
- •Библиотека mfc.
- •Создаем код
- •Шпаргалка
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Файл проекта
- •Введение
- •Свойства компонентов
- •События
- •Менеджер проектов
- •Пример: создание простейшего приложения
- •Графика Внедрение картинок
- •Редактор изображений
- •Классы для хранения графических объектов.
- •If (SelectDirectory( //Компонент библиотеки
- •Методы создания собственной графики. Рисование по пикселам
- •Int px, py; //координаты пикселей
- •Рисование с помощью пера
- •Int px, py; //координаты пикселей
- •Рисование кистью
- •Мультимедиа и анимация Общие сведения о звуковых и видеофайлах
- •Способы воспроизведения звуков
- •Создание мультфильма
- •Воспроизведение немых видео клипов — компонент Animate
- •Проигрыватель MediaPlayer
- •Процессы, потоки, распределенные приложения
- •If include "uOverlayl.H" // включение головного файла приложения
- •Функция CreateProcess
- •490 _ Глава 7
- •7.8.4 Элементы ActiveX
- •492 Глава 7
- •494 Глава 7
- •7.9 Компоненты-серверы сом
- •496 Глава 7
- •7.9.2 Свойства и методы сервера Word
- •500 Глава 7
- •Заключение
- •Что такое ansi?
- •Почему вместо русских букв в консольном приложении выводится мусор? Автор: Алексей Кирюшкин Версия текста: 1.0
- •Раздел I.2Выход 1
- •Раздел I.3Выход 2
- •Раздел I.4Выход 3
- •Раздел I.5Выход 4
- •(A)Потоки
- •(C)Ввод-вывод файлов
- •Выбор компонентов для групповых операций
- •Установка разделяемых свойств компонентов
- •Изменение размера компонентов
- •Выравнивание компонентов
- •Пример: Создание текстового редактора Проектирование формы приложения
- •Создание обработчиков событий
- •Создание меню
5.2. Динамические массивы
Под динамическим массивом понимают массив размер котрого определяется в процессе работы программы и неизвестен при ее написании. Создать такой массив с помощью указателей несложно, но прежде чем приступить к изучению динамических массивов, рассмотрим как резервируется память для обычного массива. При объявлении массива, например,
int array[10];
происходит следующее. Программа резервирует 10 смежных ячеек памяти, по 4 байта в каждой ячейке. Именно такое количество байтов необходимо для хранения числа типа int. Кроме того, компьютер запоминает адрес первого элемента массива array[0]. Этот адрес, как мы увидим позже, хранится в указателе, которым является имя массива. Адреса всех остальных элементов не запоминаются, а вычисляются относительно адреса array[0]. То есть
адрес второго элемента =адресу первого элемента +4,
адрес третьего элемента =адресу первого элемента +2*4,
и т.д.
Все это говорит о том, что имя массива, на самом деле, представляет собой переменную указатель, которая указывает на первый элемент массива array[0]. Чтобы убедиться в этом рассмотрим маленькую программу.
#include <iostream>
using namespace std;
typedef int* pointer; /*определение типа, т.е. далее указатель типа int можно объявлять как тип pointer*/
int main(){
Int array[10]; //объявляется массив с именем array
pointer point; //объявление указателя соответствующего типа
for(int i=0; i<10; i++){
array[i]=i; //заполнение массива целыми числами
cout<< array[i];
}
cout<<"\n";
point=array; //Значение одного указателя присваивается другому
for(int i=0; i<10; i++)
cout<< point[i];
return 0;
}
В результате выполнения программы получим следующее
0123456789
0123456789
После присвоения значения одного указателя другому, point указывает на тоже место в памяти, что и array. Значит point можно рассматривать как идентификатор массива, а array как указатель, что и подтверждают результаты выполнения программы.
Вот еще интересный пример, это фрагмент программы:
Int a[10]; //объявляется массив с именем a
int i;
for (i=0; i<10; i++) {
a[i] = i; //в массив записываются числа по порядку
cout<<i[a]; //выводятся элементы несуществующего массива
}
Вот результат
Этот пример говорит о том, что для С++ массивы a[i] и i[a] – это одно и тоже Точнее для С++ идентификаторы a[i] и i[a] это адреса, которые вычисляются как сумма адресов – адреса первой ячейки массива a и адреса сдвига i.
Теперь, наконец, обратимся к динамическим массивам. Динамические массивы создаются с помощью оператора new . Рассмотрим несколько примеров
//пример массива типа int
Int *array1; //указатель типа int с именем array1
array1=new int[10]; /* просим дать свободный адрес для
* массива из 10-ти элементов типа.
* int, т.к объявление размера массива
* должно быть проведено до его
* использования в программе */
// пример массива типа double
double *array2;
array2=new double[10];
// пример массива типа char
typeof char* dinamicArray;
dinamicArray array3;
array3=new char[10];
Вот пример программы в которой используются эти массивы.
#include <iostream>
# include<windows.h>
using namespace std;
int main(){
int n;
SetConsoleOutputCP(1251);
cout<<”Размер массива=”;
cin>>n;
int *array1;
array1=new int[n+2]; //создание массива int
for(int i=0; i<n+2; i++){ //цикл для заполнения массива
array1[i]=i; //заполнение массива целыми числами
cout<< array1[i];
}
cout<<endl;
double *array2;
array2=new double[n]; //создание массива double
for(int i=n-1; i>=0; i--){
array1[i]=i+0.0;
cout<< array1[i];
}
cout<<endl;
typedef char* dinamicArray;
dinamicArray array3=new char[n]; // объявление с
// инициализацией
for(int i=0; i<n; i++){
array1[i]=i;
cout<< array1[i];
}}
А вот результаты выполнения программы:
Многомерный массив в С++ рассматривается как массив массивов. Например,
int array[3][4][5];
можно рассматривать как массив из трех элементов, каждый из которых представляет собой двумерный массив 4×5. В памяти элементы массива размещаются в порядке возрастания правого индекса.
Динамические двумерные массивы создаются сложнее. Для их создания вводится указатель на указатель, и выделяется память под массив указателей на строки массива.
int **a=new int*[r]; //r- количество строк
Каждый из указателей, входящий в массив, является указателем на строку двумерного массива.
Далее организуется цикл для выделения памяти под каждую строку массива
for(int i=0; i<r;i++)
каждому элементу массива указателей на строки присваевается адрес начала участка памяти, выделенного под строку двумерного массива
a[i]=new int[c]; // с- количество столбцов
Пример в котором создается, заполняется динамический двумерный массив размерностью NxM и выводится на печать? После чего находятся номера отрицательных элементов каждой строки и каждого столбца.
#include <iostream.h>
#include <windows.h>
int main(int argc, char* argv[])
{
int n = 0; //Количество строк
int m = 0; //Количество столбцов
SetConsoleOutputCP(1251);
cout << "Введите n: ";
cin >> n;
cout << " Введите m: ";
cin >> m;
//Создаем массив указателей
int** arr=new int*[n];
for (int i=0; i<n; ++i)
arr[i]=new int[m];
//Заполняем массив
for (int i=0; i<n; ++i)
{
for (int j=0; j<m; ++j)
{
cout<<"arr["<<i<<"]["<<j<<"]=";
cin>>arr[i][j];
}
}
//Поиск отрицательных чисел в столбце
cout << "В столбце:\n";
//в следующем цикле объявлены 2 переменные !
for (int i=0, index=-1; i<m; ++i)
{
for (int j=0; j<n; ++j)
if(arr[j][i]<0) index=j;
if (index !=- 1) cout<<i<<") "<<index<<endl;
}
cout << "В строке:\n";
for (int i = 0, index=-1; i<m; ++i)
{
for (int j = 0; j<n; ++j)
if (arr[i][j]<0) index=j;
if (index != - 1) cout<<i<<") "<<index<<endl;
}
//Удаляем массив
//сначала удаляются указатели на столбцы
for (int i=0; i<n; ++i) delete [] arr[i];
//потом указатели на строки
delete [] arr;
_flushall(); //очистка всех буферов
char z;
cin>>z;return 0;
}
В языке С++ могут применяться массивы указателей. Объявление происходит точно также как и обычных массивов, например,