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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2012, 15:31   #1
Falcao
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 33
По умолчанию Работа с записями

Помогите с задачей в паскале, или дайте пример решения, суть состоит в том чтобы из текстового файла взять информацию о сотрудниках предприятия за схемой: фамилия имя отчество, фамилия имя отчество... и т.д. и перенести эти данные в другой файл по иной схеме: имя фамилия отчество, имя фамилия отчество... и т.д. Заранее всем благодарен
P.S. как брать данные с файла я знаю) проблема в том как запомнить данные которые я беру, я пытался через массив, но безрезультатно

Последний раз редактировалось Falcao; 29.11.2012 в 15:40.
Falcao вне форума Ответить с цитированием
Старый 29.11.2012, 15:49   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
проблема в том как запомнить данные
зачем?
Код:
while eof(f1) do begin
readln(f1,s);
fam:=copy(s,1,pos(' ',s)-1);
delete:=(s,1,pos(' ',s));
nam:=copy(s,1,pos(' ',s)-1);
delete:=(s,1,pos(' ',s));
otc:=s;
Writeln(f2,nam,' ',fam,' ',otc);
end;
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 29.11.2012, 17:18   #3
Falcao
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 33
По умолчанию

Спасибо, но что такое "pos" и единице перед ним, и S- это строка, как я догадался?
Falcao вне форума Ответить с цитированием
Старый 03.12.2012, 15:33   #4
Falcao
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 33
По умолчанию

Вот что у меня получилось:

Код:
uses crt;
type baza=record
     pr:string[25];
     name:string[25];
     otc:string[25];
end;
var a: array[1..100] of baza;
    i,n: integer; f1,f2:text;
Begin
assign(f1, 'd:\baza.in');
assign(f2, 'd:\baza.out');
reset(f1);
i:=1;
 while not eof(f1) do
  with a[i] do
   begin
    read(f1,pr,name,otc);
    i:=i+1; n:=i;
   end;
 close(f1);
rewrite(f2);
                    for i:=1 to n do
                     with a[i] do
                      write(f2,name,pr);
close(f2);
end.
Но всё равно... Выводит только первые фамилию, имя, отчество + вторую фамилию, если увеличить размеры с 25, то выведет всё как и было в изначальном файле, я понимаю что что-то в структуре вывода записей не так, но в книге написано всё аналогично.




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 03.12.2012 в 16:24.
Falcao вне форума Ответить с цитированием
Старый 03.12.2012, 16:30   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ваш код должен быть примерно такой:
Код:
uses crt;
type baza=record
     pr:string[25];
     name:string[25];
     otc:string[25];
end;
var aa : baza;
   f1,f2:text;
Begin
   assign(f1, 'd:\baza.in');
   assign(f2, 'd:\baza.out');
   reset(f1);
   rewrite(f2);
   while not eof(f1) do
      with aa do begin
         ReadLn(f1,pr,name,otc);
         WriteLn(f2,name,pr);
       end;
   close(f1);
   close(f2);
end.
НО! В таком случае, в исходном файле информация должна быть именно в таком виде, в каком Вы её читаете:
<25 символов PR><25 символов NAME><25 символов OTC>
никаких лишних пробелов, табуляций и прочего!


p.s. Кстати, обычно подобные задачи предполагают использование типизированного(-ых) файла(ов).
Вы уверены, что в вашем случае надо использовать два текстовых файла?

Последний раз редактировалось Serge_Bliznykov; 03.12.2012 в 23:21. Причина: Исправил опечатку. правильно: WriteLn(f2,name,pr);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.12.2012, 16:50   #6
Falcao
Пользователь
 
Регистрация: 29.11.2012
Сообщений: 33
По умолчанию

Спасибо, уверен, задание состоит во взятии информации с первого файла и переносе их в другой файл, ещё одно, у Вас

with aa do begin
ReadLn(f1,pr,name,otc);
WriteLn(f1,name,pr);
end;

т.е. без массива можно попытаться?+ во WriteLn(F2...) стоять должно?. Вот я немного упростил, ради основы:

Код:
uses crt;
type baza=record
     pr:string[9];
     name:string[7];
     otc:string[9];
end;
var a: array[1..100] of baza;
    i,n: integer; f2:text;
Begin
assign(f2, 'd:\baza.out');
rewrite(f2);
 for i:=1 to 3 do
  with a[i] do
   read(pr,name,otc);

                    for i:=1 to 3 do
                     with a[i] do
                      write(f2,name,' ',pr,',');
close(f2);

end.

Здесь все работает, но в предыдущем ошибка, как вы и говорили, вот в чем: <25 символов PR><25 символов NAME><25 символов OTC> , но как считать данные, ведь таких фамилий в файле может быть сотни, а для каждой высчитывать... Сейчас попытаюсь переделать с Вашей подсказкой
Falcao вне форума Ответить с цитированием
Старый 03.12.2012, 23:35   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
во WriteLn(F2...) стоять должно?
да. Опечатался, извините.
Разумеется, должно читаться из одного файла (f1), выводится в другой (f2)!

Цитата:
т.е. без массива можно попытаться?
тут и пытаться нечего - нужно писать код без использования массива!
Зачем Вам массив? Чтобы увеличить занимаемый программой объём данных, ввести ограничение не более 100 строчек (записей) во входном файле, ухудшить быстродействие (правда, последнее, насчёт быстродействия весьма символически, но всё же...)
Пишите без массива там, где в нём нет острой необходимости!


Цитата:
но как считать данные, ведь таких фамилий в файле может быть сотни, а для каждой высчитывать...
можно (и я бы очень рекомендовал) изменить процедуру чтения.
Если вкратце, то принцип такой.
одной командой считывайте полностью всю строку из текстового файла в переменную типа String
после чего, разбираете (или, это программисты называют "parse" - парсите) строку на нужные элементы (Вам нужно чётно и однозначно определить, каким образом в файле фамилия отделяется от имени, а имя отделяется от отчества.
например, допустим, они отделяются пробелами.
тогда можно написать так:
Код:
var s : string;
  One : baza;
...
   while not eof(f1) do begin
    ReadLn(f1, s);
    with One do begin
      pr := ''; name := ''; otc := '';
      if Pos(' ',s)>0 then begin
          pr := Copy(s, 1, Pos(' ',s)-1);
          Delete(s, 1, Pos(' ',s));
          while (Length(s)>0) and (Pos(' ',s)=1) do Delete(s,1,1); { удалим лишние пробелы }
      end; 
      if Pos(' ',s)>0 then begin
          Name := Copy(s, 1, Pos(' ',s)-1);
          Delete(s, 1, Pos(' ',s));
          while (Length(s)>0) and (Pos(' ',s)=1) do Delete(s,1,1); { удалим лишние пробелы }
      end;
      otc := s; {всё, что в строке осталось - считаем за отчество!} 

      {запишем в выходной файл данные}
      write(f2,name,' ',pr,',')
    end; 
   end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с записями. dima-intro Помощь студентам 5 30.12.2010 10:01
Работа с записями dima-intro Помощь студентам 1 26.12.2010 13:43
Работа с записями Intersap Помощь студентам 0 20.11.2010 18:01
работа с записями wawan93 Microsoft Office Word 0 26.06.2009 14:48
Работа с записями Viata Паскаль, Turbo Pascal, PascalABC.NET 3 24.06.2009 09:03