Одномерный динамический массив.
Лекция №1.
Модули.
Заголовочный файл — в языках программирования Си файл, содержащий определения типов данных, структуры, прототипы функций, перечисления, макросы предпроцессора. Имеет по умолчанию расширение .h. Заголовочный файл используется путём включения его текста в данный файл директивой препроцессора #include "Название Заголовочного Файла.h".
Например: #include<cmath> - библиотека для функций типа tan, sin и т.п., #include<time.h> - библиотека для работы с датой и временем и т.д.
#define – создает символическую константу.
Например: #define __ N 5 – найдет все N и заменит их на 5.
Функция main () – это главная функция, которая возвращает целое число.
Main () { - начало
Return 0;
} - конец
Типы данных.
Тип | байт | Диапазон принимаемых значений |
целочисленный (логический) тип данных | ||
bool | 0 / 255 | |
целочисленный (символьный) тип данных | ||
char | 0 / 255 | |
целочисленные типы данных | ||
short int | -32 768 / 32 767 | |
unsigned short int | 0 / 65 535 | |
int | -2 147 483 648 / 2 147 483 647 | |
unsigned int | 0 / 4 294 967 295 | |
long int | -2 147 483 648 / 2 147 483 647 | |
unsigned long int | 0 / 4 294 967 295 | |
типы данных с плавающей точкой | ||
float | -2 147 483 648.0 / 2 147 483 647.0 | |
long float | -9 223 372 036 854 775 808 .0 / 9 223 372 036 854 775 807.0 | |
double | -9 223 372 036 854 775 808 .0 / 9 223 372 036 854 775 807.0 |
Логические операции.
Операции | Обозначение | Условие | Краткое описание |
И | && | a == 3 && b > 4 | Составное условие истинно, если истинны оба простых условия |
ИЛИ | || | a == 3 || b > 4 | Составное условие истинно, если истинно, хотя бы одно из простых условий |
НЕ | ! | !( a == 3) | Условие истинно, если a не равно 3 |
Операции над числами.
1.() Вызов функции Слева направо
2. [] Выделение элемента массива
3. ! Логическое отрицание Справа налево
4.- Изменение знака
5.++ Увеличение на единицу (increment)
6.-- Уменьшение на единицу (decrement)
7.~ Побитовое отрицание (complement)
8.& Побитовая операция И Слева направо
9.| Побитовая операция ИЛИ
10.^ Побитовая операция исключающее ИЛИ (eXclude OR)
11.<< Сдвиг влево
12.>> Сдвиг вправо
13.* Умножение Слева направо
14./ Деление
15.% Деление по модулю
16.+ Сложение Слева направо
17.- Вычитание
18.< Меньше, чем Слева направо
19.<= Меньше или равно
20.> Больше, чем
21.>= Больше или равно
22.== Равно
23.!= Не равно
24.|| Логическая операция ИЛИ Слева направо
25.&& Логическая операция И Слева направо
26.= Присваивание Справа налево
27.+= Сложение с присваиванием
28.-= Вычитание с присваиванием
29.*= Умножение с присваиванием
30./= Деление с присваиванием
31.%= Деление по модулю с присваиванием
32.>>= Сдвиг вправо с присваиванием
33.<<= Сдвиг влево с присваиванием
34.&= Побитовое И с присваиванием
35.|= Побитовое ИЛИ с присваиванием^= Исключающее ИЛИ с присваиванием, Запятая Слева направо
Пример:
#include <stdio.h> int main(void) { int a = 5, b =10, c = 25, d = 100, result; printf("%d + %d = %d\n", a, b, a + b); printf("%d - %d = %d\n", a, b, a - b); printf("%d / %d = %d\n", d, c, d / c); printf("%d * %d = %d\n", c, a, c * a); printf("%d %% %d = %d\n", c, b, c % b); result = (c + d) / a * b; printf("result is: %d\n", result); } |
Результат:
5 + 10 = 15
5 — 10 = -5
100 / 25 = 4
25 * 5 = 125
25 % 10 = 5
result is: 250
Циклы.
Цикл — многократное прохождение по одному и тому же коду программы. Циклы необходимы программисту для многократного выполнения одного и того же кода, пока истинно какое-то условие. Если условие всегда истинно, то такой цикл называется бесконечным, у такого цикла нет точки выхода.
В языке программирования С++ существуют такие циклы:
- цикл for
- цикл while
- цикл do while
1)for- Тело цикла будет выполняться до тех пор, пока условие будет истинно(т. е. true).
// форма записи оператора цикла for:
for (/*выражение1*/; /*выражение2*/; /*выражение3*/ )
{
/*один оператор или блок операторов*/;
}
Рассмотрим подробно три выражения записанные в круглых скобках цикла for. Выражение 1 - объявление (и) или инициализация, ранее объявленной, переменной-счетчика, которая будет отвечать за истинность условия в цикле for. Пример: int counter = 0; // отсюда видно, что была объявлена переменная counter типа int и инициализирована значением 0
Выражение 2- это условие продолжения циклаfor, оно проверяется на истинность.
counter < 10; // условие истинно пока count строго меньше десяти!
Выражение 3 изменяет значение переменной-счетчика. Без выражения 3 цикл считается бесконечным, так как изменение содержимого переменной count выполняться не будет, и если изначально условие было истинным, то цикл будет бесконечным, иначе программа даже не войдет в цикл
Выражения 1, 2, 3 отделяются друг от друга обязательными разделителями, точкой с запятой. Тело цикла обрамляется фигурными скобочками, если тело цикла состоит из одного оператора ,то фигурные скобочки не нужны. Под изменением значения переменной подразумевается уменьшение или приращение значения , например:
for ( int counter = 0; counter < 15; counter++) // выполняется приращение переменной counter с шагом 1 от 0 до 15
2)while -цикл, повторяющий одно и то же действие, пока условие продолжения цикла whileостаётся истинным.
// форма записи цикла while
while (/*условие продолжения цикла while*/)
{
/*блок операторов*/;
/*управление условием*/;
}
3) Цикл do while отличается от цикла while тем, что в do while сначала выполняется тело цикла, а затем проверяется условие продолжения цикла. Из-за такой особенности do while называют циклом с постусловием. Таким образом, если условие do while заведомо ложное, то хотя бы один раз блок операторов в теле цикла do while выполнится.
// форма записи оператора цикла do while:
do // начало цикла do while
{
/*блок операторов*/;
}
while (/*условие выполнения цикла*/); // конец цикла do while
Условные операторы:
Имеются две формы условных операторов:
if (выражение) оператор
if (выражение) оператор else оператор
В обоих случаях вычисляется выражение и, если оно отлично от нуля, то выполняется первый подоператор. Во втором случае, если выражение равно нулю, выполняется второй подоператор.
Лекция №2.
Используется при PRINTF.
d - аргумент преобразуется к десятичному виду;
o - аргумент преобразуется в беззнаковую восьмеричную форму (без лидирующего нуля);
x - аргумент преобразуется в беззнаковую шестнадцатеричную форму (без лидирующих 0х);
u - аргумент преобразуется в беззнаковую десятичную форму;
c - аргумент рассматривается как отдельный символ;
s - аргумент является строкой: символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности;
e - аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]m.nnnnnne[+-]хх, где длина строки из n определяется указанной точностью. Точность по умолчанию равна 6;
f - аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]mmm.nnnnn, где длина строки из n определяется ука занной точностью. Точность по умолчанию равна 6.
g - используется или формат %e или %f, какой короче; незначащие нули не печатаются.
Scanf (“%c %d %f ”,& ch, &I, &fl) –требует не имя переменной а адрес, где &- операция взятия адреса.
Массивы.
Массив это структура данных, представленная в виде группы ячеек одного типа, объединенных под одним единым именем. Массивы используются для обработки большого количества однотипных данных.
Одномерный массив — массив, с одним параметром, характеризующим количество элементов одномерного массива. Фактически одномерный массив — это массив, у которого может быть только одна строка, и n-е количество столбцов.
//синтаксис объявления одномерного массива в С++:
/*тип данных*/ /*имя одномерного массива*/[/*размерность одномерного массива*/];
//пример объявления одномерного массива, изображенного на рисунке 1:
int a[16];
//ещё один способ объявления одномерных массивов
int mas[10], a[16];
Пример
#include <stdio.h>
void main()
{
int a[]={5, 4, 3, 2, 1}; // массив a содержит 5 элементов
printf("%d %d %d %d %d\n",a[0], a[1], a[2], a[3], a[4]);
getchar();
}
Результат выполнения:
5 4 3 2 1
Двумерный массив — это обычная таблица, со строками и столбцами. Фактически двумерный массив — это одномерный массив одномерных массивов.
Структура двумерного массива, с именем a, размером m на n:
// синтаксис объявления двумерного массива
/*тип данных*/ /*имя массива*/[/*количество строк*/][/*количество столбцов*/];
// пример объявление двумерного массива:
int a[5][3];
Пример
#include <stdio.h>
void main()
{
int a[2][3]={1, 2, 3, 4, 5, 6};
printf("%d %d %d\n", a[0][0], a[0][1], a[0][2]);
printf("%d %d %d\n", a[1][0], a[1][1], a[1][2]);
getchar();
}
Результат выполнения
1 2 3
4 5 6
Динамический массив.
Динамическое выделение памяти необходимо для эффективного использования памяти компьютера.
В С операции new и delete предназначены для динамического распределения памяти компьютера. Операция new выделяет память из области свободной памяти, а операция delete высвобождает выделенную память. Выделяемая память, после её использования должна высвобождаться, поэтому операции new и delete используются парами. Даже если не высвобождать память явно, то она освободится ресурсами ОС по завершению работы программы. Рекомендую все-таки не забывать про операцию delete.
// пример использования операции new
int *ptrvalue = new int;
//где ptrvalue – указатель на выделенный участок памяти типа int
//new – операция выделения свободной памяти под создаваемый объект.
Операция new создает объект заданного типа, выделяет ему память и возвращает указатель правильного типа на данный участок памяти. Если память невозможно выделить, например, в случае отсутствия свободных участков, то возвращается нулевой указатель, то есть указатель вернет значение 0. Выделение памяти возможно под любой тип данных: int, float,double,char и т. д.
// пример использования операции delete:
delete ptrvalue;
// где ptrvalue – указатель на выделенный участок памяти типа int
// delete – операция высвобождения памяти
Пример:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int *ptrvalue = new int; // динамическое выделение памяти под объект типа int
*ptrvalue = 9; // инициализация объекта через указатель
//int *ptrvalue = new int (9); инициализация может выполнятся сразу при объявлении динамического объекта
cout << "ptrvalue = " << *ptrvalue << endl;
delete ptrvalue; // высвобождение памяти
system("pause");
return 0;
}
Результат выполнения:
ptrvalue = 9
одномерный динамический массив.
// объявление одномерного динамического массива на 10 элементов:
float *ptrarray = new float [10];
// где ptrarray – указатель на выделенный участок памяти под массив вещественных чисел типа float
// в квадратных скобочках указываем размер массива
После того как динамический массив стал ненужным, нужно освободить участок памяти, который под него выделялся.
// высвобождение памяти отводимой под одномерный динамический массив:
delete [] ptrarray;
Пример:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main()
{
int *a; // указатель на массив
int i, n;
system("chcp 1251");
system("cls");
printf("Введите размер массива: ");
scanf("%d", &n);
// Выделение памяти
a = (int*) malloc(n*sizeof(int));
// Ввод элементов массива
for(i=0; i<n; i++)
{
printf("a[%d] = ", i);
scanf("%d", &a[i]);
}
// Вывод элементов массива
for(i=0; i<n; i++)
printf("%d ", a[i]);
free(a);
getchar(); getchar();
}
Результат выполнения:
Введите размер массива: 5
a[0]=4
a[1]=7
a[2]=3
a[3]=2
a[4]=1
4 7 3 2 1