Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2009, 15:15   #1
Рамик
Студент
Форумчанин
 
Аватар для Рамик
 
Регистрация: 18.02.2009
Сообщений: 125
Смущение [Pascal] комбинированные типы(задача)

задача:
Дан список из фамилий уч-ся и дат их рождения. Вывести фамилию младшего учащегося.

вот я начал:
Код:
program p1;
uses crt;
type spisok=record
     fam:string[20];
     date:string[20];
     end;
var n,i,kod,m:integer;
    d:array[1..100] of spisok;

begin
     writeln('vvedite kollichestvo uchashihsia: ');
     readln(n);
for i:=1 to n do begin
     writeln('vvedite familiyu: ');
     write(i,': ');
     readln(d[i].fam);
     writeln('vvedite datu rojdenia(dd.mm.yy): ');
     readln(d[i].date);
     end;
...

как правильно сравнить их даты рождения?
Рамик вне форума Ответить с цитированием
Старый 15.03.2009, 15:28   #2
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
По умолчанию

А дата у тебя в каком формате?
Silence is of great value...
Jean-Esther вне форума Ответить с цитированием
Старый 15.03.2009, 15:37   #3
Рамик
Студент
Форумчанин
 
Аватар для Рамик
 
Регистрация: 18.02.2009
Сообщений: 125
По умолчанию

типа String формата дд.мм.гг
Рамик вне форума Ответить с цитированием
Старый 15.03.2009, 15:41   #4
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
По умолчанию сравнение дат

Положим, формат DD:MM:YYYY
тогда введем функцию:
Код:
function DateValue(date:string):longint;
var DD,MM,YYYY:string;
var k:integer;
begin
k:=pos(':',date);
DD:=copy(date,1,k-1);
delete(date,1,k);
k:=pos(':',date);
MM:=copy(date,1,k-1);
delete(date,1,k);
YYYY:=date;
{=========}
DateValue:=StrToInt(DD) +
   StrToInt(MM)*31 + {31 — наибольшее количество дней}
   (StrToInt(YYYY)-1900) * 31*12; {-1900 для укладки в тип longint, 31*12 — количество дней в году, если в каждом месяце по 31 день :) }
end;
Осталось только описать функцию
Код:
function StrToInt(s:string):integer;
var k:integer;
begin
k:=0;
while s<>'' do
begin
    k:=k*10+ord(s[1])-48;
    delete(s,1,1);
end; {вроде правильно написал}
StrToInt:=k;
end;
И сравниваем даты
Код:
min:=DateValue(d[1].date); for i:=2 to n do if min>DateValue(d[i].date) then min:=DateValue(d[i].date); for i:=1 to n do if DateValue(d[i].date)=min then writeln('>>',d[i].fam);
Вроде так. Писал сходу, мог ошибиться.
Silence is of great value...

Последний раз редактировалось Jean-Esther; 15.03.2009 в 15:54. Причина: ошибка в коде
Jean-Esther вне форума Ответить с цитированием
Старый 15.03.2009, 15:43   #5
Рамик
Студент
Форумчанин
 
Аватар для Рамик
 
Регистрация: 18.02.2009
Сообщений: 125
По умолчанию

...мы функции еще не проходили...(((
я вот думаю с помощью val может как то сравнить?
Рамик вне форума Ответить с цитированием
Старый 15.03.2009, 16:00   #6
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
Счастье

Понимаю, что это скорее всего тебе не поможет, но привожу работающую прогу.
Код:
program p1;
uses crt;
type spisok=record
     fam:string[20];
     date:string[20];
     end;
var n,i,kod,m:integer;
    d:array[1..100] of spisok;
var min:longint;
function StrToInt(s:string):integer;
var k:integer;
begin
k:=0;
while s<>'' do
begin
    k:=k*10+ord(s[1])-48;
    delete(s,1,1);
end; {вроде правильно написал}
StrToint:=k;
end;
function DateValue(date:string):longint;
var DD,MM,YYYY:string;
var k:longint;
begin
k:=pos('.',date);
DD:=copy(date,1,k-1);
delete(date,1,k);
k:=pos('.',date);
MM:=copy(date,1,k-1);
delete(date,1,k);
YYYY:=date;
{=========}
k:=StrToInt(DD);
k:=k + StrToInt(MM)*31;
k:=k + (StrToInt(YYYY)-1900) * 31*12;
DateValue:=k;
end;


begin
     writeln('vvedite kollichestvo uchashihsia: ');
     readln(n);
for i:=1 to n do begin
     writeln('vvedite familiyu: ');
     write(i,': ');
     readln(d[i].fam);
     writeln('vvedite datu rojdenia(dd.mm.yy): ');
     readln(d[i].date);
     end;
min:=DateValue(d[1].date);
for i:=2 to n do if min>DateValue(d[i].date)
    then min:=DateValue(d[i].date);
for i:=1 to n do if DateValue(d[i].date)=min
    then writeln('>>',d[i].fam);
end.
Silence is of great value...

Последний раз редактировалось Jean-Esther; 15.03.2009 в 16:01. Причина: замена разделителя
Jean-Esther вне форума Ответить с цитированием
Старый 15.03.2009, 16:07   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
я вот думаю с помощью val может как то сравнить?
можно и так
только через функцию Copy( ) выделяйте отдельно год, отдельно месяц и отдельно день.
к ним можно применять val и сравнивать.
справитесь?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.03.2009, 17:33   #8
Рамик
Студент
Форумчанин
 
Аватар для Рамик
 
Регистрация: 18.02.2009
Сообщений: 125
По умолчанию

должен...) спс
Рамик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal] Комбинированные типы Рамик Помощь студентам 4 09.03.2009 18:00
Pascal комбинированные типы Rus 47 Помощь студентам 7 22.02.2009 17:48
Комбинированные типы melikyan Помощь студентам 5 10.02.2009 21:41
Комбинированные типы данных и массивы mar4elo Общие вопросы Delphi 11 01.12.2008 10:41
Задача [Pascal] [Smarik] Помощь студентам 4 04.02.2008 15:50