Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 10.10.2011, 17:37   #1 (permalink)
Ильгиза
Member
 
Регистрация: 08.10.2011
Сообщений: 49
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Программа на Паскаль

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

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

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, найти номера столбцов ,элементы в каждой из которых образуют монотонную последовательность. (возрастающую или убывающую).
Ильгиза вне форума   Ответить с цитированием

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

На форуме ранее создавались топики которые так или иначе похожи на ваш

Турбо Паскаль или Фри Паскаль. Задание по теме Типизированный файл
Паскаль АВС
Паскаль
Паскаль
Паскаль

Старый 10.10.2011, 20:57   #2 (permalink)
DDS
Member
 
Регистрация: 15.02.2009
Сообщений: 695
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 523
По умолчанию

Первую программу вроде подправил, работает.
Код:
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.
DDS вне форума   Ответить с цитированием
Старый 10.10.2011, 22:06   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

М-да...
Боюсь, тут не одна ошибка.
Ну прежде всего. Конечно, отрадно, что Вы не боитесь использовать процедуры (обычно начинающие от них шарахаются), но надо это делать в меру и грамотно. Ну зачем для каждого чиха процедуру оформлять? Вообще-то, по большому счету, они тут вовсе не нужны: программа у Вас линейная, все операторы выполняются последовательно, многократные обращения к процедурам отсутствуют, так зачем они? Ну ладно, хотите через процедуры - дело Ваше. Но! Вот сравните процедуры 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.
Vladimir_S вне форума   Ответить с цитированием
Старый 11.10.2011, 08:45   #4 (permalink)
Ильгиза
Member
 
Регистрация: 08.10.2011
Сообщений: 49
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое что все объяснили!!!на самом деле с локальными и глобальными переменными проблема.Спасибо!!
Ильгиза вне форума   Ответить с цитированием
Ads

Яндекс

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


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

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




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

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