Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2010, 22:18   #1
Оля_1991
 
Регистрация: 18.09.2010
Сообщений: 3
Вопрос Где в этой программе ошибка:

При запуске программы пишет ошибку 202.
Код:
Program SumG_SumP;
uses crt;
const Max=100;
type matr=array [1..Max,1..Max] of integer;
var a:matr;
i,j,SumG,SumP,x:integer;
n:integer;
   Procedure VvodRazmernostiMatrici (var x:integer);
   begin
   repeat
   writeln ('Vvedite razmernost kvadratnoi matrici(1..',Max,')');
   readln (x) until x in [1..Max];

   end;
   Procedure GenerateMatr (x:integer; var M:Matr);
   var i,j:integer;
   begin
   for i:=1 to x do
   for j:=1 to x do
   M[i,j]:=random(20)
   end;
   Procedure PrintMatr(x:integer; M:Matr);
   var i,j:integer;
      begin
   for i:=1 to x do begin
   for j:=1 to x do
   write (M[i,j]);
   writeln;
   end;
   end;

   Function SumGlavnoiDiagonali (x:integer; M:Matr):real;
   var SumG: real;
   i,j:integer;
   begin
   SumG:=0;
   for i:=1 to x do
   for j:=1 to x do
   if i=j then
   begin
   SumG:=SumG+M[i,j];
   SumGlavnoiDiagonali:=SumG;

   end;
   end;
  Function SumPobochnoiDiagonali (x:integer; M:Matr):real;
   var SumP:real;
   i,j:integer;
   Begin
   SumP:=0;
   for i:=1 to x do
   for j:=1 to x do
   SumP:=SumP+M[x-i+1,i];
   SumPobochnoiDiagonali:=SumP;
   end;


    Begin
   VvodRazmernostiMatrici(x);

   GenerateMatr (x,a);


   PrintMatr(x,a);
   SumGlavnoiDiagonali(x,a);
   writeln ('summa elementov glavnoi diagonali=',SumGlavnoiDiagonali(x,a));
   SumPobochnoiDiagonali (x,a);

   writeln ('summa elementov pobochnoi diagonali=',SumPobochnoiDiagonali(x,a));
   readln;
   End.

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

Последний раз редактировалось Stilet; 18.09.2010 в 22:46. Причина: добавление условия задачи
Оля_1991 вне форума Ответить с цитированием
Старый 18.09.2010, 22:40   #2
Xatr
Форумчанин
 
Аватар для Xatr
 
Регистрация: 17.09.2008
Сообщений: 349
По умолчанию

у меня программа выпонилась, только неправильно считалась побочнаая диагональ...
теперь сумму чисел побочной диагонали должно считать правильно:
Код:
Program SumG_SumP;
uses crt;
const Max=100;
type matr=array [1..Max,1..Max] of integer;
var a:matr;
i,j,SumG,SumP,x:integer;
n:integer;
Procedure VvodRazmernostiMatrici (var x:integer);
begin
repeat
writeln ('Vvedite razmernost kvadratnoi matrici(1..',Max,')');
readln (x) until x in [1..Max];
end;
Procedure GenerateMatr (x:integer; var M:Matr);
var i,j:integer;
begin
for i:=1 to x do
for j:=1 to x do
M[i,j]:=random(20)
end;
Procedure PrintMatr(x:integer; M:Matr);
var i,j:integer;
begin
for i:=1 to x do begin
for j:=1 to x do
write ('  ',M[i,j]);
writeln;
end;
end;
Function SumGlavnoiDiagonali (x:integer; M:Matr):real;
var SumG: real;
i,j:integer;
begin
SumG:=0;
for i:=1 to x do
for j:=1 to x do
if i=j then
begin
SumG:=SumG+M[i,j];
SumGlavnoiDiagonali:=SumG;
end;
end;
Function SumPobochnoiDiagonali (x:integer; M:Matr):real;
var SumP:real;
i,j:integer;
Begin
SumP:=0;
for i:=1 to x do
SumP:=SumP+M[x-i+1,i];
SumPobochnoiDiagonali:=SumP;
end;
Begin
VvodRazmernostiMatrici(x);
GenerateMatr (x,a);
PrintMatr(x,a);
SumGlavnoiDiagonali(x,a);
writeln ('summa elementov glavnoi diagonali=',SumGlavnoiDiagonali(x,a ));
SumPobochnoiDiagonali (x,a);
writeln ('summa elementov pobochnoi diagonali=',SumPobochnoiDiagonali(x ,a));
readln;
End.
удалена строка:
Код:
for j:=1 to x do
за ненадобностью.
ну я конечно в Pascal ABC тестил, а не в Turbo Pascal. Поэтому и не было 202 Stack overflow error (Переполнение стека), если вы под 202 это имели ввиду...
если чем помог, поставьте отзыв на весы

Последний раз редактировалось Xatr; 18.09.2010 в 22:45.
Xatr вне форума Ответить с цитированием
Старый 18.09.2010, 22:41   #3
ROMA2PVT
ТАМБОВСКИЙ ВОЛК.
Участник клуба
 
Аватар для ROMA2PVT
 
Регистрация: 16.03.2010
Сообщений: 1,354
По умолчанию

Код:
const Max=100;
Поменьше вот так:
Код:
const Max=15;
при выводе чтобы массив не сливался:
Код:
write (M[i,j]:4);
Ну и вот эта функция:
Код:
Function SumPobochnoiDiagonali (x:integer; M:Matr):real;
var SumP:real;
i,j:integer;
Begin
SumP:=0;
for i:=1 to x do
for j:=1 to x do
SumP:=SumP+M[x-i+1,i];
SumPobochnoiDiagonali:=SumP;
end;
Вот так исправьте:
Код:
Function SumPobochnoiDiagonali (x:integer; M:Matr):real;
var SumP:real;
i,j:integer;
Begin
SumP:=0;
for i:=1 to x do
SumP:=SumP+M[x-i+1,i];
SumPobochnoiDiagonali:=SumP;
end;
везде где тип стоит Real исправьте на Integer
にんじゃ

Последний раз редактировалось ROMA2PVT; 18.09.2010 в 23:39.
ROMA2PVT вне форума Ответить с цитированием
Старый 04.10.2010, 00:46   #4
Kochevnik_ua_km
 
Регистрация: 04.10.2010
Сообщений: 4
По умолчанию

Доброго времени суток.
В чем ошибка в процедуре? выдаёт переполнение стека?

Код:
procedure tform1.downsort(first,last:integer);
var i,j:integer;
tmp:cryina;rtm,x:real;
begin
rtm:=0;
  i:=first;
  j:=last;
  for i:=first to last do
  rtm:=mas[i].nacel+rtm;
  x:=rtm/last;   repeat
    while mas[i].nacel>x do i:=i+1; 
    while x>mas[j].nacel do j:=j-1; 
    if i<=j then
     begin
       tmp:=mas[i];
       mas[i]:=mas[j];
       mas[j]:=tmp;
       i:=i+1;
       j:=i-1;
     end;
   until i>j;
   if first<j then downsort(first,j);
   if i<last then downsort(i,last)
   end;
Kochevnik_ua_km вне форума Ответить с цитированием
Старый 04.10.2010, 12:20   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
  i:=first;
  j:=last;
  for i:=first to last do
  rtm:=mas[i].nacel+rtm;
  x:=rtm/last;   repeat
    while mas[i].nacel>x do i:=i+1; 
    while x>mas[j].nacel do j:=j-1; 
    if i<=j then
     begin
       tmp:=mas[i];
       mas[i]:=mas[j];
       mas[j]:=tmp;
       i:=i+1;
       j:=i-1;
     end;
   until i>j;
   if first<j then downsort(first,j);
   if i<last then downsort(i,last)
   end;
в выделенных красным использована одна и та же переменная и как следствие ее значение отличается от ожидаемого тобой (можешь проверить отладчиком). неверное значение данной переменной приводит к бесконечной рекурсии и переполнению стека.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.10.2010 в 12:24.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где в программе ошибка? Warfvare Помощь студентам 3 22.06.2010 15:26
подробнее о программе где сравнение массивов moda Паскаль, Turbo Pascal, PascalABC.NET 2 21.03.2010 15:19
Помогите нарисовать блок-схему к этой программе C-Jay Общие вопросы C/C++ 3 30.12.2009 16:21
подскажите, что в этой программе не так?? мария2507 Microsoft Office Excel 3 22.12.2009 16:30
Подскажите, где в программе ошибка gamer123 Паскаль, Turbo Pascal, PascalABC.NET 3 25.02.2008 03:09