БИЛЕТ 6.
1) Многомерные массивы: определение и инициализация, расположение в памяти, передача в качестве параметров в функции.
Си поддерживает многомерные массивы. Размерность (dimension) массива – это число индексов, используемых для ссылки на конкретный элемент массива. Многомерные массивы должны описываться и могут при описании инициализироваться. Элементы многомерных массивов хранятся в памяти в порядке возрастания самого правого индекса (или, как иногда говорят, по строкам).
Многомерные массивы в C++ рассматриваются как массивы, элементами которых являются массивы.
Определение многомерного массива должно содержать информацию о типе, размерности и количестве элементов каждой размерности.
Массив инициализируется списком начальных значений, заключенным в фигурные скобки; каждая строка двумерного массива инициализируется соответствующим подсписком. Многомерный массив подобно одномерному массиву может быть проинициализирован с помощью списка инициализаторов. Первыми инициализируются элементы с самыми маленькими индексами:
int MyArray[3][3][3] = {0,1,2,3,4,5,6,7,8,9,10,11};
Начальные значения получают следующие элементы трёхмерного массива:
MyArray[0][0][0] == 0
MyArray[0][0][1] == 1
MyArray[0][0][2] == 2
MyArray[0][1][0] == 3
MyArray[0][1][1] == 4
MyArray[0][1][2] == 5
MyArray[0][2][0] == 6
MyArray[0][2][1] == 7
MyArray[0][2][2] == 8
MyArray[1][0][0] == 9
MyArray[1][0][1] == 10
MyArray[1][0][2] == 11
Остальные элементы массива получают начальные значения в соответствии со статусом массива (в глобальном массиве значения остальных элементов равны 0, в локальном массиве элементам присваиваются неопределённые значения).
Дополнительные фигурные скобки в инициализаторе позволяют инициализировать отдельные фрагменты многомерного массива. Каждая пара фигурных скобок специфицирует значения, относящиеся к одной определённой размерности.
Передача массивов в функции.
Чтобы передать массивы в качестве аргумента в функции, необходимо ука-зать имя массива, без каких-либо квадратных скобок.
Например:
int hourly Tempetur [24];
то оператор вызова функции:
modify Array (hourly Temperet, 24);
C++ автоматически передает массивы функциям, используя модифицируе-мый вызов по ссылке - вызываемые функции могут изменять значения (аргумен-тов) элементов в исходных массивах источника вызова. Поскольку в функцию пе-редается начальный адрес массива, вызываемая функция знает, где храниться массив. Поэтому когда, вызываемая функция модифицирует элементы массива в теле функции, она модифицирует реальные элементы массива в их истинных ячейках памяти.
Отдельные элементы массива передаются вызовом по значению, подобно простым элементам. Такие отдельные простые элементы называются скалярами или скалярными параметрами.
Массив - параметр фиксированного размера.
2) Операции присваивания, изменить и заменить.
К операциям присваивания относятся все операции, которые меняют значение одного из операндов. В Си их целых три группы:
-обычное присваивание (=);
-присваивание, соединенное с одной из бинарных операций (+=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^=);
-операции инкремента и декремента (увеличения и уменьшения на 1).
Операция присваивания "=" сохраняет значение выражения, стоящего в левой части, в переменной, а точнее, в адресном выражении, стоящем в правой части. Термин "АДРЕСНОЕ ВЫРАЖЕНИЕ" (или l-value) используется для обозначения тех выражений, которым соответствуют переменные в памяти программы. При выполнении операции присваивания тип выражения в правой части преобразуется к типу адресного выражения в левой. Результатом операции является значение левой части после присваивания, соответственно, тип результата -это тип левой части. Кроме того, присваивание -одна из немногих операций с направлением выполнения "справа налево". Из сказанного следует возможность многократного присваивания "справа налево", в котором результат каждого из них используется как правая часть последующего:
long a; char b; int c;
a = b = c; // эквивалентно b = c; a = b;
В данном случае при первом (правом) присваивании тип int преобразуется к char, а результатом операции является значение переменной b типа char после выполнения этого присваивания.
Операция присваивания, соединенная с одной из бинарных операций, -это частный случай, когда результат бинарной операции сохраняется (присваивается) в первом операнде: a +=b; // эквивалентно a = a + b;
Операции инкремента и декремента увеличивают или уменьшают значение единственного операнда до или после использования его значения в выражении:
int a; // Эквивалент Интерпретация
a++; // Rez=a; a=a+1; Увеличить на 1 после использования
++a; // a=a+1; Rez=a; Увеличить на 1 до использования
a--; // Rez=a; a=a-1; Уменьшить на 1 после использования
--a; //
a=a-1; Rez=a; Уменьшить на 1 до использования
3. Напишите функцию удаления из строки n-символов, начиная с q-го.
#include<conio.h>
#include<stdio.h>
#include<string.h>
char*s="You are fucker!!!";
int n = 5,q = 2;
void main()
{
clrscr();
int i;
int ls=strlen(s);
printf("%s\n",s);
printf("delete %d symbols from %d position\n",n,q);
if (ls-q+1<n)
n=ls-q+1;
if (n<=ls)
{
i=q;
for (;i<ls-n+1;i++,q++)
s[q]=s[q+n];
};
s[q-1]='\0';
printf("The result: %s",s);
getch();
}
4. Напишите функцию перевода р-ричного числа в десятичное.
#include<conio.h>
#include<stdio.h>
int ch[] = {2,5,4};
int sys = 16;
int n = sizeof(ch)/sizeof(int);
int i, j, rez = 0, sys_temp;
void main()
{
clrscr();
sys_temp = 1;
j = 0;
for (i=n-1;i>=0;i--)
{
if (j>0)
sys_temp *= sys;
rez += ch[i] * sys_temp;
j++;
}
printf("\n%d",rez);
getch();
}