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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
| uses crt;
{$R-}
type
TElem=single;
TArr=array[1..1] of TElem;
PArr=^TArr;
TMas=array[1..1] of PArr;
PMas=^TMas;
FSingle=file of single;
TTen=1..10;
var
a: PMas; //a-динамический массив
width, height, res, i, j,flag: integer;//width-колличество строчек,height-колличество столбцов
p1,p2: TTen;
inp, oup: FSingle;
err: boolean;
need1, need2: longint;
filename: string;
asd:telem;
function BoolTest(const value: boolean): string;
const Values: array[boolean] of string = ('Нет', 'Да');
begin
BoolTest := Values[value];
end;
procedure Proced(var a:PMas;width,height:integer;var res:integer;var ce:boolean);
{процедура определяет значение и положение в таблице элемента,для которого сумма элементов,
лежащих не выше и не левее его ,максимальна.
входные параметры: а-указатель на таблицу(по ссылке),
width,heidht-фактические размеры таблицы(по значению),
выходные параметры: res-элемент,для которого сумма эллементов,лежащих не выше
и не левее его,максимальна.
ce-false,если ошибка,true,если всё правильно}
var i,j,k:integer;bool:boolean;
begin
if (width<0) or (height<0) or (a=nil) then ce:=false
else begin
res:=0;
for j:=1 to height do begin
bool:=true;
for i:=1 to width-1 do begin
for k:=i+1 to width do begin
if a^[i]^[j]=a^[k]^[j] then bool:=false
end ;
end;
if bool then inc(res);
end;
ce:=true;
end;
end;
begin
clrscr;
repeat
clrscr;
writeln;
writeln(' Меню пользователя');
writeln;
writeln('1. Задать размеры таблицы');
writeln('2. Заполнить таблицу случайными числами');
writeln('3. Заполнить таблицу с клавиатуры');
writeln('4. Создать файл элемнтов таблицы ');
writeln('5. Заполнить таблицу из файла');
writeln('6. Просмотреть таблицы');
writeln('7. Выполнить подпрограмму');
writeln('8. Завершеть работу программы');
writeln;
write('Выберите пункт меню: ');
repeat
{$I-} readln(p1); {$I+}
until (IORESULT=0) and ((p1>=1) and (p1<=8));
case p1 of
1:begin
clrscr;
writeln('1. Задание размеров таблицы');
if a<>NIL then begin {если указатель не пуст,то освобождаем память}
for i:=1 to width do FreeMem(a^[i], need2);
FreeMem(a, need1);
a := NIL;
end;
repeat
write('Введите колличество строчек');
{$I-}readln(width);{$I+}
until (IORESULT=0);
repeat
write('Введите колличество столбиков ');
{$I-}readln(height);{$I+}
until (IORESULT=0);
need1 := longint(width) * sizeof(PArr);{считаем сколько нам памяти нужно}
need2 := longint(height) * sizeof(TElem);
GetMem(a, need1);{выделяем память}
for i:=1 to width do GetMem(a^[i], need2);
flag:=1;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
end;
2:begin
clrscr;
randomize;
writeln('2.Заполнение таблицы случайными числами');
if flag=0 then writeln('Размеры не заданы')
else begin
for i:=1 to width do
for j:=1 to height do begin
a^[i]^[j]:=random(100);
end;
writeln('Выполнено');flag:=2; end;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
end;
3:begin
clrscr;
writeln('3.Заполнение таблицы с клавиатуры');
if flag=0 then writeln('Размеры не заданы')
else begin
for i:=1 to width do
for j:=1 to height do begin
repeat
write('а[', i, ', ', j, '] = ');
{$I-}read(a^[i]^[j]);{$I+}
until (IORESULT=0);
end;
flag:=2;
writeln('Выполнено'); end;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
end;
4:begin
write('Введите имя файла');
readln(filename);
Assign(oup, filename);//ф.п. oup связывается с именм файла
{$I-} rewrite(oup); {$I+}//инициирует запись информации в файл
if IORESULT = 0 then begin
asd:=width;
write(oup, asd);
asd:=height;
write(oup, asd);
writeln('Просмотр');
for i:=1 to width do begin
for j:=1 to height do begin
write(a^[i]^[j]:8:2);
write(oup, a^[i]^[j]);
end;
writeln;
end;
close(oup);
end;
filename := '';
writeln;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
end;
5:begin
clrscr;
writeln('5.Заполнеие таблицы из файла');
{ if flag<>3 then writeln('Файл не создан')
else} begin
if a <> NIL then begin
need1 := longint(width) * longint(height) * sizeof(PArr);
need2 := longint(height) * sizeof(TElem);
for i:=1 to width do FreeMem(a^[i], need2);
FreeMem(a, need1);
a := NIL;
end;
write('Введите имя файла ');
readln(filename);
assign(inp, filename);
{$I-} reset(inp); {$I+}//чтение файла
if IORESULT = 0 then begin
read(inp, asd);
width:=round(asd);
read(inp, asd);
height:=round(asd);
need1 := longint(width) * longint(height) * sizeof(PArr);
need2 := longint(height) * sizeof(TElem);
GetMem(A, need1);
for i:=1 to width do GetMem(a^[i], need2);
for i:=1 to width do begin
for j:=1 to height do begin
{$I-} read(inp, a^[i]^[j]); {$I+}
if IORESULT = 0 then write(a^[i]^[j]:8:2);
end; // while [j]
end; // while [i]
{$I-} close(inp); {$I+}
filename := '';
flag:=2; end else writeln('no');
writeln('Для возврата в главное меню нажмите ENTER');
end;
end;
6:begin
clrscr;
writeln('6.Просмотр таблицы');
if flag<>2 then writeln('Таблица не создана')
else begin
for i:=1 to width do begin
for j:=1 to height do write(a^[i]^[j]:8:2);
writeln;
end; end;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
end;
7:begin
clrscr;
writeln('7.Выполнение подпрограммы');
if flag<>2 then writeln('Таблица не создана.Невозможно выполнить подпрограмму')
else begin
Proced(a, width, height,res,err);
writeln('Правильно ли выполнилась программа?',BoolTest(err));
writeln('Ответ:', res);
end;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
end;
end; //case
if p1<>8 then readln;
until p1=8; //repeat
clrscr;
writeln('Завершение работы'); //освобождаем память
for i:=1 to width do FreeMem(a^[i], need2); //удаляем все строки
FreeMem(a, need1);//удаляем указатели на них
a := NIL;
{$R+}
writeln('Для продолжения нажмите ENTER');
readln;
end. |