Структура программы. Описание типов данных. Любая программа,все равно на каком языке программирования, состоит из 2-х частей

Вид материалаПрограмма

Содержание


Abs Аrctan
Write,Writeln,Read,Readln,Readkey(ввод символа с клавиатуры).
Подобный материал:
1   2   3   4   5

Арифметические стандартные функции



Функция

Описание

Abs

Аrctan

Возвращает абсолютное значение аргумента.

Возвращает арктангенс аргумента.

Соs

Ехp

Возвращает косинус аргумента.

Возвращает экспоненту аргумента.

Frас

Int

Возвращает дробную часть аргумента.

Возвращает целую часть аргумента.

Ln

Возвращает натуральный логарифм аргумента.

Рi

Sin

Возвращает значение числа Pi

(3.141592653897932385).

Возвращает синус аргумента.

Sqr

Sqrt

Возвращает аргумент в квадрате.

Возвращает квадратный корень аргумента.



Отметим важные стандартные процедуры

Write,Writeln,Read,Readln,Readkey(ввод символа с клавиатуры).


лекция 5


массивы,векторы,матрицы.


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

{векторы}

var a: array[1..100] of real; {массив из 100 вещ. чисел}

b: array[0..33] of char; {массив из 33 символов}

d: array[-2..2] of boolean; {массив из 5 битовых разрядов,

где 0- false, 1- true}

{матрицы}

м:array[1..3,1..4] of real; {матрица размерностью 3*4}


при записи матрицы на первом месте указывается число строк,а на втором – число столбцов.

например.запишем матрицу в виде типизированной константы:

столбец

const

aa:array[1..3,1..4] of real = ((1.0,2.2,3.1,5.0), (2.0,4.5,3.3,2.6), (5.9,4.4,6.8,9.11), (123.0 ,23.0, 66.0,77.5));


строка

В прямоугольном виде пишется так:

1.0 2.2 3.1 5.0

2.0 4.5 3.3 2.6 a[3,3]=66.0, a[1,4]=5.0 и т.д.

5.9 4.4 6.8 9.11

123.0 23.0 66.0 77.5


При записи array следует избегать следующих ошибок:
  • писать x: array[] of real;
  • использовать в индексах вещественные числа;
  • включать выражения в определение индексов,


например, x:array[1..a*b] of integer.

Более сложные определения array следует описывать через ключевое слово type.

Например:

Type

Days=(‘пон’,’вт’,’ср’,’чт’,’пт’); { перечисляемый тип}

h = 8..18; { интервальный тип}

work=array[days,h] of real;

var office : work;

work[‘ пон’,5]:=10 означает заработок за отработанные 5 часов в

понедельник.

Заполнение массивов производится различным образом:
  • через типизированную константу;
  • через оператор ввода с дисплея;
  • через датчик случайных чисел;
  • через выражения в процессе программирования.

Например:

1.Var a: array[1..5] of real;

I: word;

…………….

For i:=1 to n do Readln a[i];

…………


2.const n=5;m=8

var aa[1..5,1..8] of real;

J, I:ineger;

…………

Begin

……..

Randomize; { инициализация датчика случайных чисел}

for i:=1 to n do

for j:=1 to m do aa[i,j]:=random(10); {занесение в элемент матрицы}

……………..

End.


Рассмотрим задачу на поиск максимального элемента в 2-х мерной матрице и его значений индексов c последующим нормированием всей матрицы на максимальный элемент.


Program Max_element_in_matrix;

Uses WinCrt;

Label myend;

const CountRow=10;

CountColumn=10;

type Matrix=array[1..CountRow,1..CountColumn] of real;

var

mmm:matrix;

MaxElement:real;

RowMax,ColumnMax:integer;

NumberRow,NumberColumn:integer;

i,j:integer;

Procedure RandomData(var mm:matrix;m,n:integer);

Var tt:real;

Begin

Randomize;

For i:=1 to m do

For j:=1 to n do

begin

tt:=random(33);

mm[i,j]:=random(100)*tt;

end;

End;

Begin

Write('введите число строк <10 ');Readln(NumberRow);

Write('введите число столбцов < 10 ');Readln(NumberColumn);

RandomData(mmm,NumberRow,NumberColumn);

for i:=1 to NumberRow do

begin

write('строка ',i:2,' ');

for j:=1 to NumberColumn do {печатаем исходную матрицу}

Write('',mmm[i,j]:6:2,' ');

Writeln;

end;

MaxElement:=mmm[1,1];

RowMax:=1;ColumnMax:=1;

For i:=1 to NumberRow do

For j:=1 to NumberColumn do

If mmm[i,j]>=MaxElement then

begin

MaxElement:=mmm[i,j];

RowMax:=i; ColumnMax:=j;

end;

for i:=1 to NumberRow do

for j:=1 to NumberColumn do

begin

if MaxElement<>0 then mmm[i,j]:= mmm[i,j]/MaxElement

else Writeln('макс.элемент=0');

goto myend;

end;

{ выводим макс.элемент и его позицию в матрице}

Write('макс.элемент = ',MaxElement:8:2,' ');

Write('строка ',rowmax,' столбец ', columnmax);

Writeln;

{ печатаем нормированную матрицу}

for i:=1 to NumberRow do

begin

write('строка ',i:2,' ');

for j:=1 to NumberColumn do

Write('',mmm[i,j]:6:2,' ');

Writeln;

End;

Myend:

End.


В заключении, хочу обратить ваше внимание на применение идентификаторов в программе. Идентификатор должен обязательно нести смысловую нагрузку. Например, если вы рассчитываете цену товара, то правильнее будет использовать cena_producta,towar. Посмотрите на выше написанную задачу. Здесь я непосчитался с длинными идентификаторами: MaxElement, NumberRow и др. только для того, чтобы читающий студент мог понять каждый шаг написанной программы. Снабжайте строки необходимыми комментариями, так чтобы это было, по крайней мере, понятно себе. Пользуйтесь процедурами ввода-вывода на дисплей, так чтобы отслеживать исполнение программы. При трансляции возникающие ошибки выводятся на нижнюю строку сообщений красным цветом с указанием номера ошибки. Коды ошибок приведены на русском языке в конце книги Марченко А.И. (см.список литературы) и в приложении к настоящим лекциям.


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

Задачи к программированию:

1.Умножить вектор на матрицу.

2.Транспонировать матрицу.

3.Просуммируйте все элементы матрицы.

4.Найдите математическое ожидание, дисперсию и среднее квадратическое отклонение для случайной последовательности.


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


лекция 6


Запись.



Запись – это структурный тип данных, состоящий из набора полей, каждое из которых имеет собственный тип записи. Например:

type avto=record

number:integer; {номер автомобиля}

marka:string[20]; {марка}

fio : string[25]; {владелец}

country:string[15]; {страна}

end;

var MyAvto:array[1..10] of avto;

Для обращения в программе используется составное имя следующего

вида:

MyAvto.number:=2222;

MyAvto.marka:=’ford’

MyAvto.fio:=’M.Jecson’;

MyAvto.country:=’Germany’;

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

with MyAvto[5] do

begin

number:=2222;

marka:=’ford’

fio:=’M.Jecson’;

country:=’Germany’;

end;

Здесь приводится 5-ая запись массива Myavto, оформленного в виде структурной записи.

При вводе-выводе следует писать в процедурах ввода-вывода так:

Writeln(myavto.number:4,myavto.fio:25)

read(myavto.country,myavto.marka).

Если нужно ввести запись в нужный индекс структуированного массива следует писать

with myavto[i] do

readln(number);

readln(marka);

readln(fio);

readln(country);

end;

При попытке вывести на дисплей Writeln(myavto) транслятор укажет на ошибку обращения к структурному набору данных.

Приведем пример программы с запиью типа record:


uses wincrt;

type {запись на фамилию и день рождения }

name=record

fio: string[20];

den:string[10];

end;

var m:array[1..2] of name; {массив из 2-хзаписей}

i:integer;

begin

writeln('введите данные');

for i:=1 to 2 do {ввод фамилии и дня рождения с дисплея 2 обращения}

begin

with m[i] do

begin

write('фио ');readln(fio);

write('день рожения ');readln(den);

end;

end;

Writeln;

for i:=1 to 2 do

begin

with m[i] do {вывод на дисплей фамилий и дней рождения }

begin

write('fio ');writeln(fio);

write('birth day ');writeln(den);

end;

end;

end.


Лекция 7


Файлы и их использование.


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

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

В случае последовательного доступа данное можно найти, последователь-

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

В Турбо-Паскаль имеются 3 вида файлов:
  • текстовый файл ( тип text);
  • типизированный файл ( тип file of тип );
  • нетипизирванный файл ( тип file).

Для указания на файл достаточно применить описание var:

Var

Var f1,f2:text;

f3:file of real;

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

Assign(f, ‘a:\Mytext.txt’),

где f – файловая переменная

Mytext.txt – физический файл, созданный на диске средствами операционной системы(Dos,Windows) через Norton commander на дискете а:

Перед выполнением каких-либо операций по вводу и выводу с файлом его необходимо открыть.Это делается с помощью нижеследующих процедур:

Reset(f)

Rewrite(f)

Close(f)

Eof(f)

Seek(f,i);

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

Процедура Rewrite(f) – создает новый файл на физическом носителе, имя которого связано с переменной через процедуру assign. Если файл давно создан, то удаляется и создается пустой файл с тем же именем. Указатель позиции в данных устанавливается в начало.

Close(f) – закрывает обращение файлу.

Eof(f) – определяет позицию указателя на файле. Равен True, если указатель указывает на конец файла.

Seek(f,i) - переводит указатель на i-тую запись.

Отметим, что в процессе выполнения программы автоматически открываются текстовые файлы Input и Output, как если бы выполнены следующие операторы

Assign(input,’’)

Reset (input)

Assign(output,’’)

Rewrite(output)

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

Стандартные операции ввода-вывода используют именно эти временные файлы. Так что правильнее эти операторы записывать так

Read(input,a) и Writeln(output,’используется по умолчанию  output’).

В общем случае пишутся так:

read(f,a), Readln(f,a),write(f,..), writln(f,…).


Запишем небольшую программу ввод строк в файл:

Program file_str;

Uses Wincrt;

Var f:text; {текстовый последовательный файл}

Z, S:string[2];

I:integer;

begin

assign(f,’а:my.txt’);

{закрепляю файл на дискете  а: свой файл mytext.txt }

rewrite(f);

{файл создается заново независимо от существования на дискете}

for i:=1 to 9 do

begin

str(i:1,z) (*стандартная процедура – переводит число в строковый вид*)

s:=’@@@@’+z

Writeln(f,s) {9 строчек с символами @@@@1….@@@@9}

End;

Close(f); {закрытие файла}

Assign(f,’а:my.text’); {снова обращаюсь}

Reset(f); {ставлю указатель на начало файла}

Readln(f,s); {считываю 1-ю запись в переменную}

Close(f); {закрытие файла}

Writeln(‘’,s); {вывод на дисплей @@@@}

End.


Лекция 8.


Алгоритмизация и разработка программ.


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

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

Стандартн алгоритм формируется в две ступени:
  • сначала формулируется постановка задачи на математическом уровне;
  • составляется графическая блок-схема, обеспечивющая понимание пошаговых приемов и методов для реализации в программном коде.

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


Описание и ввод исходных данных



Вычислительный процесс



Вывод полученных

результатов

Блок-схемы для алгоритмов

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




Составим для примера алгоритм для расчета среднего арифметического





Приближенное вычисление интегралов.


Существует 3 метода расчета приближенных интегралов:
      • метод прямоугольников
      • метод трапеций
      • метод Симпсона.






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

Здесь промежуток интегрирования b-a делится на n равных частей, каждая из которых имеет длину

(1)

Полагаем a=x0 ,b=xn. .Через х1/2 , х3/2 , х5/2 , х7/2 …обозначаем середины отрезков 01), (х12), (х23), (х34), …Полагаем, далее,


f(x0) = y0 , f(x1) = y1 , f(x2) = y2 , …..

f(x1/2) = y1/2 , f(x3/2) = y3/2 , f(x5/2) = y5/2 ,…..


Формулами прямоугольников называются следующие приближенные равенства

(2)


(3)


(4)


Пример. Вычислим по формуле (4) на 10 ординат (n=10) приближенное значение интеграла

(5)


xi/2

0,05

0,15

0,25

0,35

0,45

0,55

0,65

0,75

0,85

0,95

yi/2

0,9995

0,9780

0,9412

0,8909

0,8316

0,7678

0,7029

0,6400

0,5806

0,5256


для h=0,1.


Общая сумма для всех у равна


Интеграл будет равен .


При этом погрешность составляет е = 0.785398 – 0.78581 = 0.0004.


Формула трапеций.


При прежних обозначениях, как для формулы прямоугольников, имеем формулу:


(6)



    Для прежнего интеграла (5) имеем таблицу:



    xi

    0

    0,1

    0,2

    0,3

    0,4

    0,5

    0,6

    0,7

    0,8

    0,9

    1

    yi

    1.0

    0,9901

    0,9615

    0,9174

    0,8621

    0,8

    0,7353

    0,6711

    0,6098

    0,5525

    0.5



    у010=1.500,



    Погрешность составляет е = 0.0004.




    Формула Симпсона (формула параболического цилиндра).

    Вычисления интеграла проводится по нижеследующей формуле:

    (7)

    Вычислим интеграл по формуле (5) по формуле Симпсона.

    Здесь положим 5 ординат для =2, =1/6 и далее строим таблицу:

      Х0

      Х1/2

      Х1

      Х3/2

      Х2

      0

      0.25

      0.50

      0.75

      1.0



    У0=1.0, у1/2=0.941175, у1= 0.8, у3/2= 0.64, у2 = 0.5





    Погрешность составляет примерно 0.00001.