Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизМожно ли ВООБЩЕ данный участок кода сделать проще: без copy, val? Найти похожие ветки
← →
Евгений2 (2004-12-29 02:39) [0]Программа берет из файла base все записи поочереди, причём файл имеет сл. структуру:
ФИО автора книги Название книги год издания
Нужно записать в файл (Newbase) список авторов издававшихся до 1980 года....
Вопрос в следующем... Можно ли проделать те же действия только без copy или val или хотя бы чего-нибудь одного.
Вся трудность в том, что год издания в конце строки, причём год записан так "1984г"
Вот листинг, написанный на Turbo Pascalconst
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