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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2010, 21:03   #1
Pascaler
Пользователь
 
Регистрация: 08.04.2010
Сообщений: 45
По умолчанию Pascal. Массивы

Не могу понять, в чем ошибка. Это процедура нахождения в двумерном массиве строки, с минимальным значением приращения(разности между соседними значениями).

Код:
Вот начало...

program kursach;
type arr = array [1..10,1..10] of integer;
var a:arr; {исходный массив}
j,i,m,n:integer;
min: integer; {номер строки с минимальным приращением}
max: integer; {номер строки с максимальным приращением}

Вот в этой процедуре ошибка...

procedure vichmin(a:arr; var min:integer);
var i,j,m,n,t:integer;
x: array[1..10] of integer;
y:array[1..10] of integer;
begin
{вычисление значения приращения}
for i:=1 to n do begin
for j:=1 to m-1 do begin
x[j]:=a[i,j+1]-a[i,j];
end;
t:=x[1];
for j:=2 to m-1 do begin
if x[j]<t then
t:=x[j]
else
y[i]:=t
end;
end;

{нахождение и вывод минимального значения приращения}
t:=y[1];
min:=1;
for i:=2 to n do begin
if y[i]<t then
t:=y[i];
min:=i;
end;
writeln ('минимальное значение приращения в строке №:',min);
for i:=1 to n do begin
write (a[min,1:m],'')
end;
end;

Последний раз редактировалось Pascaler; 10.06.2010 в 22:56. Причина: ..
Pascaler вне форума Ответить с цитированием
Старый 10.06.2010, 22:53   #2
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

твой код не просматривал, но вот быстренько накидал кое-что, вроде бы верно работает, можешь воспользоваться, чтобы найти ошибку у себя, либо бери как есть:
Код:
type
  record1 =record         // для первого элемента
    firstI: integer;
    firstJ: integer;
  end;
  
  record2 = record        // для второго элемента
    secondI: integer;
    secondJ: integer;
  end;
const
 N = 4;
 rand = 50;

var
  arr :array [1..N,1..N] of integer;
  line_min: array [1..N] of integer;
  i,j:integer;
  value, itog, itog2 :integer;  // itog - общее значение минимальной разницы, itog2 - для отдельно взятой строки
  one:record1;
  two:record2;
begin
  randomize;
  writeln('Исходный массив:'#13#10);
  for i:=1 to N do
    for j:=1 to N do
    begin
      arr[i,j]:= random(rand);
      write('arr[',i,j,']=', arr[i,j], '  ');
      if j=N then writeln;
    end;
  itog:=abs(arr[1,2] - arr[1,1]);   // здесь сразу задаем начальное значение итога
    
  for i:=1 to N do
  begin
    itog2 := abs(arr[i,2] - arr[i,1]);
    for j:=1 to N-1 do
    begin
      value:=abs(arr[i,j+1] - arr[i,j]);
      if value < itog then
      begin
        itog:=value;
        with one do
        begin
          FirstI:=i;
          firstJ:=j;
        end;
         with two do
        begin
          SecondI:=i;
          SecondJ:=j+1;
        end;
      end;
      if value < itog2 then
         itog2:=value;
      if j = N-1 then 
      line_min[i]:=itog2;
    end;
  end;  
  writeln(#13#10'Минимальные значения разниц по строкам:');
  for i:=1 to n do
  writeln(i,') ', line_min[i]);
  writeln(#13#10, 'Наименьшая разница = ', itog,', была найдена между элементами: arr[',two.secondI,',',two.SecondJ,'] и arr[',one.FirstI,',',one.FirstJ,']');
end.

Последний раз редактировалось tools; 11.06.2010 в 01:07.
tools вне форума Ответить с цитированием
Старый 10.06.2010, 22:59   #3
Pascaler
Пользователь
 
Регистрация: 08.04.2010
Сообщений: 45
По умолчанию

Дело в том, что я писал программу на фортране сперва, вот переделал в паскаль, не работает... Мне надо найти по своему спсособу, чтобы выводило в конце строку, где минимальное приращение... Пожалуйста просмотрите мой код.

Последний раз редактировалось Pascaler; 10.06.2010 в 23:03.
Pascaler вне форума Ответить с цитированием
Старый 10.06.2010, 23:24   #4
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

В процедуре я что-то не понял, массив x - для разниц, а массив y -для чего? Там же одной переменной достаточно, зачем массив целый. И еще вы передаете в качестве параметра переменную min и не используете ее... Там по идеи вообще эти два массива локальных не нужны, вы и так передаете свой массив через параметры по значению.

Последний раз редактировалось tools; 11.06.2010 в 00:43.
tools вне форума Ответить с цитированием
Старый 10.06.2010, 23:38   #5
Pascaler
Пользователь
 
Регистрация: 08.04.2010
Сообщений: 45
По умолчанию

вот программа на фортране. Массивы x, y нужны. Нужно написать на паскале и чтобы работало....
Код:
program Console1

! блок объявления переменных
    implicit none
    integer (4), dimension (1:10,1:10) :: a ! 2d массив, в который записываются данные с файла
    integer (4)  :: min ! номер строки с минимальным приращением элементов
    integer (4)  :: max ! номер строки с максимальным приращением элементов
    integer (4)  :: i,j ! счетчики в циклах
    integer (4)  :: m,n ! кол-во строк (m) и столбцов (n)

! получение значений кол-ва строк и столбцов
    print *, "Input number of rows:"
    read (*, '(I)') m
    print *,  "Input number of columns:"
    read (*, '(I)') n
! вызов подпрограмм
    call readFromFile(a, m, n)
    call searchMin(a, min, m, n)
    call searchMax(a, max, m, n)

end program Console1


! подпрограмма считывания данных с файла
subroutine readFromFile(a, m, n)

    implicit none
    integer (4), dimension (1:10,1:10) :: a
    integer (4) :: i, j, m, n
    character (50)  fileName

    fileName = "massiv.txt" ! необходимо задать правильное имя и путь в файлу
    open(51,file=fileName,status='old',access='sequential',form='formatted',action='read')
!   считывание данных с файла
    do i=1, m
        read(51,'(10I3)'), (a(i,j), j=1,n)
    end do

    close(51)
        
end subroutine readFromFile

! подпрограмма поиска минимального приращения в строках
subroutine searchMin(a, min, m, n)

! блок объявления переменных
    implicit none
    integer (4), dimension (1:10, 1:10)  ::  a
    integer (4), dimension (1:10)        ::  x,y
    integer (4) :: min
    integer (4) :: i,j,m,n,t
    
    do i=1, m
        ! находим разность между j и j+1 элементом i-той строки
        do j=1, (n-1)
            x(j) = abs(a(i,j+1) - a(i,j)) ! abs - фун-ция взятие модуля
        end do
        !здесь идет поиск наименьшего приращения
        t = x(1)
        do j=2, (n-1)
            if (x(j)<t) then
                t = x(j)
            end if
        end do
        y(i) = t
    end do
    ! здесь находиться минимальное значение приращения в разных строках    
    t = y(1)
    min = 1
    do i=2, m
        if (y(i)<t) then
            t = y(i)
            min = i
        end if
    end do
    ! вывод данных на экран
    write (*, '("minimum value of the increment in the line", I3)'), min
    write (*, '("line is:", 10I3, /)'), a(min,1:n)
end subroutine searchMin
Pascaler вне форума Ответить с цитированием
Старый 11.06.2010, 00:02   #6
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Только сейчас обратил внимание для чего нужен массив Y у вас. Сейчас подправим код (не компилировал, поэтому проверьте сами)...
Код:
procedure vichmin(a:arr; var min:integer);
var
   i,j, line_min:integer;                                              // line_min - минимальное значение в отдельно взятой строке
   x: array[1..(N-1)*N] of integer;                               // N - размер массива a,
   y:array[1..N] of integer;                                        // который вы передаете
begin
{вычисление значения приращения}
k:=1;
for i:=1 to n do
  line_min := abs(a[i,2] - a[i,1]);
  for j:=1 to N -1 do 
    begin
      x[k]:=abs(a[i,j+1]-a[i,j]);                // все "разницы" записываем в x
      if x[k] < line_min then
         line_min:=x[k];
      if  j = N-1 then                             // дошли до конца строки в сравнении и записали в массив конечное значение line_min
         y[i]:=line_min;
      inc(k);
    end;

min:=x[1];
for k:=2 to high(k) do begin
  if x[k] < min then
    min:=x[k];                                     // минимальный записали
end;

Последний раз редактировалось tools; 11.06.2010 в 13:03.
tools вне форума Ответить с цитированием
Старый 11.06.2010, 11:40   #7
Pascaler
Пользователь
 
Регистрация: 08.04.2010
Сообщений: 45
По умолчанию

Код:
 write (*, '("minimum value of the increment in the line", I3)'), min
    write (*, '("line is:", 10I3, /)'), a(min,1:n)
Как мне правильно переделать этот код из фортрана, в паскаль?
Pascaler вне форума Ответить с цитированием
Старый 11.06.2010, 17:03   #8
Pascaler
Пользователь
 
Регистрация: 08.04.2010
Сообщений: 45
По умолчанию

Все понятно теперь,я нашел ощибку, мне надо было через цикл сделать этот вывод.
Pascaler вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы в Pascal Izymka Помощь студентам 12 08.06.2010 03:13
Pascal, Массивы Nastik Помощь студентам 6 07.06.2010 20:44
Pascal (массивы) 4otenado Помощь студентам 3 21.02.2010 15:57