Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Никитосс
0 / 0 / 1
Регистрация: 20.05.2013
Сообщений: 8
1

Переполнение стека

07.06.2013, 19:57. Просмотров 530. Ответов 4
Метки нет (Все метки)

Pascal
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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
Program kriteriy;
uses crt,math;
const
MS='абвгдежзийклмнопрстуфхцчшщъыьэюя';
key1=4;
lenkol=7;
n=27547;
lenstroki=ceil(n/lenkol);                 {ceil округляет до ближайшего целого}
  var
  keystrok:array[1..lenstroki] of integer;
  nomkey:array[1..lenkol] of integer;
  TC,aa,dp:array[1..n] of integer;
  MC:array[1..length(MS)] of integer;
  MDd,MDaad,MDpdd:array[1..15000] of integer;
  MDTD:array[1..1024] of integer;
  TD,d,aad,pdd:array [1..2,1..n-1] of integer;
  MD:array[1..2,1..1024] of integer;
  TSt,st,aat,cct:array[1..n-1] of string;
  MSt:array[1..length(MS),1..length(MS)] of string;
  cp:array[1..n] of char;
  a:array[1..n] of char;
  TS,s:array[1..20000] of char;
  mas:array[1..1024] of string;
  P,H:array[1..1024] of real;
  P1,H1,H2,P2,H3,P3:array[1..15000] of real;
  index:array[1..255] of integer;
  ss:array[1..n] of integer;
  i,j,k,len,curr,T,b,z,m,x,size:integer;
  sp,sh,sp1,sh1,sp2,sh2,sp3,sh3:real;
  sss,key:string;
  c,cs,sc:char;
  fa,fs:file of char;
  f:text;
begin
//begin программы для диграмм исходного текста
 k:=1;
clrscr;
assign(f,'work.txt');
reset(f);
i:=0;
 while not eof(f) do
    begin
    i:=i+1;
    read(f,TS[i]);
    end;
  for i:=1 to n do
       TC[i]:=ord(TS[i]);
  for i:=1 to n-1 do
       TSt[i]:=TS[i]+TS[i+1];
  for i:=1 to 2 do
    for j:=1 to n-1 do
         begin
         TD[i,j]:=ord(TSt[j][i]);
         end;
  //end программы для диграмм исходного текста
 //begin программы для диграмм алфавита
  for i:=1 to length(MS) do
       MC[i]:=ord(MS[i]);
  for i:=1 to length(MS) do
         begin
        for j:=1 to length(MS) do
          MSt[i,j]:=MS[i]+MS[j];
         end;
      for i:=1 to length(MS) do
        for j:=1 to length(MS) do
         begin
         mas[k]:=MSt[i,j];
         inc(k);
         end;
    for i:=1 to 2 do
      for j:=1 to 1024 do
        begin
        MD[i,j]:=ord(mas[j][i]);
        end;
    //end программы для диграммы алфавита
    //begin подсчета суммарной вероятности и энтропии исходного текста
 MDTD[j]:=0;
 P[j]:=0;
 H[j]:=0;
 sp:=0;
 sh:=0;
   begin
   for i:=1 to n-1 do
        begin
      for j:=1 to 1024 do
           begin
         if (MD[1,j]=TD[1,i]) and (MD[2,j]=TD[2,i]) then
                                                     begin
                                                     MDTD[j]:=MDTD[j]+1;
                                                     P[j]:=MDTD[j]/(n-1);
                                                     H[j]:=-P[j]*(ln(P[j])/ln(2));
                                                     end;
        end;
           end;
                                 for j:=1 to 1024 do
                                          begin
                                          sp:=sp+P[j];
                                          sh:=sh+H[j];
                                          end;
  end;
   {write('    суммарная вероятность  = ',sp:4:2);
   writeln;}
   write('энтропия исходного текста           =',sh:5:2);
   writeln;
   //end подсчета суммарной вероятности и энтропии исходного текста
   //begin программы для вертикальной перестановки по ключу
    assign(f,'work.txt');
    reset(f);
  b:=0;
while not eof(f) do
  begin
  b:=b+1;
  read(f,s[b]);
  end;
  key := '827496315';
  len := length(key);
  for i := 1 to len do index[i] := i;
  for i := 1 to len do
     begin
    for j := len downto i + 1 do
      begin
      if key[index[j - 1]] > key[index[j]] then
        begin
        T := index[j - 1]; index[j - 1] := index[j]; index[j] := T;
        end;
      end;
     end;
        z:=0;
    for i := 1 to len do
      begin
      curr := index[i];
       while curr <= n do
          begin
          z:=z+1;
          ss[z]:=ord(s[curr]);
          inc(curr,len);
          end;
      end;
 //end программы для вертикальной перестановки по ключу
//begin программы для диграмм текста зашифрованного методом вертикальной перестановки
  for i:=1 to n-1 do
       St[i]:=chr(ss[i])+chr(ss[i+1]);
  for i:=1 to 2 do
     for j:=1 to n-1 do
        begin
        d[i,j]:=ord(St[j][i]);
        end;
//end программы для диграмм текста зашифрованного методом вертикальной перестановки
 //begin программы для подсчета суммарной вероятности и энтропии текста зашифрованного методом вертикальной перестановки
 MDd[j]:=0;
 P1[j]:=0;
 H1[j]:=0;
 sp1:=0;
 sh1:=0;
   begin
   for i:=1 to n-1 do
        begin
      for j:=1 to 1024 do
           begin
         if (MD[1,j]=d[1,i]) and (MD[2,j]=d[2,i]) then
                                                     begin
                                                     MDd[j]:=MDd[j]+1;
                                                     P1[j]:=MDd[j]/(n-1);
                                                     H1[j]:=-P1[j]*(ln(P1[j])/ln(2));
                                                     end;
       end;
           end;
                                 for j:=1 to 1024 do
                                          begin
                                          sp1:=sp1+P1[j];
                                          sh1:=sh1+H1[j];
                                          end;
  end;
   {write('    суммарная вероятность  = ',sp1:4:2);
   writeln;}
   write('энтропия для вертикал. перестановки =',sh1:5:2);
   writeln;
 //end программы для подсчета суммарной вероятности и энтропии текста зашифрованного методом вертикальной перестановки
 //begin программы для шифрования методом перестановки скитала
 assign(fa,'work6.txt');
 reset(fa);
 i:=1;
 size:=filesize(fa);
 m:=ceil(size/(key1+1));                               {ceil округляет до ближайшего целого}
 while not eof(fa) and (i<=m) do
   begin
   j:=1;
   while not eof(fa) and (j<=key1+1) do       {пробегаем по столбцам тут же потом делаем шифрование и помещаем в строку на ту позицию где она была}
      begin
      read(fa,c);
      if c in ['а'..'я'] then
        begin
        x:=m*(j-1)+i;                 {вычисляем номер ячейки куда нужно положить символ}
        a[x]:=c;
        j:=j+1;
        end;
      end;
       while j<=key1+1 do
           begin
           x:=m*(j-1)+i;                   {заполняем нулями все те ячейки в котором символа не было}
           a[x]:=#0;
           j:=j+1;
           end;
       i:=i+1;
   end;      {считываем зашифрованный текст}
close(fa);
while i<=m do
   begin
     j:=1;
     while j<=key1+1 do               {мы заполняем нулями те ячейки которые не используются}
      begin
      x:=m*(j-1)+i;
     a[x]:=#0;
     j:=j+1;
      end;
      i:=i+1;
   end;
 for j:=1 to n do
          begin
          if a[j]<>#0 then           {результирующий массив a[j]}
          {write(a[j]);}
          end;
  //end программы для перестановки скитала
  //begin программы для диграмм текста зашифрованного методом перестановки скитала
for i:=1 to n do
       aa[i]:=ord(a[i]);
  for i:=1 to n-1 do
       aat[i]:=a[i]+a[i+1];
  for i:=1 to 2 do
    for j:=1 to n-1 do
      begin
        aad[i,j]:=ord(aat[j][i]);
      end;
 //end программы для диграмм текста зашифрованного методом перестановки скитала
//begin программы для подсчета суммарной вероятности и энтропии текста зашифрованного методом перестановки скитала
MDaad[j]:=0;
 P2[j]:=0;
 H2[j]:=0;
 sp2:=0;
 sh2:=0;
   begin
   for i:=1 to n-1 do
        begin
      for j:=1 to 1024 do
           begin
         if (MD[1,j]=aad[1,i]) and (MD[2,j]=aad[2,i]) then
                                                     begin
                                                     MDaad[j]:=MDaad[j]+1;
                                                     P2[j]:=MDaad[j]/(n-1);
                                                     H2[j]:=-P2[j]*(ln(P2[j])/ln(2));
                                                     end;
           end;
        end;
                                 for j:=1 to 1024 do
                                          begin
                                          sp2:=sp2+P2[j];
                                          sh2:=sh2+H2[j];
                                          end;
   end;
   {write('    суммарная вероятность  = ',sp2:4:2);
   writeln;}
   write('энтропия для перестановки скитала   =',sh2:5:2);
   writeln;
//end программы для подсчета суммарной вероятности и энтропии текста зашифрованного методом перестановки скитала
//begin программы для шифрования двойной перестановкой
{задается ключ по столбцам }
randomize;
i:=1;
 while i<=lenkol  do
   begin
   x:=random(lenkol)+1;     {0..(lenkol-1)+1}
   j:=1;
     while (j<i) and (x<>nomkey[j]) do
     j:=j+1;       {проходим те элементы которые были и сравниваем с теми которые получились случайным образом если x<>... ложь то мы выходим из цикла}
       if j>=i then
          begin
          nomkey[i]:=x;             {выйдем из цикла и получим массив в котором не будет повторяющихся элементов}
          i:=i+1;
          end;
   end;
   //ключ по строкам
  i:=1;
 while i<=lenstroki  do
   begin
   x:=random(lenstroki)+1;     {0..149+1}
   j:=1;
     while (j<i) and (x<>keystrok[j]) do
     j:=j+1;       {проходим те элементы которые были и сравниваем с теми которые получились случайным образом если x<>... ложь то мы выходим из цикла}
       if j>=i then
          begin
          keystrok[i]:=x;             {выйдем из цикла и получим массив в котором не будет повторяющихся элементов}
          i:=i+1;
          end;
   end;
  //шифрование
  assign(fs,'work7.txt');
  reset(fs);
  i:=1;
     while (i<=lenstroki) and (not eof(fs)) do
        begin
        j:=1;
          while (j<=lenkol) and (not eof(fs)) do
            begin
             read(fs,cs);
             if cs in ['а'..'я'] then
               begin
               x:=lenstroki*(nomkey[j]-1)+keystrok[i];          {формула которая вычисляет позицию в массиве символов}
               cp[x]:=cs;
               j:=j+1;
               end;
            end;
            while j<=lenkol do
           begin
            x:=lenstroki*(nomkey[j]-1)+keystrok[i];            {заполняем нулями все те ячейки в котором символа не было}
           cp[x]:=#0;             {те пустые ячейки которым не присвоено наше значение, заполняется нулевыми значениями, может быть мусор который может всплыть}
           j:=j+1;
           end;
       i:=i+1;
        end;
close(fs);
while i<=lenstroki do
   begin
     j:=1;
     while j<=lenkol do               {мы заполняем нулями те ячейки которые не используются}
      begin
     x:=lenstroki*(nomkey[j]-1)+keystrok[i];
     cp[x]:=#0;
     j:=j+1;
      end;
      i:=i+1;
   end;
 for j:=1 to n do
          begin
          if cp[j]<>#0 then           {результирующий массив c[j] из которого делается энтропия}
          {write(cp[j],' ');}
          end;
  //end программы шифрования двойной перестановкой
  //begin программы для диграмм текста зашифрованного двойной перестановкой
 for i:=1 to n do
       dp[i]:=ord(cp[i]);
  for i:=1 to n-1 do
       cct[i]:=cp[i]+cp[i+1];
  for i:=1 to 2 do
    for j:=1 to n-1 do
      begin
        pdd[i,j]:=ord(cct[j][i]);
      end;
 //end программы для диграмм текста зашифрованной двойной перестановкой
 //begin программы для подсчета суммарной вероятности и энтропии текста зашифрованного двойной перестановкой
 MDpdd[j]:=0;
 P3[j]:=0;
 H3[j]:=0;
 sp3:=0;
 sh3:=0;
   begin
   for i:=1 to n-1 do
        begin
      for j:=1 to 1024 do
           begin
         if (MD[1,j]=pdd[1,i]) and (MD[2,j]=pdd[2,i]) then
                                                     begin
                                                     MDpdd[j]:=MDpdd[j]+1;
                                                     P3[j]:=MDpdd[j]/(n-1);
                                                     H3[j]:=-P3[j]*(ln(P3[j])/ln(2));
                                                     end;
           end;
        end;
                                 for j:=1 to 1024 do
                                          begin
                                          sp3:=sp3+P3[j];
                                          sh3:=sh3+H3[j];
                                          end;
   end;
   {write('    суммарная вероятность  = ',sp3:4:2);
   writeln;}
   write('энтропия для двойной перестановки   =',sh3:5:2);
   writeln;
close(f);
//end программы для подсчета суммарной вероятности и энтропии текста зашифрованного двойной перестановкой
end.
Добавлено через 45 секунд
господа программисты, без особого понимания этой программы, на первый взгляд, из за чего происходит переполнение стека и как это исправить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 19:57
Ответы с готовыми решениями:

Переполнение стека
Всем привет! пишу программу, в ней достаточно много массивов, процедур и есть рекурсия....

Переполнение стека
Всем привет. Вобщем почему-то пишет переполнение стека, в чем проблема воот листинг: uses graph;...

Переполнение стека
Задание такое: Описать объектный тип «Одномерный массив целых чисел» и продемонстрировать его...

Ошибка переполнение стека
здрасти форумчане. при компиляции у меня возникает ошибка 202: переполнение стека и указывает на...

Ошибка: переполнение стека (графические объекты)
Turbo Pascal - ошибка переполнение стека (графические объекты)??? что не так?? uses crt,graph; ...

4
Puporev
Модератор
56311 / 43102 / 29814
Регистрация: 18.05.2008
Сообщений: 102,418
08.06.2013, 12:49 2
Цитата Сообщение от Никитосс Посмотреть сообщение
из за чего происходит переполнение стека и как это исправить?
Думаю что из-за большого количества переменных и объема выделяемой под них памяти, нужно посмотреть и сократить
0
Никитосс
0 / 0 / 1
Регистрация: 20.05.2013
Сообщений: 8
08.06.2013, 16:30  [ТС] 3
Каким образом это можно сделать?
0
Puporev
Модератор
56311 / 43102 / 29814
Регистрация: 18.05.2008
Сообщений: 102,418
08.06.2013, 16:40 4
Цитата Сообщение от Никитосс Посмотреть сообщение
без особого понимания этой программы
Вот без этого и не сделать... А понимать и нет желания....
0
Никитосс
0 / 0 / 1
Регистрация: 20.05.2013
Сообщений: 8
08.06.2013, 16:43  [ТС] 5
Ладно, спасибо
0
08.06.2013, 16:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2013, 16:43

Графическое меню. Переполнение стека при многократном вызове
Не знаю, как исправить. Ошибка в следующем: переходить из графического в текстовый режим можно...

Ошибка 202 "Переполнение стека"
Как её исправить? То, что я нашла в нете : &quot;Эта ошибка генерируется на входе в процедуру или...

Перемещать элементы из первого стека во второй, пока значение вершины первого стека не станет четным
Ребята помогите кто может... Даны указатели P1 и P2 на вершины двух непустых стеков. Перемещать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru