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

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

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

> Телефонная книга. Исправить ошибки, Ввод,поиск,сохранение записей.
Natalia
сообщение 20.12.2006 2:48
Сообщение #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 страниц V  1 2 >  
 Ответить  Открыть новую тему 
Ответов(1 - 19)
Lapp
сообщение 20.12.2006 9:20
Сообщение #2


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

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

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


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

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

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


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


Новичок
*

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

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


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

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


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

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

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


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

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Natalia
сообщение 20.12.2006 19:46
Сообщение #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 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 20.12.2006 19:58
Сообщение #6


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

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

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


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Natalia
сообщение 20.12.2006 21:36
Сообщение #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 
 К началу страницы 
+ Ответить 
Natalia
сообщение 20.12.2006 21:51
Сообщение #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 - 20.12.2006 21:59
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 20.12.2006 21:57
Сообщение #9


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

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

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


var f:file;

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


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


Новичок
*

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

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


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

var f:file;

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

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

Сообщение отредактировано: Natalia - 20.12.2006 22:34
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bokul
сообщение 20.12.2006 22:46
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.12.2006 22:52
Сообщение #12


Гость






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

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


Ты наверное забыла весь цикл взять в Begin/End
 К началу страницы 
+ Ответить 
Гость
сообщение 20.12.2006 23:21
Сообщение #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;



Э-э-э... Это наверное хорошая функция... Но мы такого модуля ещё не проходили)) Попробую поэкспериментировать, спасибо))
 К началу страницы 
+ Ответить 
Natalia
сообщение 20.12.2006 23:31
Сообщение #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 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 21.12.2006 0:38
Сообщение #15


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

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

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


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


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


Новичок
*

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

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


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

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

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


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

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

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


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


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


Гость






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

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


Гуру
*****

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

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


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

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


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


Гость






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

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

 



- Текстовая версия 20.07.2025 22:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"