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

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

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

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

Программа на Паскаль

Ильгиза

Новые
Регистрация
8 Окт 2011
Сообщения
49
Реакции
0
Баллы
0
Программа на Паскаль

Здравствуйте!!помогите пожалуйста найти ошибку.

дан двумерный массив, поменять местами в этом массиве максимальный и минимальный элемент. считать что максимальный и минимальный элемент единственны.

program upr1;
const n=2; m=2;
type mas=array[1..n,1..m] of integer;
procedure vv( var a:mas);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to m do
a[i,j]:=random(10);
end;
procedure vv1( var a:mas);
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to m do
write(a[i,j]:3);
writeln;
end;
end;
procedure vv2(var max:integer; a:mas);
var i,j,k,l:integer;
begin
max:=a[1,1];
k:=1;
l:=1;
for i:=1 to n do
for j:=1 to m do begin
if a[i, j] > Max
then
begin
Max := a[i, j];
k:=i;
l:=j;
end;
end;
end;
procedure vv3(var min:integer; a:mas);
var i,j,b,d:integer;
begin
min:=a[1,1];
b:=1;
d:=1;
for i:=1 to n do
begin
for j:=1 to m do
if a[i, j] < Min
then
begin
Min := a[i, j];
b:=i;
d:=j;
end;
end;
end;
procedure vv4( var a:mas);
var
i,j,k,l,b,d,c,min,max:integer;
begin
c:=a[k,l];
a[k,l]:=a[b,d];
a[b,d]:=c;
end;
procedure vv5(var a:mas);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to m do begin
write (a[i,j]:3);
writeln;
end;
end;
end;
var a:mas;
min,max:integer;
begin
writeln('введите массив');
vv(a);
vv1(a);
vv2(max,a);
vv3(min,a);
vv4(a);
writeln('измененный двумерный массив ');
vv5(a);
end.




и если можно помогите решить:

2)дана целочисленная квадратная матрица,порядка n, найти номера столбцов ,элементы в каждой из которых образуют монотонную последовательность. (возрастающую или убывающую).
 
Первую программу вроде подправил, работает.
Код:
program upr1;
 const n=3; m=3;
 type mas=array[1..n,1..m] of integer;
 var a:mas;
 min,max,k,l,b,d:integer;

 procedure vv( var a:mas);
 var i,j:integer;
 begin
   randomize;
   for i:=1 to n do
      for j:=1 to m do
        a[i,j]:=random(100)+1;
 end;

 procedure vv1( var a:mas);
 var i,j:integer;
 begin
   for i:=1 to n do begin
      for j:=1 to m do
        write(a[i,j]:3);
        writeln;
      end;
   end;

 procedure vv2(var max:integer; a:mas);
 var i,j:integer;
 begin
   max:=a[1,1];
   k:=1;
   l:=1;
   for i:=1 to n do
      for j:=1 to m do begin
         if a[i, j] > Max
            then
              begin
                Max := a[i, j];
                k:=i;
                l:=j;
             end;
      end;
   end;

 procedure vv3(var min:integer; a:mas);
 var i,j:integer;
 begin
   min:=a[1,1];
   b:=1;
   d:=1;
   for i:=1 to n do
      begin
        for j:=1 to m do
           if a[i, j] < Min
              then
                begin
                  Min := a[i, j];
                  b:=i;
                  d:=j;
                end;
     end;
 end;

 procedure vv4( var a:mas);
 var i,j,c,min,max:integer;
 begin
   c:=a[k,l];
   a[k,l]:=a[b,d];
   a[b,d]:=c;
 end;

 procedure vv5(var a:mas);
 var i,j:integer;
 begin
   for i:=1 to n do
      begin
        for j:=1 to m do
         begin
            write (a[i,j]:3);
         end;
         writeln;
      end;
 end;

 begin

 writeln('введите массив');
 vv(a);
 vv1(a);
 vv2(max,a);
 vv3(min,a);
 vv4(a);
 writeln('измененный двумерный массив ');
 vv5(a);

 end.
 
М-да...
Боюсь, тут не одна ошибка.
Ну прежде всего. Конечно, отрадно, что Вы не боитесь использовать процедуры (обычно начинающие от них шарахаются), но надо это делать в меру и грамотно. Ну зачем для каждого чиха процедуру оформлять? Вообще-то, по большому счету, они тут вовсе не нужны: программа у Вас линейная, все операторы выполняются последовательно, многократные обращения к процедурам отсутствуют, так зачем они? Ну ладно, хотите через процедуры - дело Ваше. Но! Вот сравните процедуры vv1 и vv5 - они выполняют одно и то же (вывод массива на экран), только вот vv1 написана грамотно и правильно, а вот vv5 - не очень.
Ну а теперь - о главном. Вы, очевидно, не вполне уяснили разницу между глобальными, формальными, фактическими параметрами и параметрами, определяемыми в теле процедуры. Звучит, понимаю, страшновато, но уж если Вы работаете с процедурами, то будьте любезны во всём этом разобраться. А чтобы было понятнее, поясню на примере.
Вот вы вводите параметры k,l в теле процедуры vv2 и параметры b,d в теле процедуры vv3. Но они существуют только внутри названных процедур, и как только Вы из процедуры выходите, программа о них забывает напрочь! Поэтому когда в теле процедуры vv4 Вы вновь определяете те же 4 параметра, то никакого отношения (с точки зрения программы) к предыдущим они не имеют, а существуют только в процедуре vv4, где по умолчанию им присваиваются нулевые значения.
Надеюсь, понятно объяснил.
Сейчас нарисую боле ли менее приличное решение задачки.
Код:
const
 n=7;
 m=7;
type
 mas=array[1..n,1..m] of integer;

var
 a:mas;
 min,max,b,d,k,l,c:integer;

procedure vv;
 var i,j:integer;
 begin
  for i:=1 to n do
   for j:=1 to m do
    a[i,j]:=random(10);
 end;

procedure vv1;
 var i,j:integer;
 begin
  for i:=1 to n do
   begin
    for j:=1 to m do
     write(a[i,j]:3);
    writeln;
   end;
  writeln;
 end;

procedure vv2;
 var i,j:integer;
 begin
  max:=a[1,1];
  min:=a[1,1];
  k:=1;
  l:=1;
  b:=1;
  d:=1;
  for i:=1 to n do
   for j:=1 to m do
    begin
     if a[i,j]>Max then
      begin
       Max:=a[i,j];
       k:=i;
       l:=j;
      end;
     if a[i,j]<Min then
      begin
       Min:=a[i,j];
       b:=i;
       d:=j;
      end;
    end;
 end;

procedure vv4;
 begin
  c:=a[k,l];
  a[k,l]:=a[b,d];
  a[b,d]:=c;
 end;


begin
 writeln('Initial 2-dimensional array:');
 vv;
 vv1;
 vv2;
 vv4;
 writeln('Changed 2-dimensional array:');
 vv1;
 readln;
end.
 
Спасибо большое что все объяснили!!!на самом деле с локальными и глобальными переменными проблема.Спасибо!!
 
Назад
Сверху