Главная страница
    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.038 c
3-1103028473
Sergo
2004-12-14 15:47
2005.01.16
Генератор в InterBase


3-1103000716
rosl
2004-12-14 08:05
2005.01.16
index


14-1103814228
Cosinus
2004-12-23 18:03
2005.01.16
Перевод проекта Delphi6 <=> Delphi5


14-1104325073
BiN
2004-12-29 15:57
2005.01.16
Дизассемблер на Паскале


4-1101400188
Ego
2004-11-25 19:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский