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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2010, 21:15   #1
Paul-SFL
 
Регистрация: 27.11.2010
Сообщений: 6
По умолчанию Pascal. Поиск линейно зависимых строк матрицы. Error 200: Division by zero, хотя нулей в матрице нет

Добрый вечер, форумчане .
Пршу помочь разобраться с проблемкой.. Паскаль учить начал только в универе, опыта очень мало, так что сам пока решения не нашел. Ну и над кодом не смейтесь сильно , пожалуйста..
Значит, есть задача:
Цитата:
Определить, есть ли в прямоугольной матрице линейно зависимые строки и подсчитать количество пар таких строк.
Программу написал. Компилится (Turbo Pascal 7.1). В чем проблема: запускаю, отвечаю на запрос об использовании принтера. Мельком вижу исходную матрицу и сообщение об ошибке, после этого программа закрывается. При запуске из командной строки программа матрицу не выводит, а сразу после вопроса о принтере выдает Runtime error 002 at 0000:005D.

Прогоняю с помощью Step over/Trace into - компилятору, гаду, откуда-то деление на ноль чудится, хотя я спецом все нули из матрицы убрал.

В манах ничего не нашел. Догадок нету (кроме незнания каки-то мелких нюансов и заковырок)..

Последний раз редактировалось Paul-SFL; 27.11.2010 в 21:26.
Paul-SFL вне форума Ответить с цитированием
Старый 27.11.2010, 21:17   #2
Paul-SFL
 
Регистрация: 27.11.2010
Сообщений: 6
По умолчанию

Вот код:
Код:
Program Lab_Four;
Uses Crt,Printer;
Const Nmax = 32; Mmax=64;
Type  Matrix = array[1..Nmax,1..Mmax] of integer;
Var
    i,k,j,                        { параметры цикла }
    n,m,                        { размеры матрицы }
    LinInd,                     { индикатор линейности строк }
    LinCount    : byte;     { количество пар линейно зависимых строк}
    PrinterInd,                { индикатор использования принтера }
    Control      : boolean; { переменная, определяющая позицию элементов a[i,j] и a[k,j]}
	                       { (т.е. что в числителе, а что - в знаменателе выражения) }
    ch           : char;      { символ нажатой клавиши }
    p,q          : integer;   { результаты целочисленного деления и остатка от него }
    A             : Matrix;    { обрабатываемая матрица }
    F             : text;       { файл, содержащий исходные данные }
...
Файл с матрицей прилеплен.
Вложения
Тип файла: zip M.zip (212 байт, 10 просмотров)
Paul-SFL вне форума Ответить с цитированием
Старый 27.11.2010, 21:17   #3
Paul-SFL
 
Регистрация: 27.11.2010
Сообщений: 6
По умолчанию

Код:
Procedure WaitEscape;
{ Приостановка программы до нажатия клавиши Esc }
Var ch : char;
Begin
  Repeat
    ch:=ReadKey;
  Until ord(ch)=27;
End { WaitEscape };
{ ------------------------------------------------------------- }
Procedure ReadMatrix;
{ Чтение матрицы из текстового файла }
Var  i,j : byte;
Begin
  Reset(F);
  Read(F,n,m);
  For i:=1 to n do
    For j:=1 to m do
      Read(F,a[i,j]);
  Close(F);
End { ReadMatrix };
{ ------------------------------------------------------------- }
Procedure ScreenMatrix;
{ Вывод матрицы на экран дисплея }
Var i,j,k : byte;
Begin
  For i:=1 to n do
    Begin
      k:=0;
      For j:=1 to m do
        begin
          Inc(k);
          if k<7 then
            Write(a[i,j],'   ')
          else
            begin
              k:=0;
              Writeln(a[i,j],'   ')
            end
        end;
      If k>0 then Writeln;
   End;
  If k>0 then Writeln;
End { ScreenMatrix };
{ ------------------------------------------------------------- }
Procedure PrinterMatrix;
{ Вывод матрицы на принтер }
Var i,j,k : byte;
Begin
  For i:=1 to n do
    Begin
      k:=0;
      For j:=1 to n do
        begin
          Inc(k);
          if k<7 then
            Write(Lst,a[i,j],'   ')
          else
            begin
              k:=0;
              Writeln(Lst,a[i,j],'   ')
            end
        end;
      If k>0 then Writeln(Lst);
    End;
  If k>0 then Writeln(Lst);
End { PrinterMatrix };
{ ------------------------------------------------------------- }
Begin
{ Установка соответствия между внутренним и внешним файлами }
  Assign(F,'M.dat');
{ Запрос об использовании принтера }
  ClrScr;
  Writeln('Будет ли использован принтер (Да,Нет) ?');
  ch:=ReadKey;
  If ch in ['Д','д','L','l'] then
    PrinterInd:=true
  Else
    PrinterInd:=false;
{ Ввод и печать исходных данных }
  ReadMatrix;
  Writeln('            Исходная матрица:');
  Writeln('                n = ',n,'  m=',m);
  ScreenMatrix;
  If PrinterInd then
    Begin
      Writeln(Lst,'             Исходная матрица:');
      Writeln(Lst,'                  n = ',n,'  m=',m);
      PrinterMatrix;
    End;
{ Поиск линейно зависимых строк }
For i:=1 to n-1 do
  Begin
    LinInd:=0;
    k:=0;
      While k<=n do
        begin
	k:=i+1;
          if a[i,j]>a[k,j] then
	 begin
	   p:=a[i,j] div a[k,j];
              q:=a[i,j] mod a[k,j];
	   Control:=true;
	 end
          else
	 begin
	   p:=a[k,j] div a[i,j];
	   q:=a[k,j] mod a[i,j];
	   Control:=false;
	 end;
{ ------------------------------------------------------------- }
	if q<>0 then
	  Break
	else
	  While j<m do
               begin
                 if Control then
                   begin
                     if (a[i,j+1] div a[k,j+1])<>p then
		 Break
	          else
		 Inc(LinInd);
		 Inc(j);
	        end
	          else 
		 begin
		   if (a[k,j+1] div a[i,j+1])<>p then
		     Break
		   else
		     Inc(LinInd);
		     Inc(j);
		 end;
               end;
{ ------------------------------------------------------------- }
         if LinInd=m then
	Inc(LinCount);
         end;
         If LinCount>0 then
	 Writeln('В данной матрице ',LinInd,' пар линейно зависимых строк')
         Else
	  Writeln('В данной матрице нет линейно зависимых строк');			
  End;
  WaitEscape;
End.
Процедуры все скопированы из методички, так что дело точно не в них.

Последний раз редактировалось Paul-SFL; 27.11.2010 в 21:21.
Paul-SFL вне форума Ответить с цитированием
Старый 27.11.2010, 21:34   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

на какой строчке Division By zero вылетает?
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 27.11.2010, 21:42   #5
Paul-SFL
 
Регистрация: 27.11.2010
Сообщений: 6
По умолчанию

Mad_Cat, точно, забыл ..
Код:
For i:=1 to n-1 do
  Begin
    LinInd:=0;
    k:=0;
      While k<=n do
        begin
	k:=i+1;
          if a[i,j]>a[k,j] then
	 begin
	   p:=a[i,j] div a[k,j];
              q:=a[i,j] mod a[k,j];
	   Control:=true;
	 end
          else
	 begin
	   p:=a[k,j] div a[i,j];
	   q:=a[k,j] mod a[i,j];
	   Control:=false;
	 end;
Так-так.. Я тут попробовал с директивой {$R+} скомпилировать - получилось, но теперь при step over выдает ошибку 201 (Range check error) вот в этом месте:
Код:
For i:=1 to n-1 do
  Begin
    LinInd:=0;
    k:=0;
      While k<=n do
        begin
	k:=i+1;
          if a[i,j]>a[k,j] then
Paul-SFL вне форума Ответить с цитированием
Старый 27.11.2010, 21:48   #6
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
при step over выдает ошибку 201 (Range check error) вот в этом месте:
значит тут k уже больше n
попробуй
Код:
While k<n do
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 27.11.2010, 21:48   #7
Paul-SFL
 
Регистрация: 27.11.2010
Сообщений: 6
По умолчанию

Нашел! Я ж параметру j ничего не присвоил , вставил для пробы j:=1 после k:=i+1 - заработало. Программа больше не вылетает. Только что-то долго вычисляет.. Минуту жду - ничего еще не посчитала. Из-за чего так может быть? Из-за кучи вложенных циклов?
Paul-SFL вне форума Ответить с цитированием
Старый 27.11.2010, 21:50   #8
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
Из-за чего так может быть
зациклилась где то)
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 27.11.2010, 21:52   #9
Paul-SFL
 
Регистрация: 27.11.2010
Сообщений: 6
По умолчанию

По ходу, да. До сих пор ничего не вычислила. Буду искать ..
Ага, зацикливается While k<=n.. Step over - наше все .

Последний раз редактировалось Paul-SFL; 27.11.2010 в 21:55.
Paul-SFL вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Division by zero на Turbo Pascal Kingdom_Reborn Помощь студентам 7 27.10.2010 13:20
поиск серии одинаковых элементов строк матрицы Termit1995 Помощь студентам 1 20.05.2010 06:44
Найти максимальный элемент матрицы и вставить правее него столбец из нулей и ниже него строку из нулей. Romer9999 Паскаль, Turbo Pascal, PascalABC.NET 3 28.11.2008 11:28
Найти номера(индексы) в матрице хотябы одной строки или хотя бы одного столбца не содержащих еденицы Сергей Попов Паскаль, Turbo Pascal, PascalABC.NET 1 28.11.2008 08:59