Выкладываю свою вторую лабораторную работу по программированию. Я, конечно, делал её много лет назад. Но вдруг кому-нибудь пригодится.
- ЦЕЛИ РАБОТЫ
— проверка с помощью ЭВМ понимания порядка выполнения операторов цикла языка Паскаль;
— знакомство с сообщениями транслятора языка Паскаль об обнаруженных ошибках в записи операторов цикла;
— получение практических навыков по отладке операторов цикла.
Задание:
1) Проанализировать программу TEST2A и по результатам выполнения заполнить таблицу входных и выходных данных.
2) Рассмотреть программу TEST2B и исправить имеющиеся в ней ошибки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
program TEST2A; var W,R,S,I: integer; P,Q,Z: 1..10; begin Write ('Введите значения P,Q,Z в диапазоне 1..10 '); ReadLn (P,Q,Z); S:=0; I:=0; repeat S:=S+Succ(S*I); I:=I+1 until I=P; (* выход пpи I=P *) WriteLn(' S=',S); R:=0; I:=0; while I<=Q do begin (* выход пpи I>Q *) R:= R+Sqr(I); I:=I+1 end; WriteLn(' R=',R); W:=2; for I:=1 to Z do W:= W+I*Pred(W); WriteLn(' W=',W) end. |
Входные данные | Выходные данные | ||||||||||
P | Q | Z | S | R | W | ||||||
Анализ | Выполнение | Анализ | Выполнение | Анализ | Выполнение | ||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 | 3 | |||
2 | 2 | 2 | 3 | 3 | 5 | 5 | 7 | 7 | |||
3 | 3 | 3 | 10 | 10 | 14 | 14 | 25 | 25 | |||
4 | 4 | 4 | 41 | 41 | 30 | 30 | 121 | 121 | |||
Текст программы TEST2B:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
program TEST2B; var I: real; M,P: integer; begin Read (M); P:=1; for I:=1 to M do P:=P*I; I:=10; repeat P:=P Div I; I:=I-1 until I=0; while I<=M do begin P:=P+I; I:=I+1 end; Write (P) end. |
При проверке программы были получены следующие сообщения компилятора об ошибке:
Invalid FOR control variable.
Operand types do not match operator.
Type mismatch.
При устранении ошибок в текст программы были внесены несколько изменений. Исправленный текст программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
program TEST2B; var I: real; M,P: integer; begin Read (M); P:=1;i:=1; While (I<=m) do begin P:=P*Round(I);i:=i+1; end; I:=10; repeat P:=P Div round(I); I:=I-1 until I=0; while I<=M do begin P:=P+round(I); I:=I+1 end; Write (P) end. |
Индивидуальное задание.
Написать программу, вычисляющую Сумму(F(X,I)), если F(X,I) = Cos(I*X). В программе предусмотреть контроль входных данных. Заполнить таблицу входных и выходных данных, проверяющих ограничение и допустимые значения переменных. Для облегчения создания программы была разработана ГСА программы. Затем по ГСА была составлена сама программа, удовлетворяющая всем вышеперечисленным условиям. При создании программы для увеличения точности были использованы переменные типа EXTENDED. Это было сделано для того, чтобы области вводимых переменных могли быть достаточно большими. При использовании переменных типа REAL компилятор при X>1.3 и n>5 выдавал сообщении об ошибке.
ГСА программы:
Текст программы:
1 2 3 4 5 6 7 8 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
program lab2; uses crt; var n,i:integer; c,e:real; b,m,summ,suml:extended; Procedure overfl; begin Textcolor(red); Writeln('Overflow!!!!'); Writeln('n=1..9, x=-pi..pi'); Writeln('Press any key to exit...'); Readln; end; Function mycos(x,eps: real):real; var r,h,f,k,p:extended; var n,z:integer; begin r:=1; k:=r+1; p:=1; h:=1;z:=1;n:=0 ;f:=1; While (abs(k-r)>eps) do begin n:=n+2; f:=f*n*(n-1) ; h:=h*x*x; p:=h/f; if z=-1 then z:=1 else z:=-1; k:=r; r:=r+z*p; {writeln(' h=',h, ' f=',f,' p=',p,' r=',r,' k=',k); readln;} end ; mycos:=r; end; begin clrscr; summ:=0; suml:=0; Textcolor(2); Writeln('Program Work number 2.'); write('Input x=');readln(c); Write('Input eps='); readln(e); Write('Input n='); readln(n); If (c<=3.14159262) and (c>=-3.1415926) and (n<=9) and (n>=1) then begin Textcolor(14); for i:=1 to n do begin Writeln(' i=',i); b:=cos(c*i); m:=mycos(c*i,e); Writeln('library cos(',c,')=',b); Writeln('Our cos(',c,')=',m); Suml:=suml+b; summ:=summ+m; Writeln('Library sum=',suml); Writeln('My sum=',summ); end; Textcolor(2); Writeln('Result:'); Textcolor(14); Writeln('library sum=',suml); Writeln('My sum=',summ); Writeln('Press any key to exit...'); readln; end else begin overfl; end; end. |
Таблица входных и выходных данных.
Входные данные | Сообщения программы | ||||
X | EPS | N | Librarian | Program | |
0.1 | 0.01 | 5 | 4.72905078813801E+00 | 4.72907500000019E+00 | |
0.1 | 0.001 | 5 | 4.72905078813801E+00 | 4.72905177638859E+00 | |
0.1 | 0.0001 | 5 | 4.72905078813801E+00 | 4.72905076388906E+00 | |
0.1 | 0.00001 | 5 | 4.72905078813801E+00 | 4.72905077188079E+00 | |
999 | 0.1 | 5 | Overflow!!! | ||
-999 | 0.1 | 5 | Overflow!!! | ||
1 | 0.01 | 15 | Overflow!!! | ||
3.1415 | 0.001 | 9 | 9.99999806844545Е-0001 | 9.99984648844475Е-0001 |