Файл: программирование на паскале2.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.04.2025

Просмотров: 1344

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Министерство образования и науки российской федерации

Начальный курс программирования на основе алгоритмического языка Паскаль

Введение

Часть. Основы программирования на Паскале

1.1. Структура простейшей Паскаль-программы

1.2. Данные и операции над ними

1.2.1. Свойства ячейки памяти. Переменные и константы

1.2.2. Типы данных

1.2.3. Правила записи констант

1.2.4. Описание переменных и именованных констант в Паскале

1.2.5. Выражения

1.3. Операторы преобразования данных

1.3.1. Оператор присваивания

1.3.2. Понятие ввода и вывода

1.3.3. Оператор вывода

1.3.4. Оператор ввода

1.4. Разработка простейших программ

1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ

1.4.2. Алгоритм и способы его записи.

1.4.3. Изображение алгоритмов в виде блок-схем

1.4.4. Базовые структуры алгоритмов и их кодирование на Паскале

1. Следование

2. Ветвление (развилка)

If условие then

If условие then

3. Цикл

1.4.5. Примеры разработки программ

1.5. Массивы

1.5.1. Понятие массива. Основные правила работы с массивами в Паскале

1.5.2. Примеры программ с массивами

1.614. Структура паскаль-программы

Часть.Подпрограммы

2.1. Общие сведения о подпрограммах

2.2. Процедуры в Паскале

2.2.1.Описание процедур

2.2.2. Обращение к процедуре

2.3. Функции Паскаля

2.3.1. Описание функций

2.3.2. Обращение к функции

2.4. Глобальные и локальные имена

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

2.6. Модули

2.6.1. Общие сведения

2.6.2. Структура модуля

2.6.3. Использование модулей

2.6.4. Модули как средство программирования

Часть. Обработка символьной информации и документов сложной структуры

3.1. Обработка символьной информации

3.1.1. Символьный тип

3.1.2.Строковые типы

3.1.3. Подпрограммы, работающие со строками

Функции

Процедуры

3.2. Тип запись

3.3. Файлы

3.3.1. Общие понятия

3.3.2. Файлы в Турбо Паскале

3.3.3. Текстовые файлы

Пример 1

Пример 2

3.3.4. Типизированные файлы

3.3.5. Нетипизированные файлы

Часть IV. Работа с динамическими массивами

Приложение 1. Краткая инструкция по работе в среде Turbo (Borland) Pascal.

Режимы компиляции программы, использующей модули

Приложение 2. Краткая инструкция по работе в режиме консольного приложения средыDelphi. Создание консольного приложения

Сохранение консольного приложения.

Отладка программы

Контрольные вопросы

Заключение

Библиографические ссылки

Содержание

Часть IV. Работа с динамическими массивами 98

Заметим, что в программе не будет промежуточных переменных. Программа будет состоять из вызовов подпрограмм (крупных операторов), а промежуточные переменные (с точки зрения пользователя детали, мелочи) будут «спрятаны» в подпрограммы.

Поясним, как составлен заголовок подпрограммы minstr.Подпрограмма имеет столько результатов, сколько строк у матрицы, все они равноправны, поэтому нет причины передавать один из них через имя функции, и, следовательно,minstrдолжна быть процедурой (не функцией). В список формальных параметров включаются "входные" данные для процедуры: матрицаа и ее размеры (n- число строк,m- число столбцов), и "выходные" данные:min - массив минимальных значений строк. Заметим, что обозначения, принятые в одной подпрограмме (a, n, m, min)никоим образом не связаны с обозначениями в других подпрограммах и программе, т. е. подпрограммы разрабатываются автономно друг от друга. Переменнаяmin- результат работы функции, поэтому ее надо объявить как параметр-переменную (перед описанием поставить ключевое словоVar). Так как фактическими значениямиnиmбудут константы (для фактической матрицыa, например, 3 и 5),n иmдолжны быть параметрами-значениями (перед их описаниемVarне следует ставить).aлучше объявить как параметр-переменную(так как это массив) с целью экономии памяти.

Получаем заголовок:

procedure minstr(Var a:matr; n,m:integer; Var min:mas).

Промежуточные переменные процедуры (счетчики строк и столбцов iиj) должны быть описаны в разделе переменных блока процедуры.

Рассмотрим заголовок процедуры ввода матрицы matrin(предлагается читателю пояснить самостоятельно, почему это процедура, а не функция). На входеmatrin– размеры матрицыnиmи имя матрицы, которое будет выводиться в приглашении к вводу символьная переменнаяс; эти данные должны быть параметрами-значениями (объясните, почему). На выходе процедуры – введенная матрица, для разнообразия обозначим еер; этообязательнопараметр-переменная. Получили заголовок:

procedure matrin(n,m:integer; c: char;Var p:matr).

Обратите внимание, что отсутствие ключевого слова Varперед описаниемaв этом заголовке приведет к неработоспособности программы, в то время как в заголовке процедурыminstrотсутствиеVar, вообще говоря, допустимо (объясните, почему).


Дальнейшие комментарии к программе приведены в ее тексте.

Блок-схема программы приведена на рис. 13, блоки вызова подпрограмм имеют двойные линии по боковым сторонам. Блок-схема процедуры minmatr приведена на рис. 14.

program primer2_2;

Type matr=array[1..7,1..5] of real; mas= array[1..7] of real;

Var a,b:matr; mina,minb:mas; {далее-раздел процедур и функций}

Procedure minstr(Var a:matr; n,m:integer; Var min:mas);

Var i,j:integer;

Begin

for i:=1 to n do

begin

min[i]:=a[i,1];

for j:=2 to m do

if min[i]>a[i,j] then

min[i]:=a[i,j];

end

End{minstr};

Procedure matrin(n,m:integer; c:char; Var p:matr);

Var i,j:integer;

Begin

Writeln('Введите матрицу ',c,' размером ',n,'*',m);

for i:=1 to n do

for j:=1 to m do

read(p[i,j]);

readln;

End{matrin};

Procedure masout(n:integer;c:char;Var min:mas);

Var i:integer;

Begin

Writeln('Минимальные значения строк матрицы ',c);

for i:=1 to n do

writeln(' ',min[i]);

End{masout};

Begin {начинается раздел действий программы}

matrin(3,5,'a',a);

matrin(7,3,'b',b);

minstr( a,3,5,mina);

minstr( b,7,3,minb);

masout(3,'a', mina);

masout(7,'b', minb);

readln

End.


2.3. Функции Паскаля

2.3.1. Описание функций

Описание функций дается в разделе процедур и, также как описание процедур общего вида, состоит из заголовка и блока. Заголовок функции имеет вид:

functionИмяФункции[(СписокФормалПараметров)]:ТипФункции;

Если имя процедуры общего вида обозначает описываемый ей алгоритм, то имя функции, кроме того, служит для обозначения выходного параметра (единственного или основного). Под типом функции подразумевается тип выходного параметра. Этот тип обязательно простой. В разделе действий функции обязательно должен иметься оператор присваивания, в левой части которого стоит имя функции, так как выходное значение должно быть определено. B правой части оператора присваивания имя функции воспринимается только как обращение18к функции. Tак, например, в функции SUM, вычисляющей сумму элементов массива А, оператор

SUM:=SUM+A[i];

неприменим, а для накопления суммы в разделе действий вместо SUM надо использовать другое обозначение (см.также пример из §2.3.2):

S:=0; ...

S:=S+A[i]; ...

SUM:=S;

2.3.2. Обращение к функции

Обращение к функции производится в выражениях посредством использования указателя фукции:

ИмяФункции[(Список фактических параметров)];

Указатель функции может стоять только в правой части оператора присваивания.

Пример.Вычислить значение У:

где a=(a1,…,a10),b=(b1,…,b5) - заданные последовательности.

Вычисление суммы и произведения и ввод элементов массива требуется производить 2 раза (для aиb), поэтому эти алгоритмы стоит оформить как подпрограммы. Каждая из подпрограмм вычисления суммы и произведения имеют одно выходное значение, поэтому это будут функции. Подпрограммы рассчитаны на массивы с размером, не превыщающим 10. Текст программы приведен ниже.

program primer_2_3;

type mas=array[1..10] of real;

var a,b:mas; y:real; pra:real;

function sum(var v:mas; n:integer):real;

{функция вычисляет сумму первых n (n<=10) элементов массива v}

var s:real; i:integer;

begin

s:=0;

for i:=1 to n do

s:=s+v[i];

sum:=s;

end;{конец функции sum}

function pr(var v:mas; n:integer):real;

{функция вычисляет произведение первых n(n<=10) массива v}

var p:real; i:integer;

begin

p:=1;

for i:=1 to n do

p:=p*v[i];

pr:=p;

end; {конец функции pr}


procedure masin(var v:mas; n:integer);

{процедура осуществляет ввод массива v размером n (n<=10),

приглашение к вводу не включено в процедуру, поэтому в списке

параметров нет символьной переменной –имени массива –

ср. с примером п.2.2}

var i:integer;

begin

for i:=1 to n do

read(v[i]);

readln;

end; {конец процедуры masin}

BEGIN

writeln(' BBEДИТЕ МАССИВ А ИЗ 10 ЭЛЕМЕНТОВ');

masin(a,10);

writeln(' ВВЕДИТЕ МАССИВ В ИЗ 5 ЭЛЕМЕНТОВ');

masin(b,5);

pra:=pr(a,10);

if pra =0 then

writeln(' ЗНАМЕНАТЕЛЬ РАВЕН НУЛЮ')

else

begin

y:=(sum(a,10)*(pr(b,5)+5)-sum(b,5))/pra;

writeln(' ЗНАЧЕНИЕ ВЫРАЖЕНИЯ; y=',y:9:3);

end;

readln;

END.

2.4. Глобальные и локальные имена

Каждая процедура (функция) может иметь свой раздел процедур, а описанные в нем процедуры также могут иметь внутренние процедуры. Таким образом, может иметь место последовательность вложенных блоков.

Понятие глобальных и локальных имен имеет смысл только относительно некоторого блока.

Глобальные имена - это имена, которые действуют на протяжении всей программы (или внешнего блока), они объявляются в соответствуюших разделах программы (или внешнего блока).

Локальные имена - это имена, которые действуют в пределах блока подпрограммы, это внутренние имена подпрограммы.

К локальным именам относятся формальные параметры и все имена, описанные в блоке подпрограммы. Вне блока подпрограммы локальные имена неопределены.

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

В Паскале данные, описанные в блоке программы, хранятся в так называемом статическом сегменте памяти; память под них распределяется при компиляции.

Локальные данные подпрограммы хранятся в специальной области оперативной памяти – стеке; память под эти данные распределяется каждый раз при вызове подпрограммы и освобождается при завершении работы подпрограммы. Если имеется цепочка вложенных обращений к подпрограммам, например, программа вызывает подпрограмму Р1, Р1 вызывает подпрограмму Р2, а Р2 – Р3, то схема заполнения стека будет соответствовать рис. 15; порядок освобождения стека: сначала уходит Р3, затем Р2, затем Р1.

Важными являются понятия области действияимени ивремени жизниданных.

Область действия имени - это часть программы, в которой имя может быть доступно. Таким образом, область действия локального имени - блок подпрограммы, в которой оно объявлено; глобального – весь текст программы от места объявления до последнего словаEnd(с точкой). Глобальное имя доступно в подпрограмме только в том случае, если в подпрограмме оно не объявлено еще раз.


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

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

Program Primer;

Var a,i:real;

Procedure p1;

Var i:real;

Begin . . . a:=...; i:=...;

End{p1};

Procedure p2;

Var i:real;

Begin . . . a:=...; i:=...;

End{p2};

Begin {раздел действий программы}

i:=...; a:=...;

р1; р2; р2

End.

a-глобальная переменная, под нее отведена одна ячейка в статическом сегменте памяти, которая доступна программе и процедурам р1 и р2. Под переменную с именем iпрограммы отводится ячейка памяти статического сегмента; под переменныеiпроцедур память в стеке распределяется столько раз, сколько раз осуществляется вход в блок процедур (в нашем примере три раза: при вызове р1 и при каждом вызове р2); при выходе из блока (т. е. при завершении работы процедуры) ячейка с именем i каждый раз освобождается. Так как в каждой процедуре имеется локальное имя i, глобальное i программы в процедурах недоступно.

В данной программе область действия переменной а – вся программа, включая процедуры, время ее жизни – все время работы программы. Область действия глобальной переменной i– текст программы, за исключением процедур; время ее жизни – все время работы программы. Область действия локальнойi– текст процедуры, в которой она объявлена, время ее жизни – время работы соотвествующей процедуры.

Рекомендации

  1. Не стоит делать глобальными промежуточные переменные (например, iв программе вычисления выражения примера §2.3.2), потому что:

  1. это делает подпрограмму менее универсальной, так как приводит к появлению непонятного пользователю "стыка" - промежуточной глобальной переменной;

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