Алгоритм обработки при работе с массивом, типизированным файлом и динамическим списком. Применение для массивов и типизированных файлов произвольной адресации элементов, для динамических списков - последовательной адресации. Блок-схема и текст программы.
Аннотация к работе
ВТ Габитова Г.Н. Ижевск 2010 Постановка задачи Общая формулировка: Дан текстовый файл, содержащий последовательность чисел. Затем переписать числа из текстового файла в типизированный файл и обработать файл, а затем создать список из текстового файла и снова его обработать. Затем сумму этих чисел добавить в конец. алгоритм массив типизированный файл Блок-схема программы fail Текст программы program kurs; uses crt; const n=10; {максимальная длина массива} type mas= array [1. n] of byte; {тип для массивов} mn= set of byte; {тип для множеств состоящих из чисел} fille= file of byte; {тип для типизированных файлов состоящих из чисел} din=^mode; {ссылочный тип} mode=record {тип запись с полями} x: byte; {для хранения числа} adr: din; {и для хранения адреса следующего элемента} end; {конец типа запись} var i,v,ch: byte; {ch-хранит числа, необходима для создания текстового файла, если исходный не был найден, i-количество записанных в текстовый файл чисел, v-используется как логическая для определения какую процедуру вызвать и выхода из программы} t: text; {исходный текстовый файл} a: mas; {массив} f: fille; {типизированный файл} first,p1,p2: din; {first-голова списка, p1,p2-для перемещения по списку} procedure delmass (k1: Integer; Var m: mas); {процедура удаления k1 элемента из массива m, путем сдвига всех элементов массива, лежащих справа от удаляемого, на 1 позицию влево} var i: byte; {счетчик цикла, он же номер элемента в массиве} begin for i: =k1 to n-1 do {перебираем элементы массива от удаляемого до предпоследнего} m [i]: = m [i 1]; {i-му элементу присваиваем значение i 1-го элемента (на первом шаге удаляемому присвоится значение элемента следующего за ним} m [n]: =0; {последнему элементу массива присваиваем 0} end; procedure mass (var a: mas); {процедура обрабатывающая переданный в нее массив a соответственно заданию} var ch,sum,kol,j: byte; {ch-счетчик количества встреч i-го числа в массиве, sum-сумма чисел встречающихся 1 раз, kol-количество чисел встречающихся 1 раз, j-счетчик цикла} mn1,mnpos: mn; {mn1-множество чисел встречающихся 1 раз (которые надо удалить), mnpos-множество номеров тех элементов массива которые встречаются 1 раз} begin mn1: = []; {обновление множества чисел} mnpos: = []; {и обновление множества номеров} reset (t); {встаем на начало текстового файла} for i: =1 to n do begin {видимо в файле всегда 10 чисел} readln (t,ch); {читаем число из файла} a [i]: =ch; {записываем прочитанное число в массив} end; close (t); {закрываем текстовый файл} ch: =0; {обнуляем количество встреч} sum: =0; {и обнуляем сумму чисел встречающихся 1 раз} for i: =1 to n do begin {в этом цикле берется один элемент из массива} ch: =0; for j: =1 to n do begin {здесь другой элемент, таким образом происходит сравнение каждого элемента с каждым, при этом рассматривается даже пара сам с собой, т е когда i=j} if (a [i] =a [j]) then {если i-ый элемент массива = j-му} inc (ch); {то увеличиваем количество встреч i-числа} end; if ch=1 then {если количество встреч равно 1, т е число совпало лишь само с собой - оно единственно} mnpos: =mnpos [i]; {то его номер записываем в множество номеров} if i in mnpos then begin {если номер попал в множество,} sum: =sum a [i]; {то это число прибавляем к сумме} inc (kol); {увеличиваем счетчик чисел, встречающихся 1 раз} end; end; for i: =1 to n do {перебираем все номера элементов массива} if i in mnpos then {если номер элемента массива входит в множество номеров} mn1: =mn1 [a [i]]; {то значение элемента записываем в множество чисел встречающихся 1 раз} for i: =n downto 1 do {перебираем элементы массива с конца} if a [i] in mn1 then {если элемент массива входит в множество,} delmass (i,a); {то удаляем его из массива} a [n-kol 1]: =sum; {в массиве после удаления останется n-kol элементов, тогда на n-kol 1 место записываем сумму элементов встретившихся в массиве 1 раз} {выводим получившийся массив} writeln (posle); for i: =1 to n-kol 1 do write (a [i], ); writeln; writeln; end; procedure fill (var g: fille); var ch,ch1,ch2,sum,kol,k,j: byte; {ch1, ch2 и k - вспомогательные переменные для чтения и записи в типизированный файл} mn1,mnpos: mn; {все остальные переменные имеют прежнее назначение} begin assign (f,tipfile. txt); {связываем файловую переменную f с файлом на диске по имени что в кавычках} reset (t); {встаем на начало текстового файла} rewrite (f); {типизированный файл открываем на перезапись} sum: =0; {обнуление суммы} kol: =0; {обнуление количества} mn1: = []; {обновление множества чисел встречающихся 1 раз} mnpos: = []; {обновление множества номеров чисел встречающихся 1 раз} while not eof (t) do begin {пока не конец текстового файла} readln (t,ch); {читаем из него число} write (f,ch); {и записываем в типизированный файл} end; close (t); {закрываем текстовый файл} reset (f); {встаем на начало типизированного файла} {обработка алогична обработке в массиве} for i: =0 to filesize (f) - 1 do begin {берем одно число из файла} ch: =0; seek (f, i); {встали перед числом, которое хотим проч