Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 9

При помощи двоичного поиска найти запись о конкретном сотруднике и удалить её

10.01.2015, 22:24. Показов 583. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть массив с данными о сотрудниках упорядоченный по фамилии. Необходимо при помощи двоичного поиска найти запись о конкретном сотруднике и удалить её. Пугает то, что ещё должна быть возможность уточнить имя сотрудника, если есть однофамильцы.
Выкладываю то, до чего смог дойти сам.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Program sotrudniki;
uses crt;
const max=20;
 
type sotrudnik=record
     fam:string[10];                      //Фамилия
     name:string[10];                     //Имя
     otch:string[10];                     //Отчество
     dolgnost:string[10];                 //Должность
     nomer:integer;                       //Номер личного дела
     end;
 
FL=file of sotrudnik;
 
VAR data:FL;
    spisok: array [1..max] of sotrudnik;
    n,p,r,f,i,j,s:integer;
 
procedure include;                 //Процедура добавления новой записи в список
var k:sotrudnik;
    i,j:integer;
begin
     If n=max then WriteLn('Список полон')
     else begin
          n:=n+1;
          WriteLn('Введите данные о новом сотруднике');
          WriteLn('Введите фамилию');
          ReadLn(spisok[n].fam);
          WriteLn('Введите имя');
          ReadLn(spisok[n].name);
          WriteLn('Введите отчество');
          ReadLn(spisok[n].otch);
          WriteLn('Введите должность сотрудника');
          ReadLn(spisok[n].dolgnost);
          WriteLn('Введите номер личного дела');
          ReadLn(spisok[n].nomer);
          If n>1 then begin
             if spisok[n].fam<spisok[n-1].fam then begin
                for i:=1 to n-1 do
                for j:=1 to n-1 do
                if spisok[j].fam>spisok[j+1].fam then begin
                   k:=spisok[j];
                   spisok[j]:=spisok[j+1];
                   spisok[j+1]:=k;
                   end;
                end;
             end;
          end;
     end;
     
procedure del;                            //Процедура удаления записи по фамилии
var c,b,e,j:integer;
    key, key2:string;
begin
     WriteLn('Введите фамилию сотрудника, запись о котором необходимо удалить');
     ReadLn(key);
     WriteLn('Уточните имя сотрудника, запись о котором необходимо удалить');
     ReadLn(key2);
     b:=1;
     e:=n;
     While (b<=e) do begin
           c:=(b+e)div(2);
           If (spisok[c].fam<key) then b:=c+1
           else e:=c-1;
           if (spisok[c].fam=key) and (spisok[c].name=key2) then
           for j:=c to n-1 do
           spisok[c]:=spisok[c+1]
           else WriteLn('Сотрудник в списке отсутствует');
           end;
end;
     
procedure print;                          //Процедура печати на экран
var i:integer;
begin
     If n=0 then WriteLn('Список пуст')
     else for i:=1 to n do
     WriteLn(spisok[i].fam,' ',spisok[i].name,' ',spisok[i].otch,' ',spisok[i].dolgnost,' ',spisok[i].nomer);
end;
 
BEGIN
     assign(data,'LIST.txt');
     n:=0;
     WriteLn('Уважаемый пользователь, выберите нужный режим работы');
     WriteLn('1 - работа со старым файлом');
     WriteLn('0 - создание нового файла');
     ReadLn(r);
     If r=1 then begin
        reset(data);
        while not(Eof(data)) do begin
              n:=n+1;
              read(data,spisok[n]);
              end;
        end;
     p:=0;
     repeat begin
            WriteLn('Для работы со списком сотрудников выберите нужную операцию');
            WriteLn('1 - добавление в список новых сотрудников');
            WriteLn('2 - удаление записи о сотруднике');
            WriteLn('3 - печать текущего списка');
            WriteLn('4 - изменение записи о сотруднике');
            WriteLn('5 - завершение работы с файлом');
            ReadLn(p);
            case p of
                 1:include;
                 2:del;
                 3:print;
                 end;
            end;
     until (p>4);
     WriteLn('Работа со списком завершена');
     rewrite(data);
     for i:=1 to n do write(data,spisok[i]);
     close(data);
     ReadLn;
END.
Добавлено через 2 часа 30 минут
Пришёл к такому варианту двоичного поиска:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Program sotrudniki;
uses crt;
const max=20;
 
type sotrudnik=record
     fam:string[10];                      //Фамилия
     name:string[10];                     //Имя
     otch:string[10];                     //Отчество
     dolgnost:string[10];                 //Должность
     nomer:integer;                       //Номер личного дела
     end;
 
FL=file of sotrudnik;
 
VAR data:FL;
    spisok: array [1..max] of sotrudnik;
    n,p,r,f,i,j,s:integer;
 
procedure include;                 //Процедура добавления новой записи в список
var k:sotrudnik;
    i,j:integer;
begin
     If n=max then WriteLn('Список полон')
     else begin
          n:=n+1;
          WriteLn('Введите данные о новом сотруднике');
          WriteLn('Введите фамилию');
          ReadLn(spisok[n].fam);
          WriteLn('Введите имя');
          ReadLn(spisok[n].name);
          WriteLn('Введите отчество');
          ReadLn(spisok[n].otch);
          WriteLn('Введите должность сотрудника');
          ReadLn(spisok[n].dolgnost);
          WriteLn('Введите номер личного дела');
          ReadLn(spisok[n].nomer);
          If n>1 then begin
             if spisok[n].fam<spisok[n-1].fam then begin
                for i:=1 to n-1 do
                for j:=1 to n-1 do
                if spisok[j].fam>spisok[j+1].fam then begin
                   k:=spisok[j];
                   spisok[j]:=spisok[j+1];
                   spisok[j+1]:=k;
                   end;
                end;
             end;
          end;
     end;
     
procedure del;                            //Процедура удаления записи по фамилии
var left,right,mid,j:integer;
    key, key2:string;
begin
     WriteLn('Введите фамилию сотрудника, запись о котором необходимо удалить');
     ReadLn(key);
     WriteLn('Уточните имя сотрудника, запись о котором необходимо удалить');
     ReadLn(key2);
     left:=1;
     right:=n;
     While (left<=right) do begin
           mid:=left+(right-left)div(2);
           If (key<spisok[mid].fam) then right:=mid-1
           else left:=mid+1;
           if (spisok[mid].fam=key) and (spisok[mid].name=key2) then for j:=mid to n-1 do
                                                                     spisok[j]:=spisok[j+1];
           end;
end;
     
procedure print;                          //Процедура печати на экран
var i:integer;
begin
     If n=0 then WriteLn('Список пуст')
     else for i:=1 to n do
     WriteLn(spisok[i].fam,' ',spisok[i].name,' ',spisok[i].otch,' ',spisok[i].dolgnost,' ',spisok[i].nomer);
end;
 
BEGIN
     assign(data,'LIST.txt');
     n:=0;
     WriteLn('Уважаемый пользователь, выберите нужный режим работы');
     WriteLn('1 - работа со старым файлом');
     WriteLn('0 - создание нового файла');
     ReadLn(r);
     If r=1 then begin
        reset(data);
        while not(Eof(data)) do begin
              n:=n+1;
              read(data,spisok[n]);
              end;
        end;
     p:=0;
     repeat begin
            WriteLn('Для работы со списком сотрудников выберите нужную операцию');
            WriteLn('1 - добавление в список новых сотрудников');
            WriteLn('2 - удаление записи о сотруднике');
            WriteLn('3 - печать текущего списка');
            WriteLn('4 - изменение записи о сотруднике');
            WriteLn('5 - завершение работы с файлом');
            ReadLn(p);
            case p of
                 1:include;
                 2:del;
                 3:print;
                 end;
            end;
     until (p>4);
     WriteLn('Работа со списком завершена');
     rewrite(data);
     for i:=1 to n do write(data,spisok[i]);
     close(data);
     ReadLn;
END.
Теперь возникла проблема с удалением записи из массива.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2015, 22:24
Ответы с готовыми решениями:

Найти элемент массива, равный 5, при помощи дихотомического поиска
Дан отсортированный целочисленный массив. Найти элемент равный 5, при помощи дихотомического поиска. Вывести на экран. Ребят выручите...

Написать программу расшифровки сообщения, зашифрованного при помощи двоичного кода
Пусть по некоторому каналу связи передается сообщение которое имеет вид последовательности нулей и едениц. Через помехи возможен ошибочный...

Дерево двоичного поиска. Найти высоту узла
public class BinaryTree { public class Node { public object inf; //информационное поле ...

1
Фрилансер
 Аватар для CodeR
3418 / 2815 / 3000
Регистрация: 08.02.2012
Сообщений: 8,603
Записей в блоге: 1
11.01.2015, 10:12
Pascal
1
2
3
4
5
6
7
if (spisok[mid].fam=key) and (spisok[mid].name=key2) then
Begin
  for j:=mid to n-1 do
  spisok[j]:=spisok[j+1];
  n:=n-1;
  break;
End;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2015, 10:12
Помогаю со студенческими работами здесь

Найти поддерево двоичного поиска с максимальным количеством элементов
Написать программу, которая формирует произвольно бинарное дерево, выводит построенное дерево на экран и затем в сформированном дереве...

Найти поддерево двоичного поиска с максимальным количеством элементов
Написать программу, которая формирует произвольно бинарное дерево, выводит построенное дерево на экран и затем в сформированном дереве ...

Как найти в тексте заданное слово методом двоичного поиска?
Как найти в тексте заданное слово методом бинарного поиска?

найти номер элемента массива, используя метод двоичного поиска
Помогите, пожалуйста решить задачу: Решить задачу двумя способами — с применением рекурсии и без нее.В упорядоченном массиве целых...

Найти номер находящегося в массиве элемента методом двоичного поиска
Помогите пожалуйста,В упорядоченном массиве целых чисел a(i) (i=1….n) найти номер находящегося в массиве элемента C.Методом двоичного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru