Для чтения из файла a.in необходимо перед оператором cin (к примеру в начале main) прописать:
freopen("a.in", "r", stdin);
Для записи в файл a.out
freopen("a.out", "w", stdout);
Если файл, в который производиться запись, отсутствует, то он будет автоматически создан. Существующий же файл – перезапишется.
Цикл while с предусловием
Цикл — это код, выполняемый пока истинно некоторое условие. После каждого выполнения кода проверяется некоторое условие, и если оно выполнилось, код начинает своё выполнение сначала – начинается новая итерация цикла.
Синтаксис:
while(){}
В () пишется условие, цикл будет выполняться пока оно истинно.
В{} пишется тело цикла.
Пример:
int n = 3;
While (n--)
{
cout << n << "\n";
}
Вывод:
2
1
0
Цикл while с постусловием
Синтаксис:
do {}
while();
Сначала выполниться тело цикла, и только после этого провериться условие.
Пример:
double a, n = 3, m = 2;
do {
a = n-- / m;
cout << a << "\n";
} while (a);
Вывод:
1.5
1
0.5
0
Если записать цикл с такой же логикой в виде цикла с предусловием, то программа выдаст ошибку “а не инициализировано”.
|
|
Цикл for
Цикл for в С это модифицированный цикл while. Он содержит 3 блока:
For(1 блок; 2 блок; 3 блок)
Блок объявления. В нём можно задать переменные, которые будет использоваться в цикле (к примеру счётчик), только одного типа.
Блок условия. Здесь пишется условия выполнения цикла, пока оно истинно – цикл будет выполняться.
Блок изменения. Здесь можно изменить переменные объявленные в первом блоке, а также переменные объявленные до цикла.
При это не обязательно писать что-либо в этих блоках, все 3 блока можно оставить пустыми, однако если оставить пустым блок условия, то получится вечный цикл.
for (;;) эквивалентно for(;true;) while(true) while(1)
Пример:
for (int i = 0; i < 5; ++i)
{
cout << i << "\n";
}
Вывод:
0
1
2
3
4
Это запись цикла равнозначна циклу while со следующей логикой:
int i = 0;
while (i < 5)
{
cout << i << "\n";
++i;
}
Допустимы и записи вроде:
for(int kkk = 0;; --kkk){}
for(;;){}
int i = 9;
for(;;i%=3){}
for (int i = 1, f = 1; f < 1000 && i < 100; f *= i, ++i){}
Статичные массивы
Массив — это структура данных, в которой храниться пронумерованные, однотипные данные (в памяти хранятся последовательно).
Статичные массивы, это массивы, размер которых не изменяется во время выполнения программы. Объявляются они также, как и обычные переменные за исключением квадратных скобок [ ] следующих за именем массива, в которых указывается размер массива.
int a[6], b;
|
|
А – массив целых чисел размера 6, b – целочисленная переменная
Обратиться к элементу массива можно через [ ] скобки:
a[0] = 0;
cin >> a[0];
cout << a[0];
Массив можно инициализировать с помощью списка. При этом не обязательно указывать размер массива, но если он указан список должен соответствовать размеру массива:
int a[] = {3, 4, 5}, b[2] = {0, 1};
Для создания двумерного массива (добавления измерения) достаточно добавить ещё одни [ ] скобки:
int a[2][3] = { {1, 2, 3}, {1, 2, 3} };
a[1][1] = 0;
Однако в многомерном массиве необходимо указывать размер измерений. При инициализации, в данном случае, в один список было вложено два других списка.
Обрабатываются массивы зачастую с помощью циклов, к примеру ввод массива можно организовать следующем образом:
int n;
cin >> n;
int a[100];
for (int i = 0; i < n; ++i)
cin >> a[i];
При этом, в данном примере нельзя было задать массиву а размер n.
Динамические массивы
В отличии от статичных массивов размер динамических массивов может изменяться. Одним из динамических массивов является std::vector< тип >. Для его использования необходимо подключить одноименную библиотеку vector. Для объявления вектора требуется написать ключевое слово vector, затем в < > скобках задать тип, хранимых в векторе переменных, после чего задать имя вектору.
vector <int> a; // вектор int-ов
В данном случае размер вектора равен нулю. При создании вектора в круглых скобках после его имени можно указать начальный размер вектора, второй необязательный аргумент в скобках указывает чем будут проинициализированы ячейки массива при создании. Для целых чисел ячейки по умолчанию инициализируются нулём.
vector <int> a(5);
// вектор int-ов с 5-ю элементами равными нулю { 0, 0, 0, 0, 0 }
vector <int> a(3, -2);
// вектор int-ов с 3-мя элементами равными минус двум {-2,-2, -2}
Для инициализации вектора списком нужно добавить равно после имени вектора и записать его элементы через запятую в {} скобках.
vector <int> a = {3, 0, -2}
// вектор int-ов с 3-мя элементами { 3, 0, -2 }
Доступ к элементам вектора осуществляется также через [ ] скобки.
a[1] = 5;
cin >> a[i];
У вектора есть в том числе и методы (встроенные функции вектора), вызываемые через точку после имени вектора:
Push_back – добавляет элемент в конец ветора
Пример:
vector <int> a; // {}
a.push_back(3); // { 3 }
vector <int> a = {9, 0, 9}; // { 9, 0, 9 }
a.push_back(-3); // { 9, 0, 9, -3 }
Size – возвращает размер вектора
Пример:
vector <int> a;
int n = a.size() // n = 0
vector <int> a = {9, 0, 9};
int n = a.size() // n = 3
Resize – изменяет размер вектора, первым аргументом выступает новый размер вектора, вторым, необязательным, то чем будут инициализироваться новые ячейки при увеличении размера вектора (по умолчанию для чисел это 0)
Пример:
vector <int> a; // {}
a.resize(3); // { 0, 0, 0 }
vector <int> a = {9, 0, 9}; // { 9, 0, 9 }
a. resize(3) // { 9, 0, 9 }
vector <int> a = {9, 0, 9}; // { 9, 0, 9 }
a. resize(2, 6) // { 9, 0 }
vector <int> a = {9, 0, 9}; // { 9, 0, 9 }
a. resize(6, 6) // { 9, 0, 9, 6, 6, 6 }