Адреса и структура exe-файла

1.Ввести в программе статические и динамические переменные:

строковые : Ваши фамилия, имя, отчество;

целые числа: коды букв Вашей фамилии;

вещественные: Ваш рост в метрах с точностью до двух знаков после запятой;

double и extended для различных степеней вашего роста в метрах

2.Программа инициализирует все переменные.

Оглавление - содержание

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

4.Используя отладчик программы, выведите в окно просмотра значения системных переменных:

PrefixSeg, DSEG, SSEG, SPTR, HeapOrg, FreePtr,HeapError, OvrHeapEnd.

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

6.В текстовом редакторе MS Word создайте схему распределения ОП для exe-файла Вашей программы.

Справка

Конструкция программы "Адреса и структура exe-файла"

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

Uses CRT;

Type T=Array[1..1] of byte;

P=^T;

PT= Array[1..1] of P;

PPT=^PT;

Var N, M, I, J: Integer;

A : PPT;

Begin

CLRSCR;

Write ( ' N = '); Read ( N );

Write ( ' M = ' ); Read ( M );

GetMem ( A, M * Sizeof ( P ));{выделение памяти}

For I:=1 To M Do

GetMem ( A^[ I ], N * Sizeof( byte ) );{выделение памяти}

For J:=1 To M Do

For I:=1 To N Do A^[J]^[I]:=J;

For J:=1 To M Do

Begin Writeln (' '); Write(J,': ');

For I:=1 To N Do Write (' ', A^[ J ]^[ I ] );

End;

ReadKey;

FreeMem( A^[ I ], N * Sizeof( byte ) );{освобождение памяти}

FreeMem( A, M * Sizeof ( P ));{освобождение памяти}

End.

Оглавление - содержание

Лабораторная работа №25

Динамические переменные

1. Программа заполняет массив размера (300+k) строк и (200+k) столбцов случайными целыми числами от -10 до +10 (k - номер фамилии студента в списке группы).

2. Программа выводит в текстовый файл (имя файла задается пользователем в режиме диалога) название группы, фамилию исполнителя и таблицу со значениями элементов, у которых номера строк на k больше номеров строк и номера столбцов на k больше номеров строк, а также их сумму.

3. Для вывода названия группы и фамилии пользователя необходимо разработать модуль с соответствующей процедурой.

Язык Turbo Pascal выделяет в оперативной памяти для своих программ непрерывную область объемом 65536 байт, называемую сегментом. В нем хранятся все переменные, объявленные в программе. Иногда для решения определенных задач, как эта, такой памяти может не хватить. Тогда в ход идет динамическая память - часть оперативной памяти ПК, предоставляемая программе при ее работе. По умолчанию - это вся оперативная память ПК. В программе "Динамические переменные" задействовано от 60000 до 73000 переменных типа ShortInt, т.е необходимо до 73000 байт динамической памяти.

Все переменные разбиваются на фрагменты - в каждом фрагменте упорядоченно находятся элементы матрицы, лежащие в одной строке. Таким образом будет столько фрагментов, сколько строк в матрице. Эти фрагменты расположены друг за другом в одной части оперативной памяти. Длина каждого фрагмента равна числу столбцов матрицы в байтах (т.к. одна переменная типа ShortInt занимает 1 байт). В программе необходимо создать массив, состоящий из указателей, в которые будут заноситься адреса начала каждого фрагмента (чтобы затем обращаться к переменным посредством этих указателей).

Ниже приведен неполный текст программы, показывающий принцип ее построения :

Program DynamicVariables;

Uses Crt, SaveFamGr; { созданный для программы "Модули" модуль SaveFamGr - для

вывода в файл фамилии и группы пользователя }

Type TShortInt = ^ShortInt; { Тип: указатели типа ShortInt }

Const <...>

Var Fragment : array[1..N] of Pointer; { Массив из указателей }

<...> { остальные переменные}

Function Matr ( i, j : Word ) : TShortInt;

{ Функция, возвращающая указатель, где находится элемент (i,j) }

begin

Matr := Ptr ( Seg(Fragment[j]^), Ofs(Fragment[j]^) + (i-1) );

{ информация о сегменте и смещении начала фрагмента,

в котором находится элемент (i,j), расположена в указателе Fragment[j],

к смещению добавляется еще порядковый номер элемента в строке }

end;

Procedure PrintElement ( i, j : Integer ); { процедура вывода в файл элемента (i,j)}

var k : Integer;

begin

k:=Matr(i,j)^; { k - элемент (i,j) }

<...> { остальные операторы }

end;

begin

Randomize;

For j:=1 to N do

begin GetMem ( Fragment[j], M );

{ Резервирование памяти для одного фрагмента длиной M байт

(кол-во элементов в строке). Указатель Fragment[j] запоминает адрес

начала фрагмента }

For i:=1 to M do Matr(i,j)^ := 10-Random(21);

{ Заполнение

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

вычисленной функцией Matr(), и занесение в нее целого числа. } end; <...>

{ Ввод фамилии, группы и создаваемого файла в режиме диалога. Занесение в этот

файл фамилии и группы (процедурой, объявленной в отдельном модуле) }

For <...> to <...> do PrintElement (<...>);

{ цикл, организованный для выполнения условия, данного в задании }

end.

Динамические переменные: самый большой массив

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

2. Массив состоит из m строк и n столбцов, Количество строк и количество столбцов вводится в режиме диалога. Перед вводом размеров массива проверить размер доступной памяти и длину максимального свободного участка памяти.

3. Массив заполняется числами типа double.

4. Вывести на экран все элементы массива построчно.

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

Справка

Конструкция программы "Динамические переменные: самый большой массив"

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

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

Определение массивов и указателей:

type T = Array[1..1] of double;

P=^T;

PT= Array[1..1] of P;

PPT=^PT;

Выделение областей памяти для указателей строк и элементов массива:

GetMem ( A, NRow * Sizeof(P));

For I:=1 To NRow Do GetMem(A^[I], NCol*Sizeof(Integer));

Освобождение областей памяти для указателей строк и элементов массива:

For I:=1 To NRow Do FreeMem(A^[I], NCol*Sizeof(Integer));

FreeMem ( A, NRow * Sizeof(P));

Оглавление - содержание

Лабораторная работа №26

Стек

1. В качестве данных использовать фамили, имена, отчества 5 своих ближайших родственников и их даты рождения.

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

3. добавление новых данных в типизированный файл;

4. чтение данных из типизированного файла;

5. добавления в стек нового элемента;

6. чтение из стека последнего элемента ;

7. удаление из стека последнего элемента.

8. Программа создает два стека, с которыми выполняет следующие действия:

9. один стек заполняет данными из типизированного файла;

10. поэлементно переносит данные из одного стека в другой.

11. Программу выполнить по шагам и, используя окно просмотра, проследить динамику изменения адресов, используемых в стеке. Записать изменения адресов в текстовый файл.

Справка

Конструкция программы "Стек"

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

Program STACK;

uses Crt;

type

Alfa= String[10];

PComp= ^Comp;

Comp= Record

sD: Alfa;

pNext: PComp

end;

var

pTop: PComp;

sC: Alfa;

Procedure CreateStack(var pTop: PComp; var sC: Alfa);

begin

New(pTop);

pTop^.pNext:=NIL;

pTop^.sD:=sC

end;

Procedure AddComp(var pTop: PComp; var sC: Alfa);

var pAux: PComp;

begin

NEW(pAux);

pAux^.pNext:=pTop;

pTop:=pAux;

pTop^.sD:=sC

end;

Procedure DelComp(var pTop: PComp; var sC:ALFA);

begin

sC:=pTop^.sD;

pTop:=pTop^.pNext

end;

begin

Clrscr;

writeln(' ВВЕДИ СТРОКУ ');

readln(sC);

CreateStack(pTop,sC);

repeat

writeln(' ВВЕДИ СТРОКУ ');

readln(sC);

AddComp(pTop,sC)

until sC='END';

writeln('****** ВЫВОД РЕЗУЛЬТАТОВ ******');

repeat

DelComp(pTop,sC);

writeln(sC);

until pTop = NIL

end.

Оглавление - содержание

Лабораторная работа №27

Очередь

1.В качестве данных использовать фамилии, имена, отчества 5 своих ближайших родственников и их даты рождения.

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

добавление новых данных в типизированный файл;

чтение данных из типизированного файла;

добавления в очередь нового элемента;

чтение из очереди первого элемента ;

удаление из очереди первого элемента.

3.Программа создает две очереди, с которыми выполняет следующие действия:

одна очередь заполняет данными из типизированного файла;

поэлементно переносит данные из одной очереди в другую.

4.Программу выполнить по шагам и, используя окно просмотра, проследить динамику изменения адресов, используемых в очереди. Записать изменения адресов в текстовый файл.

Справка

Конструкция программы "Очередь"

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

Program QUEUE;

uses Crt;

type

Alfa= String[10];

PComp= ^Comp;

Comp= record

sD:Alfa;

pNext:PComp

end;

var

pBegin, pEnd: PComp;

sC: Alfa;

Procedure CreateQueue(var pBegin,pEnd: PComp; var sC: Alfa);

begin

New(pBegin);

pBegin^.pNext:=NIL;

pBegin^.sD:=sC;

pEnd:=pBegin

end;

Procedure AddQueue(var pEnd:PComp; var sC:Alfa);

var pAux: PComp;

begin

New(pAux);

pAux^.pNext:=NIL;

pEnd^.pNext:=pAux;

pEnd:=pAux;

pEnd^.sD:=sC

end;

Procedure DelQueue(var pBegin: PComp; var sC: Alfa);

begin

sC:=pBegin^.sD;

pBegin:=pBegin^.pNext

end;

begin

Clrscr;

writeln(' ВВЕДИ СТРОКУ ');

readln(sC);

CreateQueue(pBegin,pEnd,sC);

repeat

writeln(' ВВЕДИ СТРОКУ ');

readln(sC);

AddQueue(pEnd,sC)

until sC='END';

writeln(' ***** ВЫВОД РЕЗУЛЬТАТОВ *****');

repeat

DelQueue(pBegin,sC);

writeln(sC);

until pBegin=NIL

end.

Оглавление - содержание

Лабораторная работа №28

Список

1.В качестве данных использовать фамилии, имена, отчества 5 своих ближайших родственников и их даты рождения. В качестве ключа использовать порядковый номер записи.

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

добавление новых данных в типизированный файл;

чтение данных из типизированного файла;

начальное формирование списка (запись первой компоненты);

добавление компоненты в конец списка;

чтение компоненты с заданным ключом;

вставка компоненты в заданное место списка (обычно после компоненты с заданным ключом);

исключение компоненты с заданным ключом из списка.

3.Программа создает два списка, с которыми выполняет следующие действия:

один список заполняет данными из типизированного файла;

выбирает случайным образом значение ключа;

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

4.Программу выполнить по шагам и, используя окно просмотра, проследить динамику изменения адресов, используемых в списке. Записать изменения адресов в текстовый файл.

Справка

Конструкция программы "Список"

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

Program LISTLINKED;

uses Crt;

type

Alfa= String[10];

PComp= ^Comp;

Comp= record

sD:Alfa;

pNext:PComp

end;

var

pBegin, pEnd, pAux, pCKey, pPreComp: PComp;

sC, sKey: Alfa;

bCond: Boolean;

Procedure CreateLL(var pBegin,pEnd: PComp; var sC: Alfa);

begin

New(pBegin);

pBegin^.pNext:=NIL;

pBegin^.sD:=sC;

pEnd:=pBegin

end;

Procedure AddLL(var pEnd: PComp; var sC: Alfa);

var pAux: PComp;

begin

New(pAux);

pAux^.pNext:=NIL;

pEnd^.pNext:=pAux;

pEnd:=pAux;

pEnd^.sD:=sC

end;

Procedure Find(var sKey: Alfa; var pBegin,pCKey,pPreComp: PComp;

var bCond: Boolean);

begin

pCKey:=pBegin;

while (pCKey <> NIL) and (sKey <> pCKey^.D) do

begin

pPreComp:=pCKey;

pCKey:=pCKey^.pNext

end;

if (pCKey = NIL) and (sKey <> pCKey^.sD) then bCond:=FALSE

else bCond:=TRUE

end;

Procedure InsComp(var sKey,sC: Alfa);

var pAux:PComp;

begin

Find(sKey,pBegin,pCKey,pPreComp,bCond);

New(pAux);

pAux^.sD:=sC;

pAux^.pNext:=pCKey^.pNext;

pCKey^.pNext:=pAux

end;

Procedure DelComp(var sKey: Alfa; var pBegin: PComp);

begin

Find(sKey,pBegin,pCKey,pPreComp,bCond);

pPreComp^.pNext:=pCKey^.pNext

end;

begin

ClrScr;

writeln(' ВВЕДИ СТРОКУ ');

readln(sC);

CreateLL(pBegin,pEnd,sC);

repeat

writeln('ВВЕДИ СТРОКУ ');

readln(sC);

AddLL(pEnd,sC)

until sC='END';

writeln(' ***** ВЫВОД ИСХОДНОГО СПИСКА *****');

pAux:=pBegin;

repeat

writeln(pAux^.sD);

pAux:=pAux^.pNext;

until pAux=NIL;

writeln;

writeln('ВВЕДИ КЛЮЧ ДЛЯ ВСТАВКИ СТРОКИ');

readln(sKey);

writeln('ВВЕДИ ВСТАВЛЯЕМУЮ СТРОКУ');

readln(sC);

InsComp(sKey,sC);

writeln;

writeln('ВВЕДИ КЛЮЧ УДАЛЯЕМОЙ СТРОКИ');

readln(sKey);

DelComp(sKey,pBegin);

writeln;

writeln(' ***** ВЫВОД ИЗМЕНЕННОГО СПИСКА *****');

pAux:=pBegin;

repeat

writeln(pAux^.sD);

pAux:=pAux^.pNext;

until pAux=NIL

end.

Оглавление - содержание

Лабораторная работа №29

Движение фигур

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

  Траектории Фиг2 Фиг3 Фиг1
Гиперболы D L b
Синусоиды i O u
Серпентины Ньютона Q J U
Кривые Аньези A Z y
Трезубцы Ньютона I [ S
Декартовы листы Y i W
Эллипсы } > r
Лемнискаты Бернулли X V }
Трехлепестковые розы r X
Кардиоиды Y K M
Спирали Архимеда a N A
Астроиды R S Z
Циклоиды z f n
Циссоиды X A .
Строфоиды : P n
Конхоиды Никомеда G c /
Улитки Паскаля . l U
Овалы Кассини t s Q
Экспоненты x e f
Секансы C b L
Эвольвенты n R J
Клотоиды y w >
Затухающие колебания u t I
Гиперболические функции w [ E
Параболы z c d

Показать список выбранных заданий Введите код группы

Введите номер группы, фамилию, имя, номер задания и отправьте Код группы

Фамилия

Имя

Номер задания

Справка

Конструкция программы "Движение фигур"

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

Адреса и структура exe-файла - student2.ru

Модуль, содержащий объект-предок "Точка"

Unit Point;

Interface

uses CRT, Graph;

type

TFigure = object

x0, y0, {Координаты центра фигуры }

Color, {Цвет фигуры }

vx, vy: Integer; {Векторы скоростей по координатам }

constructor Init; {Инициализация объекта }

destructor Done; virtual; {Удаление экземпляра объекта }

procedure Show; virtual; {Отображение на экране }

procedure Hide; virtual; {Убрать с экрана }

procedure Move; {Изменение координат }

procedure Live; {Передвижение }

end;

Implementation

{Тексты методов объекта TFigure}

constructor TFigure.Init;

begin {Случайный выбор}

Color := Random(8) + 8; {цвета }

x0 := Random(GetMaxX); y0 := Random(GetMaxY); {координат и }

vx := Random(11) - 5; vy := Random(11) - 5; {скорости }

Show;

end;

destructor TFigure.Done;

begin {Пусто} end;

procedure TFigure.Show;

begin {Пусто} end;

procedure TFigure.Hide;

begin {Пусто} end;

procedure TFigure.Move;

begin

Inc(x0, vx); Inc(y0, vy); {Изменение координат точки }

if (x0 < 0) or (x0 > GetMaxX) then {При выходе за границы экрана}

begin vx := -vx; Inc(x0, vx); end;{изменение компоненты }

if (y0 < 0) or (y0 > GetMaxY) then {скорости на противоположное }

begin vy := -vy; Inc(y0, vy); end;

end;

procedure TFigure.Live; {Шаг движения реализуется в }

begin Hide; Move; Show; end; {трех процедурах }

end.

Модуль, содержащий объект-потомок "Треугольник"

Unit Triangle;

Interface

uses CRT, Graph, Point;

type

TTriangle = object(TFigure) {Треугольник }

x1, x2, x3,

y1, y2, y3: Integer; {Координаты вершин }

constructor Init; {Инициализация объекта }

procedure Show; virtual; {Показать фигуру }

procedure Hide; virtual; {Скрыть фигуру }

end;

Implementation

{Тексты методов объекта TTriangle}

constructor TTriangle.Init;

begin {Случайный выбор}

x1 := Random(40) - 20; y1 := Random(40) - 20; {координат }

x2 := Random(40) - 20; y2 := Random(40) - 20; {трех }

x3 := Random(40) - 20; y3 := Random(40) - 20; {углов }

{Инициализация с помощью процедуры предка центра фигуры и цвета}

inherited Init;

end;

procedure TTriangle.Show;

begin {Процедуры из модуля Graph }

SetColor(Color); {Установка цвета }

MoveTo(x0 + x1, y0 + y1); {Установка текущей точки }

LineTo(x0 + x2, y0 + y2); {Вычерчивание отрезка прямой }

LineTo(x0 + x3, y0 + y3); {через вершины углов }

LineTo(x0 + x1, y0 + y1); {треугольника }

end;

procedure TTriangle.Hide;

begin {С помощью функции }

SetColor(GetBkColor); {GetBkColor из модуля Graph }

MoveTo(x0 + x1, y0 + y1); {вершины и стороны треугольника }

LineTo(x0 + x2, y0 + y2); {принимают цвет фона }

LineTo(x0 + x3, y0 + y3);

LineTo(x0 + x1, y0 + y1);

end;

end.

Модуль, содержащий объект-потомок "Прямоугольник"

Unit Square;

Interface

uses CRT, Graph, Point;

type

TSquare = object(TFigure) {Прямоугольник }

x1, x2, y1, y2 : Integer; {Координаты углов }

constructor Init; {Инициализация объекта }

procedure Show; virtual; {Показать фигуру }

procedure Hide; virtual; {Скрыть фигуру }

end;

Implementation

{Тексты методов объекта TSquare}

constructor TSquare.Init;

begin

{Случайный выбор координат противоположных углов прямоугольника}

x1 := - Random(10) - 10; y1 := - Random(10) - 10;

x2 := Random(10) + 10; y2 := Random(10) + 10;

{Инициализация с помощью процедуры предка центра фигуры и цвета}

inherited Init;

end;

procedure TSquare.Show;

begin {Процедуры из модуля Graph }

SetColor(Color); {Установка цвета вычерчивание прямоугольника}

Rectangle(x0 + x1, y0 + y1, x0 + x2, y0 + y2);

end;

procedure TSquare.Hide;

begin {С помощью функции GetBkColor из модуля Graph}

SetColor(GetBkColor);

{вершины и стороны прямоугольника принимают цвет фона}

Rectangle(x0 + x1, y0 + y1, x0 + x2, y0 + y2);

end;

end.

Модуль, содержащий объект-потомок "Окружность"

Unit Okr;

Interface

uses CRT, Graph, Point;

type

TCircle = object(TFigure) {Окружность }

Radius : Integer; {Радиус }

constructor Init; {Инициализация объекта }

procedure Show; virtual; {Показать фигуру }

procedure Hide; virtual; {Скрыть фигуру }

end;

Implementation

{Тексты методов объекта TCircle}

constructor TCircle.Init;

begin {Случайный выбор радиуса окружности}

Radius := Random(10) + 10;

{Инициализация с помощью процедуры предка центра фигуры и цвета}

inherited Init;

end;

procedure TCircle.Show;

begin {Процедуры из модуля Graph}

SetColor(Color); {Установка цвета }

Circle(x0, y0, Radius); {Вычерчивание окружности }

end;

procedure TCircle.Hide;

begin {С помощью функции GetBkColor из модуля Graph}

SetColor(GetBkColor); {окружность принимает }

Circle(x0, y0, Radius); {цвет фона }

end;

end.

Программа "Движение фигур"

Program DrowFig;

{Движение по экрану треугольников, прямоугольников, окружностей

с эффектом отражения от границ экрана.

В программе использованы динамические объекты и виртуальные методы}

uses CRT, Graph, Point, Triangle, Square, Okr;

const {Количество }

n1 = 20; {треугольников }

n2 = 20; {прямоугольников }

n3 = 20; {окружностей }

type

PTTriangle = ^TTriangle;

PTSquare = ^TSquare;

PTCircle = ^TCircle;

var

I : Integer;

{Массивы указателей на }

MTriangle : Array [1..n1] of PTTriangle; {треугольники }

MSquare : Array [1..n2] of PTSquare; {прямоугольники}

MCircle : Array [1..n3] of PTCircle; {окружности }

begin

Randomize;

I := Detect;

InitGraph(I, I, 'd:\BP\BGI\');

if GraphResult <> grOk then

Halt(1);

{Инициализация и выделение памяти для экземпляров объектов}

for I := 1 to n1 do

begin New(MTriangle[i]); MTriangle[i]^.Init; end;

for I := 1 to n2 do

begin New(MSquare[I]); MSquare[I]^.Init; end;

for I := 1 to n3 do

begin New(MCircle[I]); MCircle[I]^.Init; end;

Repeat

{Движение фигур по экрану}

for I := 1 to n1 do

MTriangle[i]^.Live;

for I := 1 to n2 do

MSquare[I]^.Live;

for I := 1 to n3 do

MCircle[I]^.Live;

Delay(50);

Until KeyPressed;

{Освобождение памяти}

for I := 1 to n1 do

Dispose(MTriangle[i], Done);

for I := 1 to n2 do

Dispose(MCircle[I], Done);

for I := 1 to n3 do

Dispose(MSquare[I], Done);

CloseGraph; end.

Литература

1. Немнюгин С.А. Turbo Pascal: СПб: Питер, 2001, 256с.

2.Ахмедов А.С.,Алибеков Б.И. Программирование и математическое моделирование -Махачкала :ИПЦ ДГУ,1997.

3.Муртазаев А.К.,Иминов К.О. . Компьютерное моделирование в физике –Махачкала :ИПЦ ДГУ,2001.

4.Матвеев А.Н. Механика и теория относительности – М. :Высшая школа, 1986.

5.Кудинов Ю.И, Пащенко Ф.Ф. Основы современной информатики. Учебное пособие, - СПб: 2009,256с.

6.Фигурнов В.Э.IBMPC для пользователя - Издание 6-е,- М.:ИНФРА, 1995.

7.Фаронов В.В. Основы Турбо-Паскаля –М.:МВТУ-ФЕСТО ДИДАКТИК,1992.

8.Гулд Х., Тобочник Я. Компьютерное моделирование в физике. – М. «Мир», 1990.

9.Информатика. Базовый курс. Под ред. С.В.Симоновича. СПб.: Питер, 2005, 640с.

10. Информатика: учеб./под ред. Н.В.Макаровой М., 2003,768с.

11.Рапаков Г.Г., Ржецкая С.Ю. Turbo Pascal для студентов и школьников. – СПб, 2005, 352с.

12.С.И. Золотова Практикум по Access. – М. «Финансы и статистика», 2003

Оглавление - содержание

Наши рекомендации