Главная

Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Использования динамических переменных


Что такое переменные?

Переменные — это выделенные ячейки в памяти под определенный тип данных. Сами же ячейки постоянно хранятся на компьютере пользователя. Их мы можем заполнять различными значениями, модифицировать и использовать в наших целях.

Стандартные типы данных в C++

Прежде чем мы продолжим знакомство с переменными в C++, давайте узнаем, значениями какого типа мы можем заполнять созданные нами переменные.

Вот список стандартных типов данных:

· int — это целый тип, который может хранить в себе только целые числа.

· float — данный тип является неточным. Он позволяет хранить не только целую часть, но, в отличии от типа int, и дробную.

· double — данный тип нечем не отличается от float, кроме более высокой точности (позволяет хранить больше чисел после запятой).

· char — в данный тип данных можно записывать отдельные символы (абсолютно любые).

· bool — хранит в себе значения логического типа: «правду» — true, либо «лож» — false. О данном типе мы подробно поговорим в уроке о логических выражениях.

Теперь когда мы вооружились знаниями о возможных типах данных, можем переходить непосредственно к созданию переменных на языке C++!

Создание переменных

Чтобы объявить переменную нам необходимо воспользоваться следующей конструкцией:

Полный список типов данных вы можете увидеть выше. Имена же переменных задаются следующим образом:

· Имя переменной не может начинаться с цифры.

· В имени переменной не может быть пробелов, а также специальных символов (вроде ; № # % или /).

· Имя переменной не может совпадать с другими, ранее объявленными, именами (функций, переменных, стандартных операторов и т. п.).

Поэтому, когда вы будете создавать очередную переменную, проверьте соблюдение всех выше перечисленных правил.

 

 

Теперь давайте разберем пример создания различных переменных:

char c = 'p'; // переменная типа char инициализирована символом 'p' int i = 10;// здесь мы создали переменную целого типа со значением 10 float f = 0.3; // эта переменная с плавающей точкой, со значением 0.3 bool b = true; // мы передали переменной типа bool, значение true

Также мы можем не задавать значение при создании переменной. Для этого мы просто прописываем тип и имя переменной:

int a, b = 9; // мы создали две переменные // для b указали значение 9

Теперь давайте более подробно разберем значения передаваемые вышеперечисленным типам:

· Для указания переменной целого типа нам надо просто написать нужное число.

· Для указания дробного значения мы должны в начале написать целую часть числа, затем указать точку, а после нее дробную часть числа.

· Если мы хотим передать символ, мы должна обернуть требуемый символ в одинарные кавычки.

· Для записи значения «верно», в переменную типа bool, мы должны написать true, и false для значения «лож».

Вот мы и разобрали создание переменных на C++. Теперь давайте попробуем создать простую программу с использованием переменных!


 

11. Думаю, понятно, для чего нужны арифметические операции, арифметика в программировании намного проще чем в математике. Нас интересуют следующие арифметические операции в C++:

+ — сложение; - — вычитание; * — умножение; / — деление; % — остаток от деления.

 
 

Ниже представлен программный код использующий арифметические операции в C++.

В строке 9 объявляются переменные с именами sum, razn, pow, div тип данных у которых double – вещественный тип данных (то есть эти переменные могут хранить такие числа: 0.99; 3.0; 21.6; — 43.15; 345.342).

Любые переменные можно использовать только после объявления. Переменные можно также и инициализировать при объявлении, пример:

double sum = 10;

Это значит, что мы объявили переменную с именем sum типа double и присвоили ей значение 10. Переменные можно инициализировать и объявлять как через запятую так и по отдельности каждую (строки 10 и 11).

cin >> a1; // прочитать первое число в переменную а1.
cin >> a2; // прочитать второе число в переменную а2.

Символы >> называются операцией извлечения из потока. Данные символы используются вместе с оператором ввода cin.

sum = a1 + a2; // сложить два числа и записать их сумму в переменную sum

razn = a1 - a2; // выч. из первого числа второе и запис. их разн. в переменную razn

pow = a1 * a2; // умножить два числа и записать их произведение в переменную pow

div = a1 / a2; // раздел. первое число на второе и записать их частное в переменную div

C 20-й по 23-ю строкимы выводим результаты наших арифметических операций. Также как и в математике в языке программирования С++ с помощью скобочек формируется порядок вычислений в сложных выражениях, например: ((a+b)*c)-d

Первое действие: a+b;

Второе действие: умножение на с;

Третье действие: вычитание d;

Результат работы программы, выполняющей четыре арифметические операции +, -, *, /.

12. Заметки

Операторы присваивания сохраняют значение в объекте, обозначенном левым операндом.Существует два типа операторов присваивания: простое присваивание, при котором значение второго операнда сохраняется в объекте, заданном первым операндом, и составное присваивание, при котором сначала выполняется арифметическая или побитовая операция или операция сдвига, а затем сохраняется результат.Все операторы присваивания в следующей таблице, за исключением оператора =, являются составными.

Операторы присваивания

operator Назначение
= Сохранение значения второго операнда в объект, указанный первым операндом (простое присваивание).
*= Умножение значения первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом.
/= Деление значения первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом.
%= деление по модулю первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом.
+= Сложение значения первого операнда со значением второго операнда; сохранение результата в объект, указанный первым операндом.
–= Вычитание значения второго операнда из значения первого операнда; сохранение результата в объект, указанный первым операндом.
<<= Сдвиг значения первого операнда влево на количество битов, заданное значением второго операнда; сохранение результата в объект, указанный первым операндом.
>>= Сдвиг значения первого операнда вправо на количество битов, заданное значением второго операнда; сохранение результата в объект, указанный первым операндом.
&= Выполнение операции побитового И для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом.
^= Выполнение операции побитового исключающего ИЛИ для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом.
|= Выполнение операции побитового включающего ИЛИ для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом.

13. В следующей таблице перечислены приоритет и ассоциативность операторов C++. Операторы перечислены сверху вниз в порядке убывания приоритета.

Приоритет Оператор Описание Ассоциативность
:: Область видимости Слева-направо
++ -- Суффиксальный/постфиксный инкремент и декремент
() Вызов функции
[] Обращение к массиву по индексу
. Выбор элемента по ссылке
−> Выбор элемента по указателю
++ -- Префиксный инкремент и декремент Справа-налево
+ − Унарный плюс и минус
! ~ Логическое НЕ и побитовое НЕ
(type) Приведение к типу type
* Indirection (разыменование)
& Адрес
sizeof Размер
new, new[] Динамическое выделение памяти
delete,delete[] Динамическое освобождение памяти
.* ->* Указатель на член Слева-направо
* / % Умножение, деление и остаток
+ − Сложение и вычитание
<< >> Побитовый сдвиг влево и сдвиг вправо
< <= Операторы сравнения < и ≤
> >= Операторы сравнения > и ≥
== != Операторы сравнения = и ≠
& Побитовое И
^ Побитовый XOR (исключающее или)
| Побитовое ИЛИ (inclusive or)
&& Логическое И
|| Логическое ИЛИ
?: Тернарное условие Справа-налево
= Прямое присваивание (предоставляемое по умолчанию для C++ классов)
+= −= Присвоение с суммированием и разностью
*= /= %= Присвоение с умножением, делением и остатком от деления
<<= >>= Присвоение с побитовым сдвигом слево и вправо
&= ^= |= Присвоение с побитовыми логическими операциями (И, XOR, ИЛИ)
throw Throw оператор (выброс исключений)
, Запятая Слева-направо

 

 

13. При разборе выражения оператор, указанный в некоторой строке таблицы, более тесно связан с аргументами (как в случае применения скобок), чем любой оператор из строк, расположенных ниже. Например, выраженияstd::cout<<a&b и *p++ будут разобраны как (std::cout<<a)&b и *(p++), а не как std::cout<<(a&b) и (*p)++.

Операторы, расположенные в одной ячейке (в одной ячейке может быть несколько строк) имеют одинаковый приоритет и разбираются с учетом ассоциативности. Например, выражение a=b=c будет разобрано как a=(b=c), а не (a=b)=c, так как операция присваивания правоассоциативна.

Перегрузка операторов не влияет на приоритеты.


14. Функции — это блоки кода, выполняющие определенные операции.Если требуется, функция может определять входные параметры, позволяющие вызывающим объектам передавать ей аргументы.При необходимости функция также может возвращать значение как выходное.Функции полезны для инкапсуляции основных операций в едином блоке, который может многократно использоваться. В идеальном случае имя этого блока должно четко описывать назначение функции.Следующая функция принимает от вызывающего ее объекта два целых числа и возвращает их сумму. a и b — параметры типа int.

int sum(int a, int b){return a + b;}

Функции могут запускаться (вызываться) в коде программы любое нужное число раз.Значения, которые передаются функции, называются аргументами. Их типы должны быть совместимы с типами параметров в определении функции.

int main() {int i = sum(10, 32); int j = sum(i, 66);cout << "The value of j is" << j << endl; // 108}

Длина функции практически не ограничена, однако для максимальной эффективности кода целесообразно использовать функции, каждая из которых выполняет одиночную, четко определенную задачу. Сложные алгоритмы лучше разбивать на более короткие и простые для понимания функции, если это возможно. Функции, определенные в области видимости класса, называются функциями-членами. В C++, в отличие от других языков, функции можно также определять в области видимости пространства имен (включая неявное глобальное пространство имен).Подобные функции называются свободными или не являющимися членами. Они часто используются в стандартной библиотеке.

Константы в С++

Язык C++ / Константы в С++

Константы в С++ аналогичны константам в Си. Для представления константы в Си использовалась только директива препроцессора #define:

#define MAX 100

В С++ для представления константы рекомендуется использовать объявление переменной с начальным значением и ключевым словом const:

const тип Имя Переменной = Начальное Значение;

const int n=10;

Область видимости константы такая же, как у обычной переменной. С помощью ключевого словаconst можно объявить указатель на константу

const тип *Имя Переменной;

const int *m; // m – указатель на константу типа int const int n=3; m = &n;

Еще одна возможность const состоит в создании постоянного указателя на величину указанного типа

тип *const Имя Переменной = Значение;

int i; int *const ptri=&i;

Использование const имеет несколько преимуществ по сравнению с #define.

· При объявлении константы с использованием const явно указывается тип величины.

· Константа, объявленная с использованием const, просто согласуется с производными типами, например, объявление массива:

const int base_vals[5] = { 1000, 2000, 3500, 6000, 10000};

· Идентификаторы const подчиняются тем же правилам, что и переменные. Можно создавать константы с различной областью видимости.

15. Инкремент ++ – это увеличение на единицу. Декремент -- – это уменьшение на единицу. Операции декремента и инкремента с лёгкостью заменяются арифметическими операциями или операциями присваивания. Но использовать операции инкремента идекремента намного удобнее.

Синтаксис использования операций инкремента и декремента таков, что перед или после имени переменной ставится операция инкремента или декремента. Когда операция инкремента или декремента ставится перед именем переменной, то такая операция называется префиксным инкрементом (сокращённо — преинкрементом) или префиксным декрементом (сокращённо — предекрементом). А если операция инкремента или декремента ставится после имени переменной, то такая операция называется операцией постфиксного инкремента (сокращённо — постинкремент) или постфиксного декремента (сокращённо — постдекремент). При использовании операции преинкремента значение переменной, сначала, увеличивается на 1, а затем используется в выражении. При использовании операции постинкремента значение переменной сначала используется в выражении, а потом увеличивается на 1. При использовании операции предекремента, значение переменной, сначала, уменьшается на 1, а затем используется в выражении. При использовании операции постдекремента, значение переменной, сначала, используется в выражении, а потом уменьшается на 1.

/*операция*/ ++value; /*эквивалентна операции*/ value += 1; /*операция*/ --value; /*эквивалентна операции*/ value -= 1; /*операция*/ ++value; /*эквивалентна операции*/ value = value +1; /*операция*/ --value; /*эквивалентна операции*/ value = value - 1;

16. В C++ различают явное и неявное преобразование типов данных. Неявное преобразование типов данных выполняет компилятор С++, ну а явное преобразование данных выполняет сам программист.

17.В С++ существует три логические операции:

1. Логическая операция И &&, нам уже известная;

2. Логическая операция ИЛИ ||;

3. Логическая операция НЕ ! или логическое отрицание.

Логические операции образуют сложное (составное) условие из нескольких простых (два или более) условий. Эти операции упрощают структуру программного кода в несколько раз. Да, можно обойтись и без них, но тогда количество ифов увеличивается в несколько раз, в зависимости от условия. В следующей таблице кратко охарактеризованы все логические операции в языке программирования С++, для построения логических условий.

Таблица 1 — Логические операции С++
Операции Обозначение Условие Краткое описание
И && a == 3 &&b > 4 Составное условие истинно, если истинны оба простых условия
ИЛИ || a == 3 ||b > 4 Составное условие истинно, если истинно, хотя бы одно из простых условий
НЕ ! !( a == 3) Условие истинно, если a не равно 3

Сейчас следует понять разницу между логической операцией И и логической операцией ИЛИ , чтобы в дальнейшем не путаться. Пришло время познакомиться с типом данных bool –логический тип данных. Данный тип данных может принимать два значения: true (истина) и false (ложь). Проверяемое условие в операторах выбора имеет тип данных bool. Рассмотрим принцип работы следующей программы, и все будет понятно со всеми этими логическими операциями.

Tablica istinnosti log operacii &&true && false: 0false && true: 0true && true: 1false && false: 0Tablica istinnosti log operacii ||true || false: 1false || true: 1true || true: 1false || false: 0Tablica istinnosti log operacii !!true: 0!false: 1

18.Таблица 5.2 Операции отношения

Название операции отношения Знак операции в Си
Больше >
Больше или равно >=
Меньше <
Меньше или равно <=
Равно ==
Не равно !=

 

Логические операции

Название логической операции Знак операции в Си
Логическое И (коньюнкция) &&
Логическое ИЛИ (дизьюнкция) | |
Отрицание (логическое НЕ) !

19. Оператор if служит для того, чтобы выполнить какую-либо операцию в том случае, когда условие является верным. Условная конструкция в С++ всегда записывается в круглых скобках после оператора if.

Внутри фигурных скобок указывается тело условия. Если условие выполнится, то начнется выполнение всех команд, которые находятся между фигурными скобками.

Пример конструкции ветвления

if (num < 10) { // Если введенное число меньше 10.

cout << "Это число меньше 10." << endl;}

else { // иначе

cout << "Это число больше либо равно 10." << endl;}

Здесь говорится: «Если переменная num меньше 10 — вывести соответствующее сообщение. Иначе, вывести другое сообщение».

20. Оператор множественного выбора – switch.Конструкция switch-case — это удобная замена длинной if-else конструкции, которая сравнивает переменную с несколькими константными значениями, например int или char.

// форма записи оператора множественного выбора switch

switch (/*переменная или выражение*/)

{case /*константное выражение1/*:

{/*группа операторов*/;

break;}

case /*константное выражение2*/:

{/*группа операторов*/;

break;}

default:

{/*группа операторов*/;}}

21. Ітераційна настанова while

Для цикла с постусловием сначала выполняется тело цикла, затем управление передается на проверку условия. В зависимости от истинности или ложности условия, тело цикла выполняется повторно или же происходит переход к оператору, следующему за телом цикла. Всё, сказанное о возможном зацикливании для цикла с предусловием, справедливо и для цикла с постусловием.

Исходя из приведенных блок-схем, очевидно основное различие двух циклов: цикл с постусловием гарантированно выполняется хотя бы раз, а цикл с предусловием может не выполняться ни разу, если условие сразу же окажется ложным.

В языке Паскаль реализованы оба вида циклов. Цикл с предусловием имеет следующий общий вид:

while логическое_выражение do begin

{операторы тела цикла}

end;

Общая запись цикла с постусловием следующая:

repeat

 
 

{операторы тела цикла}

until логическое_выражение;


 

22. Ітераційна настанова do while

Для цикла с постусловием сначала выполняется тело цикла, затем управление передается на проверку условия. В зависимости от истинности или ложности условия, тело цикла выполняется повторно или же происходит переход к оператору, следующему за телом цикла. Всё, сказанное о возможном зацикливании для цикла с предусловием, справедливо и для цикла с постусловием.

Исходя из приведенных блок-схем, очевидно основное различие двух циклов: цикл с постусловием гарантированно выполняется хотя бы раз, а цикл с предусловием может не выполняться ни разу, если условие сразу же окажется ложным.

Цикл do while очень похож на цикл while. Единственное их различие в том, что при выполнении цикла do while один проход цикла будет выполнен независимо от условия.

do {

//тело

}

 
 

while (условие);


23.

Механізми використання настанови continue

Оператор continueиспользуется только в циклах. В операторах for, while, do while,оператор continueвыполняет пропуск оставшейся части кода тела цикла и переходит к следующей итерации цикла. Рассмотрим фрагмент кода с оператором continue.

// пример использования оператора continue:

int count = 0;

do // начало цикла do while

{

continue;

count++;

}

while ( count < 10 ) Посмотрите внимательно на выше приведенный пример, и Вы увидите, что do while бесконечный, так как каждая итерация цикла приводит к выполнению оператора continue, который пропускает операцию инкремента переменной-счётчика countи переходит на следующую итерацию цикла

 

24.

Механізми використання настанови break

Оператор break завершает выполнение ближайшего внешнего цикла или условного оператора, в котором он находится.Управление передается оператору, который расположен после оператора, при его наличии.

Оператор break используется с условным оператором switch и операторами циклов do, for и while.

В операторе switch оператор break заставляет программу выполнять следующий оператор, находящийся снаружи оператора switch.Без оператора break выполняется каждый оператор из сопоставленной метки case до конца оператора switch, включая предложение default.

В циклах оператор break завершает выполнение ближайшего внешнего оператора do, for или while.Управление передается оператору, который расположен после завершенного оператора, при его наличии.

for (int i : nums) {

if (i == 4) {

break;

}

cout << i << '\n';


 

25. Механізми використання настанови goto

Оператор goto безусловно передаёт управление в инструкцию с меткой заданным идентификатором.

goto label;

// другой код

label:

//код

При использовании goto, программа переходит к метке label, что в третьей строке и уже код выполняется после метки. Получается своеобразный прыжок, мы пропускаем участок с другим кодом и выполняем тот код, который нужно, строки 4 и до конца программы. (Вы не можете, прыгать из одной функции в другую функции.)

 

26Одномірні масиви

Стандартный вид объявления одномерного массива следующий:

тип имя_переменной [размер];

char р [10];

то будет объявлен массив символов из 10 элементов, причем эти элементы адресуются индексом от 0 до 9. Следующая программа загружает целочисленный массив числами от 0 до 9 и выводит его:

#include <stdio.h>

int main(void)

{int x[10]; /* резервирует место для 10 целочисленных элементов */

int t;

for(t=0; t<10; ++t) x[t] = t;

for(t=0; t<10; ++t) printf("%d ", x[t]);

return 0;

}


 

27. Сортування елементів масива

Сортировка выбором

Идея метода состоит в том, чтобы создавать отсортированную последовательность путем присоединения к ней одного элемента за другим в правильном порядке. Если входная последовательность почти упорядочена, то сравнений будет столько же, значит алгоритм ведет себя неестественно.

for(int i = 0; i < size - 1; ++i) // i - номер прохода{for(int j = 0; j < size - 1; ++j) // внутренний цикл прохода{if (arr[j + 1] < arr[j]) { tmp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = tmp;

Сортировка пузырьком (обменом)

Идея метода: шаг сортировки состоит в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами.

tmp = arr[j + 1];arr[j + 1] = arr[j]; arr[j] = tmp; 3. Сортировка вставкамиСортировка простыми вставками в чем-то похожа на вышеизложенные методы. T tmp;for (int i = 1, j; i < size; ++i) // цикл проходов, i - номер прохода{tmp = a[i]; for (j = i - 1; j >= 0 && a[j] > tmp; --j) // поиск места элемента в готовой последовательности a[j + 1] = a[j]; // сдвигаем элемент направо, пока не дошлиa[j + 1] = tmp; // место найдено, вставить элемент 4. Сортировка ШеллаСортировка Шелла является довольно интересной модификацией алгоритма сортировки простыми вставками.T temp = a[i];for (j = i-inc; (j >= 0) && (a[j] > temp); j -= inc)a[j + inc] = a[j];a[j] = temp;

 


 

28.Рядки

Строка — последовательность (массив) символов. Если в выражении встречается одиночный символ, он должен быть заключен в одинарные кавычки. При использовании в выражениях строка заключается в двойные кавычки.

char s[25];// Определен массив из 3 строк по 25 байт в каждой.

char s[7] = "Привет"; //// массив строк

char s[3][25] = {"Пример", "использования", "строк"}; //Определен массив из 3 строк по 25 байт в каждой.

//описываем 3 строки, s3- указатель

char s2[20], *s3, s4[30];

cout<<"s2="; cin>>s2; //ввод строки s2

cout<<"s2="<<s2<<endl;


 

29Застосування бібліотечних функцій для обробки рядків

strlen()

Общий формат вызова функции strlen() таков:

strlen(s);

Эта функция возвращает длину строки (количество символов) s не считая нулевого байта.

strcpy()

Общий формат вызова функции strcpy() таков:

strcpy(to, from);

Функция strcpy() копирует содержимое строки from в строку toю Помните, что массив, используемый для хранения строки to, должен быть достаточно большим, чтобы в него можно было поместить строку из массива from. В противном случае массив to переполнится, т.е. произойдет выход за его границы, что может привести к разрушению программы.

strcat()

Обращение к функции strcat() имеет следующий формат:

strcat(s1, s2);

Функция strcat() присоединяет строку s2 к концу строки s1, при этом строка s2 не изменяется. Обе строки должны завершаться нулевым символом. Результат вызова этой функции, т.е. результирующая строка s1 так же будет завершена нулевым символом. Программист должен позаботится о том, чтобы строка s1 была довольно большой, и в неё поместилось, кроме её исходного содержимого, содержимое строки s2.

strcmp()

Ее вызов имеет вид

strcmp(s1, s2);

Функция strcmp() возвращает 0, если строка s1 равна строке s2. Строки равны если эти строки содержат одно и то же число одинаковых символов. Сначала функция сравнивает первые символы строк, потом если они равны она сравнивает вторые символы и т.д.

С++ поддерживает широкий диапазон функций для манипуляций со строками. Самые известные из них:

Все строковые функции используют один и тот же зголовок <cstring>. Рассмотрим эти функции подробнее.

Вызов функции strcpy( )выглядит таким образом:

strcpy (куда, откуда)

Функция strcpy( ) копирует содержимое строки откуда в строку куда. Не забывайте, что массив, образующий куда, должен иметь достаточный размер, чтобы в него поместилась строка откуда. Если места в нем не хватит, то произойдет выход за пределы массива куда,что скорее всего, приведет к аварийному завершению программы.


 

30. Два-та баготовимірні масиви

Двумерный массив объявляется следующим образом:

тип имя_массива[размер второго измерения][размер первого измерения];

Следовательно, для объявления двумерного массива целых с размером 10 на 20 следует написать:

int d[10] [20] ;

int arr[3][3]={0}; // инициализациями нулями

// квадратная матрицаint Array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};for (i = 0; i <= 2; i++) {for (j = 0; j <= 2; j++){}} Можно объявлять не только двумерные массивы, но и массивы с большим количеством измерений. Например, объявление int A[n][m][l] создает трехмерный массив из n*m*l элементов. Для обращения к каждому элементу такого массива необходимо указать три индекса: A[i][j][k], при этом 0<=i, i<n, 0<=j, j<m, 0<=k, k<l. Количество измерений в массиве может быть практически бесконечным (т.е. достаточным для решения любых практических задач).

Многомерные массивы тоже могут быть инициализированы:

int ia[ 4 ][ 3 ] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 }};

Внутренние фигурные скобки, разбивающие список значений на строки, необязательны и используются, как правило, для удобства чтения кода. Приведенная ниже инициализация в точности соответствует предыдущему примеру, хотя менее понятна:

int ia[4][3] = { 0,1,2,3,4,5,6,7,8,9,10,11 };

Следующее определение инициализирует только первые элементы каждой строки. Оставшиеся элементы будут равны нулю:

int ia[ 4 ][ 3 ] = { {0}, {3}, {6}, {9} };

 

31. Основні поняття та механізми використання покажчиків

Указатель – переменная, значением которой является адрес ячейки памяти. То есть указатель ссылается на блок данных из области памяти, причём на самое его начало. Указатель может ссылаться на переменную или функцию. Для этого нужно знать адрес переменной или функции. Так вот, чтобы узнать адрес конкретной переменной в С++ существует унарная операция взятия адреса &. Такая операция извлекает адрес объявленных переменных, для того, чтобы его присвоить указателю.

Указатели используются для передачи по ссылке данных, что намного ускоряет процесс обработки этих данных (в том случае, если объём данных большой), так как их не надо копировать, как при передаче по значению, то есть, используя имя переменной. В основном указатели используются для организации динамического распределения памяти

//объявление указателя

/*тип данных*/ * /*имя указателя*/;

int *ptrvar; // объявление указателя

ptrvar = &var; // инициализация указателя

Указатели могут ссылаться на Переменную и другие указатели, функции

 

32.Оператори для роботи с покажчиками

Ссылки на структуры.

Для доступа к структуре можно использовать ссылку. Ссылка на структуру часто используется в качестве параметра функции или значения, возвращаемого функцией. При получении доступа к членам структуры с помощью ссылки используйте оператор “точка”(оператор стрелка зарезервирована для доступа к членам структуры с помощью указателя)


Пример-программа:

#include <iostream>

Using namespace std;

Struct mystruct{

Int a, b; };

Mystruct &f(mystruct &var);

Int main()

{ mystruct x, y;

x.a=10; x.b=20;

cout<<”исходные значения полей х.a и x.b: ”;

cout<<x.a<<’ ‘<<x.b<<’\n’;

y=f(x);

cout<<”модифицированные значения полей х.a и x.b: ”;

cout<<x.a<<’ ‘<<x.b<<’\n’;

cout<<”модифицированные значения полей y.a и y.b: ”;

cout<<y.a<<’ ‘<<y.b<<’\n’;

return 0;

// функция, которая получает и возвращает ссылку на структуру.

Mystruct &f(mystruct &var)

{

Var.a=var.a*var.a;

Var.b=var.b/var.b;

Return var;


}

44. Бiтовi поля та використання об'еднань

Битовые поля это бит-ориентированный член структуры. Метод, который использован в С++ для доступа к битам, основан на применении структур. Битовое поле—это в действительности специальный тип члена структуры, который определяет свой размер в битах. Общий формат определения битовых полей таков.

Struct имя_типа_структуры {

Тип имя1: длина;

Тип имя2: длина;

Тип имяN: длина; };

Здесь элемент тип означает тип битового поля, а элемент длина—количество битов в этом поле. Битовое поле должно быть обьявлено как значение целочисленного типа или перечисления. Битовые поля длинной 1 бит обьявляются как значения типа без знака(unsigned), поскольку единственный бит не может иметь знакового разряда. Доступ к каждому битовому полю можно получить с помощью оператора точка. Но если общий доступ к структуре осуществляется через указатель, необходимо использовать оператор стрелочка.

Объединения

Объединение — это место в памяти, которое используется для хранения переменных, разных типов. Объединение дает возможность интерпретировать один и тот же набор битов не менее, чем двумя разными способами. Объявление объединения (начинается с ключевого слова union) похоже на объявление структуры и в общем виде выглядит так:

union тег {

тип имя-члена;

тип имя-члена;

тип имя-члена;}

переменные-этого-объединения;

Например:

union u_type {

int i;

char ch;};

Это объявление не создает никаких переменных. Чтобы объявить переменную, ее имя можно поместить в конце объявления или написать отдельный оператор объявления. Чтобы с помощью только что написанного кода объявить переменную-объединение, которая называется cnvt и имеет тип u_type, можно написать следующий оператор:

union u_type cnvt;

В cnvt одну и ту же область памяти занимают целая переменная i и символьная переменная ch. Конечно, i занимает 2 байта (при условии, что целые значения занимают по 2 байта), a ch — только 1. На рис. 7.2 показано, каким образом i и ch пользуются одним и тем же адресом. В любом месте программы хранящиеся в cnvt данные можно обрабатывать как целые или символьные.

Рис. 7.2. Как i, так и ch, хранятся в объединении cnvt (подразумевается, что целые значения занимают по 2 байта)

|<- ch ->|


 

44. Когда переменная объявляется с ключевым словом union, компилятор автоматически выделяет столько памяти, чтобы в ней поместился самый большой член нового объединения. Например, при условии, что целые значения занимают по 2 байта, для размещения i в cnvt необходимо, чтобы длина этого объединения составляла 2 байта, даже если для ch требуется только 1 байт.

Для получения доступа к члену объединения используйте тот же синтаксис, что и для структур: операторы точки и стрелки. При работе непосредственно с объединением следует пользоваться точкой. А при получении доступа к объединению с помощью указателя нужен оператор стрелка. Например, чтобы присвоить целое значение 10 элементу i из cnvt, напишите

cnvt.i = 10;

В следующем примере функции func1 передается указатель на cnvt:

void func1(union u_type *un)

{

un->i = 10; /* присвоение cnvt значение 10 с помощью указателя */

}

Объединения часто используются тогда, когда нужно выполнить специфическое преобразование типов, потому что хранящиеся в объединениях данные можно обозначать совершенно разными способами. Например, используя объединения, можно манипулировать байтами, составляющими значение типа double, и делать так, чтобы менять его точность или выполнять какое-либо необычное округление.

Чтобы получить представление о полезности объединений в случаях, когда нужны нестандартные преобразования типа, подумайте над проблемой записи целых значений типа short в файл, который находится на диске.

В стандартной библиотеке языка С не определено никакой функции, специально предназначенной для выполнения этой записи.


 

44. Хотя данные любого типа можно записывать в файл, пользуясь функцией fwrite(), но было бы нерационально применять этот способ для такой простой операции, как запись на диск целых значений типа short, так как получится чрезмерный перерасход ресурсов. А вот, используя объединение, можно легко создать функцию putw(), которая по одному байту будет записывать в файл двоичное представление целого значения типа short. (В этом примере предполагается, что такие значения имеют длину 2 байта каждое.) Чтобы увидеть, как это делается, вначале создадим объединение, состоящее из целой переменной типа short и из массива 2-байтовых символов:


union pw {

short int i;

char ch[2];};

Теперь с помощью pw можно написать вариант putw(), приведенный в следующей программе.

#include <stdio.h>

#include <stdlib.h>

union pw {

short int i;

char ch[2];};

int putw(short int num, FILE *fp);

int main



Последнее изменение этой страницы: 2016-06-09

headinsider.info. Все права принадлежат авторам данных материалов.