Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК-1_АЯП_рус.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.19 Mб
Скачать

Int n; // Количество узлов интерполяции

Int k; // Номер узла

double t; // Точка, в которой вычисляется значение

double L; // Значение многочлена L_k(x) в точке t

int i = 0;

. . .

L = 1.0; // Начальное значение произведения

while (i <= n)

{ if (i == k){

++i; // К следующему узлу

continue; // Пропустить k-й множитель

}

L *= (t - x[i]) / (x[k] - x[i]); // Вычисляем произведение

++i; // К следующему узлу

}

}

Основная литература: 1[82-97], 2[84-91]

Дополнительная литература:1,2,3,5

Контрольные вопросы:

1. Какой процесс называется ”циклическим” ?

2. Чем отличаются операторы while и do……while?

3. Поясните понятие “Вложенный цикл”;.

4. Оператор цикла с постусловием выполняется до тех пор, пока заключенное в нем выражение …………………(истина или ложь?);

5. Какого типа может быть шаг изменения параметра цикла for? цикла while?

Лекция 6. Указатели. Операции над указателями. Классы памяти. Динамическое выделение памяти

Указатели

Указатель – это переменная, в которой хранится адрес другой переменной или участка памяти.

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

Указатель используется:

- для связи независимых структур друг с другом;.

- для динамического распределения памяти;.

- для доступа к различным элементам структуры..

Указатель объявляется следующим образом:

тип *<имя переменной>;

Указатели объявляются в списке переменных, но перед их именем ставится знак *. Указатель всегда указывает на переменную того типа, для которого он был объявлен.

Например:

int *a, b, c, *d;

float *f;

char *w;

Здесь объявлены указатели a, d, которые могут содержать адреса переменных только целого типа , указатель f, который может содержать адрес переменной только вещественного типа , указатель w, который может содержать адрес переменной только символьного типа и переменные b,c типа int.

Операции над указателями

1. & – операция взятия адреса;

2. * – операция выдачи содержимого переменной, адрес которой содержит указатель;

3. = операция присваивания. Указатели одного и того же типа могут использоваться в операциях присваивания, как и любые другие переменные;

4. арифметические операции

+, -, ++, --, +=, -=

Степень увеличения (уменьшения) значения указателя зависит от типа указателя. Общая формула для вычисления значения указателя

p=p+n*<количество байт памяти базового типа указателя>

p=p-n*<количество байт памяти базового типа указателя>

5. Если р и р1 указатели на элементы одного и того массива, то р-р1 дает такой же результат, как вычитание индексов соответствующих элементов массива, также и р+р1 дает такой же результат, как сложение индексов соответствующих элементов массива

6. Указатели можно сравнивать(<, >, <=, >=, ==, !=)

Рассмотрим операции над указателями на фрагментах программы.

Операции взятия адреса и выдачи содержимого переменной

1. int x=1, y=2;

2. int *ip;

3. ip=&x;

4. y=*ip;

5. *ip=0;

В первой строке объявлены и инициализированы переменные x и y. Во второй строке объявлен указатель *ip, который может содержать адреса переменных только целого типа. В третьей строке приведена операция взятия адреса &, то есть переменной ip присваивается адрес переменной x или иначе эта запись означает: «записать в указатель ip адрес переменной x». Четвертая запись означает: «присвоить переменной y значение переменной, адрес которой содержит указатель ip».Таким образом, после данной операции значение переменной y будет равно 1. Пятая запись означает: «присвоить переменной, адрес которой содержит указатель ip, значение 0», то есть переменной x будет присвоено значение 0.

Операция присваивания

1. int x=1, y=2;

2. int *px, *py;

3. px=&x; py=&y;

4. py= px;

В первой строке объявлены и инициализированы переменные x и y. Во второй строке объявлены указатели *px, *py , которые могут содержать адреса переменных только целого типа. В третьей строке приведена операция взятия адреса &, то есть переменной px присваивается адрес переменной x, а переменной py присваивается адрес переменной y. В четвертой строке переменной py присвоивается значение переменной px. После данной операции указатели *px, *py будут указывать на одну и ту же переменную x.

Арифметические операции

int *px;

...

px ++;

px += 4;

-- px;

px -= 4;

В результате этих операций значение указателя меняется особым способом: px ++ сдвигает указатель на размер целого числа, то есть на 2 байта, а не на 1 как можно подумать. А запись px +=4 или px = px +4 сдвигает указатель на 4 целых числа дальше, то есть на 8 байт.

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

• указатель – это переменная, в которой записан адрес другой переменной;

• при объявлении указателя надо указать тип переменных, на которых он будет указывать, а перед именем поставить знак *;

• знак & перед именем переменной обозначает ее адрес;

• знак * перед указателем в рабочей части программы (не в объявлении) обозначает значение ячейки, на которую указывает указатель;

• нельзя записывать по указателю, который указывает непонятно куда – это вызывает сбой программы, поскольку что-то стирается в памяти;

• для обозначения недействительного указателя используется константа NULL;

• при изменении значения указателя на n он в самом деле сдвигается к n-ому следующему числу данного типа, то есть для указателей на целые числа на n*sizeof(int) байт;

• указатель печатаются по формату %p.

В результате выполнения программы

#include<stdio.h>

#include<conio.h>