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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2014, 17:19   #1
shalgan
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 68
По умолчанию поиск бинарным способом

доброго времени суток, помогите пожалуйста разобраться с программой,найти свои ошибки,программа работает,но работает не правильно
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
mas:array[1..100] of integer;
n:integer;
i:integer;
s:integer;//середина
l:integer;//верхняя
r:integer;//нижняя
k:integer;// эл поиска
found:boolean;
p:integer;
begin
n:=memo1.lines.count;
for i:=1 to n do
mas[i]:=strtoint(memo1.Lines[i-1]);
k:=strtoint(edit1.Text);
l:=1;r:=n;
found:=false;
while (l<=r) and (not found) do begin
s:=(l+r) div 2;
if k=mas[s] then found:=true
else
if k<mas[s] then l:=s+1 else r:=s-1;
end;
if found then label1.caption:='mesto vstavki elementa p'+inttostr(s) else
label1.caption:='mesto vstavki elementa p'+inttostr(r);end;
end.
Безымянный.jpg

на некоторые числа,программа работает правильно
вот задание "Пусть первые (n-1) элемент массива х упорядочены по неубыванию,
а n-я позиция в этом массиве свободна. Требуется вставить новый элемент р в этот массив с сохранением упорядоченности по неубыванию. Для поиска места вставки для элемента р использовать бинарный поиск.
"
shalgan вне форума Ответить с цитированием
Старый 26.03.2014, 08:43   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Код:
var
    n, i, p, l, r, s : Integer;
    a : array [1..100] of Integer;

begin
    ReadLn(n);
    for i := 1 to n do
        Read(a[i]);

    ReadLn(p);

    l := 1; r := n;
    while l < r do begin
        s := (l+r) div 2;
        if a[s] < p then
            l := s+1
        else
            r := s
    end;

    Move(a[l], a[l+1], (n-l+1)*SizeOf(Integer));
    a[l] := p;

    for i := 1 to n+1 do
        Write(a[i], ' ')
end.
Poma][a вне форума Ответить с цитированием
Старый 26.03.2014, 13:39   #3
shalgan
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Код:
var
    n, i, p, l, r, s : Integer;
    a : array [1..100] of Integer;

begin
    ReadLn(n);
    for i := 1 to n do
        Read(a[i]);

    ReadLn(p);

    l := 1; r := n;
    while l < r do begin
        s := (l+r) div 2;
        if a[s] < p then
            l := s+1
        else
            r := s
    end;

    Move(a[l], a[l+1], (n-l+1)*SizeOf(Integer));
    a[l] := p;

    for i := 1 to n+1 do
        Write(a[i], ' ')
end.
спасибо,логику понял. Не могли бы рассказать о move и sizeof ,пока что их не брали
shalgan вне форума Ответить с цитированием
Старый 26.03.2014, 13:44   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Хорошо..
Move(a, b, c) берет C байт начиная с a, и переставляет их в b.
SizeOf я использовал для того, чтобы сделать код, который будет корректно работать на каком угодно компиляторе, т.к. Integer в Turbo занимает 2 байт, в Фри(если включен режим совместимости с Делфи, в Делфи, и в ужасно ABC 4 байта.
А так.. Вместо Move Вы можете использовать простой цикл, сдвигающий элементы..

(Чуть более подробно и правильно про Move и SizeOf : тыц и тыц
Poma][a вне форума Ответить с цитированием
Старый 26.03.2014, 13:45   #5
shalgan
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Код:
var
    n, i, p, l, r, s : Integer;
    a : array [1..100] of Integer;

begin
    ReadLn(n);
    for i := 1 to n do
        Read(a[i]);

    ReadLn(p);

    l := 1; r := n;
    while l < r do begin
        s := (l+r) div 2;
        if a[s] < p then
            l := s+1
        else
            r := s
    end;

    Move(a[l], a[l+1], (n-l+1)*SizeOf(Integer));
    a[l] := p;

    for i := 1 to n+1 do
        Write(a[i], ' ')
end.

программа работает также криво =( Безымянный.jpg
shalgan вне форума Ответить с цитированием
Старый 26.03.2014, 13:47   #6
shalgan
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Хорошо..
Move(a, b, c) берет C байт начиная с a, и переставляет их в b.
SizeOf я использовал для того, чтобы сделать код, который будет корректно работать на каком угодно компиляторе, т.к. Integer в Turbo занимает 2 байт, в Фри(если включен режим совместимости с Делфи, в Делфи, и в ужасно ABC 4 байта.
А так.. Вместо Move Вы можете использовать простой цикл, сдвигающий элементы..

(Чуть более подробно и правильно про Move и SizeOf : тыц и тыц

спасибо огромное)
shalgan вне форума Ответить с цитированием
Старый 26.03.2014, 13:49   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

У меня всё работает тыц
Poma][a вне форума Ответить с цитированием
Старый 26.03.2014, 15:35   #8
shalgan
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
У меня всё работает тыц
большое спасибо,подправил немного и у меня тоже все заработало
Безымянный.jpg
shalgan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с бинарным деревом Stanislav94 Помощь студентам 0 27.02.2013 20:18
Ошибка с бинарным файлом shrek1993 Общие вопросы C/C++ 5 15.04.2012 14:31
С++ работа с бинарным файлом Voldemort93 Помощь студентам 0 09.11.2011 19:03
Работа с бинарным файлом Celestia Общие вопросы Delphi 7 17.01.2011 14:43
Работа с бинарным файлом. griba Помощь студентам 4 11.12.2010 13:08