Одномерный динамический массив.

Лекция №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