forz
1

бинарный поиск в массиве записей

19.10.2009, 23:25. Показов 2236. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Товари програмисты хел плиз!
вот задача- В памяти ЭВМ хранятся списки номеров телефонов и фамилий абонентов, упорядоченные по номерам телефонов, для каждого из пяти телефонных узлов города. Один телефонный узел включает несколько АТС (не более 10). Номера АТС (первые две цифры номера телефона), относящихся к каждому телефонному узлу, также хранятся в памяти ЭВМ. Составить программу, обеспечивающую быстрый поиск фамилии абонента по заданному номеру телефона.

Проблема состоит в реализации процедцры поиска.Далее представлен написанный мной код , помогите найти ошибки

код-
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
program spravo4nik;
uses crt;
const n=6;
type Tzap=record
     fam:string[25];
     nomer:string[6];
     yzel:string[2];
     end;
 
var  F:file of tzap;
     sp:array [1..n] of Tzap;
     i,k,j,a,l:integer;
     nom:string[6];
procedure SozdF; {файл создаем сразу отсортированным по номеру телефона}
begin
assign(F,'c:\tel.typ');
rewrite(f);
          for i:=1 to n   do
          begin
                write('Familiya:');
                readln(sp[i].fam);
                write('Nomer:');
                readln(sp[i].nomer);
                  sp[i].yzel:=copy(sp[i].nomer,1,2);
                write(F,sp[i]);
                writeln('----------------');
            end;
Close(F);
end;
 
procedure search;
var
niz,verh,mid,lh:integer;
flag:boolean;
begin
     assign(F,'c:\tel.typ');
     reset(f);
     writeln('Vvedite Nomer telefona =>');
     readln(nom);
     niz:=1;
     verh:=n;
     while not eof(f) do
     begin
         read(f,sp[i]);
          repeat
            mid:=(niz+verh) div 2;
            if nom>sp[mid].nomer then
            niz:=mid+1
            else
            verh:=mid-1;
          until  (sp[mid].nomer<>nom) or (niz>verh) ;
        end;
       if sp[mid].nomer=nom then writeln('Familiya:',sp[mid].fam)
       else writeln('Abonent ne naiden');
      readln;
  Close(F);
end;
 
procedure vyvodF;
var J:integer;
begin
assign(F,'c:\tel.typ');
reset(f);
writeln('     Familiya  ','Nomer     ','yzel   ');
writeln('------------------------------');
        for i:=1 to n do
        begin
             read(f,sp[i]);
             writeln( '',sp[i].fam:12,' ',sp[i].nomer:8,'',sp[i].yzel:6);
          end;
 
readln;
close(f);
 end;
 
begin
  clrscr;
  writeln('*** Telefonniy Spravochnik: ');
  writeln('1-sozdat fail');
  writeln('2 -  Prosmotr Vhodnogo faila');
  writeln('3 - Poisk abonenta');
  writeln('4- Exit');
  write('Vash Vibor: ');
  readln(k);
  case k of
    1: begin
         clrscr;
           SozdF;
         readkey;
       end;
    2: begin
         clrscr;
          VyvodF;
       end;
    3: begin
         clrscr;
         Search;
       end;
    4:end;
end.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2009, 23:25
Ответы с готовыми решениями:

Бинарный поиск чисел в массиве
Привет! Никак не могу доработать программу: выводит только ответ для последнего значения второго...

бинарный поиск в одномерном массиве строк
program poisk; {$APPTYPE CONSOLE} uses crt; const n=100; type mas=array of string; var...

бинарный поиск
есть ли у кого-нибудь информация о бинарном поиске в Паскале?

Бинарный поиск
В заданном массиве A(N),найти наибольший элемент из отрицательных значений

1
1063 / 130 / 34
Регистрация: 09.10.2009
Сообщений: 271
20.10.2009, 12:06 2
непонятно, что этот кусок делает ? вернее, что должен делать?
Pascal
1
2
3
4
5
6
7
8
9
10
11
   while not eof(f) do 
     begin  read(f,sp[i]);
              repeat
                      mid:=(niz+verh) div 2;
                      if nom>sp[mid].nomer then
                         niz:=mid+1
                      else  verh:=mid-1;
              until  (sp[mid].nomer<>nom) or (niz>verh) ;
     end;
     if sp[mid].nomer=nom then writeln('Familiya:',sp[mid].fam)
     else writeln('Abonent ne naiden');
где определяется индекс i (присваивания I := не видно, но в sp[i] читается запись файла) ?
почему verh всегда = 6 ?
бинарный поиск - как должен работать, как "деление отрезка пополам"? может, процедуру seek(f, mid-1) использовать, без вспомогательного массива? только тогда уж verh = filesize(f), a не const
0
20.10.2009, 12:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2009, 12:06
Помогаю со студенческими работами здесь

бинарный поиск
В массиве C(L)элементы, кратные трем, заменить на «три».Через бинарный поиск

Бинарный поиск
Program massiv; uses crt; var a: array of integer; b: array of integer; c: array of integer;...

Бинарный поиск
В заданном массиве A(N) найти наибольший элемент из отрицательных значений методом бинарного поиска.

Бинарный поиск
а если надо будет бинарно искать число А в упорядоченном массиве, то я всего лишь буду изменить v...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru