IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Телефонная книга. Исправить ошибки, Ввод,поиск,сохранение записей.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Доброго времени суток! Помогите разобраться с задачей. Всё, что поняла, реализовала в программе.
Задача такая: Составьте программу, реализующую телефонную книгу. Каждая запись в книге включает фамилию, инициалы и три телефона (один домашний и два рабочих). Программа должна обеспечивать ввод и сохранение записей, вывод телефонов по введённой фамилии, а также вывод всех фамилий с указанием инициалов по введённому телефонному номеру.
Но у меня не выходит. wacko.gif

Код
program Telefonnaya_kniga;
uses crt;
const n=10;
type
       book=record
             first_name:string[20];
             inis:string[5];
             telrab1:shortInt;
             telrab2:shortint;
             teldom:shortint;
            end;
       Tel_Book=array[1..n] of book;
       Ffile=file of Tel_Book; {файл для хранения базы}
var f:Ffile;
    b:Tel_Book;
    t,k,tel:shortint;
    i:byte;
    s:string;
begin
  assign(f,'tel_book.txt');
  writeln('Ввод данных-0; поиск-1; сохранение-2; возврат в меню-".."');
  readln(t);
  if t=0 then begin
  append(f);
  writeln('Ввод данных в телефонную книгу:');
  while t<>'..' do
   with b[i] do begin
    write('Фамилия: ');
    readln(first_name);
    write('Инициалы: ');
    readln(inis);
    writeln('Домашний телефон: ');
    readln(teldom);
    writeln('Рабочий телефон 1: ');
    readln(telrab1);
    writeln('Рабочий телефон 2: ');
    readln(telrab2);
    writeln;
   end;
   write(f,b);
   close(f);
  end;
  if t=1 then begin
  reset(f);
  while k<>'..' do
   writeln('Поиск:')
   writeln('по фамилии-0');
   writeln('по телефону-1');
   readln(k);
  if k=0 then begin
   writeln('Введите фамилию');
   readln(s);
    for i:=1 to n do
     if s=b.first_name then writeln(b.first_name,b.inis,b.teldom,b.telrab1,b,telrab2);
    end;
  end;
  if k=1 then begin
   writeln('Введите телефон');
   readln(tel);
    for i:=1 to n do
     if tel=b.teldom then writeln(b.first_name,b.inis,b.teldom,b.telrab1,b,telrab2);
     if tel=b.telrab1 then writeln(b.first_name,b.inis,b.teldom,b.telrab1,b,telrab2);
     if tel=b.telrab2 then writeln(b.first_name,b.inis,b.teldom,b.telrab1,b,telrab2);
    end;
  end;
  close(f);
  end;
  readln;
  end.


И ещё вопрос: какой функцией воспользоваться, чтобы определить количество байтов, записанных в файл? FileSize - мне не помог. Нужна ли тут процедура FilePos?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Natalia @ 20.12.2006 3:48) *

Но у меня не выходит.

Слишком общо.. Что именно не выходит?
Ошибок у тебя немало. Во-первых, нетекстовый файл нельзя открывать процедурой Append. Так что либо используй ReWrite, либо работай с текстовым файлом (последнее на мой взгляд, предпочтительнее).
Определишься с этим - приходи..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Основную проблему с append я знаю... У меня задание сохранять и загружать из типизированного файла. Я бы использовала rewrite, но, как я понимаю, это перезапись файла, а мне необходимо открывать файл с телефонной книгой и добавлять записи. Как-то напрямик в книжке не было сказано, что нельзя использовать append с типизированным файлом. Зменила значок '..' на цифру 3 и заменила append на rewrite. А как тогда поля записи правильно отобразить? Через точку неверно (s=b.first_name), хотя в книге приводтся два примера: через точку и with.

Сообщение отредактировано: Natalia -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


хммм....
Цитата
В отличие от текстовых типизированные файлы допускают операции как записи, так и чтения независимо от того, какой процедурой файл открыт

так что смело открывай reset


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Поковырялась с файлом. Вот что вышло. По-крайней мере он выполняется.
Код
program Telefonnaya_kniga;
uses crt;
const n=10;
type
       book=record
             first_name:string[20];
             inis:string[5];
             telrab1:shortInt;
             telrab2:shortint;
             teldom:shortint;
            end;
       Tel_Book=array[1..n] of book;
       Ffile=file of Tel_Book; {файл для хранения базы}
var f:Ffile;
    b:Tel_Book;
    t,k,tel:shortint;
    i:byte;
    s:string;
begin
  assign(f,'tel_book.txt');
  reset(f);
  writeln('Ввод данных-0; поиск-1; сохранение-2; возврат в меню-"3"');
  readln(t);
  if t=0 then
   begin
    writeln('Ввод данных в телефонную книгу:');
     while t<>3 do
      with b[i] do begin
       write('Фамилия: ');
       readln(first_name);
       write('Инициалы: ');
       readln(inis);
       writeln('Домашний телефон: ');
       readln(teldom);
       writeln('Рабочий телефон 1: ');
       readln(telrab1);
       writeln('Рабочий телефон 2: ');
       readln(telrab2);
       writeln;
      end;
      write(f,b);
    end;
  if t=1 then begin
  while k<>3 do
   begin
    writeln('Поиск:');
    writeln('по фамилии-0');
    writeln('по телефону-1');
    readln(k);
     if k=0 then
      begin
       writeln('Введите фамилию');
       readln(s);
        with b[i] do
         begin
          for i:=1 to n do
           if s=first_name then writeln(first_name,inis,teldom,telrab1,telrab2);
         end;
        end;
       end;
      if k=1 then
       begin
        writeln('Введите телефон');
        readln(tel);
         with b[i] do
          begin
           for i:=1 to n do
             begin
              if tel=teldom then writeln(first_name,inis,teldom,telrab1,telrab2);
              if tel=telrab1 then writeln(first_name,inis,teldom,telrab1,telrab2);
              if tel=telrab2 then writeln(first_name,inis,teldom,telrab1,telrab2);
             end;
          end;
        end;
   end;
  close(f);
  readln;
  end.
  


Какой функцией воспользоваться, чтобы определить количество байтов, записанных в файл? FileSize - мне не помог. Нужна ли тут процедура FilePos?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


размер в байтах=filesize(твоего файла)*sizeof(элемент файла)


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Подскажите, пожалуйста, в чём дело. Немного переделала программу. Она запускается, но почему-то выводит только одну фразу "Ввод данных-0; поиск-1; возврат в меню-3". Почему она ничего другого не выполняет?
Код
program Telefonnaya_kniga;
uses crt;
const n=50;
type
       book=record
             first_name:string[20];
             inis:string[5];
             telrab1:shortInt;
             telrab2:shortint;
             teldom:shortint;
            end;
       Tel_Book=array[1..n] of book;
       Ffile=file of Tel_Book; {файл для хранения базы}
var f:Ffile;
    b:Tel_Book;
    t,k,tel:shortint;
    i:byte;
    s:string;
begin
  assign(f,'tel_book.txt');
  reset(f);
   while t<>3 do
    writeln('Ввод данных-0; поиск-1; возврат в меню-3');
    readln(t);
     if t=0 then
      begin
       writeln('Ввод данных в телефонную книгу:');
        with b[i] do begin
         write('Фамилия: ');
         readln(first_name);
         write('Инициалы: ');
         readln(inis);
         writeln('Домашний телефон: ');
         readln(teldom);
         writeln('Рабочий телефон 1: ');
         readln(telrab1);
         writeln('Рабочий телефон 2: ');
         readln(telrab2);
         writeln;
        end;
       write(f,b);
      end;
     if t=1 then
      begin
       writeln('Поиск:');
       writeln('по фамилии-0');
       writeln('по телефону-1');
       readln(k);
        if k=0 then
         begin
          writeln('Введите фамилию');
          readln(s);
           with b[i] do
            begin
             for i:=1 to n do
              if s=first_name then writeln(first_name,inis,teldom,telrab1,telrab2)
                              else writeln('Такой фамилии нет');
            end;
          end;
         if k=1 then
          begin
           writeln('Введите телефон');
           readln(tel);
            with b[i] do
             begin
              for i:=1 to n do
               begin
                if tel=teldom then writeln(first_name,inis,teldom,telrab1,telrab2)
                               else writeln('Такого телефона нет');
                if tel=telrab1 then writeln(first_name,inis,teldom,telrab1,telrab2)
                               else writeln('Такого телефона нет');
                if tel=telrab2 then writeln(first_name,inis,teldom,telrab1,telrab2)
                               else writeln('Такого телефона нет');
               end;
             end;
           end;
       end;
  close(f);
  readln;
  end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Цитата(мисс_граффити @ 20.12.2006 19:58) *

размер в байтах=filesize(твоего файла)*sizeof(элемент файла)


Спасибо за подсказку)) Но у меня проблемка такая, pascal напрочь отказывается найти файл (файл нетипизированный по заданию). Вроде, поместила файл в ту директорию, даже пробовала указывать путь... Вот эта программа, пока только сделанная не до конца.

Код
uses crt;
uses crt;
var f:file;
    s:char;
    rzm:word;
    name:string;
    a:integer;
begin
  clrscr;
  write('Введите имя файла ');
  readln(name);
  assign(f,name);
  reset(f,1);
  rzm:=filesize(f);
  a:=rzm*sizeof(char);
  writeln('Размер файла',a);
  close(f);
end.


Сообщение отредактировано: Natalia -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


var f:file;

а речь вроде шла про работу с типизированными...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Цитата(мисс_граффити @ 20.12.2006 21:57) *

var f:file;

а речь вроде шла про работу с типизированными...

с типизированным я знаю, как определить)) У меня задание с нетипизированным)) Значит, мне сначала надо определить тип содержимого файла, а затем определять количество байтов?
Подскажи, пожалуйста, в чём дело по телефонной книге. Немного переделала программу (она выложена выше). Она запускается, но почему-то выводит только одну фразу "Ввод данных-0; поиск-1; возврат в меню-3". Почему она ничего другого не выполняет?

Сообщение отредактировано: Natalia -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Держи универсальную функцию нахождения размера файла. smile.gif

uses dos;
function MyFileSize(s:string):longint;
var Info:SearchRec;
begin
FindFirst(s,AnyFile,info);
MyFileSize:=info.size;
end;



--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата
Почему она ничего другого не выполняет?

А что, в этом цикле где-то меняется значение T?
   while t<>3 do
writeln('Ввод данных-0; поиск-1; возврат в меню-3');


Ты наверное забыла весь цикл взять в Begin/End
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата(Bokul @ 20.12.2006 22:46) *

Держи универсальную функцию нахождения размера файла. smile.gif

uses dos;
function MyFileSize(s:string):longint;
var Info:SearchRec;
begin
FindFirst(s,AnyFile,info);
MyFileSize:=info.size;
end;



Э-э-э... Это наверное хорошая функция... Но мы такого модуля ещё не проходили)) Попробую поэкспериментировать, спасибо))
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Цитата(volvo @ 20.12.2006 22:52) *

А что, в этом цикле где-то меняется значение T?
   while t<>3 do
writeln('Ввод данных-0; поиск-1; возврат в меню-3');


Ты наверное забыла весь цикл взять в Begin/End


Точно! Спасибо, а то не могла понять, почему получались лишние endы). Объясните ещё, пожалуйста, смысл ошибки: "0-выход за границы диапазона изменения индекса 1..50" blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


а почему у тебя вложенные циклы по одной переменной?
так нельзя


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Цитата(мисс_граффити @ 21.12.2006 0:38) *

а почему у тебя вложенные циклы по одной переменной?
так нельзя

Пока не знаю, как сделать по-другому. И не могу уже думать... У меня так: пока не равно трём идёт цикл, в котором при t=0 - ввод данных, а при t=1 идёт поиск (поиск по двум критериям - фамилии и телефонам). Если же t=3, то переход должен быть в начало выбора: ввода или поиска. Знаю, что там напортачила, но пока не соображу, как переделать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Я в твоем форматировании запуталась.
они, оказывается, не вложенные, а независимые...
но что тогда значит это:
with b[i] do
begin
for i:=1 to n do
begin


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Цитата
Я в твоем форматировании запуталась.
smile.gif Кстати, есть очень хорошая утилита - для переформатирования текстов программ, написанных на Паскале, с соблюдением отступов (из комплекта FPC) - иногда просто незаменима, если код довольно большой и плохо форматированный (или вообще без отступов):

Полезные программы и утилиты
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
Кстати, есть очень хорошая утилита - для переформатирования текстов программ, написанных на Паскале, с соблюдением отступов (из комплекта FPC) - иногда просто незаменима, если код довольно большой и плохо форматированный (или вообще без отступов):

И как с ней работать?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Запустить из консоли не пробовал? Она показывает Хелп... Чтобы все сделать по умолчанию -
Цитата(Console)
PTOP myfile.pas myfile2.pas
где myfile.pas - название НЕформатированного файла...
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 19:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name