Вторник, 21.05.2024, 05:25
Приветствую Вас, Гость

БИЛЕТ 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();

}