Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Можно ли ВООБЩЕ данный участок кода сделать проще: без copy, val?   Найти похожие ветки 

 
Евгений2   (2004-12-29 02:39) [0]

Программа берет из файла base все записи поочереди, причём файл имеет сл. структуру:
 
ФИО автора книги   Название книги   год издания

Нужно записать в файл (Newbase) список авторов издававшихся до 1980 года....

Вопрос в следующем...  Можно ли проделать те же действия только без copy или val или хотя бы чего-нибудь одного.

Вся трудность в том, что год издания в конце строки, причём год записан так "1984г"

Вот листинг, написанный на Turbo Pascal
const

 A="base.txt"
 B="Newbase.txt"

Var F, F1: text;
   St, X: String;
   I,Y,S: integer;
begin
   
 Assign(F,A);
 Reset(F);
 Assign(F1,B);
 Reset(F1);
 Rewrite(F1);
 
 while not Eof(F) DO
   begin
     Readln(F,St);
     X:=copy(St, length(St)-4,4); //COPY
     Val(X,Y,I);                  //VAL
       if Y<1980 then
         Writeln(F1,St);
   end;

 Close(F);
 Close(F1);
 
end.



Если есть какие-либо мысли? Прошу написать!

 Большое вам спасибо!


 
TButton ©   (2004-12-29 03:01) [1]

A="base.txt"
B="Newbase.txt"

Var F, F1: text;
  St, X: String;
  I,Y,S: integer;
begin
 
Assign(F,A);
Reset(F);
Assign(F1,B);
Reset(F1);
Rewrite(F1);
 
while not Eof(F) DO
  begin
    Readln(F,St);
    X:=copy(St, length(St)-4,4); //COPY
      if X<"1980" then
        Writeln(F1,St);
  end;

Close(F);
Close(F1);

end.


 
TButton ©   (2004-12-29 03:09) [2]

а без COPY тебе не обойтись, раз уж все в одну строку пишется
можно разбить (в блокноте) строку на три т.е. было
ФИО автора книги   Название книги   год издания
стало
ФИО автора книги
Название книги
год издания

тогда код меняется следующим образом
A="base.txt"
B="Newbase.txt"

Var F, F1: text;
 auth, title, year, X: String;
 I,Y,S: integer;
begin
 
Assign(F,A);
Reset(F);
Assign(F1,B);
Reset(F1);
Rewrite(F1);

while not Eof(F) DO
 begin
   Readln(F,auth);
   Readln(F,title);
   Readln(F,year);
   if year<"1980" then
   begin
     Writeln(F1,auth);
     Writeln(F1,title);
     Writeln(F1,year);
     // или вот так
     // Writeln(F1,auth+"   "+title+"   "+year+"г");
   end;
 end;

Close(F);
Close(F1);

end.


 
default ©   (2004-12-29 03:24) [3]

TButton ©   (29.12.04 03:09) [2]
"а без COPY тебе не обойтись"
ну почему же, строка же есть, можно просто по цифрам сравнивать


 
TButton ©   (2004-12-29 03:27) [4]

l:=length(st)-4;
if (st[l]<="1")and(st[l+1]<="9")and(st[l+2]<="8")and(st[l+3]<"0")

так?


 
default ©   (2004-12-29 03:42) [5]

TButton ©   (29.12.04 03:27) [4]
похоже, только сравнение нужно улучшить и подправить
можно попробовать ввести какой-нибудь тип
TStr3 = Array[1..3] of Char;
и сделать приведение(3 символа потому что тысячелетие наверняка смысла нет смотреть) и сравнить через тот же "<"


 
TButton ©   (2004-12-29 03:59) [6]


> потому что тысячелетие наверняка смысла нет смотреть) и
> сравнить через тот же "<"

а как же труды Платона? =)


 
begin...end ©   (2004-12-29 09:02) [7]

> Евгений2   (29.12.04 02:39)

Если файлы не предназначены для ручного редактирования, то я бы воспользовался всё же нетипизированными файлами. Тогда бы не понадобились ни Val, ни Copy.


 
TButton ©   (2004-12-29 10:40) [8]


> Если файлы не предназначены для ручного редактирования,
> то я бы воспользовался всё же нетипизированными файлами.
> Тогда бы не понадобились ни Val, ни Copy.

объяснитесь.


 
TUser ©   (2004-12-29 11:25) [9]

А чем не понравились copy и val?


 
Евгений2   (2004-12-29 14:04) [10]

=))))) Спасибо всем!

  2TUser

     Мне очень даже понравились, толкьо вот препод.... ;) козлит =))...


 
begin...end ©   (2004-12-29 14:48) [11]

> [8] TButton ©   (29.12.04 10:40)

Объясняюсь. Я опечатался - имел в виду типизированный файл, а именно файл записей.

Запись бы была, например, такая:

type
 TBookInfo = packed record
   FIO:   String [40];
   Title: String [40];
   Year:  Word
 end.


Тогда можно было бы использовать файл типа file of TBookInfo, и записывать/читать в/из него целыми записями с помощью процедур Write и Read. Недостатки такого способа налицо: во-первых, получающийся файл тяжело редактировать вручную (в отличие от текстового), а во-вторых, приходится пользоваться короткой строкой (String [40], например), вся длина которой может и не понадобиться.

Можно, конечно, использовать и нетипизированные файлы, и писАть в них даже длинные строки, и вообще всё что угодно, по схеме: сначала записываем длину "чего угодно", потом - непосредственно "что угодно". Но так гораздо тяжелее. Например, я не знаю другого способа сохранения длинных строк в нетипизированный файл, кроме такого:

var
 F: file;
 S: String;

begin
 ...
 BlockWrite(F, (@S[1])^, Length(S))
 ...
end.



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
14-1103968704
Чеширский_Кот
2004-12-25 12:58
2005.01.16
Merry Xmas!


1-1103985249
Andrick
2004-12-25 17:34
2005.01.16
Работа с TListBox


14-1103896711
Тимур
2004-12-24 16:58
2005.01.16
Железо - хелп!


8-1096733091
CyberPank
2004-10-02 20:04
2005.01.16
плагин к Winamp


3-1103006883
OlegL
2004-12-14 09:48
2005.01.16
TMemoField