Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
chast4.doc
Скачиваний:
3
Добавлен:
09.07.2019
Размер:
99.84 Кб
Скачать

Массивы.

<рез-е пам.>≡<идент. типа><идент.>[[конст.]{[конст.]}]{ <идент. типа><идент.>[[конст.]{[конст.]}]}.

Константа задает количество значений индекса.

Пример: int a [3][5][3], - элементы этого одномерного массива – 3 одномерных массива, элементы которых – 5 одномерных массивов.

Идентификатор массива имеет значение адреса и тип «указатель».

*a ~ a[0]

*(a+1) ~ a[1]

*(*a) ~ a[0][0]

*(*(*a)) ~ a[0][0][0]

a[i][j][k] ~ *(*(*(a+i)+j)+k)

Начальная инициализация.

<резер-е пам.> ≡ <идент. типа><идент.>[[конст.]{[конст.]}][=<значение>] {,<идент.>[[конст.]{[конст.]}][=<значение>]}.

<значение> = {<знач. эл. мас.>{, <знач. эл. мас.>}}.

Пример: int a[3][5][3] = {{{15, 1, 3}, {2, 3, 0}, …}, …}

int a[3][5][3] = {15, 1, 3, 2, 3, 0, …}, - допустима частичная инициализация, т.е. записать до 45 (в нашем примере) элементов, можно меньше, но не больше.

Пример программы с массивами.

Задание: Для заданной матрицы сформировать вектор из сумм элементов

диагоналей, параллельных главной, включая ее.

Блок-схема: A – матрица; S – результат.

Текст программы:

void main ()

{

int N, J, I;

float A[100][100], S[199]

cout<<”Razmer matrici”;

cin>>N;

for (I=0; I<N; I++)

for (J=0; J<N; J++)

{

cout<<”A[”<<I<<”][”<<J<<”]= ”;

cin>>*(*(A+I)+J);

}

for (I=0; I<2*N+1; *(S+I)=0, I++ );

for(I=0; I<N; I++)

for (J=0; J<N; *(S+N+I-J-1)+=*(*(A+I)+J), J++);

for (I=0; I<2*N+1; I++)

cout<<*(S+I)<<” ”;

getch();

}

Строки в С.

Строки в С обрабатываются как массивы элементов типа char. Функции для работы со строками можно найти в модуле string.h.

“\0”, - символ конца строки; его необходимо использовать, так как, не найдя его система будет заполнять строку всякой «ненужной информацией».

Пример: char s[10], - можно рассматривать как строку из 9-ти элементов, так как один символ – “\0”.

Со строками можно работать, как и с обычными массивами, т.е. возможна и начальная инициализация: char s[10] = {‘0’, ‘1’, …, ‘8’, ‘\0’}.

getchar(), - функция, считывающая один символ из вводимых.

Пример(ввод строки): for (I=0; I<9&&(S[I]=getchar())!=’\n’; I++)

S[I]=’\0’

Функции от строк.

1. strlen(<выр.>), - определяет длину строки.

2. strcpy(<идент.>,<выр.>), - <идент.> и <выр.> должны быть строкового типа; после вызова этой функции идентификатору присваивается значения выражения.

3. strcat(<идент.>, <выр.>), - склейка строк, т.е. после вызова данной ф-ии к значению идентификатора присоединяется значение выражения.

4. strcmp(<выр. 1>, <выр. 2>), - посимвольное сравнение строк слева направо.

5. Копирование части строки S с позиции M в количестве N:

for (I=0; I<N; S1[I] = S[M+I-1], I++);

S1[I] = ‘\0’;

6. Удаление символов из строки S с позиции M в количестве N:

for (I=0; I<K-N-M+2; S[M+I-1]=S[M+N-1], I++); где K, - длина строки S.

7. Вставка в строку S выражения с позиции M:

strcpy(S1, <выр.>)

for(I=0; I<strlen(S)-M+2; S1[i]=S[M+I], I++);

S[M-1]=’\0’;

strcat(S,<выр.>);

strcat(S, S1).

Принцип модульности в С.

Различают два понятия область существования и область доступа.

Область существования – часть программы, при использовании которой выделена память под переменную («время жизни»).

Область доступа – совокупность строк программы, в которой можно использовать соответствующий объект (например идентификатор типа).

Эти две области обычно совпадают.

Классы памяти в С.

<класс памяти><резервирование памяти>.

<класс памяти> = одно из зарезервированных слов: auto, extern, static, register; используется для описания локальных переменных. Область существования – с момента описания до конца составного оператора, т.е. до конца описания функции.

Для локальных переменных класс памяти auto используется по умолчанию.

register, - рассматривается как рекомендация транслятору выделить память под переменную в регистрах процессора.

extern, - для глобальных переменных; в явном виде не используется, т.к. переменные, выделенные под функции, автоматически относятся к этому классу. Область существования совпадает с областью доступа. Память под эти переменные выделяется все время работы программы.

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

Передача параметров.

В языке С параметры передаются только значением.

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

void swap (float *x, float *y)

{

float z;

z=*x;

*x=*y;

*y=z;

}

Void main ()

{

float a, b;

cout<<”a=? ”;

cin>>a;

cout<<”b=? ”;

cin>>b;

swap(&a, &b);

cout<<”a= ”<<a<<” b= ”<<b<<endl;

}

В С++ появляется возможность передачи значений ссылкой.

Для этого нужно перед параметром поставить знак «взятие адреса», который не является операцией, а носит лишь справочный характер.

В примере, указанном выше, для этого нужно вместо первых двух *(звездочек) поставить символы &(а именно: void swap (float &x, float &y)), а затем обращаться к параметрам уже без символа *(звездочка).

При этом значения x и а хранятся в одной области памяти, под x и y память не выделяется, под z – выделяется.

Передача массива в качестве параметра.

Элементы массива простого типа:

1). <идент. типа><идент.>[]; - передача значением; <идент.> имеет смысл «указатель».

Пример: сортировка массива.

void sort(int n, float a[])

{

}

n, - количество элементов массива; a, - сам массив.

2). <идент. типа><идент.>[const].

Элементы массива – массивы:

Необходимо указать количество индексов для элемента массива:

1). … float b[][5];

2). … float b[10][5]

Использование функций.

Имя функции имеет смысл переменной.

В качестве параметра функции необходимо описать его как указатель на некоторую функцию.

В С это описание называют прототипом.

Прототип носит справочный характер.

Пример:

float kv (float t)

void swap1 (float &x, float &y, float (*k)(float t))

{

float z;

z=k(x);

x=k(y);

y=z;

}

Void main ()

{

swap1(a, b, kv)

}

# include “mod.h”

Void main ()

{

swap1(a, b, kv);

}

Перегрузка функции.

Может быть описано несколько функций с одним идентификатором, но с разным списком параметров.

Пример: Найти площадь треугольника тремя способами.

float strl(float &x, float &y)

{

return x*y/2;

}

float strl(float &x, float &y, int &z)

{

return x*y*atan(1)*z/90;

}

float strl(float &x, float &y, float &z)

{

float p;

p=(x+y+z)/2;

return sqrt(p*(p-x)(p-y)(p-z));

}

Void main ()

{

float a, b, c;

int n;

cout<<”Ploshad’ treugol’nika:”<<endl;

cout<<”1. Po osn. I vis.: ”<<endl;

cout<<”2. Po storonam I uglu v gradusah: ”<<endl;

cout<<”3. Po trem storonam: ”<<endl;

cout<<”Nomer puncta ? ”<<endl;

cin>>n;

switch n

{

case 1:

cout<<”Osnovanie I visota ? ”;

cin>>a>>b;

cout<<”Ploshad’ = ”<<strl(a, b)<<endl;

break;

case 2:

cout<<”Smegnie storoni I ugol ? ”;

cin>>a>>b>>n;

cout<<”Ploshad’ = ”<<strl(a, b, n)<<endl;

break;

case 3:

cout<<”Tri storoni ? ”;

cin>>a>>b>>c;

cout<<”Ploshad’ = ”<<strl(a, b, c)<<endl;

break;

default

cout<<”Nepravil’niy nomer punkta. ”;

}

}

Функции с параметрами по умолчанию.

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

При вызове такой функции в качестве фактических параметров достаточно указать только те параметры, которые соответствуют инициализированным формальным.

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

Правила:

1. Инициализированные параметры должны идти последними в списке параметров.

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

Пример:

Нахождение длины отрезка

<тип значения><идент.>(<тип пар.>[=<знач.>]{, <тип пар.>[=<знач.>]})

float par (float, float = 1, float = 1);

float par (float &x, float &y, float &z)

{

return x*y*z;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]