1 Глава 3 Структурные типы данных 3.1 Массивы Массив – это упорядоченная совокупность однотипных данных. Каждому элементу массива соответствует один или.

Презентация:



Advertisements
Похожие презентации
Множества. Внутреннее представление.. Механизм внутреннего представления Каждое значение базового типа представляется одним битом. В память заносится.
Advertisements

Множества. Множество- ограниченный, неупорядоченный набор различных элементов одного типа. Примеры множеств: Множество арабских цифр. Множество знаков.
Множественный тип данных А+В А*В. Множество - конечная совокупность элементов, принадлежащих некоторому базовому типу. Базовый тип –перечислимые типы.
СТРОКИ Строковой называется последовательность символов определённой длины. Идентификатор типа – слово String Примеры описания: Var Str1 : String[10];
Структурные типы данных 1.Массивы 2.Строки 3.Записи 4.Множества 5.Файлы.
Программирование на языке Паскаль Массивы. Определение массива Многие задачи, которые решаются с помощью ЭВМ, связаны с обработкой массивов. Массив -
«Программирование с использованием множеств» Delphi. Тема 8:
Структурированные типы в Pascal Pascal Структурированные типы данных в Pascal характеризуются множественностью образующих тип элементов. К этим типам относятся.
МНОЖЕСТВА. ОПРЕДЕЛЕНИЕ Множество – это набор однотипных объектов. Характер связей между объектами подразумевается программистом и никак не контролируется.
Массивы – структурированный тип данных, состоящий из фиксированного числа элементов одинакового типа, имеющих общее имя. Массив.
СТРОКИ Строковой называется последовательность символов определённой длины. Идентификатор типа – слово String Примеры описания: Var Str1 : String[10];
Задача. С клавиатуры вводится n чисел (числа могут повторяться). Необходимо подсчитать количество чисел равных наименьшему числу.
ПРОГРАММИРОВАНИЕ МАССИВОВ Язык программирования Паскаль ЕАДК, преподаватель Неверова И.Ю.
Для добавления текста щелкните мышью Структурированные типы данных. Множества 11 класс.
МАССИВЫ Структурные типы данных В тех случаях, когда какой-либо объект описывается рядом однотипных значений (например, ежедневное количество осадков на.
1 Пример: Для каждого из 25 учеников класса известны фамилия и оценки (в баллах) по пяти дисциплинам. Требуется вычислить среднюю оценку каждого ученика.
Массивы Вариант 1 Program upr1; Var s,a:real; I: integer; Begin S:=0; For I:=1 to 10 do Begin Writeln (введите очередное число'); Readln(a); S: =s+a; End;
ОДНОМЕРНЫЕ МАССИВЫ. В математике, экономике, информатике часто используются упорядоченные наборы данных, например, последовательности чисел, таблицы,
Множественный тип данных Множество в языке Паскаль – это ограниченный набор различных элементов одного (базового) типа, которые рассматриваются как единое.
Транксрипт:

1 Глава 3 Структурные типы данных 3.1 Массивы Массив – это упорядоченная совокупность однотипных данных. Каждому элементу массива соответствует один или несколько индексов, определяющих положение элемента в массиве. Количество типов индексов задает размерность массива. Тип индекса – порядковый – определяет доступ к элементу. Тип элемента – любой кроме файла, в том числе массив. Массив в памяти не может занимать более 2 Гб.

2 Примеры объявления массивов Var a:array[1..5] of integer; с:array[A..C,-5..-3] of byte; b:array[byte] of char; Type mas=array[1..10] of integer; Var a:mas; Инициализация массива при объявлении Var a:array[1..5]of real=(0,-3.6,7.8,3.789,5.0); b: array[boolean, 1..5] of real= ((0,-3.6,7.8,3.789,5.0), (6.1,0,-4.56,8.9,3.0));

3 Операции над массивами 1. Операция присваивания (только для массивов одного типа): Пример: Var a, b:array[boolean] of real;... a:=b; 2. Доступ к элементу массива: Пример: Var a:array[char,boolean] of real;... a[A,true]:=5.1; {прямой доступ}... Ch:=B; b:=false; a[Ch,b]:=3; {косвенный доступ: значения индексов находятся в переменных}

4 Косвенный доступ к элементам массива Косвенный доступ позволяет реализовать последовательную обработку элементов массивов: for i:=1 to 6 do a[i]:=i*i; или for i:=6 downto 1 do a[i]:=i*i; Прямой доступ Косвенный доступ

5 Операции над массивами (2) 3. Ввод/вывод массивов осуществляется поэлементно: Пример 1. Ввод элементов одномерного массива Var a:array[1..5] of real;... for i:=1 to 5 do Read(a[i]); ReadLn;{вводит последнее Enter} Значения вводятся через пробел, Tab( ) или Enter( ): а) б)

6 Операции над массивами (3) Пример 2. Вывод матрицы. Var a:array[1..5, 1..7] of real; Begin... for i:=1 to 5 do begin for j:=1 to 7 do Write(a[i, j]); { a i,1 a i,2 a i,3 a i,4 a i,5 a i,6 a i,7 } WriteLn; {переходим на следующую строку} end;...

7 Максимальный элемент массива и его номер А 4512 АMAXIMAXi begin end

8 Программа определения максимального элемента массива и его номера Program Ex3_1; {$APPTYPE CONSOLE} Uses SysUtils; Var a:array[1..5] of single; amax:single;i, imax:byte; Begin WriteLn('Input 5 values:'); for i:=1 to 5 do Read(a[i]); ReadLn; amax:=a[1]; imax:=1; for i:=2 to 5 do if a[i]>amax then begin amax:=a[i]; imax:=i; end; WriteLn('Values:'); for i:=1 to 5 do Write(a[i]:7:2); WriteLn; WriteLn('Max =', amax:5:2, ', number=', imax); ReadLn; End.

9 Сумма элементов строк матрицы А B i j Подсчет суммы элементов i-ой строки begin end

10 Программа суммирования элементов строк Program Ex3_2; {$APPTYPE CONSOLE} uses SysUtils; Var A:array[1..10,1..10] of real; B:array[1..10] of real; i,j:byte; Begin WriteLn('Input n,m'); ReadLn(n,m); WriteLn('Input matrics n*m values:'); for i:=1 to n do begin for j:=1 to m do Read(A[i,j]); ReadLn; end; WriteLn('Results:'); for i:=1 to n do begin B[i]:=0; for j:=1 to m do B[i]:=B[i]+A[i,j]; for j:=1 to m do Write(A[i,j]:7:2); WriteLn(' Sum= ',B[i]:7:2); end; ReadLn; End.

Строки Строка – последовательность символов. Целое – максимальная длина строки. Внутренний формат: Текущая длина строки

12 Примеры описания строк 1) Var S1,S2:string[40]; S3:string; 2) С предварительным объявлением типов: Type S40 = string[40]; ST = string; Var S1,S2: S40; S3:ST; 3) С инициализацией Var S:string[40]=Строковая константа; S1:string = ;

13 Операции над строками 1. Присваивание строк: S1:=ABCD; S1:=S2; S1:=A; S1:=;{пустая строка} 2. Обращение к элементу: S1[5] - прямое S1[i] - косвенное 3. Конкатенация (сцепление) строк: St:=St + A; St:= A + B; 4. Операции отношения – результат определяется по кодам первых различных символов: b:= S1 > S2; T < Ta 5. Ввод-вывод строк: ReadLn(S1); {Строка вводится до Enter или указанной длины} WriteLn(S1);

14 Стандартные процедуры и функции 1. Функция Length(st):word – возвращает длину строки st: n:=Length(st1); 2. Процедура Delete(st, index, count) – удаляет count символов строки st, начиная с символа с номером index: S1: = dddddsssssfffff; Delete(S1,6,5); 3. Процедура Insert(St2,St1,index) – вставляет подстроку символов St2 в строку St1, начиная с символа с номером index: S1 = dddddddddd; S2 = аааааа ; Insert(S2,S1,6); Insert(Pas,S1,6); dddddfffff dddddааааааddddd dddddPasааааааddddd

15 Стандартные процедуры и функции (2) 4. Процедура Str(x[:w[:d]],St) – преобразует результат выражения x, в строку st, содержащую запись этого числа в виде последовательности символов (как при выводе). x:=-5.67; Str(x:7:3,s1); 5. Процедура Val(St,x,Code) – преобразует строку St с записью числа в виде последовательности символов во внутреннее представление целого или вещественного числа и помещает его в переменную x. В целочисленной переменной Code процедура возвращает код ошибки: Var S:string; Code:integer; a:real;......repeat Write(Input a:); ReadLn(S); Val(S,a,Code); if Code<>0 then WriteLn(Input error); until Code=0;

16 Стандартные процедуры и функции (3) 6. Функция Copy(St,index,count):string – возвращает фрагмент строки St, длиной count символов, начиная с символа с номером index: S1 = qqqEEEEEEuuuuu; S:= Copy(S1,4,6); 7. Функция Pos(St2,St1):integer – возвращает номер позиции первого вхождения подстроки St2 в строку St1. Если вхождение не найдено, то функция возвращает 0: S1 = qqqEEррEEuuuuu; i:= Pos(EE,S1); 8. Функция UpCase(ch):char – возвращает символ, соответствующий символу верхнего регистра для ch, если таковой имеется, либо сам символ ch, если для него не определен символ верхнего регистра. EEEEEE i=4

17 Удаление «лишних» пробелов из строки ASD FS

18 Программа Program Ex3_3; {$APPTYPE CONSOLE} Uses SysUtils; Var st:string[40]; k:byte; Begin WriteLn('Input string <= 40 symbols'); ReadLn(st); WriteLn('String:', st); k:=pos(' ',st); while k<>0 do begin delete(st,k,1); k:=pos(' ',st); end; if st[1]= ' ' then delete(st,1,1); k:= length(st); if st[k]= ' ' then delete(st,k,1); if length(st)<>0 then WriteLn('Result:',st) else WriteLn('Only spaces.'); ReadLn; End.

19 Преобразование последовательности строк Вводится последовательность строк вида Иванов Иван Иванович 1956 Иванов И.И. 45 Завершение ввода – при чтении пустой строки.

20 Программа Program Ex3_4; {$APPTYPE CONSOLE} Uses SysUtils; Var st,strez,strab:string[40]; c1,c2,c3,n,old:word;code:integer; Begin WriteLn('Input string. End - empty string.'); ReadLn(st); while st<>'' do begin c1:=Pos(' ',st); strez:=Copy(st,1,c1+1)+'.'; strab:=Copy(st,c1+2,Length(st)-c1-1);

21 Программа (2) c2:=Pos(' ',strab); strez:=strez+strab[c2+1]+'.'; Delete(strab,1,c2+1); c3:=Pos(' ',strab); Delete(strab,1,c3); Val(strab,n,code); old:=2001-n; Str(old,strab); strez:=strez+' '+strab; WriteLn(strez); WriteLn('Input string. End - empty string.'); ReadLn(st); end; End.

Множества Множество – неупорядоченная совокупность неповторяющихся объектов. Тип элементов – порядковый, кроме Word, Integer, SmallInt, LongInt. Количество элементов не должно превышать 256. Type Digits = set of ; Setchar = set of char; letter = set of a..z; Var mychar: setchar; mydig: Digits; simst: letter; или Var number: set of 1..31; cif: set of 0..9; kods: set of #0..#255;

23 Конструкторы и инициализация множеств Конструкторы множеств – константы множественного типа: [] – пустое множество; [2,3,5,7,11] – множество чисел; [a,d,f,h] – множество символов; [1,k] – множество чисел, переменная k должна содержать число; [2..100] – множество содержит целые числа из указанного интервала; [k..2*k] – интервал можно задать выражениями; [red,yellow,green]- множество перечисляемого типа Инициализация множеств при объявлении: Type setnum = set of byte; Var S:setnum = [1..10];

24 Операции над множествами 1. Присваивание: A:=B; A:=[]; 2. Объединение, пересечение и дополнение: А+B (A B) – объединение множеств А и B – множество, состоящее из элементов, принадлежащих множествам А и B А*B (A B) – пересечение множеств А и B – множество, состоящее из элементов, принадлежащих одновременно и множеству А и множеству B. А-B (A \ B) – дополнение множества А до B – множество, состоящее из тех элементов множества А, которые не принадлежат множеству B. Примеры: [1,2]+[3,4] = [1,2,3,4]; [1..10]*[3,8,9,15,23,45] = [3,8,9]; [1..15]-[3,8,9,15,23,45] = [1,2,4..7,10..14]; [red,blue,green,black]*[blue,magenta,yellow] = [blue]

25 Операции над множествами (2) 3. Операции отношения: А = B – проверка совпадения множеств А и B (если совпадают – true) А <> B – проверка не совпадения множеств А и B (не совпадают – true). А <= B – проверка нестрогого вхождения A в B (если входит – true). А > B – проверка строгого вхождения B в A (если входит – true). 4. Проверка вхождения элемента во множество: Пример: if a in [2..6] then …

26 Ввод-вывод элементов множеств Значения множественного типа нельзя вводить и выводить ! Ввод элементов множества:: Var S:set of ;... S:=[]; Read(n); while n<>0 do begin S:=S+[n]; Read(n); end; ReadLn;... Вывод элементов множества: Var S:set of a..z;... for i:=a to z do if i in S then Write(i:3); WriteLn;

27 Определение множества цифр числа Program Ex3_5; {$APPTYPE CONSOLE} Uses SysUtils; Var n:longint; st:string; mnoj:set of '0'..'9'; i:integer; j:char; Begin WriteLn('Input value:'); ReadLn(n); Str(abs(n),st); // преобразуем число в строку mnoj:=[]; for i:=1 to length(st) do mnoj:=mnoj+[st[i]]; //добавляем цифры WriteLn('String ',n,' includes '); for j:='0' to '9' do if j in mnoj then Write(j+' '); ReadLn; End.

28 «Решето Эратосфена» (простые числа) Исходное состояние (NunSet): Результат (RezSet): 1 Начало NumSet:=2..n A RezSet:=1 Next:=2 A NunSet<>[] да нет Вычеркнуть кратные Определить Next Конец Вывод RezSet RezSet:= RezSet+[Next]

29 «Решето Эратосфена» (простые числа)(2) Program Ex3_6; {$APPTYPE CONSOLE} Uses SysUtils; Const N = 100; Type Numbers = set of 1..N; Var NumSet,ResSet:Numbers; Next,Nn,i:word; Begin NumSet := [2..N]; ResSet := [1]; Next := 2;

30 «Решето Эратосфена» (простые числа)(3) while NumSet <> [] do begin Nn := Next; while Nn <= N do begin NumSet := NumSet - [Nn]; Nn := Nn + Next; end; ResSet := ResSet + [Next]; repeat inc(Next); until (Next in NumSet) or (NumSet =[]); end; for i:=1 to N do if i in ResSet then write(i,' '); ReadLn; End.

Записи Запись – это структура данных, образованная фиксированным числом разнотипных компонентов, называемых полями записи. Пример записи: Иванов Иван 20 лет студент 1 курса Иванов | Иван | 20 | студент | 1 Фиксированная часть записи:

32 Объявление и инициализация записей Примеры: а) Var Zap1: record Day:1..31; Month: 1..12; Year: word; end; б) Type Data = record Day:1..31; Month: 1..12; Year: word; end; Var Zap1:Data; в) Var BirthDay: Data = (Day:30; Month:6; Year:1973);

33 Операции над записями 1. Присваивание записей одного типа: Var A,B: record Day:1..31; Month: 1..12; Year: word; end ; … A:=B; 2. Доступ к полям записи: A.Day:=21; {точечная нотация} with A do Day := 21; {оператор доступа} 3. Ввод и вывод записей осуществляется по полям.

34 Массив записей Задача. Вводится список: Ф.И.О. Год р. Месяц р. Дата р. Иванов Б.А Петров М.А Сидоров А.В Определить дату рождения по фамилии и инициалам.

35 Программа Program Ex3_7; {$APPTYPE CONSOLE} Uses SysUtils; Type data=record year:word; month:1..12; day:1..31; end; zap=record fam:string[16]; birthday:data; end; Var fb:array[1..25] of zap; fff:string[16]; i,j,m,n:byte; key:boolean;

36 Ввод записей Begin WriteLn('Input n<=25'); ReadLn(n); m:=0; {счетчик записей} repeat m:=m+1; Write('Input family :'); Readln(fb[m].fam); Write('Input year : ' ); Readln(fb[m].birthday.year); Write('Input month : '); ReadLn(fb[m].birthday.month); Write('Input date : '); ReadLn(fb[m].birthday.day); until n=m; Начало Ввод n m=0 m=m+1 Ввод данных n=m A да нет

37 Вывод списка и ввод фамилии WriteLn; WriteLn('List of group '); WriteLn; for i:=1 to m do with fb[i] do begin Write(i:2,fam:17); with birthday do WriteLn(year:6, month:4, day:4); end; WriteLn; Write('Input family:'); ReadLn(fff); А i=1,m Вывод данных Ввод Ф.И.О. В

38 Поиск. Программирование поискового цикла i:=1; key:=false; while (i <= n) and (not key) do if fb[i].fam = fff then key:=true; else i:=i+1; B i=1,n Фамилия совпадает? нет да Вывод данных Нет данных Конец B i:=1 key:=false i<=n и not key Фамилия совпадает? данет да нет С key:=true i:=i+1

39 Вывод результата {вывод результата} if key then with fb[i] do begin WriteLn('Student :'); Write(fam:18,' '); with birthday do WriteLn(day:2,':', month:2,':', year:5); end else WriteLn('No data about:',fff:18); ReadLn; End. Вывод данных Нет данных Конец С key нетда

40 Записи с вариантами Записи с вариантами реализуют наложение переменных в памяти:

41 Записи с вариантами (2) Пример: Var M: record case byte of 0: (by: array [0..3] of byte); 1: (wo: array [0..1] of word); 2: (lo: longint); end; by[0]by[1]by[2]by[3] wo[0]wo[1] lo