Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на поиск ключа в файле и дальнейшую мини-сортировку
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-Олег-
В общем вот решил я такую задачку, которая: просит нас ввести ключ, потом ищет этот ключ в массиве(которой задавался рандомом), далее просит выбрать сортировку этого массива. 1 Сортировка заключается в том, чтобы то введенное число(то бишь ключ) поменять с первым местами,а вторая поменять ключ с предыдущим, и у меня не пашут обе,народ гляньте в процедуру чего там не так, а то я запарился...
program laba1;
const
 N=20;
var
 M:array[1..N+1] of integer;
 y1,y2,y3,x,x1,x2,z,i,kluch,rez:integer;
 ch:char;

function search(kluch:integer):integer;
begin
M[N+1]:=kluch;
i:=1;
while M[i]<>kluch do i:=i+1;
if i=N+1 then search:=0
else search:=i
end;

procedure Vivod;
begin
for i:=1 to N do write(M[i],' ');
writeln(' ');
end;

procedure Algoritm(al:byte);
var
temp,item:integer;
begin
case al of
  1:
      begin
       Temp:=M[item];
       for i:=Item downto 2 do M[I]:=M[I-1];
       M[1]:=Temp;
      end;
     2:
      begin      
       if Item<>1 then
          begin
           Temp:=M[Item];
           M[Item]:=M[item-1];
           M[Item-1]:=Temp;
          end;
      end;
end;
end;

begin
Randomize;
for i:=1 to N do M[i]:=random(100);
writeln('Massiv:');
Vivod;
rez:=0;
while rez=0 do
    begin
     writeln('Vvedite kluch poiska');
     readln(kluch);
z:=search(kluch);
while z=0 do begin
     writeln('Kluch v massive ne nayden, poprubuyte vvesti ewe raz');
     writeln('Vvedite kluch poiska');
     readln(kluch);
     z:=search(kluch);
end;
      begin
       ch:=' ';
       writeln('Esli vi xotite vipolnit sortirovku metodom puzirka, to nazmite 1,'+
                  ' a esli metodom priamogo dostupa-2');
       while (ch<>'1') and (ch<>'2') do Readln(ch);
       case ch of
         '1':algoritm(1);
         '2':algoritm(2);
      end;
      end;
Writeln('Rezultat:');
Vivod;
ch:=' ';
Writeln('Xotite ewe? (y/n)');
while (ch<>'y') and (ch<>'n') do readln(ch);
case ch of
'n':exit;
'y':rez:=0;
end;
end;
end.
volvo
Цитата
гляньте в процедуру чего там не так
Чего не так? Вот это, например:
procedure Algoritm(al:byte);
var
  temp, item:integer; { <--- item  - ЛОКАЛЬНАЯ переменная, так? }
begin
  case al of
    1:
    begin
      Temp:=M[item]; { <--- Стоп !!! Чему у тебя здесь равен item ? }
      for i:=Item downto 2 do M[I]:=M[I-1];
      M[1]:=Temp;
    end;
    2:
    begin      
      if Item<>1 then begin { <--- А здесь чему??? }
        Temp:=M[Item];
        M[Item]:=M[item-1];
        M[Item-1]:=Temp;
      end;
    end;
  end;
end;
Гость
В инете так!!! Где я при переделывании ошибся???
program Lab1;
uses
 crt;
const
 N=10;
 Range=100;
var
 M:array [1..N] of integer;
 i,key,Result:integer;
 ch:char;

function Search(key:integer):integer;
begin
Search:=0;
for i:=1 to N do if M[i]=key then Search:=i;
end;

procedure WriteM;
begin
for i:=1 to N-1 do Write(M[i],',');
Write(M[n]);
WriteLn('');
end;

procedure Algorithm(Alg:byte;Item:integer);
var
Temp:integer;
begin
Case Alg of
     1:
      begin
       Temp:=M[item];
       for i:=Item downto 2 do M[I]:=M[I-1];
       M[1]:=Temp;
      end;
     2:
      begin
       if Item<>1 then
          begin
           Temp:=M[Item];
           M[Item]:=M[item-1];
           M[Item-1]:=Temp;
          end;
      end;
     end;
end;

begin
clrscr;
Randomize;
for i:=1 to N do M[i]:=random(range);
WriteLn('Array:');
WriteM;
Result:=0;
while Result=0 do
      begin
       writeln('Enter a key of search');
       {$I-}
       readln(key);
       {$I+}
       if IOResult<>0 then
          begin
           WriteLn('Wrong key!!!');
           exit;
          end;
       Result:=Search(key);
       if Result<>0 then
          begin
           ch:=' ';
           WriteLn('Specify algorithm (1/2)');
           While (ch<>'1') and (ch<>'2') do Readln(ch);
           case ch of
                '1':Algorithm(1,result);
                '2':algorithm(2,result);
                end;
           WriteLn('Result:');
           WriteM;
           ch:=' ';
           WriteLn('Again? (y/n)');
           While (ch<>'y') and (ch<>'n') do Readln(ch);
           case ch of
                'n':exit;
                'y':result:=0;
                end;
          end
       else WriteLn('Element is not Found');
      end;
end.
volvo
А сам не видишь? Во второй программе значение item передается в процедуру Algorithm, а ты при переделывании добился того, что у тебя item описан локально, и в нем хранится мусор.
Гость
Чето не пойму, где айтем передается в процедуру algorithm и если не трудно напиши куда мне это в мою прогу вставить.
volvo
Цитата(Гость @ 1.04.2006 13:19) *
Чето не пойму, где айтем передается в процедуру algorithm

Что по-твоему такое ВТОРОЙ параметр для процедуры algorithm?
case ch of
  '1':Algorithm(1,result); { <--- Здесь }
  '2':algorithm(2,result); { <--- и здесь? }
end;

А вот что:
procedure Algorithm(Alg:byte;Item:integer);
{ первый параметр - способ сортировки, второй - значение Item }
...


А по-поводу куда это вставить... Ну, так это же твоя программа. Ты спросил, где ошибка, я тебе сказал. Решать, как исправлять - тебе...
Гость
А я когда пытался присобачить этот result после 1 в скобке то выдавал ошибку, что надо закрыть скобку после 1, ща пробну еще раз, спасибки.
Гость
Все пашет спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.