- •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)Ввод-вывод файлов
- •Выбор компонентов для групповых операций
- •Установка разделяемых свойств компонентов
- •Изменение размера компонентов
- •Выравнивание компонентов
- •Пример: Создание текстового редактора Проектирование формы приложения
- •Создание обработчиков событий
- •Создание меню
Использование указателей в функциях и указатели на функции
Параметрами функций могут быть не только переменные базового типа, но и массивы. Как известно размер массива должен быть определен до его использования. Поэтому, в функциях используются массивы с явным заданием размера, либо с параметрами несущими информацию о размере. Следует запомнить, что если формальными параметрами функции являются массивы, то аргументы передаются в виде указателей.
Рассмотрим задачу умножения двух векторов.
#include <iostream>
#include <windows.h>
using namespace std;
double multVect(int n,double x[],double y[]){/*скалярное произведение*/
double z=0;
for(int i=0;i<n;i++) z=z+x[i]*y[i];
return z;
}
void main(){
SetConsoleOutputCP(1251);
double u[]={1.0, 2.0, 3.0}, v[]={4.0, 5.0, 6.0};
cout<<”Произведение векторов=”<<multVect(3,u,v);
}
Иногда возвращаемое значение функции должно быть указателем. Рассмотрим программу на примере объединения массивов.
#include <iostream>
#include <windows.h>
using namespace std;
//объявляем и описываем фунцию
double *connectVect(int n, double* x, int m, double* y){ int i;
double *z=new double[n+m]; //выделяем память
for(i=0;i<n;i++) z[i]=x[i]; //заносим в память
for(i=n;i<n+m;i++) z[i]=y[i-n];
return z;
}
void main(){
SetConsoleOutputCP(1251);
double u[]={1.0, 2.0, 3.0}, v[]={4.0, 5.0, 6.0, 7.0, 8.0}, *w;
w=connectVect(3,u,5,v);
cout<<"Объединение массивов"<<endl;
for(int i=0;i<8;i++)
cout<<w[i]<<endl;
}
Любая функция представляет собой код с определенным именем. Для размещения функции компилятор языка С++ находит в памяти подходящий объем свободных ячеек с непрерывными адресами и записывает этот код в память последовательно занимая её свободные ячейки. Указателем на начало кода является имя функции, а его значением служит адрес первой ячейки, занимаемый кодом функции. Тип указателя определяется типом возвращаемого значения. Раз так, то возникает вопрос: нельзя ли вызвать функцию используя указатель? Ответ очень простой: можно. Для этого адрес начала кода функции должен быть присвоен новому указателю, который можно использовать для вызова функции. Конечно этот новый указатель должен иметь тот же тип, что и возвращаемое значение функции. Более того, сигнатура нового указателя должна быть такой же как у функции. Ведь функция в общем случае потребует передачи значений своих параметров. Иными словами синтаксис объявления указателя на функцию должен быть таким
тип_функции (*имя_указателя)(список_спецификаций_параметров);
Например, указатель функции предназначенный для умножения двух целых чисел должен иметь вид:
int (*multiplay)(int, int);
Обратите внимание, что имя указателя записывается в круглых скобках, в противном случае компилятор поймет его как прототип функции multiplay, которая возвращает значение указателя типа int.
В качестве примера вновь запишем программу для произведения векторов.
#include <iostream>
#include <windows.h>
using namespace std;
double multVect(int n,double x[],double y[]){/*объявление функции*/
double z=0;
for(int i=0;i<n;i++) z=z+x[i]*y[i];
return z;
}
//--------------------------------------
void main(){
SetConsoleOutputCP(1251);
double u[]={1.0, 2.0, 3.0}, v[]={4.0, 5.0, 6.0};
double (*ptrFun)(int, double[], double[]); /*объявление указателя с именем ptrFun */
ptrFun=multVect; /*в новый указатель записывается адрес функции */
cout<<"Произведение векторов="<<ptrFun(3,u,v)<<endl;
cout<<"Произведение векторов="<<(ptrFun)(3,u,v)<<endl; /* При вызове функции через указатель его имя можно взять в скобки */
}
Функция main()
Теперь обратимся к функции main(). Этой функции передается управление после запуска программы. Она может не только возвращать значения о чем мы уже говорили, но и принимать параметры. Об этом мы сейчас расскажем подробнее.
Стандарт функции main() допуcкает два формата – без параметров,
тип main(){/*тело функции*/}
и с двумя параметрами
тип main(int argc, char* argv[]){/*тело функции*/}
Имена параметров в программе могут быть любыми, но общепринятыми являются argc и argv.
Первый параметр argc определяет количество аргументов, второй argv является указателем на массив указателей типа char.Каждый элемент массива это указатель на отдельный параметр командной строки, хранящейся в виде С-строки, оканчивающейся нуль-символом. Первый элемент массива argv[0] ссылается на полное имя запускаемого на выполнение файла, и поэтому количество элементов массива не может быть меньше 1. Следующий argv[1] указывает на первый параметр, argv[2] указывает на второй параметр и т.д. Параметр argv[argс] должен быть равен нулю.
Если функция main() выполнилась до конца, то вызвавшая ее система получит значение 0, означающее успешное завершение. Ненулевое значение означает аварийное завершение. Оператор возврата return из main() можно опускать. Вот простой пример, иллюстрирующий сказанное.
Наберите следующую программу.
#include<iostream.h>
#include<windows.h>
//#include<string.h>
int main(int argc,char* argv[]){
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
if(argc!=2){
cout<<"Вы забыли указать свое имя.\n";
exit(1);
}
cout<<"Привет!"<<argv[1];
return 0;
}
Откомпилируйте и сохраните ее под каким-нибудь именем. Если вы используете Builder, то для сохранения воспользуйтесь File/save All. Далее воспользуйтесь каким-нибудь файловым менеджером, например, Windows Commander, Far или Volkov Commander. Найдите свой файл. Пусть его имя будет Project2.exe, и запустите его. Если после запускаемого файла указать свое имя, то программа выведет приветствие