• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

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

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Где же баг? Помогите, пожалуйста, уважаемые профи!

  • Автор темы Автор темы Skazzi
  • Дата начала Дата начала

Skazzi

Новые
Регистрация
24 Авг 2011
Сообщения
15
Реакции
0
Баллы
0
Где же баг? Помогите, пожалуйста, уважаемые профи!

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. Где я не права?))
 
Суть программки - решение задачи на подсчет максимального элемента из части квадратной матрицы, находящейся выше главной диагонали.
 
И еще важный момент: я ввела переменную "max_defined", чтобы максимум был либо определён, либо не определён. То есть, если взять матрицу размерностью "1", максимум будет не определён (принять максимум равный 1 - логически не верно).
 
Точку с запятой уберите перед else
 
Что-то намудрила... Посмотрите, пожалуйста, еще одно:

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!" (Максимальный элемент не определен).
 
Что-то намудрила... Посмотрите, пожалуйста, еще одно:
Вы знаете, сколь я голову ни ломал, но так и не сподобился узреть хотя бы малейший оттенок смысла в булевом параметре 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.
 
Спасибо, Владимир! :)

Я может зря заморочилась - но, ведь, если матрица 1x1, max element = -10000, а сие не верно...
 
Спасибо, Владимир! :)

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

о 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:
 
Неверно выразилась: вычислить надо максимум из нижнего треугольника, а не просто нижний треугольник) Владимир, поделитесь номерком icq? :)
 
Неверно выразилась: вычислить надо максимум из нижнего треугольника, а не просто нижний треугольник) Владимир, поделитесь номерком icq? :)
Не поделюсь. И не потому, что жалко, а просто нету у меня ICQ. И Скайпа тоже нету. Ну ископаемое я!

Теперь по программе.
1. Исходя из условия, следует проверять размерность матрицы не только на величину, но и на четность: подобный фрагмент может быть только у матрицы нечетного размера. Или надо было показать область для четной матрицы. Добавил.
2. Не понравился алгоритм проверки ввода размера матрицы. Считаю (и отнюдь не только я), что прерывания циклов (break), равно как и переходы по меткам, нужно использовать только в самых крайних случаях, а вообще желательно обходиться без них. Переделал на свой вкус.
3. Добавил вывод на экран введенной матрицы.
4. Если тело цикла содержит только один оператор, то заключать последний в операторные скобки begin-end не обязательно. Не ошибка, но лишнее загромождение кода, ухудшающее читабельность. Убрал.
5. Сделал кое-какие косметические исправления - форматы и т.п.
6. И еще призываю не игнорировать, а активно использовать структурирование листинга ("лесенки" и т.п.). Ну очень трудно читать программу в один столбец. Сиди и разбирайся, какой "end" к какому "begin" относится!
Вот:
Код:
program MaxElement;

uses Crt;

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

begin
 clrscr;

 repeat
  write('Enter the matrix size: ');
  readln(size);
  if size <= 2 then
   writeLn('Error: matrix size is too small!');
  if (size mod 2)=0 then
   writeLn('Error: matrix size must be odd!');
 until (size>2) and ((size mod 2)=1);

 writeLn('Enter the matrix:');

 for i:= 1 to size do
  for j:= 1 to size do
   begin
    write('Matrix[',i:2,',',j:2,']= ');
    readln(Matrix[i, j]);
   end;

 clrscr;
 writeln('Matrix:');
 for i:= 1 to size do
  begin
   for j:= 1 to size do
    write(Matrix[i,j]:8:3);
   writeln;
  end;

 writeln;

 i0:=(size div 2)+2;
 j0:=(size div 2)+1;
 { Upper triangular point coordinates }

 maxValue:= Matrix[i0, j0];

 for i:=i0+1 to size do
  for j:=j0-(i-i0)  to j0+(i-i0) do
   if Matrix[i,j] > maxValue then maxValue:= Matrix[i,j];


 writeLn('Max value = ', maxValue:0:3);

 readLn;
end.
 
Владимир, большое вам студенческое спасибо за каждый пункт! :) Буду разбираться.

6 - почему-то форум "съедает" моё форматирование.

С другой стороны хорошо, что не пользуетесь асей - студенты ведь замучают!
 
6 - почему-то форум "съедает" моё форматирование.
А чтобы не "съедал", нужно так:
1. "Мой кабинет" - "Опции" - устанавливаем "Визуальный редактор - расширенный интерфейс".
2. Пост с листингом пишем в "Расширенном режиме".
3. Копипастим листинг.
4. Выделяем его.
5. Жмем кнопочку "#". При этом в начале и в конце листинга автоматически вставляется тег {code}.
ВСЁ!
 
Назад
Сверху