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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2011, 23:20   #1
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию ошибка в процедурах. поправить код

Как сделать что бы введенный массив использовался в остальных процедурах?
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const n=15;
type  mas=array[1..n]of integer;
var a:mas;
    m:integer;


procedure VvodMas(var a:mas;m:integer);
  var i:byte;
 begin
     writeln('vvedite massiv');
      for i:=1 to m do
          read(a[i])
 end;
procedure VyvodMas(a:mas;m:integer);
   var i:byte;
  begin
     writeln('massiv kotoryi byl vveden');
      for i:=1 to m do
          write(a[i],' ');
    writeln
  end;
procedure MaxEl(a:mas;var m:integer);
 var i,k,max:byte;
    begin
      for i:=1 to m do
        begin
          max:=a[i];
           if max>a[i+1] then
              max:=a[i+1];
              k:=i;
        end;
          writeln('max=',max,' s indeksom',k);
    end;
procedure SortMas(a:mas;var m:integer);
 var i,flag,buf:integer;
   begin
       repeat
        flag:=0;
         for i:=1 to n-1 do
           if a[i]>a[i+1] then
             begin
               buf:=a[i];
               a[i]:=a[i+1];
               a[i+1]:=buf;
               flag:=1
             end
       until (flag=0);
     writeln('otsortirovanyi massiv');
        for i:=1 to m do
          writeln (a[i],' ');
    end;
procedure IsEl(a:mas;var m:integer);
 var el,vm,nm,i,flag,k:integer;
 label stop;
   begin
     writeln('vvedite iskomyi element');
     readln(el);
     nm:=1; vm:=m; flag:=0;
      repeat
        begin
           k:=(nm+vm)div 2;
             if el=a[k] then
               begin
                flag:=1;
                write('element naide, index=',i);
                goto stop
               end
             else
               if el<a[k] then
                  vm:=k-1
               else
                  nm:=k+1
        end;
      until(nm>vm);
          writeln('element ne naiden!');
          stop:readln; readln
   end;
begin
writeln('vvedite kolichestvo elenemtov m<=',n);
readln(m);
  VvodMas(a,m);
  VyvodMas(a,m);
  MaxEl(a,m);
  SortMas(a,m);
  IsEl(a,m);

  { TODO -oUser -cConsole Main : Insert code here }
end.
Антон Лысенко вне форума Ответить с цитированием
Старый 23.02.2011, 23:32   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Теоретически, процедуры/функции не должны сами делать вывод массива. Поиск максимального элемента и поиск элемента в массиве, лучше сделать функциями. Соответственно процедура сортировки, должна принимать массив по ссылке(ключевое слово var перед параметром). А так как сейчас не работает?
netrino вне форума Ответить с цитированием
Старый 23.02.2011, 23:34   #3
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

сейчас max=0, сортированный массив 0 0. а искать элемент пока что не пытался.
Антон Лысенко вне форума Ответить с цитированием
Старый 23.02.2011, 23:37   #4
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

так значит лучше напечатать массив в основной программе?
Антон Лысенко вне форума Ответить с цитированием
Старый 23.02.2011, 23:42   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

При поиске максимального значения, переменная max постоянно принимает значение текущего элемента на каждой итерации цикла, что бессмысленно. Я бы так написал
Код:
function MaxEl(A: Mas; M: Integer): Integer;
var
  I, Res: Integer;
begin
  Res := A[1];
  for I := 2 to M do
    if A[I] > Res then
      Res := A[I];
  MaxEl := Res;
end;
Код:
procedure SortMas(var A: Mas; M: Integer);
var
  I, J, Tmp: Integer;
begin
  for I := 1 to M-1 do
    for J := I + 1 to M do
      if A[I] > A[J] then
        begin
          Tmp := A[I];
          A[I] := A[J];
          A[J] := Tmp;
        end;
end;
Цитата:
Сообщение от Антон Лысенко
так значит лучше напечатать массив в основной программе?
Да. С помощью VyvodMas, естественно
netrino вне форума Ответить с цитированием
Старый 23.02.2011, 23:43   #6
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

вот результат
Изображения
Тип файла: jpg Безымянный.jpg (19.2 Кб, 122 просмотров)
Антон Лысенко вне форума Ответить с цитированием
Старый 23.02.2011, 23:56   #7
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

если делать через ф-ию то ошибка:[Error] Project1.dpr(53): Statement expected but 'FUNCTION' found
Код:
function IsEl(var a:mas;var m:integer):integer;
 var el,vm,nm,i,flag,k:integer;
 label stop;
   begin
     writeln('vvedite iskomyi element');
     readln(el);
     nm:=1; vm:=m; flag:=0;
      repeat
        begin
           k:=(nm+vm)div 2;
             if el=a[k] then
               begin
                flag:=1;
                write('element naide, index=',i);
                goto stop
               end
             else
               if el<a[k] then
                  vm:=k-1
               else
                  nm:=k+1
        end;
      until(nm>vm);
          writeln('element ne naiden!');
          stop:readln; readln
   end;
Антон Лысенко вне форума Ответить с цитированием
Старый 24.02.2011, 00:07   #8
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

натворил вот такое:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const n=15;
type  mas=array[1..n]of integer;
var a:mas;
    m:integer;
    el,vm,nm,i,flag,k:integer;
 label stop;

procedure VvodMas(var a:mas;m:integer);
  var i:byte;
 begin
     writeln('vvedite massiv');
      for i:=1 to m do
          read(a[i])
 end;
procedure VyvodMas(a:mas;m:integer);
   var i:byte;
  begin
     writeln('massiv kotoryi byl vveden');
      for i:=1 to m do
          write(a[i],' ');
    writeln
  end;
function MaxEl(a: Mas; m: integer): integer;
    var i, Res: Integer;
    begin
      Res := a[1];
      for i := 2 to M do
        if a[i] > Res then
         Res := a[i];
          MaxEl := Res;
      end;
procedure SortMas(var a: mas; m: integer);
var
  i, j, Tmp: Integer;
begin
  begin
  for i := 1 to m-1 do
    for j := i + 1 to m do
      if a[i] > a[j] then
        begin
          Tmp := a[i];
          a[i] := a[j];
          a[j] := Tmp;
        end;

end;



   end;
begin
writeln('vvedite kolichestvo elenemtov m<=',n);
readln(m);
  VvodMas(a,m);
  VyvodMas(a,m);
  writeln('maksimalnyi element=',maxel(a,m));
  SortMas(a,m);
  writeln('otsortirovan massiv');
  for i:=1 to m do
  write(a[i],' ');
   begin
     writeln('vvedite iskomyi element');
     readln(el);
     nm:=1; vm:=m; flag:=0;
      repeat
        begin
           k:=(nm+vm)div 2;
             if el=a[k] then
               begin
                flag:=1;
                write('element naide, index=',i);
                goto stop
               end
             else
               if el<a[k] then
                  vm:=k-1
               else
                  nm:=k+1
        end;
      until(nm>vm);
          writeln('element ne naiden!');
          stop:readln; readln

    end;
  { TODO -oUser -cConsole Main : Insert code here }
end.
но элемент не находит. пишет индекс на 1 больше чем элементов массива
Антон Лысенко вне форума Ответить с цитированием
Старый 24.02.2011, 00:15   #9
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

всё работает просто в печать вывел і а не к
Антон Лысенко вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поправить код! Cruelbob Общие вопросы C/C++ 6 12.05.2010 23:33
Нужно поправить код kimoncar PHP 0 13.04.2010 12:52
Поправить Код... Lucchese Общие вопросы C/C++ 1 25.01.2010 20:00
одинаковый код в процедурах jungle Помощь студентам 7 26.11.2008 22:45
Помогите поправить код SANTA_KLAUD Общие вопросы Delphi 5 30.05.2008 09:01