- •Методическое материалы по курсу
- •Cанкт-Петербург
- •Оглавление
- •Введение.
- •Задание: Разобраться в коде и вывести на консоль еще одну фразу: "It's a first program"
- •Типы данных и правила их применения:
- •Операции
- •Управляющие операторы
- •Оператор цикла do-while
- •Задание: в данном примере реализуйте операции умножения и деления Оператор цикла for (;;)
- •Задание: к примеру добавьте перегруженную функцию для суммирования чисел типа double, и проверьте ее работу
- •Модульная организация программы
- •Массивы
- •Задание: добавьте еще один элемент в массив при инициализации и посмотрите его размерность. В цикле увеличьте значение всех элементов массива на 10 и напечатайте его заново. Работа со строками
- •Ссылочный тип данных
- •Задание: Объявить еще одну переменную-ссылку на I и, изменив ее значение, пронаблюдать, как изменилось значение переменной I Работа с файлами
- •Взаимодействие с ассемблером
- •Обработка ошибок и исключений
- •Директивы препроцессора: Макросы и Условные директивы
- •Структуры
- •Задание : Добавить в сруктуру еще одно данное (стоимость модели) типа int, в коде функции main() задать значение этого данного переменной–структуры, и напечатать его.
- •Объектно-ориентированное программирование (ооп)
- •Терминология ооп
- •Структура как простейший класс
- •Конструкторы и деструкторы
- •Перегрузка методов класса
- •Дружественные функции и классы
- •Указатель this
- •Перегрузка операций
- •Множественное наследование
- •Если осталось время – разобраться в иерархии классов и принципов построения
- •Список литературы
Задание: добавьте еще один элемент в массив при инициализации и посмотрите его размерность. В цикле увеличьте значение всех элементов массива на 10 и напечатайте его заново. Работа со строками
Строки представленны как массив символов, заканчивающийся нулем (\0). Имя переменной-строки совпадает с адресом ее первого символа.
Для работы со строками имеется системная библиотека <string.h>, содержащая все необходимые функции, например:
strcpy – копирование строк
strcat – соединение строк
strlen – вычисление длины строки
strcmp – сравнение строк
(\19STRING)
#include <iostream>
#include <string.h> // Заголовок библиотеки для работы со строками
using namespace std;
int main ()
{
char sz1[21]; // Резервирование места для строки из 20 символов
char sz2[5] = "ship"; // Объявление и инициализация строки
char sz3[6] = {'p','l','a','n','e','\0'}; // Еще один вариант
char sz4[] = "truck"; // Инициализация без задания размера
char sz5[4];
sz5[0] = 'c'; // Заполнение содержания строки посимвольно
sz5[1] = 'a';
sz5[2] = 'r';
sz5[3] = '\0';
cout << "Enter a string : " ; // Приглашение на ввод строки
cin >> sz1; // Считывание строки
// Вывод всех строк
cout << sz1 << endl << sz2 << endl << sz3 << endl << sz4 << endl << sz5 << endl;
strcpy(sz1, "Hello"); // Копирование строки в sz1
cout << sz1 << endl;
strcat(sz1, ", world!"); // Соединение строк
cout << sz1 << endl;
int ilen = strlen(sz1); // Вычисление длины строки
cout << "length sz1 = " << ilen << endl;
switch (strcmp(sz1, sz2)) { // Сравнение строк sz1 и sz2
case 0: cout << "sz1 is equal sz2" << endl; // Строки равны
break;
case 1: cout << "sz1 is greater than s2" << endl; // sz1 больше
break;
case -1: cout << "sz2 is greater than s1" << endl; // sz2 больше
break;
}
return(0);
}
Задание: Объявить строковую переменную, которая может содержать до 10 символов, спросить пользователя ввести в нее значение, напечатать ее, найти ее длину. Добавить к строке строковую константу " !" и напечатать ее.
Указатели и выделение памяти
При объявлении обычной переменной в месте ее обявления (по этому адресу) хранится ее реальное значение. Указатель – это ссылка на адрес, где храниться переменная. Указатель обозначается звездочкой (*) перед именем переменной.
int *pi; // объявление указателя на целое значение
Для инициализации указателя ему нужно присвоить адрес реальной переменной, адрес переменной можно получить через операцию получения адреса (&). Неинициализированный указатель может ссылаться на что угодно и его использовать нельзя.
pi = &i; // инициализировать указатель адресом переменной i
Использовать значение переменной по указателю можно разыменовав его (операция *)
cout << "*pi = " << *pi << endl; // Считать значение по указателю
Изменить значение переменной по указателю можно:
*pi = 11; // Присвоение значения переменной по указателю
Если объявлять массив переменных, то память для него резервируется для всех элементов, если неизвестно, сколько элементов будет в нем содержаться, то эффективней динамически резервировать память для нужного числа элементов.
В C++ используются операторы new и delete для выделения и освобождения блока памяти под элемент или массив элементов (malloс и free – в С)
Параметром new является выражение, определяющее число выделяемых байт, а возвращаемым значением - указатель на начало блока памяти или 0
Параметром delete является указатель на начало блока памяти
(\20NEWDEL)
#include <iostream>
using namespace std;
#define NULL 0 // Объявление констант
#define ISIZE 512
int main()
{
int i = 1, j = 2; // Объявление двух переменных целого типа
cout << "i = " << i << " j = " << j << endl; // Печать значений переменных
int *pi; // Объявление указателя на целое число
pi = &i; // инициализировать указатель адресом переменной i
cout << "*pi = " << *pi << endl; // Считать значение по указателю
*pi = 11; // Присвоение значения переменной по указателю
cout << "i = " << i << endl; // Значение переменной i изменилось
cout << "*pi = " << *pi << endl; // Считать значение по указателю
pi = &j; // инициализировать указатель адресом переменной j
cout << "*pi = " << *pi << endl; // Теперь указатель ссылается на j
pi = new int[ISIZE]; // Динамическое выделение памяти под 512 целых чисел
if (pi == NULL) // Проверка успешности операции
cout << "Insufficient memory\n"; // Нехватка памяти
else
cout << "Memory allocated\n"; // Память выделена
*pi = 10; // Первому элементу массива присвоить 10
pi++; // Переход ко второму элементу
*pi = 20; // Второму элементу массива присвоить 20
i = *pi; // Присвоить i значение второго элемента массива
j = *(--pi); // Присвоить j значение первого элемента массива
cout << "i = " << i << " j = " << j;
delete(pi); // Освобождение выделенной памяти
return(0);
}
Задание: объявить и инициализировать массив из 3 целых чисел и получить в указатель адрес второго элемента. Работая через указатель, увеличить значение второго элемента массива вдвое, после чего распечатать его.
Тип указателя void (не путать с void при описании параметров и возвращаемого значения функции) - хранит в себе адрес другой переменной, ничего не зная о типе, то есть может ссылаться на любой тип данных, при его использовании необходимо приведение типов
void *p = &i; // Объявление и инициализация обобщенного указателя
*(int*)p = 13; // Приведение типа к указателю на целое
Можно использовать указатель на указатели и т.п.
int **ppi; // Объявления указателя на указатель на целое число
ppi = &pi // Инициализация значением адреса указателя
**ppi = 100; // Использование
Работа со строками также возможна через указатели. Имя массива символов – это адрес его первого элемента, соответственно инициализировать указатель на строку можно именем массива
char *psz, *pszWorld = "world !";
char szHello[20] = "Hello, ";
psz = szHello; // Инициализировать указатель
//psz = &szHello[0]; // Второй вариант того же
strcat(psz, pszWorld); // Добавить константу
cout << psz;
Функция main может принимать два аргумента: количество параметров и массив указателей на строки, при необходимости, эти аргументы можно использовать для анализа параметров передаваемых при запуске программы из командной строки (\21AMAIN)
#include <iostream>
using namespace std;
int
main(int argc, char *argv[]) // Аргументы: кол-во и массив параметров
{
for (int i = 0; i < argc; i++) // Перебор параметров
cout << argv[i] << endl; // Печать параметра
return;
}
