«программирование»





Название«программирование»
страница6/11
Дата публикации08.03.2015
Размер1.89 Mb.
ТипУчебно-методический комплекс
100-bal.ru > Информатика > Учебно-методический комплекс
1   2   3   4   5   6   7   8   9   10   11

Контрольные вопросы и задания


  1. Что такое множество?

  2. Почему множество является структурированным типом данных?

  3. Как хранится множество в памяти ЭВМ? Какой максимальный объем оперативной памяти может быть отведен под хранение одного множества?

  4. Какие операции можно выполнять над множествами?

  5. Как добавить элемент в множество?

  6. Как исключить элемент из множества?

  7. Как вывести элементы множества? Как подсчистать количество элементов в множестве?

  8. Как может быть использована операция вхождения?


Лекция №10. Записи в языке Pascal
Запись — структурированный тип данных. Записи являются неоднородными неупорядоченными структурами с прямым доступом к компонентам. Компоненты записи называют полями записи.

Обычно запись содержит совокупность разнотипных атрибутов, относящихся к одному объекту.

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

рекордсмен

страна

статус соревнований (Олимпиада, чемпионат мира)

длина дистанции

год рекорда

время
Структурная диаграмма для записи

Запись может быть объявлена в разделе type:

идентификатор типа = Record

поле1: тип;

поле2: тип;



полеN: тип

end;

Например,

type beg = record

fam: string[25];

srtana: string[20];

status: boolean; {Олимпиада - true; чемпионат мира - false}

dlina: longint;

god: 1900..2009;

vr: string[15];

end;
Var a: beg;
К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру:

<имя переменной>.<имя поля>
Например,

a.fam; a.dlina и т.п.
Если, например, требуется полю "status" присвоить значение «true», то это делается так:

a.status := true;
Поля записи могут иметь любой тип, кроме файла, в частности, сами могут быть записями.
Например,

type beg1 = record

fam: string[25];

srtana: string[20];

status: boolean; {Олимпиада - true; чемпионат мира - false}

dlina: longint;

god: 1900..2009;

vr: record min: longint;

sec: real

end

end;
Var a: beg1;
Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем. Например,

a.vr.min

a.vr.sec
В программе могут использоваться массивы записей.
Любая обработка записей, в том числе ввод и вывод, производится поэлементно.
Например,

var b: array[1..200] of beg1;
...

write('Число рекордсменов? '); readln(n);

for i:=1 to n do

with b[i] do

begin

write('Фамилия спортсмена? '); readln(fam);

write('Гражданин какой страны спортсмен? '); readln(strana);

write('Статус соревнования? '); readln(status);

write('Длина дистанции? '); readln(dlina);

write('Год проведения соревнования? '); readln(god);

write('Время, за которое спортсмен пробежал дистанцию (мин, сек)? '); readln(vr.min, vr.sec);

end;

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

with <переменная типа запись> do <оператор>;
Он позволяет, один раз указав имя переменной типа "запись" после слова with, работать в пределах одного оператора (простого или составного) с именами полей как с обычными переменными, т.е. не писать громоздких составных имен.

Объём памяти, занимаемый записью, определяется суммарным объёмом, занимаемым её полями:

type beg1 = record

fam: string[25]; {26 байт}

srtana: string[20]; {21 байт}

status: boolean; {1 байт}

dlina: longint; {4 байта}

god: 1900..2009; {2 байта}

vr: record min: longint; {4 байта}

sec: real {6 байт}

end

end;
Всего получаем: 26+21+1+4+2+4+6=65 байт
Массив, описанный выше, занимает 65 байт × 200 элементов = 13000 байт оперативной памяти.

Записи с вариантами

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

Вариантная часть записи начинается выбором case и следует за общей частью; после ее окончания в записи не могут появляться никакие другие поля, поэтому case закрывается служебным словом end.
Любая запись может иметь только одну вариантную часть, которая должна размещаться в конце записи (после фиксированной части). Однако, внутри какого-либо варианта, в свою очередь, может присутствовать другая вариантная часть, вложенная в первую.

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

Type pol=(m,w);

people=record

fam:string[20];

godro:1900..2007;

case mw:pol of

m: ( voen: boolean; spec: string[15]);

w: ( merry: boolean; child: byte)

end;

var p1, p2: people;
Все имена элементов должны быть различными, даже если они встречаются в разных вариантах.
К элементам вариантной части можно обращаться так же, как к элементам фиксированной части записи.

P1.mw:=m; p1.voen:=true; p2.child:=2;
В процессе выполнения программы в структуру записи включается тот вариант, элементам которого в данный момент было присвоено значение. Как только какому-либо элементу другого варианта присваивается некоторое значение, в структуру записи включается этот вариант, а элементы предыдущего варианта становятся неопределенными.

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

Type pol=(m,w);

people=record

fam:string[20]; {21}

godro:1900..2007; {2}

case mw:pol of {1}

m: ( voen: boolean; spec: string[15]); {1+16=17}

w: ( merry: boolean; child: byte) {1+1=2}

end;

21 + 2 + 1 + max(17, 2) = 41 (байт)

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

program ex_zap;

type detal = record a: string[30]; kol, st: integer; end;

var a: array [0..99] of detal; n, i, max: integer;

begin

write('Количество деталей? ');

readln(n);

for i:=0 to n-1 do

With a[i] do

begin write('Информация об ', i, ' детали: ');

readln(a);

readln(kol);

readln(st);

end;

max := 0;

for i:= 1 to n-1 do

if a[max].kol*a[max].st < a[i].kol*a[i].st then max:=i;

writeln('Искомая деталь: ', a[max].a, ' стоимостью ', a[max].st, ' в количестве ', a[max].kol);

end.


Контрольные вопросы и задания


  1. Чем отличается тип "запись" от других структурированных типов?

  2. Могут ли поля записи быть одного и того же типа?

  3. Как обратиться к отдельному полю записи?

  4. Что такое "оператор присоединения"? В каких целях он используется?

  5. Что такое "запись с вариантами"?

  6. Как определить объем памяти под статическую запись? запись с вариантами?

  7. Как заполнить массив записей?


Лекция №11. Создание библиотек подпрограмм в Turbo Pascal
Стандартный язык Pascal не располагает средствами разработки и поддержки библиотек программиста (в отличие, скажем, от языка Fortran и других языков программирования высокого уровня), которые компилируются отдельно и в дальнейшем могут быть использованы как самим разработчиком, так и другими. Если программист имеет достаточно большие наработки, и те или иные подпрограммы могут быть использованы при написании новых приложений, то приходится эти подпрограммы целиком включать в новый текст.

В Turbo Pascal это ограничение преодолевается за счет, во-первых, введения внешних процедур, во-вторых, разработки и использования модулей. В настоящей публикации на примерах рассмотрим работу с теми и другими программными единицами.

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

Покажем это на примере задач целочисленной арифметики, где аргументы, результаты и промежуточные величины являются целыми (Integer, Word, LongInt и т.д.). Вот несколько таких задач.
1. Дано натуральное число n. Найти сумму первой и последней цифры этого числа.
2. Дано натуральное число n. Переставить местами первую и последнюю цифры этого числа.
3. Дано натуральное число n. Дописать к нему цифру k в конец и в начало (если это возможно, т.е. результат не выйдет за диапазон допустимых значений), или сообщить о невозможности выполнения операции.
4. Найти наибольшую цифру в записи данного натурального числа.
5. Дано натуральное число n. Переставить его цифры так, чтобы образовалось максимальное число, записанное теми же цифрами.
При решении каждой из этих задач может быть использована функция, возвращающая количество цифр в записи натурального числа.
Вот возможный вариант такой функции:

Function Digits(N : LongInt) : Byte;

Var Kol : Byte;

Begin

Kol := 0;

While N <> 0 Do Begin Kol := Kol + 1; N := N Div 10 End;

Digits := Kol

End;
Сохраним этот текст в файле с расширением .inc (это расширение внешних подпрограмм в Turbo Pascal), например, digits.inc.
Еще необходима функция возведения натурального числа в натуральную степень.

Function Power(A, N : LongInt) : LongInt; {файл power.inc}

Var I, St : LongInt;

Begin

St := 1;

For I := 1 To N Do St := St * A;

Power := St

End;
Попробуем использовать функции при решении задачи номер один.

Program Example1;

Var N, S : LongInt;

{$I digits.inc} {подключаем внешнюю функцию digits.inc, возвращающую количество цифр в записи числа}

{$I power.inc} {внешняя функция, выполняющая возведение числа A в степень N}

Begin

Write('Введите натуральное число: ');

ReadLn(N);

{для определения последней цифры числа N берем остаток от деления этого числа на 10, а для определения первой делим N на 10 в степени на единицу меньшую, чем количество цифр в записи числа (нумерация разрядов начинается с 0)}

S := N Mod 10 + N Div Power(10, Digits(N) - 1);

WriteLn('Искомая сумма: ', S)

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

Далее речь пойдет о модулях: их структуре, разработке, компиляции и использовании.

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

В основе идеи модульности лежат принципы структурного программирования. Существуют стандартные модули Turbo Pascal, которые обычно описываются в литературе по данному языку.
Модуль имеет следующую структуру:

Unit <имя модуля>; {заголовок модуля}

Interface

{интерфейсная часть}

Implementation

{раздел реализации}

Begin

{раздел инициализации модуля}

End.
После служебного слова Unit записывается имя модуля, которое (для удобства дальнейших действий) должно совпадать с именем файла, содержащего данный модуль. Поэтому (как принято в MS DOS) имя не должно содержать более 8 символов.

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

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

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

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

Задача. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида P/Q (P — целое, Q — натуральное): 1) сложение; 2) вычитание; 3) умножение; 4) деление; 5) сокращение дроби; 6) возведение дроби в степень N (N — натуральное); 7) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).
Дробь представить следующим типом:

Type Frac = Record

P : Integer;

Q : 1.. High(LongInt)

End;
Используя этот модуль, решить задачи:
1. Дан массив A — массив обыкновенных дробей. Найти сумму всех дробей, ответ представить в виде несократимой дроби. Вычислить среднее арифметическое всех дробей, ответ представить в виде несократимой дроби.
2. Дан массив A — массив обыкновенных дробей. Отсортировать его в порядке возрастания.

Unit Droby;

Interface

Type

Natur = 1..High(LongInt);

Frac = Record

P : LongInt; {Числитель дроби}

Q : Natur {Знаменатель дроби}

End;

Procedure Sokr(Var A : Frac);

Procedure Summa(A, B : Frac; Var C : Frac);

Procedure Raznost(A, B : Frac; Var C : Frac);

Procedure Proizvedenie(A, B : Frac; Var C : Frac);

Procedure Chastnoe(A, B : Frac; Var C : Frac);

Procedure Stepen(A : Frac; N : Natur; Var C : Frac);

Function Menshe(A, B : Frac) : Boolean;

Function Bolshe(A, B : Frac) : Boolean;

Function Ravno(A, B : Frac) : Boolean;

Function MensheRavno(A, B : Frac) : Boolean;

Function BolsheRavno(A, B : Frac) : Boolean;

Function NeRavno(A, B : Frac) : Boolean;

{Раздел реализации модуля}

Implementation

{Наибольший общий делитель двух чисел - вспомогательная функция, ранее не объявленная}

Function NodEvklid(A, B : Natur) : Natur;

Begin

While A <> B Do

If A > B Then

If A Mod B <> 0 Then A := A Mod B Else A := B

Else

If B Mod A <> 0 Then B := B Mod A Else B := A;

NodEvklid := A

End;

Procedure Sokr; {Сокращение дроби}

Var M, N : Natur;

Begin

If A.P <> 0 Then

Begin

If A.P < 0 Then M := Abs(A.P)

Else M := A.P; {Совмещение типов, т.к. A.P - LongInt}

N := NodEvklid(M, A.Q); A.P := A.P Div N; A.Q := A.Q Div N

End

End;

Procedure Summa; {Сумма дробей}

Begin

{Знаменатель дроби} C.Q := (A.Q * B.Q) Div NodEvklid(A.Q, B.Q);

{Числитель дроби} C.P := A.P * C.Q Div A.Q + B.P * C.Q Div B.Q;

Sokr(C)

End;

Procedure Raznost; {Разность дробей}

Begin

{Знаменатель дроби} C.Q := (A.Q * B.Q) Div NodEvklid(A.Q, B.Q);

{Числитель дроби} C.P := A.P * C.Q Div A.Q - B.P * C.Q Div B.Q;

Sokr(C)

End;

Procedure Proizvedenie;

Begin

{Знаменатель дроби} C.Q := A.Q * B.Q;

{Числитель дроби} C.P := A.P * B.P;

Sokr(C)

End;

Procedure Chastnoe;

Begin

{Знаменатель дроби} C.Q := A.Q * B.P;

{Числитель дроби} C.P := A.P * B.Q;

Sokr(C)

End;

Procedure Stepen; {Степень}

Var I : Natur;

Begin

C.Q := 1; C.P := 1; Sokr(A);

For I := 1 To N Do Proizvedenie(A, C, C)

End;

Function Menshe;

Begin Menshe := A.P * B.Q < A.Q * B.P End;

Function Bolshe;

Begin Bolshe := A.P * B.Q > A.Q * B.P End;

Function Ravno;

Begin Ravno := A.P * B.Q = A.Q * B.P End;

Function BolsheRavno;

Begin BolsheRavno := Bolshe(A, B) Or Ravno(A, B) End;

Function MensheRavno;

Begin MensheRavno := Menshe(A, B) Or Ravno(A, B) End;

Function NeRavno;

Begin NeRavno := Not Ravno(A, B) End;

{Раздел инициализации модуля}

Begin

End.
Дадим некоторые рекомендации по разработке модулей:
1) спроектировать модуль, т.е. выделить основные и вспомогательные подпрограммы, другие ресурсы;
2) каждую подпрограмму целесообразно отладить отдельно, после чего «вклеить» в текст модуля.
Сохраним текст разработанной программы в файле DROBY.PAS и откомпилируем наш модуль. Для этого можно воспользоваться внешним компилятором, поставляемым вместе с Turbo Pascal. Команда будет выглядеть так: TPC DROBY.PAS. Если в тексте нет синтаксических ошибок, получим файл DROBY.TPU, иначе будет соответствующее сообщение с указанием строки, содержащей ошибку. Другой способ компиляции модуля — в среде программирования Turbo Pascal выбрать в пункте меню Run подпункты Make или Build (при этом должна быть включена компиляция на диск).

Теперь можно подключить модуль к программе, где планируется его использование.
Для примера решим задачу суммирования массива дробей.

Program Sum;

Uses Droby;

Var A : Array[1..100] Of Frac;

I, N : Integer;

S : Frac;

Begin

Write('Введите количество элементов массива: ');

ReadLn(N);

S.P := 0; S.Q := 1; {Первоначально сумма равна нулю}

For I := 1 To N Do {Вводим и суммируем дроби}

Begin

Write('Введите числитель ', I, '-й дроби: '); ReadLn(A[I].P);

Write('Введите знаменатель ', I, '-й дроби: '); ReadLn(A[I].Q);

Summa(A[I], S, S);

End;

WriteLn('Ответ: ', S.P, '/', S.Q)

End.
Вторую задачу предлагаем решить читателю самостоятельно.

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

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

Ещё несколько слов о видимости объектов модуля. Если в программе, использующей модуль, имеются идентификаторы, совпадающие с точностью до символа с идентификаторами модуля, то они «перекрывают» соответствующие ресурсы модуля. Тем не менее, даже в такой ситуации доступ к этим ресурсам модуля может быть получен таким образом: <имя модуля>.<имя ресурса>.

Лекция №12. Динамические структуры данных: списки

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

В языках программирования (Pascal, C, др.) существует и другой способ выделения памяти под данные, который называется динамическим. В этом случае память под величины отводится во время выполнения программы. Такие величины будем называть динамическими. Раздел оперативной памяти, распределяемый статически, называется статической памятью; динамически распределяемый раздел памяти называется динамической памятью (динамически распределяемой памятью).

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

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

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

Адрес величины — это номер первого байта поля памяти, в котором располагается величина. Размер поля однозначно определяется типом.

Далее будем более подробно обсуждать указатели и действия с ними в языке Pascal, примеры будем приводить на Pascal и C.

Величина ссылочного типа (указатель) описывается в разделе описания переменных следующим образом:

Var <идентификатор> : ^<имя типа>;
Вот примеры описания указателей:

Type Mas1 = Array[1..100] Of Integer;

Var P1 : ^Integer;

P2 : ^String;

Pm : ^Mas1;
Здесь P1 — указатель на динамическую величину целого типа; P2 — указатель на динамическую величину строкового типа; Pm — указатель на динамический массив, тип которого задан в разделе Type.

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

Каким же образом происходит выделение памяти под динамическую величину? Память под динамическую величину, связанную с указателем, выделяется в результате выполнения стандартной процедуры NEW. Формат обращения к этой процедуре:

NEW(<указатель>);
Считается, что после выполнения этого оператора создана динамическая величина, имя которой имеет следующий вид:

<имя динамической величины> := <указатель>^
Пусть в программе, в которой имеется приведенное выше описание, присутствуют следующие операторы:

NEW(P1); NEW(P2); NEW(Pm);
После их выполнения в динамической памяти оказывается выделенным место под три величины (две скалярные и один массив), которые имеют идентификаторы:

P1^, P2^, Pm^
Например, обозначение P1^ можно расшифровать так: динамическая переменная, на которую ссылается указатель P1.

Дальнейшая работа с динамическими переменными происходит точно так же, как со статическими переменными соответствующих типов. Им можно присваивать значения, их можно использовать в качестве операндов в выражениях, параметров подпрограмм и пр. Например, если переменной P1^ нужно присвоить число 25, переменной P2^ присвоить значение символа "Write", а массив Pm^ заполнить по порядку целыми числами от 1 до 100, то это делается так:

P1^ := 25;

P2^ := 'Write';

For I := 1 To 100 Do Pm^[I] := I;
Кроме процедуры NEW значение указателя может определяться оператором присваивания:

<указатель> := <ссылочное выражение>;
В качестве ссылочного выражения можно использовать

указатель;

ссылочную функцию (т.е. функцию, значением которой является указатель);

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

До присваивания значения ссылочной переменной (с помощью оператора присваивания или процедуры NEW) она является неопределенной.
Ввод и вывод указателей не допускается.
Рассмотрим пример. Пусть в программе описаны следующие указатели:

Var D, P : ^Integer;

K : ^Boolean;
Тогда допустимыми являются операторы присваивания

D := P; K := Nil;

поскольку соблюдается принцип соответствия типов. Оператор K := D ошибочен, т.к. базовые типы у правой и левой части разные.

Если динамическая величина теряет свой указатель, то она становится "мусором". В программировании под этим словом понимают информацию, которая занимает память, но уже не нужна.

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

NEW(D); NEW(P);

{Выделено место в динамической памяти под две целые переменные. Указатели получили соответствующие значения}

D^ := 3; P^ := 5;

{Динамическим переменным присвоены значения}

P := D;

{Указатели P и D стали ссылаться на одну и ту же величину, равную 3}

WriteLn(P^, D^); {Дважды напечатается число 3}
Таким образом, динамическая величина, равная 5, потеряла свой указатель и стала недоступной. Однако место в памяти она занимает. Это и есть пример возникновения "мусора". На схеме показано, что произошло в результате выполнения оператора P := D.

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

DISPOSE(<указатель>);
Например, если динамическая переменная P^ больше не нужна, то оператор

DISPOSE(P)

удалит ее из памяти. После этого значение указателя P становится неопределенным. Особенно существенным становится эффект экономии памяти при удалении больших массивов.

В версиях Турбо-Паскаля, работающих под операционной системой MS DOS, под данные одной программы выделяется 64 килобайта памяти (или, если быть точнее, 65520 байт). Это и есть статическая область памяти. При необходимости работать с большими массивами информации этого может оказаться мало. Размер динамической памяти — много больше (сотни килобайт). Поэтому использование динамической памяти позволяет существенно увеличить объем обрабатываемой информации.

Следует отчетливо понимать, что работа с динамическими данными замедляет выполнение программы, поскольку доступ к величине происходит в два шага: сначала ищется указатель, затем по нему — величина. Как это часто бывает, действует "закон сохранения неприятностей": выигрыш в памяти компенсируется проигрышем во времени.

Пример. Дан текстовый файл размером не более 64 Кб, содержащий действительные числа, по одному в каждой строке. Переписать содержимое файла в массив, разместив его в динамически распределяемой памяти. Вычислить среднее значение элементов массива. Очистить динамическую память. Создать целый массив размером 10000, заполнить его случайными целыми числами в диапазоне от –100 до 100 и вычислить его среднее значение.

{Язык Turbo Pascal}

Program Srednee;

Const NMax = 10000;

Type Diapazon = 1..NMax;

MasInt = Array[Diapazon] Of Integer;

MasReal = Array[Diapazon] Of Real;

Var PIint : ^MasInt; PReal : ^MasReal;

I, Midint : longInt; MidReal : Real; T : Text; S : string;

Begin

Write('Введите имя файла: '); ReadLn(S);

Assign(T, S); Reset(T); MidReal := 0; MidInt := 0;

Randomize;

NEW(PReal); {Выделение памяти под вещественный массив}

{Ввод и суммирование вещественного массива}

While Not Eof (T) Do

Begin ReadLn(T, PReal^[I]); MidReal := MidReal + PReal^[I] End;

DISPOSE(PReal); {Удаление вещественного массива}

NEW(PInt); {Выделение памяти под целый массив}

{Вычисление и суммирование целого массива}

For I := 1 To NMax Do

Begin PInt^[I] := -100 + Random(201); MidInt := MidInt + PInt^[I] End;

{Вывод средних значений}

WriteLn('среднее целое равно: ', MidInt Div NMax);

WriteLn('среднее вещественное равно: ', (MidReal / NMax) : 10 : 6)

End.


// Язык C++

#include < stdio.h >

#include < time.h >

#include < stdlib.h >

#include < iostream.h >

#define NMax 10000

typedef int MasInt;

typedef float MasReal;

MasInt *PInt; MasReal *PReal;

int I, n, MidInt; float MidReal; char S[255];

FILE *t; char *endptr;

void main()

{ cout << "Введите имя файла: "; cin >> S;

t=fopen(S, "r");

MidReal = 0; MidInt = 0;

randomize(); I=0;

/*Выделение памяти под вещественный массив*/

PReal = (MasReal*) malloc (sizeof(MasReal));

/*Ввод и суммирование вещественного массива*/

while (!feof(t))

{fgets(S, 255, t); // вводим из файла строку

PReal[I] = strtod(S, &endptr); // преобразуем введенную строку в вещественное число

MidReal += PReal[I]; I++;}

n=I+1;

free (PReal); /*Удаление вещественного массива*/

PInt = (MasInt*) malloc(sizeof(MasInt)); /*Выделение памяти под целый массив*/

/* Вычисление и суммирование целого массива */

for (I=0; I < NMax; I++)

{ PInt[I] = -100 + random(201);

MidInt += PInt[I];}

/*Вывод средних значений*/

cout << "\nсреднее целое равно " << MidInt / double(NMax) << "\n";

cout << "среднее вещественное равно: " << MidReal / n << "\n";

fclose(t);

}
1   2   3   4   5   6   7   8   9   10   11

Похожие:

«программирование» icon12 Достижения компьютерной техники 15 Программирование
Программирование 3
«программирование» iconПрограмма по формированию навыков безопасного поведения на дорогах...
Понятно, что программирование стержень профильного курса информатики. Но какова его роль и есть ли необходимость изучать программирование...
«программирование» iconРабочая программа дисциплины оп. 08 Теория алгоритмов (с дополнениями...
Специальность 09. 02. 03 «Программирование компьютерных систем» (базовая подготовка)
«программирование» iconОсновная образовательная программа среднего профессионального образования...
Нормативные документы для разработки ооп спо по специальности 230115 Программирование в компьютерных системах
«программирование» icon«Динамическое Web-Программирование»
Целью курса "Динамическое Web-Программирование" является изучение принципов разработки приложений, работающих в среде Интернет и...
«программирование» iconРабочая программа по дисциплине “алгоритмизация и программирование”...
Алгоритмизация и программирование” составлена в соответствии с требованиями Государственного общеобразовательного стандарта высшего...
«программирование» iconПрограмма учебной дисциплины технические средства информатизации...
Рабочая программа учебной дисциплины разработана на основе Федерального государственного образовательного стандарта (далее – фгос)...
«программирование» iconСамостоятельная работа Методические указания к выполнению самостоятельной...
Методические указания выполнению самостоятельной работы по курсу «Информатика» и «Информатика и программирование»: Авт сост Н. В....
«программирование» iconОбзор цифровых образовательных ресурсов, рекомендованных Министерством...
Программа предназначена для проведения квалификационных испытаний в рамках процедуры аттестации педагогических работников по должности...
«программирование» iconРеферат по дисциплине «Информатика и программирование»

«программирование» iconРазработка урока по информатике с применением икт на тему «Программирование...
...
«программирование» iconПрограммирование в среде логомиры
«Убегающая кнопка» развивает у учеников первоначальные навыки работы с мышью
«программирование» iconАннотация рабочих программ учебных дисциплин (модулей) специальности...

«программирование» icon«икт в образовании»
Рабочая программа дисциплины «Программирование» /сост. Хатаева Р. С.– Грозный: чгпи, 2012г
«программирование» iconУчебно-методический комплекс дисциплины «Информатика и программирование»
Государственного образовательного учреждения высшего профессионального образования
«программирование» iconКурсовая работа по дисциплине «Информатика и программирование»
Кафедра «Программное обеспечение вычислительной техники и автоматизированных систем»


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск