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

Вид материалаПрограмма
Подобный материал:
1   2   3   4   5

{ формула прямоугольников }

{ приближенное решение интеграла }


uses

WinCrt;

const

pi=0.785398;

a=0;

b=1;

label lend;

var

x,y:real;

d,c:real;

i,n:integer;

begin

lend:Writeln('укажите число делений отрезка b-a ');

readln(n);

if n<>0 then

c:=(b-a)/n; {шаг деления}

else

begin

writeln('n=0 ');

goto lend;

end;

x:=c/2;

y:=0;

for i:=1 to n do

begin

{ writeln('x= ',x:5:3); }

y:=y+1/(1+x*x);

{writeln('y= ',y:5:3); }

{ readkey; }

x:=x+c;

end;

y:=c*y;

d:=abs(y-pi);

writeln('интеграл равен = ',y:10:9);

writeln('ошибка в расчете ',d:10:9);

end.



{ формула трапеций }

{ приближенное решение интеграла }

uses

WinCrt;

const

pi=0.785398;

a=0;

b=1;

label lend,eend;

var

x,y,y1,y2:real;

d,c:real;

i,n:integer;

begin

Writeln('укажите число делений отрезка b-a ');

readln(n);

if n<>0 then

c:=(b-a)/n

else

begin

Writeln('n=0');

goto lend;

end;

x:=0;

y1:=1/(1+x*x);

x:=b;

y2:=1/(1+x*x);

x:=c;

for i:=1 to n-1 do

begin

{writeln('x= ',x:5:3); }

y:=y+1/(1+x*x);

{writeln('y= ',y:5:3); }

{ readkey; }

x:=x+c;

end;

y:=c*(y1/2+y2/2+y);

d:=abs(y-pi);

writeln('интеграл равен = ',y:10:9);

writeln('ошибка в расчете ',d:10:9);

goto eend;

lend: writeln('n равно 0');

eend:end.


{ формула симпсона }

{ приближенное решение интеграла }


uses

WinCrt;

const

pi=0.785398;

a=0;

b=1;

label lend,eend;

var

x,y,y1,y2,yy:real;

d,c:real;

i,n:integer;

begin

Writeln('укажите число делений отрезка b-a ');

readln(n);

if n<>0 then

c:=(b-a)/n

else

begn

Writeln('n=0 ');

goto lend;

end;

x:=0;

y1:=1/(1+x*x);

x:=b;

y2:=1/(1+x*x);

x:=c;

for i:=1 to n-1 do

begin

y:=y+1/(1+x*x);

x:=x+c;

end;

x:=c/2;

yy:=0;

for i:=1 to n do

begin

writeln('x= ',x:5:3);

yy:=yy+1/(1+x*x);

writeln('y= ',yy:5:3);

readkey;

x:=x+c;

end;

y:=(y1/2+y2/2+y)+2*yy;

y:=c*y/3;

d:=abs(y-pi);

writeln('ннтеграл равен = ',y:10:9);

writeln('ошибка в расчете ',d:10:9);

goto eend;

lend: writeln('n равно 0');

eend:end.


Лекция 10


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


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


1.Вычислить ежемесячные выплаты по займу по формуле:

,

где г = р/100 – процент выплат,

n – число лет выплат по займу,

s - размер займа.

Для расчета общей прибыли используется формула: d=12mn-s.

Для расчета показательного выражения используются стандартные функции

exp(x) и ln (x) по формуле

.


Program Zaim;

Var m,s,p,r,n,d : real;

rub,kop : integer; {d- общая прибыль, - рубли, - копейки}

writeln(‘Введите s – заем, p - процент, n - число лет’);

writeln(‘нельзя n=0 или s=0!!’)

readln(s,p,n);

r:=p/100;

a:= exp(n*ln(1+r)); {см. Формулу для показательной степеии}

m:= (s*r*a)/(12*(a-1)); {}

m:= trunc(100*m+0.5)/100;

d := m*n*12-s;

rub:= round(s*100) div 100;

kop:=round(s*100) mod 100;

writeln(‘Взято’,rub,’руб. ‘, kop,’коп.’,’под ’,p:5;2,’% на ’,n:5:2,’ лет’);

writeln;

rub:=round(m*100) div 100;

kop:=round(m*100) mod 100;

writeln(‘Месячная выплата’,rub,’ руб. ‘, kop,’ коп’);

rub:=round(d*100) div 100;

kop:=round(d*100) mod 100;

writeln(‘Общая прибыль=’,rub,’ руб. ‘, kop,’ коп ’);

end.


Обращаю внимание на функции округления до целого:

trunc(x:real):longint round(x:real):longint.

-


2.Опеделение дня недели по дате.

program den_nedeli;

var den,mes,god:integer;

n:longint:

begin

writeln(‘’);

readln(den,mes,god);

if (m>=2) then m:=m+1 else

begin

m:=m+13;god:=god-1;

end;

n:=trunc(365.25*god)+trunc(30.6*mes)+den-621050;

n:=n-trunc(n/7)*7+1;

case n of

1: writeln(‘понедельник’);

2 : writeln(‘вторник’);

3: writeln(‘среда’);

4: writeln(‘четверг’);

5: writeln(‘пятница’);

6: writeln(‘суббота’);

7: writeln(‘воскресенье’);

end;

end.


3.Вычисление рядов с заданной погрешностью


;








Где ! означает факториал. Напр. 5!=1*2*3*4*5=120.


Программа вычисления косинуса с точностью до 10-7.


program mycosx

uses wincrt;

const eps=1e-7;

var x,s,u:real;

i:word;

begin

write(‘Укажите Х в градусах: ’);

readln(x);

x:=x*pi/180;

s:=1; u:=1; i:=0;

repeat

i:=i+2;

u:=-u*x*x/((i-1)*i);

s:=s+u;

until abs(u)<=eps;

writeln(‘cos(’ ,x*180/pi:6:2,’ = ‘,s:7:3);

end.


Вычислим синус по другому циклу с испольованием оператора while.

const eps=1e-7;

var x,s,u:real;

i:word;

begin

write(‘Укажите Х в градусах:’); readln(x);

x:=x*pi/180;

s:=x; u:=x; i:=1;

while abs(u)>eps do

begin

i:=i+2; u:=-u*x*x/((i-1)*i);

s:=s+u;

end;

writeln(‘sin(’ ,x*180/pi:6:2,’ = ‘,s:7:3);

end.


4.Вычисление определенного интеграла.

Искомая функция y=3x2 . Вычислить, применяя метод прямоугольника,

трапеций и Симпсона.

uses wincrt;

var a,b; real {выбор интервала}

h:real;

s1,s2,s3:real; {s1-для прямоугольника,s2- трапеция,s3-симпсон}

n:integer;

x1,x2: real;

i:integer;

begin

writeln(‘вычисляем интегралы’);

write(‘нижняя граница а=’); readln(a);

write(‘верхняя граница в=’); readln(b);

write(‘число разбиений п=’); readln(n);

h:=(b-a)/n;

x1:=a+h/2;

x2:=a;

s1:=3*x1*x1;

s2:=((3*x2*x2)+(3*b*b))/2;

for i:=1 to n-1 do

begin

x1:=x1+h; x2:=x2+h;

s1:=s1+(3*x1*x2); {для прямоугольника}

s2:=s2+(3*x2*x2); {для трапеции}

end;

s1:=h*s1;

s2:=h*s2;

s3:=(2*s1+s2)/3; {для симпсона}

writeln(‘для прямогольника’,s1:8:5);

writeln(‘для трапеции’,s2:8:5);

writeln(‘для симпсона’,s3:8:5);

end.


5.Программы обработки матриц и векторов.

а) транспонировать матрицу Aij.

uses wincrt;

const a:array[1..3,1..6] of integer=

((1,2,3,4,5,6),(7,8,9,10,11,12),(13,14,15,16,17,18));

var b:array[1..6,1..3] of integer;

i,j:integer;

begin

for j:=1 to 6 do

for i:=1 to 3 do

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

for j:=1 to 6 do

begin

for i:=1 to 3 do

write(b[j,i],' ');

writeln

end;

end.


2) Умножение двух матриц.

Для умножения двух матриц используется следующая формула:


для к=1…r, i=1…m

где матрица, состоящая из m столбцов и n строк, т.е размерностью m*n;

матрица размерность n*r


При умножении матриц обязательно совпадение строк 1-ой матрицы

со столбцами 2-ой матрицы.

Progam Matrix1;

uses wincrt;

const a:array[1..3,1..6] of integer=

((1,2,3,4,5,6),(7,8,9,10,11,12),(13,14,15,16,17,18));

b:array[1..6,1..4] of integer=

((1,2,3,4),(7,8,9,10),(13,14,15,16),(1,2,3,4),(5,6,7,8),(1,2,3,4));

var c : array[1..3,1..4] of integer;

i,j,k : integer;

begin

for i:=1 to 3 do

for k:=1 to 4 do

begin

for j:=1 to 6 do

c[i,k]:=c[i,k]+a[i,j]*b[j,k]; { умножение матриц}

end;

begin

for i:=1 to 3 do

begin

for k:=1 to 4 do

write(c[i,k],' ');

writeln

end;

end;

end.


6.Процедуры и функции.

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


Program sigma;

uses wincrt;

{const n:integer=1000;}

type e=array[1..1000] of real;

var a:e;

i,j,n,m:integer;

x1,x2:real;

procedure stochastic(var h:integer; var sigma,mat:real; var aa:e);

begin

mat:=0;

for i:=1 to h do

mat:=mat+a[i];

mat:=mat/h;

for i:=1 to h do

sigma:=(a[i]-mat)*(a[i]-mat);

sigma:=sqrt(sigma/(h-1));

end;

begin

randomize;

write('введите длину вектора '); readln(n);

write('введите число для датчика случайных чисел '); readln(m);

for i:=1 to n do

a[i]:=random(m);

stochastic (n, x1, x2, a);

writeln('мат.ожидание ',x1:5:2,' ср.кв.отклонение ',x2:6:3);

end.


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

Возьмем, например, уравнение:



Program halb;

function ff(x:real):real;

begin

ff:=4-exp(x)-2*x*x;

end;

var a,b,fa,fb,c,eps:real;

begin

write(‘границы интервала поиска корня - а,в ’); readln(a,b);

write(‘задайте погрешность ’); readln(eps);

fa:=f(a);

while b-a>eps do

begin

c:=(a+b)/2; fc:=f(c);

if fa*fc<=0 then b:=c else

begin

a:=c; fa:=fc;

end;

end;

writeln(‘f= ’,f(a):10:5,’ при x= ‘,a:10:5);

end.


7.Пример программы для типа запись (record).


Program schola;

uses wincrt;

type student = record

name : string[10];

surname : string[20];

university : string[50];

gruppa : string[10];

den: string[10];

end;

var school: array[1..10] of student;

i: 1..10;

c: byte;

procedure in_data ;

{ввод данных}

begin

writeln(‘введите сведения по № ’,i,’ : ’);

write(‘имя’); readln(school[i].name);

write(‘фамилия’); readln(school[i].surname);

write(‘вуз’); readln(school[i].university);

write(‘группа’); readln(school[i].gruppa);

write(‘день рождения’); readln(school[i].den);

writeln;

end;

procedure print_data;

{печать сведений о студентах}

begin

with school[i] do

begin

writeln(‘имя’,name);

writeln(‘фамилия’,surname);

writeln(‘вуз’,university);

writeln(‘группа’,gruppa);

writlen(‘день рождения’,den);

end;

end;

begin

for i:=1 to 10 do

in_data;

writeln;

writeln(‘данные о 5 студентах’);

writeln;

i:=5;

print_data;

write(‘задайте номер группы ’); readln(c);

for i:=1 to 10 do

if school[i].gruppa = c then

print_data

else

writeln(‘ нет такого студента’);

end.


8.Обработка файлов.

Приводим пример записи и считывания данных для типизированного

файла

program My_file;

uses wincrt;

type ff=file of real;

var f1:ff;

sum,mult,r:real;

begin

writeln(‘’);

{назначаем файл на диске и если его нет,то создаем заново}

Assign(f1,’data.txt’); rewrite(f1);

randomize;

for i:=1 to 100 do { ввод данных через датчик сл.чисел}

begin

r:=random(10,);

write(f1,r);

end;

seek(f1,0); { устанавливаем указатель на 1-ю запись можно reset(f1)}

sum:=0;

mult:=1;

while not eof(f1) do

read(f1,r); sum:=sum+r; mult:=mult*r;

end;

close(f1);

writeln(‘сумма= ’,sum:7:3,’произведение= ’,mult:7:3);

end.


Приложение.


Сообщения об ошибках Компилятора


Ошибка * Сообщение об ошибках

1 Недостаточно памяти

2 Требуется идентификатор

3 Неизвестный идентификатор

4 Двойной идентификатор

5 Ошибка синтаксиса

6 Ошибка в реальной константе

7 Ошибка в константе целого числа

8 превышение string

9 Слишком много вложенных файлов

10 Неожиданный конец файла

11 Выравнивают слишком долго

12 Требуется идентификатор типа

13 Слишком много открытых файлов

14 Недопустимое имя файла

15 Файл не найден

16 Полный диск

17 Недопустимая директива компилятора

18 Слишком много файлов

19 Неопределенный тип на определении указателя

20 Переменный требуется идентификатор

21 Ошибка в типе

22 Слишком большая структура

23 базовый тип множества вне границ дипазона

24 Компонентами файла не могут быть файлы или объекты

25 Недопустимая длина строки

26 неправильно указан Тип

27 порядковый тип вне границ диапазона

28 Нижняя граница больше верхней

29 нужен Порядковый тип

30 нужна константа целого числа

31 нужна Константа

32 Целое число или реальное для константы

33 нужен идентификатор для указателя

34 Недопустимый тип результата

35 нужен идентификатор метки

36 нет begin

37 нужен end

38 нужно выражение целого числа

39 нужно выражение Порядкового типа

40 Булевское ожидаемое выражение

41 Типы операнда не соответствуют оператору

42 Ошибка в выражении

43 Незаконное назначение

44 нужен идентификатор для в записи record

45 Слишком большой файл для объекта(.obj)

46 Неопределенная внешняя ссылка

47 Недопустимый Record для объекта

48 Слишком большй сегмент кода

49 Слишком большой сегмент данных

50 do нужен

51 Недопустимое pubic определение

52 Недопустимое EXTRN определение

53 Слишком много EXTRN определений

54 of нужен

55 нужна секция ИНТЕРФЕЙС

56 Недопустимая перемещаемая ссылка

57 нет then

58 else к ожидаемому to/DOWNTO

59 Недопустимая опережающая ссылка

61 Недопустимый преобразование типа

62 деление на нуль

63 Недопустимый тип файла

64 Нельзя read или write для переменных этого типа

65 нужна переменная для указателя

66 нужна строковая переменная

67 нужен тип строки

68 циклическая ссылка на модуль

69 Название(имя) модуля не соответствует

70 Версия модуля не соответствует

72 Ошибка формата файла модуля

73 нужна секция implementation

74 Константа и типы case не соответствуют

75 нужна переменная типа record

76 Константа вышла за границу диапазона

77 нужна переменная для файла

78 нужно выражение для типа указатель

79 выражение либо real / integer

80 Метка не в пределах текущего блока

81 Метка, уже определенa

82 Неопределенная метка

83 Недопустимый параметр

84 нужен unit

85 ";" требуется

86 ":" требуется

87 ,"" требуется

88 "(" требуется

89 ")" требуется

90 "=" требуется

91 ": = " требуется

92 "[" или " (. " требуется

93 "]" или ".) " требуется

94 "." требуется

95 ".." требуется

96 Слишком много переменных

97 Недопустимый for

98 Ожидаемая переменная integer

99 тип file здесь не допускается

100 несоответствие длины строки

101 Недопустимый порядок полей для const

102 нужна константа строкового типа

103 переменная либо integer, либо real

104 Порядковая ожидаемая переменная

105 inline ошибка

106 Символьное ожидаемое выражение

112 Константа case вне диапазона

113 Ошибка в утверждении(заявлении)

114 Не возможно вызвать процедуру обработки прерываний

116 Для компиляции нужен режим 8087 ($N+ директива)

117 адрес назначения не найден

118 Включаюмые файлы здесь не возможны (раздел операторов вне файла).

120 Требуется nil

121 Недопустимый квалификатор

122 Недопустимая переменная ссылка

123 Слишком много идентификаторов

124 Слишком большой раздел операторв

126 Файлы должны быть описаны в Var

127 Слишком много условных идентификаторов

128 пропущена условная директива

129 нет ENDIF (при компиляции)

130 Ошибка в начальных условных определениях

131 Заголовок не соответствует предыдущему определению процедуры/функции

132 невожможно вычислить выражение

133 Невозможно вычислить это выражение

136 Недопустимая косвенная ссылка

137 Структурированные переменные здесь недопустимы

140 Недопустимая операция с плавающей запятой

142 нужна переменная процедурного типа или типа функция

143 Недопустимая ссылка на процедуру или функцию

144 этот модуль не может использоваться в качестве оверлейного

145 очень большая вложенность

146 файла недоступен

147 нуен тип object

148 описание локальных объектных типов не разрешается

149 требуется Virtual

150 нужен идентификатор метода

151 Виртуальные конструкторы не позволяются

152 Ожидаемый идентификатор конструктора

153 Destructor ожидаемый идентификатор

154 Fail доускается только внутри конструкторов

155 Недопустимая комбинация кода операции и операндов

156 требуетс ссылка на памяти

157 Нельзя добавлять или вычетать перемещаемые идентификаторы

158 Недопустимое счетание регистра

159 инструкции процессоров 286/287 не допускаются

160 Недопустимая ссылка на идентификатор

161 Ошибка генерации кода

162 нужно ключвое сово ASM

163 Дублируется динамический индекс метода

164 Дублирование идентификатора ресурса

165 Двойной или недопустимый индекс экспорта

166 нужен идентификатор процедуры/функции

167 этот идентификатор нелья экспортировать

168 Дублирование экспортируемого имени