Консультация № 189254
24.04.2016, 11:28
0.00 руб.
0 18 1
Здравствуйте! Прошу помощи в следующем вопросе:
Есть задача для Pascal: Заполнить файл assort, содержащий сведения об игрушках: указывается название игрушки, ее стоимость в рублях и возрастные границы ( например, игрушка может предназначаться для детей от 2 до 5 лет). Получить название игрушек, цена которых не превышает 140 руб. и которые подходят детям 5 лет.

Помогите реализовать её через файл


Обсуждение

давно
Профессионал
153662
1070
24.04.2016, 11:41
общий
Адресаты:
Здравствуйте. Какого типа должен быть файл?
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
400259
21
24.04.2016, 11:50
общий
24.04.2016, 11:56
Цитата: Евгений/Genia007/
Здравствуйте. Какого типа должен быть файл?

Не имеет особого значения. Можно попробовать с типизированным файлом ну или с текстовым )) Не знаю, какой будет предпочтительнее
давно
Профессионал
304622
583
24.04.2016, 16:14
общий
Адресаты:
Мне кажется, что вам надо уточнить постановку задачи. Что имеется в виду:

а) Файл assort -- это исходные данные. Т.е. надо создать и сохранить в "Блокноте" этот файл, а потом написать программу на Паскале, которая открывает его, находит там данные по условию и выводит их на экран?

б) Файл assort -- это результат. Т.е. программа на Паскале создаёт этот файл и заполняет его данными по условию?
давно
Посетитель
400259
21
24.04.2016, 16:26
общий
Цитата: Сергей Бендер
а) Файл assort -- это исходные данные. Т.е. надо создать и сохранить в "Блокноте" этот файл, а потом написать программу на Паскале, которая открывает его, находит там данные по условию и выводит их на экран?


Скорее так
давно
Посетитель
400259
21
24.04.2016, 16:33
общий
24.04.2016, 16:34
Нужно на подобие такого оформления. Только в этой программе определяется стоимость самого дорогого конструктора. А мне нужно вывести на экран из файла название игрушек, цена которых не превышает 140 руб. и которые подходят детям 5 лет.

И почему-то у меня в этой программе не видит созданный пустой файл
"(14) : Ошибка времени выполнения: Файл 'C:\PABCWork.NET\fdsf' не найден."



Код:
Type Toy = record {Запись}
name: string [50]; {Название}
price: word; {Цена}
LowAge: byte; {Нижняя граница возраста}
HighAge: byte; {Верхняя граница возраста}
end;
Var f: file of Toy; {Типизированный файл}
z: Toy;
fname: string;
maxPrice: integer;
begin
readln (fname); {Ввод имени файла}
assign (f, fname); {Ассоциируем переменную с файлом на диске. Вместо fname можно написать 'Assort', если имя файла постоянно, тогда ввод не нужен}
reset (f); {Открываем файл для чтения}
maxPrice:= -1; {Устанавливаем нмаксимум на отрицательное число, посольку отрицательной цены не может быть}
while not eof(f) do {Пока не конец файла}
begin
read (f, z); {Считываем запись}
if (z.name='Konstruktor') and (z.price>maxPrice) then maxPrice:= z.price; {Если это конструктор и его цена больше - перезапоминаем}
end;
if maxPrice<0 then writeln ('Net konstruktorov') {Если цена осталась отрицательной - конструкторов не встретилось}
else writeln ('Price: ', maxPrice); {Иначе выводим результат}
close (f); {Закрываем файл}
end.


давно
Посетитель
400259
21
24.04.2016, 17:13
общий
Цитата: Евгений/Genia007/
Мой вариант подходит?

К сожалению, мне ваш вариант не подходит.
Можете просто изменить программу, которую я прикрепил. И разобраться с ошибкой в 14 строке
давно
Профессионал
153662
1070
24.04.2016, 17:29
общий
Адресаты:
Вы в турбо паскале 7 делаете?
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
400259
21
24.04.2016, 17:36
общий
24.04.2016, 17:36
Цитата: Евгений/Genia007/
Вы в турбо паскале 7 делаете?


Pascal abc net
давно
Профессионал
153662
1070
24.04.2016, 17:38
общий
24.04.2016, 20:05
Что то типа этого:
[code lang=pascal h=250]type
assortiment = record {Описание записи ассортимент}
name : string[30]; {Название игрушки}
chena : integer; {Цена}
vozrast : string[10]; {Возрастное ограничение вид 3-9 или 6}
end;
var
F: File of assortiment;
spisok: assortiment;
i, y, min, max: integer;
v: string;
begin
i:= 0;
Assign(F, 'assort.dat');
Reset(F);
Repeat
Seek(F, i);
Read(F, spisok);
inc(i);
v:= spisok.vozrast;
if Length(v) > 1 then
begin {Возрастные ограничения от до}
y:= pos('-', v);
min:= StrToInt(copy(v, 1, y - 1));
max:= StrToInt(copy(v, y + 1, length(v) - 1));
if (5 >= min) and (5 <= max) then
y:= 5;
end
else
if StrToInt(spisok.vozrast) = 5 then {Ограничение просто один числом}
y:= 5
else
y:= 1;
if (spisok.chena <= 140) and (y = 5) then {название игрушек, цена которых не превышает 140 руб. и которые подходят детям 5 лет}
begin
writeln ('название игрушки: ', spisok.name);
end;
Until eof(f);
CloseFile(F);
end.[/code]
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
400259
21
24.04.2016, 17:41
общий
Цитата: Евгений/Genia007/
type
assortiment = record {Описание записи ассортимент}
name : string[30]; {Название игрушки}
chena : integer; {Цена}
vozrast : string[10]; {Возрастное ограничение}
end;
var
F: File of assortiment;
spisok: assortiment;
i, y, min, max: integer;
v: string;
begin
i:= 0;
AssignFile(F, 'assort.dat');
Reset(F);
Repeat
Seek(F, i);
Read(F, spisok);
inc(i);
v:= spisok.vozrast;
if Length(v) > 1 then
begin {Возрастные ограничения от до}
y:= pos('-', v);
min:= StrToInt(copy(v, 1, y - 1));
max:= StrToInt(copy(v, y + 1, length(v) - 1));
if (5 >= min) and (5 <= max) then
y:= 5;
end
else
if StrToInt(spisok.vozrast) = 5 then {Ограничение просто один числом}
y:= 5;
if (spisok.chena <= 140) and (y = 5) then {название игрушек, цена которых не превышает 140 руб. и которые подходят детям 5 лет}
begin
writeln ('name: ', spisok.name);
end;
Until eof(f);
CloseFile(F);
end.


На pascalabc.net ошибка в 15 строке. Сейчас попробую скачать turbo
давно
Профессионал
153662
1070
24.04.2016, 17:45
общий
Адресаты:
Здесь AssignFile(F, 'assort.dat'); надо полный путь к файлу. У меня в компе нет турбо паскаля и Pascal abc net
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
400259
21
24.04.2016, 17:57
общий
24.04.2016, 18:01
Цитата: Евгений/Genia007/
Здесь AssignFile(F, 'assort.dat'); надо полный путь к файлу. У меня в компе нет турбо паскаля и Pascal abc net


Указал полный путь
AssignFile(F, 'C:\Users\Алмаз\Desktop\ddd.dat');

Теперь ошибка
Program2.pas(18) : Ошибка времени выполнения: Чтение после конца потока невозможно.

pascalabc.net

Попробовал AssignFile(F, 'C:\Users\Алмаз\Desktop\ddd.txt');

То же самое
давно
Профессионал
153662
1070
24.04.2016, 18:03
общий
Адресаты:
Сейчас качаю pascalabc.net, посмотрим.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
24.04.2016, 18:59
общий
24.04.2016, 20:07
Адресаты:
Добавте в код после строки Assign(F, 'assort.dat');
Код:
rewrite(f);
for y:= 0 to 2 do
begin
readln(spisok.name);
readln(spisok.chena);
readln(spisok.vozrast);
write(f, spisok);
end;
CloseFile(F);

Это создаёт файл, который понимает pascalabc.
Вот программа: [code lang=pascal h=300] type
assortiment = record {Описание записи ассортимент}
name : string[30]; {Название игрушки}
chena : integer; {Цена}
vozrast : string[10]; {Возрастное ограничение}
end;
var
F: File of assortiment;
spisok: assortiment;
i, y, min, max: integer;
v: string;
begin
i:= 0;
Assign(F, 'assort.dat');
{rewrite(f);
for y:= 0 to 2 do
begin
readln(spisok.name);
readln(spisok.chena);
readln(spisok.vozrast);
write(f, spisok);
end;
CloseFile(F);}
Reset(F);
Repeat
Seek(F, i);
Read(F, spisok);
inc(i);
v:= spisok.vozrast;
if Length(v) > 1 then
begin {Возрастные ограничения от до}
y:= pos('-', v);
min:= StrToInt(copy(v, 1, y - 1));
max:= StrToInt(copy(v, y + 1, length(v) - 1));
if (5 >= min) and (5 <= max) then
y:= 5;
end
else
if StrToInt(spisok.vozrast) = 5 then {Ограничение просто один числом}
y:= 5
else
y:= 1;
if (spisok.chena <= 140) and (y = 5) then {название игрушек, цена которых не превышает 140 руб. и которые подходят детям 5 лет}
begin
writeln ('name: ', spisok.name);
end;
Until eof(f);
CloseFile(F);
end.[/code]
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
400259
21
24.04.2016, 19:07
общий
24.04.2016, 19:07
Каким образом заполнять?
Я вводил:
мишка
10
1 4
гена
20
5 8
ген
15
1 8

И после третьего круга он мне выдал ошибку
Program3.pas(33) : Ошибка времени выполнения: Входная строка имела неверный формат.
давно
Профессионал
153662
1070
24.04.2016, 19:13
общий
24.04.2016, 19:16
Адресаты:
Заполняйте так:
мишка
10
1-4
гена
20
5-8
ген
15
1-8
Если заполнять по Вашему, тогда надо переделать строку y:= pos('-', v); в y:= pos(' ', v);
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
400259
21
24.04.2016, 19:30
общий
Получилось, очень вам благодарен!!
давно
Профессионал
153662
1070
24.04.2016, 20:03
общий
это ответ
Здравствуйте, almazmr!
Вот пример для PascalABC.NET с использованием типизированного файла. Данные для файла вводятся в виде:
машинка
120
3-6
кукла
140
5.
После первого запуска программы и формирования файла можно за комментировать блок формирования файла и программа будет работать с созданным ранее файлом.
[code lang=pascal h=250]type
assortiment = record {Описание записи ассортимент}
name : string[30]; {Название игрушки}
chena : integer; {Цена}
vozrast : string[10]; {Возрастное ограничение вид 3-9 или 6}
end;
var
F: File of assortiment;
spisok: assortiment;
i, y, min, max: integer;
v: string;
begin
i:= 0;
Assign(F, 'assort.dat');
{блок формирования файла assort}
rewrite(f);
for y:= 0 to 2 do
begin
readln(spisok.name);
readln(spisok.chena);
readln(spisok.vozrast);
write(f, spisok);
end;
CloseFile(F);
{конец блока формирования файла assort}
Reset(F);
Repeat
Seek(F, i);
Read(F, spisok);
inc(i);
v:= spisok.vozrast;
if Length(v) > 1 then
begin {Возрастные ограничения от до}
y:= pos('-', v);
min:= StrToInt(copy(v, 1, y - 1));
max:= StrToInt(copy(v, y + 1, length(v) - 1));
if (5 >= min) and (5 <= max) then
y:= 5;
end
else
if StrToInt(spisok.vozrast) = 5 then {Ограничение просто один числом}
y:= 5
else
y:= 1;
if (spisok.chena <= 140) and (y = 5) then {название игрушек, цена которых не превышает 140 руб. и которые подходят детям 5 лет}
begin
writeln ('название игрушки: ', spisok.name);
end;
Until eof(f);
CloseFile(F);
end.[/code]
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа