Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

Можно ли ВООБЩЕ данный участок кода сделать проще: без 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.053 c
3-1102840739
kvit
2004-12-12 11:38
2005.01.16
Query1


8-1094583769
Agent[007]
2004-09-07 23:02
2005.01.16
Как в OpenGL повысить яркость


8-1097229322
duk
2004-10-08 13:55
2005.01.16
Просмотр графического файла PNG


1-1103876185
whiteswan
2004-12-24 11:16
2005.01.16
не запускается прога в вин98. работаю в винХП,дельфи6.


1-1103914510
olookin
2004-12-24 21:55
2005.01.16
У меня тоже вопрос... По массивам...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский