Главная страница
    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.043 c
14-1104091695
Yorick1988
2004-12-26 23:08
2005.01.16
Что за песня???


1-1104829082
Goblin
2005-01-04 11:58
2005.01.16
Print w delphi7


3-1102885803
SergP
2004-12-13 00:10
2005.01.16
ADOQuery. Подмена данных при их получении.


3-1102885906
m-a-x
2004-12-13 00:11
2005.01.16
связь многие-ко-многим


3-1102357690
able
2004-12-06 21:28
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский