Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на поиск ключа в файле и дальнейшую мини-сортировку
Форум «Всё о Паскале» > 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, ща пробну еще раз, спасибки.
Гость
Все пашет спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.