Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Орловский Дмитрий
Статус: Профессор
Рейтинг: 3987
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2651
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2252
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1163
Дата выхода:14.02.2011, 13:30
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:182 / 181
Вопросов / ответов:1 / 2

Вопрос № 182148: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Нужно Составить программу, которая заполняет и выводит на экран массив записей с данными об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, колич...



Вопрос № 182148:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Нужно Составить программу, которая заполняет и выводит на экран массив записей с данными об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, количество, возрастные границы(например 2-5, т.е. от 2 до 5 лет). Найти название игрушки, которая по стоимости не превышает указанную сумму и подходит для ребенка в возрасте от a до b лет.

Отправлен: 09.02.2011, 12:53
Вопрос задал: Посетитель - 349343 (Посетитель)
Всего ответов: 2
Страница вопроса »


Отвечает Сергей Бендер (Практикант) :
Здравствуйте, Посетитель - 349343!

Примечания:

1. По хорошему в такой программе надо вводить данные из файла.
Или, по крайней мере, предусмотреть такую возможность.

2. Ограничения возраста, как я понял, вводятся в виде строки
(типа 2-5). Это требует некоторого алгоритма по выделению из
строки чисел. Я написал в самом общем виде, хоть для 123-3456.
Если ограничить возраст двузначными числами, то можно сделать
попроще. Если однозначными, тогда совсем просто. Но вдруг
какая-то из игрушек предназначена 120-130-летних?

3. В условиях не дано ограничений на значения остальных полей.
Потому если задать название длинее 20 символов, цену больше
9999.99, а количество больше 999, то вид таблицы будет несколько
испорчен.

4. j используется, как флаг. По хорошему он должен быть boolean.
Но вдруг вы его не изучали -- можно и через integer.

Теперь текст:

Код:

uses crt;

const maxN = 30;
{ максимально возможное количество записей в ассортименте }

type
{Одна запись ассортимента}
TToy = record
Nazvanie:string;
Cena:real;
Kolichestvo:integer;
Vozrast1,Vozrast2:integer;
end;

{Весь ассротимент}
TAssortiment = array[1..maxN] of TToy;

var Assortiment:TAssortiment;
i,j:integer;
n:integer; {текущее колчество записей в ассортименте}
s1,s2:string; {строки для считывания возрастных ограничений}
maxCena:real; { Параметры поиска игрушки }
a,b:integer;

begin
clrscr;
n:=1;
{Цикл для ввода данных}
repeat
writeln('Введите данные по игрушке N',n:2);
writeln('либо введите точку для завершения');
write('> Название: ');
readln(Assortiment[n].Nazvanie);
{Если введена точка, то выход из цикла}
if Assortiment[n].Nazvanie='.' then break;
write('> Цена: ');
readln(Assortiment[n].Cena);
write('> Количество: ');
readln(Assortiment[n].Kolichestvo);
write('> Возрастные ограничения (например 2-5): ');
{считывается строка типа 6-12}
readln(s1);
{ищется положение '-'}
i:=pos('-',s1);
{все, что после '-' записывается в другую строку}
s2:=copy(s1,i+1,length(s1));
{в s1 оставляется только то, что перед '-'}
s1:=copy(s1,1,i-1);
{Распознание чисел}
val(s1,Assortiment[n].Vozrast1,i);
val(s2,Assortiment[n].Vozrast2,i);
{Следующая запись}
inc(n);
{Если превысили максимальное количество записей, то ввод прекращается}
until n>maxN;
{Один inc(n) был лишний}
dec(n);


{Вывод таблицы. :20, :7 и :3 -- количество символов вывода
для названия, цены и количества}
clrscr;
writeln('----------------------------------------------');
writeln(' Название | Цена | Кол | Возраст');
for i:=1 to n do
writeln(Assortiment[i].Nazvanie:20,' | ',Assortiment[i].Cena:7:2,' | ',
Assortiment[i].Kolichestvo:3,' | ',
Assortiment[i].Vozrast1,'-',Assortiment[i].Vozrast2);
writeln('----------------------------------------------');
writeln('Н ажмите Enter');
readln;

{Поиск игрушки по цене и возрастным ограничениям}
clrscr;
writeln('Пои ск');
write('> Введите максимальную цену: ');
readln(maxCena);
write('> Введите минимальный возраст: ');
readln(a);
write('> Введите максимальный возраст: ');
readln(b);

{Начальное значение флага: "не найдено"}
j:=0;
for i:=1 to n do
if (Assortiment[i].Cena <= maxCena) and
(Assortiment[i].Vozrast1 <= a) and
(Assortiment[i].Vozrast2 >= b)
then begin
j:=1; {Флаг устанавливается на "найдено"}
writeln(Assortiment[i].Nazvanie);
end;

if j=0 then writeln('Игрушки по заданным параметрам не найдено');

writeln('Нажмите Enter');
readln;

end.

Ответ отправил: Сергей Бендер (Практикант)
Ответ отправлен: 09.02.2011, 16:11
Номер ответа: 265787
Тел.: 8-912-761-0437
Организация: Удмуртский ГосУнивеситет. г. Ижевск.
Абонент Skype: ostapbskype

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265787 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает vito007 (1-й класс) :
    Здравствуйте, Посетитель - 349343!
    {упрощенный вариант программы (без разбора строки границ возраста) }
    program records;
    uses crt;
    type
    toys=record
    name:string[15];
    cost:real;
    count:integer;
    agemin:integer;
    agemax:integer
    end;
    var
    a:array[1..100] of toys;
    i,n:integer;
    x,y,y1:real;

    begin
    {ввод числа записей}
    readln(n);
    {определение значений соответсвующих полей}
    for i:=1 to n
    do
    begin
    writeln('Название игрушки?');
    readln(a[i].name);
    writeln('Цена');
    readln(a[i].cost);
    writeln('Кол-во');
    readln(a[i].count);
    repeat
    begin{защита от глупого пользователя типа максимальный возраст должен быть больше минимального}
    writeln('минимальный возраст');
    readln(a[i].agemin);
    writeln('максимальный возраст');
    readln(a[i].agemax)
    end;
    until (a[i].agemax>a[i].agemin);
    clrscr
    end;
    clrscr;

    for i:=1 to n
    do
    begin
    writ eln(a[i].name,'|',a[i].cost:4:2,'|',a[i].count,'|',a[i].agemin,'-',a[i].agemax);
    end;

    readkey; {вводим данные для поиска}
    clrscr;
    writeln('Цена');
    readln(x);
    writeln('Возрастные границы');
    repeat{так же страхуемся от быдло ввода}
    begin
    writeln('Минимальный возраст');
    readln(y);
    writeln('Максимальный возраст');
    readln(y1)
    end
    until y1>y;
    {Поиск}
    for i:=1 to n
    do
    begin
    if (x<a[i].count) and ((y1<=a[i].agemax) and (y>=a[i].agemin))
    then
    writeln(a[i].name,'|',a[i].cost:4:2,'|',a[i].count,'|',a[i].agemin,'-',a[i].agemax);
    else
    writeln('Ошибка поиска');
    end
    readkey

    end.

    Ответ отправил: vito007 (1-й класс)
    Ответ отправлен: 09.02.2011, 16:58
    Номер ответа: 265788
    Тел.: +79644625257

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265788 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное