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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2013, 16:42   #1
Karl__
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 40
Восклицание Программа сортировки Turbo Pascal

Помогите сделать программу работоспособной, откорректировать.
Задание было такое Дан массив C(N). Преобразовать массив, упорядочив первую его половину элементов по возрастанию, а вторую по убыванию.(Известно, что N-четное). Применялась сортировка выбором. Но при этом есть условия всё нужно оформить с использованием процедур, у меня была исходная программа сортировки выбором к моему заданию, но вот что-то намудрила с переменными и ошибка, вообщем запуталась. Ещё нужно вставить счётчик итераций, только куда его поместить? он мне нужен для определения временной сложности.

Код:
Uses Crt;
Const       N = 50;
Type        T_Mas = Array [1..N] of Integer;
Var     Mas : T_Mas;
        Kol : Integer;

                
Procedure Count (Var Kol:Integer);
{Процедура определения размерности массива}
Var     IOR : Word;
Begin
Write('Введите размерность массива: ');
    Repeat
        {$I-} ReadLn(Kol); {$I+}
        IOR := IOResult;
        If odd(IOR) or (Kol>N) Then
            WriteLn('Ошибка. Повторите ввод.')
    Until (Kol<=N) and (IOR=0)
End;


Procedure Filling (Kol:Integer; Var A: T_Mas);
{Процедура заполнения массива}
Var I : Integer;
Begin
    Randomize;
    For I := 1 To Kol Do A[I] := Random(N)
End;


Procedure Print (Kol:Integer; A: T_Mas);
{Процедура вывода массива}
Var I : Integer;
Begin
    For I:=1 to Kol do Write (A[I], ' ')
End;

Procedure Vibor (var X:T_Mas);
var k,i,j,x,buf:byte;
k:=X div 2;
{сортировка выбором по возрастанию первой половины}
for i:=1 to k-1 do
  begin
    x:=i;
    for j:=i+1 to k do
    if a[j]<a[x] then x:=j;
    buf:=a[i];
    a[i]:=a[x];
    a[x]:=buf;
  end;
{сортировка выбором по убыванию второй половины}
for i:=k+1 to n-1 do
  begin
    x:=i;
    for j:=i+1 to n do
    if a[j]>a[x] then x:=j;
    buf:=a[i];
    a[i]:=a[x];
    a[x]:=buf;
  end;

Begin
    ClrScr;
    Count(Kol);
    Filling(Kol, Mas);
    WriteLn('Исходный массив'); Print (Kol, Mas);
    Vibor (Mas);
    WriteLn;
    WriteLn('Отсортированный массив'); Print (Kol, Mas);
    Repeat until KeyPressed
End.
Karl__ вне форума Ответить с цитированием
Старый 08.12.2013, 18:47   #2
Karl__
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 40
По умолчанию

Кто-нибудь...пожалуйста помогите!!!
Karl__ вне форума Ответить с цитированием
Старый 08.12.2013, 19:36   #3
Karl__
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 40
По умолчанию

Теперь программа работает, но не выводит отсортированного массива, в чём проблема?
Код:
Uses Crt;
Const		N = 50;
Type 		T_Mas = Array [1..N] of Integer;
Var		Mas	: T_Mas;
		Kol	: Integer;

				
Procedure Count (Var Kol:Integer);
{Процедура определения размерности массива}
Var		IOR	: Word;
Begin
Write('Введите размерность массива: ');
	Repeat
		{$I-} ReadLn(Kol); {$I+}
		IOR := IOResult;
		If odd(IOR) or (Kol>N) Then
			WriteLn('Ошибка. Повторите ввод.')
	Until (Kol<=N) and (IOR=0)
End;


Procedure Filling (Kol:Integer; Var A: T_Mas);
{Процедура заполнения массива}
Var I : Integer;
Begin
	Randomize;
	For I := 1 To Kol Do A[I] := Random(N)
End;


Procedure Print (Kol:Integer; A: T_Mas);
{Процедура вывода массива}
Var I : Integer;
Begin
	For I:=1 to Kol do Write (A[I], ' ')
End;

Procedure Vibor (Kol:Integer; A: T_Mas);
var k,i,j,x,buf:byte;
begin
k:= Kol div 2;
{сортировка выбором по возрастанию первой половины}
for i:=1 to k-1 do
begin
x:=i;
for j:=i+1 to k do
if a[j]<a[x] then x:=j;
buf:=a[i];
a[i]:=a[x];
a[x]:=buf;
end;
{сортировка выбором по убыванию второй половины}
for i:=k+1 to Kol-1 do
begin
x:=i;
for j:=i+1 to Kol do
if a[j]>a[x] then x:=j;
buf:=a[i];
a[i]:=a[x];
a[x]:=buf;
end;
end;

Begin
	ClrScr;
	Count(Kol);
	Filling(Kol, Mas);
	WriteLn('Исходный массив'); Print (Kol, Mas);
	Vibor (Kol,Mas);
	WriteLn;
	WriteLn('Отсортированный массив'); Print_sort (Kol, Mas);
	Repeat until KeyPressed
End.
Karl__ вне форума Ответить с цитированием
Старый 08.12.2013, 19:42   #4
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Думаю, что в процедуру сортировки массив надо передавать по ссылке.
Код:
Procedure Vibor (Kol:Integer; var A: T_Mas);
Иначе никаких изменений в фактически передаваемом параметре Mas не произойдет.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 08.12.2013, 19:44   #5
Karl__
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 40
По умолчанию

а где исправлять, покажите пожалуйста
всё вижу, сейчас попробую.
Karl__ вне форума Ответить с цитированием
Старый 08.12.2013, 19:50   #6
Karl__
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 40
По умолчанию

Спасибо, заработало, ещё вопрос куда добавить счётчик итераций, чтобы выводило количество.
Karl__ вне форума Ответить с цитированием
Старый 08.12.2013, 20:06   #7
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Как-то так думаю должно быть
Код:
Procedure Vibor (Kol:Integer; A: T_Mas; var countIter : Integer);
var k,i,j,x,buf:byte;
begin
k:= Kol div 2;
{сортировка выбором по возрастанию первой половины}
for i:=1 to k-1 do
begin
x:=i;
inc(countIter);
for j:=i+1 to k do
Begin
  inc(countIter);
  if a[j]<a[x] then x:=j;
End;
buf:=a[i];
a[i]:=a[x];
a[x]:=buf;
end;
{сортировка выбором по убыванию второй половины}
for i:=k+1 to Kol-1 do
begin
x:=i;
inc(countIter);
for j:=i+1 to Kol do
Begin
  inc(countIter);
  if a[j]>a[x] then x:=j;
End;
buf:=a[i];
a[i]:=a[x];
a[x]:=buf;
end;
end;
Код:
.....
countIteration := 0;
Vibor (Kol,Mas, countIteration)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на turbo pascal 10Gramm Помощь студентам 2 16.12.2010 13:09
Программа на turbo pascal 10Gramm Помощь студентам 2 29.11.2010 14:29
Программа в Turbo Pascal ОгненныйВолк Помощь студентам 7 25.04.2010 12:13