Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Яп

.pdf
Скачиваний:
28
Добавлен:
15.03.2023
Размер:
6.44 Mб
Скачать

Кортежи

Кортеж - это структура данных из разнотипных элементов, не имеющих имен и представляемых значениями.

Кортежи схожи с записями, но отличаются от них тем, что в записях элементы (поля) имеют имена, а в кортеже нет.

Язык Python содержит неизменяемый тип кортеж (tuple). Если кортеж нужно изменить, то с помощью функции list его конвертируют в массив. После изменения он может быть преобразован обратно в кортеж функцией tuple.

Python

aTuple= (7, 9.5, 'peace') // создание кортежа aTuple[1] // обращение к первому элементу

Кортежи подвергаются конкатенации, обозначаемой операцией плюс (+). Они могут удаляться оператором del. Над кортежами определены и другие операции и функции.

161

Списки

Список — это упорядоченнаяпоследовательностьнекоторых структурданных.

Первый элемент списканазывают головой,

Остальныеэлементы — хвостом списка.

Какправило,типы элементовспискаявно не объявляются.

Применяюткак однородные, так и неоднородныесписки.

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

Впервые спискипоявилисьв функциональномязыке LISP.

163

2/27/2023

СОСТАВНЫЕ ТИПЫ ДАННЫХ. СПИСКИ

162

Списки

Python

аList= [2, 7.4, "book"] у = aList[2]

del aList[2] # удалениетретьегоэлемента

В Python предусмотрен достаточномощныймеханизмдля созданиясписков,называемыйгенераторомсписков.

[a a for a in range(12)if a % 3 = = 0]

Функция range создаетсписок[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].

Условиеотфильтровываетвсе числав списке,отбрасывая все числа,которыене делятся на 3. Далее выражение возводит каждоеоставшеесячисло в квадрат.Квадратычисел накапливаютсяв возвращаемомсписке.

Данныйгенераторсписковвозвращаетследующийсписок:

[0, 9, 36, 81]

164

41

ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ.

ИДЕНТИФИКАТОРЫ

165

Идентификаторы

Эти идентификаторы называютсявнешними именами (external names). К ним относятся имена функций и глобальных переменных, используемых несколькими файлами.

Если идентификатор не используется в процессе редактирования внешних связей, то значащими считаются, по крайней мере, 31 первый символ. Такие идентификаторы называютсявнутренними именами

(internal names).

167

2/27/2023

Идентификаторы

Идентификаторы - имена переменных,функций, меток и других объектов, определенных пользователем.

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

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

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

166

ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ.

ОПЕРАТОРЫ И УПРАВЛЯЮЩИЕ СТРУКТУРЫ

168

42

Операторы

Операторы– командыязыка программирования.Каждый оператортранслируется в цепочку команд машинногокода.

Различают:

1.Простые операторы,напримерприсваивание.

2.Составныеоператоры,напримерусловия, циклы…

Основные операторы:

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

2.Операторыветвления.

3.Операторбезусловногоперехода.

Все остальные операторыможнореализовать через эти 3.

169

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

На транслятор возлагается обязанность контроля соответствия типа – соответствия типов левой и правой частей.

При этом возможны три варианта при несовпадениитипов:

1.Ничегоне делать, оставить как есть. Можетпривести к появлению пустых ячеек или к перезатираниюячеек, не относящихся к переменной.

2.Неявно преобразовать значениек типу переменной.

3.Строгий контрольсоответствия типов – не выполнять действие и сообщить об ошибке в случае несоответствия.

ЯП, реализующие третий подходназывают строго типизированными.

171

2/27/2023

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

• Классическая форма записи:

Left := Right

• Выполняютсяследующие действия:

1.Вычислениезначениявыражениявправойчасти.

2.Вычисление значения выражения в левой части, которое трактуется какадресячейкипамяти.

3.Запись значения правой части в ячейку по адресу, вычисленномувлевойчасти.

A[i+2]= b*10;

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

i=1;

A[i++]=i++;

170

Управляющие операторы и структуры

Отвечают толькоза порядок выполненияоператоров программы:

1.Операторбезусловногопереходаgoto и подобныеему break, continue,exit, return.

2.Операторыветвления/проверкиусловий if, else, elseif…

3.Операторывыбора switch,case.

4.Операторыцикла for, while, do while, foreach...

5.Операторывызова подпрограмми возвращения из подпрограммы.

6.Если в ЯП реализованы только первые два типа операторов – это структурное программирование.

172

43

Операторы безусловного перехода

goto label; // программапереходит к метке label // другой код

label: //код

for (intix= 0; ix< 10; ix++)

{

if (ix==5) break; // выход из цикла

continue; // пропуститьдальнейшее выполнение текущей итерации

cout << ix; // этот код никогда не выполнится

}

173

Организация повторения операторов. Циклы и рекурсия

175

2/27/2023

Оператор множественного выбора switchcase

switch(/*переменная*/)

{

case /*значение 1*/:

//код, если переменная приняла значение 1 case /*значение 2*/:

//код , если переменная приняла значение 2 break; // выход из switch

default:

//код, который выполнится, если все ветки с case - ложные

}

174

Организация повторения операторов

Повторение некоторой последовательностиоператоров— это мощное средство для сокращениядлины программи повышенияэффективностивычислений.

Известны две схемыорганизации повторений:рекурсия и итерация.

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

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

Рекурсия является естественной математической формой записи повторяющихся вычислений(на основе функций).

Рекурсия считается главнымсредством поддержки

 

повторенийв функциональныхязыках.

176

44

Циклы

Тело цикла – группа многократноповторяющихся операторов. Этот набор определяетфункциональные возможностицикла.

Итерация – одноповторение тела цикла.

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

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

В результате формируется условиепродолжения, или

условиезавершения цикла.

Различают циклы с предусловиеми с постусловием.

177

Циклы со счетчиком

В составе секций управления есть переменнаяцикла,

которая принимаетдискретноеколичество значенийи используется для подсчета количестваповторенийтела.

Секция управления ограничивает количествозначений переменнойцикла, определяя ее начальное,конечное значение, а также величину шагамежду соседними значениями.Начальное и конечноезначения переменной,а также величину шага называют параметрамицикла.

Pascal

for переменная := начальное_значение to(downto) конечное_значение do оператор_тела

Условие проверяется перед выполнениемтела. Если условие не выполняетсяв самом начале работы оператора, тело не будет выполненони разу.

• величина шага не меняется (является постоянной).

179

2/27/2023

Циклы

while (x<10) {…}

Операторы теламогутвыполняться 0 иболеераз.

Операторы тела повторяются пока условиеравно True.

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

do {…}

while (x<20);

Его тело всегда должно выполняться хотя бы одинраз.

178

Циклы с повторением по данным

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

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

C#

foreach(int x in intArray) {операторы_тела};

При каждом повторении цикла целая переменная x будет принимать значение, равное следующему элементу массива intArray. Размер массива определяет количество повторений тела цикла.

180

45

Обобщенный for в Python for переменная_цикла in структура_данных :

-тело цикла

[else:

-ветвь else]

for loopVarin [15,20, 77]: print loopVar

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

range(4) возвращает [0, 1, 2, 3]; range(2, 9) возвращает [2, 3, 4, 5, 6, 7, 8];

range(0, 10, 2)возвращает [0, 2, 4, 6, 8].

181

Операторы цикла без заданного числа повторений

Количество повторений тела заранее не известно.

Решение о прекращении цикла принимаетсяпо результатам анализатекущей ситуации.

В этом случае говорят о логически управляемыхциклах.

Любой циклс управлениемпо счетчику можно построитьс помощьюлогически управляемогоцикла, но не наоборот.

Pascal: while true do begin операторытела end

С: for(; ;){ операторытела }

ЯзыкиС, С++, C# и Java управление циклами:

1.Безусловныйоператор break для выхода из цикла.

2.Безусловныйоператор continueдлядосрочного

прекращения текущей итерации с передачейуправления

на следующую итерацию цикла.

183

 

2/27/2023

Циклы в функциональных языках

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

Циклы моделируются так:

1.Счетчикможетбыть параметромдля функции, многократновыполняющей тело цикла.

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

3.Т.о. функция цикла принимаетв качестве параметров тело вспомогательнойфункции и количествоповторений.

let rec loopforbodyloopreps= //rec - рекурсивная функция

 

if reps<= 0 then // количество повторений

 

( )

// if должен иметьelse, () –пустоедействие

 

else

 

 

bodyloop() // функция с телом цикла

 

loopforbodyloop, (reps - 1);;

182

for в языках С, С++,C# и Java

for (выражение_1; выражение_2; выражение_3) {телоцикла}

выражение_1вычисляетсяперед входомв цикл;

выражение_2определяет условиепродолженияцикла; отсутствиерассматриваетсякак true.

выражение_3вычисляетсяперед каждойследующей итерацией цикла.

Особенности:

1.Внутри всех выражений могут содержатьсяприсваивания.

2.Все выражения необязательны.

3.Не существует явных счетчиков или параметров цикла.

4.Все переменные,указанные в секции управления, могут изменяться в теле цикла.

5.В качестве первого и третьеговыраженийразрешают

применятьсоставные выражения

184

46

for в языках С, С++,C# и Java

intbuf, i, j;

for (i= 0, j = m - 1;i< j; i++, j--) { buf= str[i];

str[i] = str[j]; str[j] = buf;

}

• ОтличияС++ от своего прообразав языкеС:

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

2.первое выражение может содержатьопределения переменных.

• Например,счетчик как целую переменную:

for (intcount = 0;count < max; count++) {…}

185

Рекурсия и фракталы

187

2/27/2023

Рекурсии

Рекурсия – описание объекта в терминах самого себя.

С точки зрения математики – болеепростая форма организации повторений.

Рассмотрим простойпримеррекурсии – ряд Фибоначчи:1, 1, 2, 3, 5, 8, 13, 21,34…

Формальнофункция для этого ряда имеетвид:

F(0)=1,

F(1)=1, F(n)=F(n-2)+F(n-1),дляn>2.

При вычислении значения F(6) будут вызваны подпрограммы

вычисления F(5) и F(4). В свою очередь, для вычисления последних

потребуется вычисление двух пар F(4),F(3) и F(3), F(2).

186

 

Рекурсии

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

Основной недостаток - повторныевычисления.

Необходимоввести дополнительнуюструктуру данных для запоминания значений, которые уже быливычислены-

динамическоепрограммирование сверху.

Stack overflow

47

Линейная рекурсия

Линейная - рекурсия, при которой рекурсивные вызовы на любом рекурсивном срезе, инициируют не болееодного последующего рекурсивного вызова.

Это наиболее простой и часто встречающийся тип рекурсии.

intfactorial (int n) { if (n<1)

return 1;

else

return n*factorial(n-1);

}

189

Каскадная рекурсия

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

intfibo(intn) { if (n<=1)

return 1;

else

return fibo(n-1)+fibo(n-2);<- вызов несколько раз

}

191

2/27/2023

Повторная рекурсия

Повторнаячастный случай линейной рекурсии с отсутствующими предварительнымиили отложенными вычислениями.

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

intf (intn) {

if (n==0)

 

return 0;

 

else

 

if (n%2==0)return f(n/2);

// повторная

else return f((n-1)/2)+1;

// линейная

}

190

Удаленная рекурсия

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

intf (inti) { if (B1(n))

return …;

else

return f(f(i-1));// функция в качестве параметра

}

192

48

Взаимная рекурсия

Взаимная(косвенная)– циклическая

последовательность вызовов нескольких функций F1, F2, …, Fk (процедур, алгоритмов) друг друга: F1 вызывает F2, F2 вызывает F3, …, Fk вызывает F1 (k>1).

Практически всегда взаимную рекурсию можносвести к простой.

int f1 (intn) {

if (n<1)return f2(n);// <- f1вызывает f2

}

int f2 (intn) {

if (n>1)return f1(n);// <- f2вызывает f1

}

// вызовы зациклились

193

Указатели

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

Значениеуказательного (ссылочного)типа (pointer type) –

это адрес.

Указательная переменная(указатель) содержитадрес другой переменнойили константы.

Объект,на который указывают, называется указуемымили обозначаемымобъектом (designatedobject).

Указатель ссылается на блок данных из области памяти, причёмна самое его начало.

Указатель может ссылаться на переменнуюили функцию.

Размер (формат) адреса зависит толькоот величины адресного пространства компьютера и специфики его организации.

195

2/27/2023

УКАЗАТЕЛИ, ССЫЛКИ, ДИНАМИЧЕСКАЯ ПАМЯТЬ

УКАЗАТЕЛИ

194

Указатели

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

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

intvar= 123;

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

ptrvar= &var; // присвоили адрес переменной указателю

cout <<&var;// адрес переменной var 0x22ff08

 

cout << ptrvar;// адрес переменной var 0x22ff08

 

cout <<var; // значение в переменной var 123

 

cout <<*ptrvar; // вывод значения содержащегося в

 

переменной var через указатель, операцией

 

разименованияуказателя 123

196

49

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

1. Объявлениеint*pa; float *pb

2.Получение адресапеременной p= & a

3.Разыменованиеx= p - получаемобъект, на который указатель ссылается.

4.Получение адресауказателя &p.

5.Увеличение указателяна единицу ++p (переме-щениек адресу следующего элементамассива).

6.Вычитаниеp2 – p1 (результатотображается в тех же единицах, что и размер данноготипа переменной).

Если р2 и р1 указывают на элементытипа long, то p2 – p1 = 2 означает, что указываемые переменные разделены двумязначениям типа long, а не двумябайтами.

197

РАЗНИЦА МЕДУ ПЕРЕМЕННОЙ-УКАЗАТЕЛЕМИ

УКАЗУЕМЫМ ОБЪЕКТОМ

int i1 = 10;

 

int i2 = 20;

 

int *ptr1 = &i1;

// ptr1 указывает на i1// ptr1 = 0x22ff04

int *ptr2 = &i2;

// ptr2 указывает на i2// ptr2 = 0x22ff00

if (ptr1 > ptr2)

// истина 0x22ff04>0x22ff00

if(*ptr1 > *ptr2)

// сравниваем переменные, 10<20,false

*ptr1 = *ptr2;

// косвенно приравниваем i1=i2=20.

if(ptr1 == ptr2)

// ложь, указатели до сих пор разные

if(*ptr1 == *ptr2)

// истина, обознач. объекты равны

ptr1 = ptr2

// указывают на i2, ptr1=ptr2=0x22ff00

 

199

2/27/2023

 

Указатели

int a;

// Целоечисло

int *a;

// Указатель на целое

int **a;

// Указатель на указатель на целое

int a[10];

// Массив из десяти целых

int *a[10];

// Массив из десяти указателейна целые

int (*a)[10];

// Указатель на массив из десяти целых

int (*a)(int);

// Указатель на функцию, которая берет

//целый аргумент и возвращает целое int (*a[10])(int); // Массив из десяти указателей на

//функции, которые берут целый

//аргумент и возвращают целое

198

Указатели на указатели

Указатели могут ссылатьсяна другие указатели.

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

Число символов * при объявлении указателя показывает

порядокуказателя.

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

200

50