Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 25.08.2011, 12:37   #1 (permalink)
Skazzi
Member
 
Регистрация: 24.08.2011
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Где же баг? Помогите, пожалуйста, уважаемые профи!

uses crt;
var
a:array [1..100,1..100] of real;
i,j,n:integer;
max:real;
max_defined:boolean;
begin
clrscr;
max:=-10000;
writeln('There is a square real matrix. Count max from x-elements');
writeln('');
writeln('- x x x ');
writeln('o - x x ');
writeln('o o - x ');
writeln('o o o - ');
writeln('');
writeln ('Enter the dimension of the square matrix A:');
readln (n);
while n<1 do
begin
writeln('Error! Wrong dimension');
writeln('');
writeln('Enter the correct dimension of the square matrix A:');
readln (n);
end;

for i:=1 to n do
for j:=1 to n do
begin
writeln ('Enter the value of matrix A element a[',i,',',j,']');
readln (a[i,j]);
end;


max_defined:=false;

for i:=1 to n-1 do
for j:=i+1 to n do
if max_defined then
begin
if a[i,j]>max then max:=a[i,j];
else max_defined:=true;
end;

writeln('');
writeln('Matrix A:');
for i:=1 to n do
begin
writeln('');
for j:=1 to n do
begin
write (a[i,j]:0:0);
end;
end;
writeln('');
writeln('max element =',max:4:0);
readln;
end.

Ругается на строчку с else - пишет Error in statement. Где я не права?))
Skazzi вне форума   Ответить с цитированием

Старый 25.08.2011, 12:37
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Если поискать по схожим темам, то можно найти это

Помогите пожалуйста
Evga gtx 460 - вопросы, профи помогите
Помогите пожалуйста
Помогите, пожалуйста, с CD-ROM
Вопрос для профи

Старый 25.08.2011, 12:39   #2 (permalink)
Skazzi
Member
 
Регистрация: 24.08.2011
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Суть программки - решение задачи на подсчет максимального элемента из части квадратной матрицы, находящейся выше главной диагонали.
Skazzi вне форума   Ответить с цитированием
Старый 25.08.2011, 12:43   #3 (permalink)
Skazzi
Member
 
Регистрация: 24.08.2011
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

И еще важный момент: я ввела переменную "max_defined", чтобы максимум был либо определён, либо не определён. То есть, если взять матрицу размерностью "1", максимум будет не определён (принять максимум равный 1 - логически не верно).
Skazzi вне форума   Ответить с цитированием
Старый 25.08.2011, 13:33   #4 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Точку с запятой уберите перед else
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Старый 25.08.2011, 15:49   #5 (permalink)
Skazzi
Member
 
Регистрация: 24.08.2011
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Что-то намудрила... Посмотрите, пожалуйста, еще одно:

uses crt;
var
a:array [1..100,1..100] of real;
i,j,n:integer;
max:real;
max_defined:boolean;
begin
clrscr;
max:=-10000;
max_defined:=false;
writeln('There is a square real matrix. Count max from x-elements');
writeln('');
writeln('- x x x ');
writeln('o - x x ');
writeln('o o - x ');
writeln('o o o - ');
writeln('');
writeln ('Enter the dimension of the square matrix A:');
readln (n);
while n<1 do
begin
writeln('Error! Wrong dimension');
writeln('');
writeln('Enter the correct dimension of the square matrix A:');
readln (n);
end;

for i:=1 to n do
for j:=1 to n do
begin
writeln ('Enter the value of matrix A element a[',i,',',j,']');
readln (a[i,j]);
end;


for i:=1 to n-1 do
for j:=i+1 to n do
if max_defined then
if a[i,j]>max then max:=a[i,j]
else max_defined:=true;

if max_defined=true then
begin
writeln('');
writeln('Matrix A:');

for i:=1 to n do
begin
writeln('');
for j:=1 to n do
begin
write (a[i,j]:0:0);
end;
end;

writeln('');
writeln('max element =',max:4:0);
readln;
end
else
writeln('Max not defined!');
readln;
end.

Сейчас при вводе любых "хороших" (больше единицы) значений размерности матрицы выводится сообщение "Max element not defined!" (Максимальный элемент не определен).
Skazzi вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 25.08.2011, 18:10   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Skazzi Посмотреть сообщение
Что-то намудрила... Посмотрите, пожалуйста, еще одно:
Вы знаете, сколь я голову ни ломал, но так и не сподобился узреть хотя бы малейший оттенок смысла в булевом параметре max_defined, т.е. с моей точки зрения он не только абсолютно лишний, но и вредный, ибо вносит путаницу в код и приводит к ошибкам, в чем Вы имели возможность убедиться. Потому предлагаю работающий вариант без указанного параметра и с некоторой еще косметикой:
Код:
uses crt;
var
 a:array [1..100,1..100] of real;
 i,j,n:integer;
 max:real;
begin
 clrscr;
 max:=-10000;
 writeln('There is a square real matrix. Count max from x-elements');
 writeln('');
 writeln('- x x x ');
 writeln('o - x x ');
 writeln('o o - x ');
 writeln('o o o - ');
 writeln('');
 writeln ('Enter the dimension of the square matrix A:');
 readln (n);
 while n<1 do
  begin
   writeln('Error! Wrong dimension');
   writeln('');
   writeln('Enter the correct dimension of the square matrix A:');
   readln (n);
  end;

 for i:=1 to n do
  for j:=1 to n do
   begin
    write('Enter the value of matrix A element a[',i,',',j,'] ');
    readln (a[i,j]);
   end;


 for i:=1 to n-1 do
  for j:=i+1 to n do
   if a[i,j]>max then max:=a[i,j];

 writeln('');
 writeln('Matrix A:');

 for i:=1 to n do
  begin
   writeln;
   for j:=1 to n do
    write(a[i,j]:8:3);
  end;

 writeln;
 writeln;
 writeln('max element =',max:4:0);
 readln;
end.
Vladimir_S вне форума   Ответить с цитированием
Старый 26.08.2011, 11:12   #7 (permalink)
Skazzi
Member
 
Регистрация: 24.08.2011
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо, Владимир!

Я может зря заморочилась - но, ведь, если матрица 1x1, max element = -10000, а сие не верно...
Skazzi вне форума   Ответить с цитированием
Старый 26.08.2011, 15:00   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Skazzi Посмотреть сообщение
Спасибо, Владимир!

Я может зря заморочилась - но, ведь, если матрица 1x1, max element = -10000, а сие не верно...
А Вам обязательно, чтобы отрабатывалась ситуация с n=1? Если да, то проще сделать отдельную обработку, например, так:
Код:
uses crt;
var
 a:array [1..100,1..100] of real;
 i,j,n:integer;
 max:real;
begin
 clrscr;
 max:=-10000;
 writeln('There is a square real matrix. Count max from x-elements');
 writeln('');
 writeln('- x x x ');
 writeln('o - x x ');
 writeln('o o - x ');
 writeln('o o o - ');
 writeln('');
 write('Enter the dimension of the square matrix A: ');
 readln (n);
 while n<1 do
  begin
   writeln('Error! Wrong dimension');
   writeln('');
   writeln('Enter the correct dimension of the square matrix A:');
   readln (n);
  end;
 writeln;
  for i:=1 to n do
   for j:=1 to n do
    begin
     write('Enter the value of matrix A element a[',i,',',j,'] ');
     readln (a[i,j]);
    end;

 If n=1 then max:=a[1,1] else
  begin
   for i:=1 to n-1 do
    for j:=i+1 to n do
     if a[i,j]>max then max:=a[i,j];
  end;
 writeln;
 writeln('Matrix A:');

 for i:=1 to n do
  begin
   writeln;
   for j:=1 to n do
    write(a[i,j]:8:3);
  end;

 writeln;
 writeln;
 writeln('max element =',max:4:0);
 readln;
end.
Vladimir_S вне форума   Ответить с цитированием
Старый 29.08.2011, 08:47   #9 (permalink)
Skazzi
Member
 
Регистрация: 24.08.2011
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

спасибо еще раз
Skazzi вне форума   Ответить с цитированием
Старый 29.08.2011, 11:20   #10 (permalink)
Skazzi
Member
 
Регистрация: 24.08.2011
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Решаю следующую задачку, и снова где-то скрылся "неуловимый" баг. Задача похожая - улучшила структуру программы, только сейчас нужно вычислить нижний треугольник матрицы:

о o o o о
о о o о о
о о о о о
о о х о о
о х х х о

program MaxElement;

uses
Crt;

var
Matrix: array [1..100, 1..100] of Real;
size: Integer;
maxValue: Real;
i: Integer;
j: Integer;

begin
clrscr;

while True do
begin
write('Enter the matrix size: ');
read(size);

if size >= 2 then
begin
break;
end;

writeLn('Error: matrix size is too small!');
end;

writeLn('Enter the matrix:');

for i:= 1 to size do
begin
for j:= 1 to size do
begin
read(Matrix[i, j]);
end;
end;

maxValue:= Matrix[1, 2];

for j:= size+1 to size-1 do
begin
for i:= size-j to size do
begin
if Matrix[i, j] > maxValue then
begin
maxValue:= Matrix[i, j];
end;
end;
end;

writeLn('Max value = ', maxValue:1:2);

readLn;
readLn;
end.

Сейчас почему-то вычисляет максимум из "верхнего" треугольника.... tehnari_ru_117:
Skazzi вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 07:20.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.