- •Введение
- •Глава 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
- •Приложения Управление выводом
- •Управление шириной вывода
Void main()
{
const int len=80;
char st[len];
cin<<st; // строку можно вводить и
cout<<st<<endl;// выводить “целиком”
}
Проблема при вводе строк возникнет, если мы попытаемся ввести строку, состоящую из нескольких слов. Так как ввод выполняется до первого пробела, знака табуляции или символа конца строки ( \n ), то вместо двух (нескольких слов) будет введено только первое слово. Решение проблемы – воспользоваться методом getline:
#include <iostream.h>
Void main()
{ const int len=80;
char st[len];
cin.getline(st,len); //вводим строку длиной len-1,если раньше не
//встретится символ \n
cout<<st<<endl;
}
Аналогичным образом строка символов вводится из текстового файла, при этом символ перевода строки - \n в строку не копируется.
Операции со строками – присваивание, сравнение и т.д. выполняется как с массивами – посимвольно, так и с помощью специальных функций, которые становятся доступными после подключения заголовочного файла string.h.
Так, функция strlen рассчитывает длину строки, а функции strcpy и strncpy – копируют символы строки в другую строку.
#include <iostream.h>
#include <string.h>
Void main()
{
char st[80];
cin.getline(st,80);//вводим строку
int m=strlen(st);// определяем длину строки без нуль-символа
char* pst =new char [m];// создаем динамический массив
strcpy(pst,st); // копируем строку st в pst
cout<<pst<<endl;
}
Функция strcpy копирует все символы строки st в pst, включая нуль-символ.
Другая функция копирования strncpy(pst,st,m) – копирует не более m символов. Если нуль-символ в исходной строке встречается раньше, копирование прекращается, оставшееся место в строке pst заполняется нуль-символами. Если m меньше или равно длине строки st, завершающий нуль-символ в pst не добавляется. Объединить строки можно функцией strncat(st1,st2,n). Функция добавляет не более n символов строки st2 к строке st1. При использовании этой функции следует контролировать границы строковых массивов.
Среди большого количества строковых функций выделим также функцию strrchr(st,ch) – она определяет первое вхождение символа ch в строку st справа, или возвращает значение false в противном случае. И функцию strstr(st,st2), которая определяет, входит ли строка st2 в строку st. Если совпадения символов нет, то возвращается значение false, в противном случае – выводится строка st2.
Следующий листинг демонстрирует работу этой функции:
#include <fstream.h>
#include <string.h>
Void main()
{
fstream f("a.txt",ios::in||ios::nocreate);
char st[80],st2[]="test";
while(!f.eof())
{
f.getline(st,80);//вводим строку
If(strstr(st,st2)) //если подстрока встречается, выводим
cout<<strstr(st,st2)<<endl;
}
}
3.1.5. Динамическое определение одномерных массивов.
До сих пор мы рассматривали примеры определения массивов, в которых память под массивы резервировалась во время компиляции.
Распределение памяти для массива во время компиляции называется статическим связыванием.
Предположим, что создается программа, в которой массив может потребоваться, а может - нет, в зависимости от хода выполнения программы. При обычном подходе массив создается путем объявления. Память под него, независимо от использования массива, будет отведена на этапе компиляции, что не очень рационально.
В С++ реализована и другая возможность распределения памяти - непосредственно во время выполнения программы с помощью оператора new.
Распределение памяти для массива во время выполнения программы называется динамическим связыванием.
// пример динамического создания одномерного массива
i = 10; // в ходе выполнения программы определена размерность массива
double * mass = new double [i];// определен динамический массив mass[10]
После окончания работы с массивом следует освободить память с помощью оператора delete :
delete [] mass;
Следующие правила помогут вам избежать ошибок при использовании операторов new и delete:
Не используйте delete для высвобождения памяти, которую не распределяли с помощью new.
Не используйте delete для освобождения одного и того же блока памяти несколько раз.
Используйте оператор delete [], если был применен оператор new [] для распределения массива.
Если для освобождения памяти воспользоваться оператором delete вместо delete[], то буден освобожден только первый элемент массива, а остальная память освобождена не будет и окажется недоступной! Такие ячейки памяти называют «мусором».
Используйте оператор delete (без квадратных скобок), если был применен оператор new для распределения одного элемента.
Из последнего пункта следует, что оператор new можно применять для выделения памяти и под простые переменные, но необходимость в этом возникает гораздо реже.