Главная |
страница 1
Программирование в среде Delphi Часть V Динамические структуры данных Утверждено научно-методическим советом математического факультета , протокол № Автор Садовская О.Б. Учебное пособие подготовлено на кафедре функционального анализа и операторных уравнений математического факультета Воронежского государственного университета. Рекомендуется для студентов 2 курса дневного отделения математического факультета, обучающихся по специальности «математика» (010100). 5.1 Организация связных списков Очередь Динамическая память и указатели уже рассматривались в параграфе 1.5 первой части данного учебного пособия «Создание консольных приложений». Эти знания мы будем использовать при изучении организации связных списков. Связный список – это динамическая структура, в которой отдельные элементы, имеющие тип запись, последовательно связаны друг с другом посредством того, что одно из полей каждого элемента связного списка имеет тип указатель и содержит адрес очередного элемента списка. Однонаправленный связный список схематически можно представить в виде первый элемент списка указатель второй элемент списка указатель . . . последний элемент списка указатель nil Опишем динамическую структуру данных, которая является однонаправленным списком. Каждый элемент этой динамической структуры – это запись, имеющая два поля. Первое поле отводится под целое число (информационное поле), а второе содержит адрес следующего элемента списка. type link = ^elem; elem = record val : integer; next : link end; var L : link; Переменная L предназначена для указателя на элемент списка. Тогда L^ – это сам элемент списка (динамическая переменная типа запись). Таким образом, L^.val и L^.next – это, соответственно, обозначения для полей этой записи. В Delphi знак разыменования ( ^ ) при обращении к полям динамических структур можно опускать, т.е. к полям данной динамической структуры можно обратиться следующим образом: L.val и L.next Построим список, информационные поля которого будут содержать целые числа, прочитанные из текстового файла file1.txt. type link = ^elem; elem = record val : integer; next : link end; var L, p, q : link; begin assignfile(f, ' file1.txt '); reset(f); new(L); {L – указатель на первый элемент списка} read(f, L.val); {В информационное поле первого элемента записали первое число} p:=L; {p – указатель на последний созданный элемент списка} while not eof(f) do begin new(q) {q – указатель на очередной элемент списка} read(f, q.val); {заполнили его информационное поле} p.next:=q; {записали в ссылочное поле предыдущего элемента адрес q} p:=q {объявили элемент q последним} end; p.next:=nil; {в ссылочное поле последнего элемента записали адрес nil} closefile(f) end. Построенный список называется очередью. Вновь созданные элементы пристраиваются в конец очереди. Работа с элементами очереди начинается с её начала. Для очереди используется обозначение fifo (first in first out – первым пришёл, первым ушёл). Задача 1. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вывести значения информационных полей очереди в поле метки. Содержимое файла file1.txt: 14 -9 8 -22 39 -1 -13 0 4 -7 27 5 -2 18 3 Окно работающего приложения: На форму поместим кнопку button1 с надписью «Создать очередь» и кнопку button2 с надписью «Показать очередь». Для метки Label1 установим свойства
Полный текст модуля: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; type link = ^elem; elem = record val : integer; next : link end; var Form1: TForm1; L:link; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var p, q : link; f : textfile; begin assignfile(f, ' file1.txt '); reset(f); new(L); read(f, L.val); p:=L; while not eof(f) do begin new(q); read(f, q.val); p.next:=q; p:=q end; p.next:=nil; closefile(f); showmessage(' Очередь создана ') end; procedure TForm1.Button2Click(Sender: TObject); var p:link; begin label1.Caption:=''; p:=L; while p<>nil do begin label1.Caption:=label1.Caption + inttostr(p.val) + ' '; p:=p.next end; end; end. Задача 2. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вставить в список новый элемент с информационным полем d после первого элемента. Содержимое файла file1.txt: 14 -9 8 -22 39 -1 -13 0 4 -7 27 5 -2 18 3 Проект для решения задачи 2 будем создавать на основе проекта задачи 1. Добавим на форму приложения задачи 1 кнопку button3 с надписью «Вставка после 1 элемента». Со страницы Additional добавим компонент LabeledEdit1, представляющий собой комбинацию однострочного текстового поля с меткой. Надпись в метке определяет свойство EditLabel (Caption). В модуль Unit1 добавим процедуру обработки события щелчка по кнопке «Вставка после 1 элемента». procedure TForm1.Button3Click(Sender: TObject); var r:link; d:integer; begin d:=strtoint(LabeledEdit1.Text); new(r); r.val:=d; r.next:=L.next; L.next:=r; end; Вставку элемента, осуществляемую этой процедурой, схематически можно изобразить следующим образом: L.next d Работа приложения должна начинаться с нажатия на кнопку «Создать очередь». После появления сообщения «Очередь создана», нужно ввести значение d (в данном случае введено число 100) и нажать на кнопку «Вставка после 1 элемента». Для просмотра преобразованного списка нужно нажать кнопку «Показать очередь». Задача 3. Создать очередь из 20 элементов, информационные поля которой содержат случайные числа из интервала [-30, 30]. Вставить в список новый элемент с информационным полем 100 за каждым отрицательным числом. Создание очереди: procedure TForm1.Button1Click(Sender: TObject); var p, q : link; i : byte; begin randomize; new(L); L.val:= -30 + random(61); p:=L; for i:=2 to 20 do begin new(q); q.val:= -30 + random(61); p.next:=q; p:=q end; p.next:=nil; showmessage('Очередь создана') end; procedure TForm1.Button3Click(Sender: TObject); var w, r : link; begin w:=L; while w<>nil do begin if w.val<0 then begin new(r); r.val:=100; r.next:=w.next; w.next:=r; w:=r.next end else w:=w.next end; end; Процедура обработки события нажатия на кнопку «Показать очередь» такая же, как в задаче 1. Работа приложения должна начинаться с нажатия на кнопку «Создать очередь». После появления сообщения «Очередь создана», нужно нажать кнопку «Показать очередь», чтобы увидеть созданный список. Затем нажать кнопку «Вставка элемента». Для просмотра преобразованного списка нужно нажать кнопку «Показать очередь». Содержимое файла file2.txt: file edit search view project run component database tools window help Описание типа динамической структуры будет иметь вид: type link = ^elem; elem = record val : string; next : link end; Создание очереди: procedure TForm1.Button1Click(Sender: TObject); var p, q : link; f : textfile; begin assignfile(f, ' file2.txt '); reset(f); new(L); readln(f, L.val); p:=L; while not eof(f) do begin new(q); readln(f, q.val); p.next:=q; p:=q end; p.next:=nil; showmessage('Очередь создана') end; Выведение информационных полей списка в столбик в метку Label1: procedure TForm1.Button2Click(Sender: TObject); var p : link; begin label1.Caption:=''; p:=L; while p<>nil do begin label1.Caption:=label1.Caption + p.val + #13; p:=p.next end; end; Удаление второго элемента списка: procedure TForm1.Button3Click(Sender: TObject); var z : link; begin z:=L.next; L.next:=z.next; dispose(z) end; Удаление элемента, осуществляемое этой процедурой, схематически можно изобразить следующим образом:
z=L.next z.next Задача 5. Создать очередь из 20 элементов, информационные поля которой содержат случайные числа из интервала [-40, 40]. Удалить из списка все отрицательные числа. В предыдущей задаче мы научились удалять элемент, стоящий за данным элементом (в задаче 4 мы удаляли 2ой элемент, как элемент, стоящий за 1ым элементом списка). Чтобы применить этот алгоритм в задаче 5, мы должны учесть, что отрицательный элемент может стоять в списке первым. Чтобы сделать первый элемент списка не первым, используют метод фиктивного элемента. Этот метод заключается в том, что перед первым элементом списка добавляют элемент с пустым информационным полем и ссылочным полем, содержащим адрес первого элемента списка ( L ). procedure TForm1.Button3Click(Sender: TObject); var w, r, z : link; begin new(r); r.next:=L; w:=r; while w.next<>nil do if w.next.val<0 then begin z:=w.next; w.next:=z.next; dispose(z) end else w:=w.next; L:=r.next end; В данной процедуре r – фиктивный элемент, w очередной элемент списка. Мы просматриваем все элементы w до предпоследнего и проверяем, является ли элемент, стоящий за w (w.next) отрицательным. Если да, то мы его удаляем. В заключение первый элемент нового списка получает имя L (если этого не сделать, список может остаться без ″головы″ в случае, когда первый элемент исходного списка – отрицательное число). Задачи Задача 6. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вставить в конец списка (после последнего элемента) новый элемент с информационным полем d. Задача 7. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вставить в начало списка (перед первым элементом) новый элемент с информационным полем d. Задача 8. Создать очередь, информационные поля которой содержат числа из текстового файла file1.txt. Вставить новый элемент с информационным полем d после 9ого элемента списка. Задача 9. Создать очередь из 20 элементов, информационные поля которой содержат случайные числа из интервала [-50, 50]. Удалить из списка последний элемент. Задача 10. Создать очередь, информационные поля которой содержат числа из текстового файла file3.txt. Удалить из списка за каждым вхождением элемента с информационным полем, равным d, один элемент, если он отличен от d. Содержимое файла file3.txt: 26 11 -8 34 2 41 -5 11 11 -37 -15 11 29 62 44 Задача 11. Создать очередь, информационные поля которой содержат строки из файла file4.txt (Список фамилий учащихся). Удалить из списка фамилии, начинающиеся с буквы ′ С ′. Содержимое файла file4.txt: Семёнов Антонова Кузнецов Самойлов Егорова Колесников Сидоров Смирнова Петрова Сафонов Указание. Использовать метод фиктивного элемента. Задача 12*. Создать очередь, информационные поля которой содержат строки из файла file4.txt (Список фамилий учащихся). Удалить из списка первую фамилию, начинающуюся с буквы ′ К ′. (Учесть, что такая фамилия может оказаться первой в списке.) Указание. Использовать метод фиктивного элемента. Задача 13*. Создать очередь, информационные поля которой содержат строки из файла file5.txt (Список фамилий учащихся, упорядоченный по алфавиту). Вставить в этот список новую фамилию с сохранением порядка. Провести тестирование проекта для следующих исходных данных: 1) Авдеев 2) Кротов 3) Гаврилов 4) Шмелёв Содержимое файла file5.txt: Антонова Воротников Егорова Колесников Кузнецов Павлов Петрова Сафонов Харитонов Указание. Использовать метод фиктивного элемента. Задача 14**. Считалочка. N ребят расположены по кругу. (Каждому присвоен номер по порядку). Начав отсчёт от первого, удаляют каждого k-ого, смыкая при этом круг. Определить номер последнего, оставшегося в круге. ( kN )Тест 1: k=3 N=7 Ответ: 4 Тест 2: k=4 N=11 Ответ: 9 Указание. Для решения задачи использовать очередь, в которой ссылочное поле последнего элемента содержит адрес первого элемента. 21 … Стек Однонаправленный список, в котором новый элемент добавляется не в конец, а в начало, впереди предыдущего элемента, называется стек. Элемент, который добавлен в стек последним, называется вершиной стека. С него и начинается обработка элементов стека. Отсюда и обозначение стека – lifo (last in first out – последним пришел, первым ушёл). Задача 15. Создать стек, информационные поля которого содержат числа из текстового файла file1.txt. Вывести значения информационных полей стека в поле метки. Содержимое файла file1.txt: 14 -9 8 -22 39 -1 -13 0 4 -7 27 5 -2 18 3 Полный текст модуля: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; type link = ^elem; elem = record val : integer; next : link end; var Form1: TForm1; p : link; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var q : link; f : textfile; begin assignfile(f, ' file1.txt '); reset(f); p:=nil; while not eof(f) do begin new(q); read(f, q.val); q.next:=p; p:=q end; closefile(f); showmessage('Стек создан') end; procedure TForm1.Button2Click(Sender: TObject); var q : link; begin label1.Caption:=''; q:=p; while q<>nil do begin label1.Caption:=label1.Caption + inttostr(q.val) + ' '; q:=q.next end; end; end. Задача 16. Написать программу, проверяющую правильность расстановки круглых скобок в арифметическом выражении. В процессе работы приложения анализируем символы строки, содержащей арифметическое выражение. Если очередной символ – открывающаяся скобка, то она записывается в стек. Если же это закрывающаяся скобка, то находящаяся в вершине стека открывающаяся скобка из стека удаляется при условии, что стек не пуст. Если же стек пуст, то это означает возникновение ошибки в расстановке скобок. Если же такая ошибка не встретилась и по окончании просмотра символов строки стек пуст, то расстановка скобок в выражении сделана правильно. type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); end; type link = ^elem; elem = record val : char; next : link end; var Form1: TForm1; implementation {$R *.dfm} procedure in_stack(var p:link; d:char); var r:link; begin new(r); r^.val:=d; r^.next:=p; p:=r end; procedure del_stack(var p:link); var r:link; begin r:=p; p:=p^.next; dispose(r) end; procedure TForm1.Button1Click(Sender: TObject); var i:integer; t:boolean; q:link; s, str : string; begin s:=edit1.Text; q:=nil; t:=true; i:=1; while (i<=length(s)) and t do begin if s[i] = ' ( ' then in_stack(q, s[i]) else if s[i] = ' ) ' then if q<>nil then del_stack(q) else t:=false; inc(i) end; t:=t and (q=nil); if t then str:=' Правильно ' else str:=' Ошибка '; label1.caption:=str; end; end. Задачи Задача 17. Преобразовать последовательность действительных чисел, записанных в файле file6.txt, расположив сначала отрицательные числа последовательности, а затем неотрицательные. При этом порядок как отрицательных, так и неотрицательных чисел изменяется на обратный. Для отображения содержимого файла на форме использовать компонент Memo1. Указание. Для решения задачи создать два стека: с отрицательными и с неотрицательными числами последовательности. Содержимое файла file6.txt: 19.5 8.06 -43.1 14.9 -35.8 -27.02 0 5.17 62.4 -4.7 p1 10 + p2 100 + p3 1000 + … , где p1, p2 , p3 , … – встречающиеся в последовательности положительные числа, взятые в обратном порядке (начиная с последнего встретившегося положительного числа). Содержимое файла file7.txt: 5 -26 8 -12 19 -10 -13 0 4 -7 9 1 -2 18 -63 Указание. Для решения задачи сформировать стек из положительных чисел последовательности. Задача 19**. Написать программу для вычисления значения выражения, представленного в обратной польской записи. Обычная запись Обратная польская запись (b + c) d b c + d a + (b + c) d a b c + d + (6 + 8)/2 + 11 6 8 + 2 / 11 + Рекурсия – это такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения обращается сама к себе. При выполнении правильно организованной рекурсивной программы осуществляется многократный переход от некоторого текущего уровня алгоритма к нижнему уровню последовательно до тех пор, пока не будет получено тривиальное решение поставленной задачи – база рекурсии. Затем осуществляется возврат на верхний уровень. В самом общем виде рекурсивная организация вычислительного процесса состоит из действий на входе в рекурсию, проверки условия завершения вхождения в рекурсию и действий на выходе из рекурсии. В правильно организованной рекурсии обязательно должно быть условие завершения процесса вхождения в рекурсию. Для реализации выхода из рекурсии требуется хранить точки возврата. Место для хранения точек возврата называется «стеком вызовов» и для него системой программирования выделяется определённая область оперативной памяти. В этом стеке запоминаются не только адреса точек возврата, но и значения всех локальных переменных. Образно выражаясь, запоминается «слепок» процедуры или функции. С помощью рекурсии удобно представлять те задачи, которые сводятся к подзадачам того же типа, но меньшей размерности. Например: n! = n(n-1)!. Здесь задача о вычислении n! может быть решена, если решена задача о вычислении (n-1)! и так далее. function fact(k : integer): int64; begin if k=1 then fact:=1 else fact:= k * fact(k-1) end; procedure TForm1.Button1Click(Sender: TObject); var n : integer; f:textfile; begin assignfile(f, ' n.txt'); reset(f); readln(f, n); append(f); writeln(f, ' n! = ' , fact(n)); closefile(f); memo1.Lines.LoadFromFile(' n.txt '); end; Проследим выполнение этой программы в пошаговом режиме. Предположим, n равно 4. После вызова функции fact формальный параметр k получает значение 4. При выполнении функции сначала проверяется условие k=1. Так как оно не выполнено, то управление передаётся оператору присваивания fact:=k fact(k–1), при выполнении которого происходит вызов функции fact, но уже для значения k на единицу меньше. Снова происходит проверка условия k=1 и, так как оно опять не выполнено, то снова вызывается fact для значения k на единицу меньше. При достижения условия завершения входа в рекурсию (k=1) получим fact:=1, после чего происходит выход из рекурсии: k=2 fact:= k fact(k–1) = 21 = 2 k=3 fact:= k fact(k–1)= 32 = 6 k=4 fact:= k fact(k–1)= 46 = 24 Файловая переменная f должна быть описана в интерфейсной части модуля. function kol:integer; var d:char; begin read(f, d); if d=#26 then kol:=0 else if d=' , ' then kol:=kol + 1 else kol:=kol end; procedure TForm1.Button1Click(Sender: TObject); begin memo1.Lines.LoadFromFile(' w.txt '); assignfile(f,' w.txt '); reset(f); label1.Caption:=' Ответ ' + inttostr(kol); closefile(f) end; Задачи Задача 22. Описать рекурсивную функцию function step(z : real; m:byte):real; для вычисления zm (z – вещественное, m – натуральное) и с её помощью подсчитать значение выражения a7 + b8 . function fib(n : integer) : integer; для вычисления n-ого (n 40) числа Фибоначчи. f0=1, f1=1, fk = fk-2 + fk-1. Задача 24. Описать рекурсивную функцию function arifm(a, d, k : integer) : integer; для вычисления k-ого элемента арифметической прогрессии (a – первый элемент прогрессии, d – разность прогрессии). Список может быть определён следующим образом: список либо пуст, либо состоит из элемента ссылающегося на список (в его ссылочном поле стоит указатель на другой список). Поскольку в этом определении понятие списка определено через само это понятие, то такое определение является рекурсивным. Таким образом, список можно назвать рекурсивной структурой данных. Проверим, является ли очередь из трёх элементов списком в смысле рекурсивного определения. 5 nil Это было бы списком, если бы первый элемент (с информационным полем 5) ссылался на список. То есть нужно проверить, является ли списком следующая структура
Это было бы списком, если бы первый элемент с информационным полем 3 ссылался на список. То есть нужно проверить, является ли списком следующая структура nil Но эта структура состоит из элемента, ссылающегося на пустой список (nil), а, следовательно, сама по определению является списком и, возвращаясь к исходной структуре, мы получаем, что созданная нами очередь является списком в смысле рекурсивного определения. Для обработки рекурсивных структур данных естественно использовать рекурсивные процедуры и функции. Рекурсивная процедура добавления к очереди нового элемента, значение которого берётся из текстового файла f1: procedure add(var r : link); begin if r = nil then begin new(r); r.next:=nil; read(f1, r.val) end else add(r.next) end; Рекурсивная процедура выведения информационных полей очереди в текстовый файл f2: procedure out(r : link); begin if r<> nil then begin write(f2, r.val:6); out(r.next) end end; Вызов этих рекурсивных процедур для создания и распечатки очереди может быть осуществлён в процедуре Button1Click следующим образом: procedure TForm1.Button1Click(Sender: TObject); begin assignfile(f1, ' file8.txt '); assignfile(f2, ' file9.txt '); reset(f1); L:=nil; while not eof(f1) do add(L); closefile(f1); rewrite(f2); out(L); closefile(f2); end; Как будет работать процедура out, если поменять местами оператор write(f2, r.val:6); и рекурсивный вызов out(r.next) ? procedure out(r : link); begin if r<> nil then begin out(r.next); write(f2, r.val:6) end end; Оказывается, в этом случае элементы списка будут выводиться в обратном порядке, так как на входе в рекурсию будет осуществляться только рекурсивный вызов, а печать будет происходить на выходе из рекурсии, т.е. при движении от хвоста к голове списка. Задача 25. Создать очередь из чисел файла file8.txt с помощью рекурсивной процедуры procedure add(var r : link). Описать рекурсивную функцию function memb(r:link; b:integer) : boolean; проверяющую, входит ли элемент с информационным полем b в список r. Описать рекурсивную процедуру procedure dele(var r:link; w:integer); удаляющую из списка r первое вхождение элемента с информационным полем w. Используя функцию memb, проверить, входит ли число, введённое в поле Edit1, в созданный список. Если да, то удалить из списка первое вхождение этого числа с помощью процедуры dele и вывести преобразованный список в файл file9.txt с помощью процедуры out. В противном случае вывести сообщение: «Такого элемента нет». Содержимое файла file8.txt: 9 -38 15 4 -21 15 9 -47 15 36 type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Edit1: TEdit; procedure Button1Click(Sender: TObject); end; type link = ^elem; elem = record val : integer; next : link end; var Form1: TForm1; L : link; f1, f2 : textfile; implementation {$R *.dfm} procedure add(var r : link); begin if r = nil then begin new(r); r.next:=nil; read(f1, r.val) end else add(r.next) end; procedure out(r : link); begin if r<> nil then begin write(f2, r.val : 6); out(r.next) end end; function memb(r : link; b : integer) : boolean; begin if r=nil then memb:=false else if r.val=b then memb:=true else memb:=memb(r.next, b) end; procedure dele(var r : link; w : integer); var z : link; begin if r<>nil then if r.val=w then begin z:=r; r:=r.next; dispose(z) end else dele(r.next, w) end; procedure TForm1.Button1Click(Sender: TObject); var d : integer; begin assignfile(f1, ' file8.txt '); assignfile(f2, ' file9.txt '); reset(f1); L:=nil; while not eof(f1) do add(L); closefile(f1); d:=strtoint(edit1.Text); if memb(L, d) then begin dele(L, d); rewrite(f2); out(L); closefile(f2); memo1.Lines.LoadFromFile(' file9.txt '); end else showmessage(' Такого элемента нет ') end; Задачи Задача 26. Создать очередь с помощью рекурсивной процедуры procedure add(var r : link). Описать рекурсивную функцию function neg(r : link) : boolean; проверяющую, имеется ли в списке элемент с отрицательным информационным полем. Ответ вывести в поле метки. procedure add(var r : link). Описать рекурсивную функцию function nmemb(r:link; b:integer):integer; подсчитывающую количество вхождений элемента с информационным полем b в список r. С помощью этой функции подсчитать, сколько раз встречается в списке число, введённое в поле Edit1. Результат вывести в поле метки. Задача 28*. Создать очередь с помощью рекурсивной процедуры procedure add(var r : link). Описать рекурсивную функцию function max(r:link) : integer; для нахождения максимума в списке r. Результат вывести в поле метки. </0></0> Смотрите также:
Программирование в среде Delphi Часть V динамические структуры данных
197.82kb.
Delphi это среда разработки программ, ориентированных на работу в операционной системе Windows
804.07kb.
Общие принципы дизайна в объектно-ориентированном проектировании Задание: Обобщенное программирование
102.86kb.
1. Цели освоения дисциплины Дать необходимые знания по основам объектно-ориентированного программирования и разработке приложений в среде Windows
151.84kb.
Понятие базы данных, реляционной базы данных, субд, ключа, отношения
18.14kb.
Аттестация: Сертификат установленного образца
50.52kb.
Xml (eXtensible Markup Language) расширяемый язык разметки. Основное внимание в xml сосредоточено на данных. В xml структурная разметка данных и представление данных строго разделены
205.68kb.
Евдокимов А. В., к ф. м н
470.83kb.
Доступ к com серверам Microsoft Office из Delphi 5
180.84kb.
K Рисунок 5 Использование принтера в автономной среде Рисунок 6 Использование принтера в сетевой среде Рисунок 7 Локальная вычислительная сеть(лвс) Рисунок 8
89.04kb.
Название он такое получил по имени одной из главных его составляющих базы данных. Программа «Базы данных» обладает большими возможностями для систематизации и отображения данных
129.79kb.
Программирование в компьютерных системах
10.83kb.
|