Определение принадлежности даты диапазону времени

Задача: 

Представим, что нам надо определить принадлежит ли определенная дата диапазону времени, т.е. находится ли между двумя другими датами.

Две крайние даты пусть задаются программно. А дату, требующую исследования, вводит пользователь.

Алгоритм решения задачи: 

Задачу можно решить как минимум двумя способами. Например, для каждой даты вычислить количество дней, прошедших с какой-нибудь начальной даты (например, нулевого года). После чего сравнить полученные значения. Если количество дней анализируемой даты будет находиться между двумя другими, то дата принадлежит диапазону.

Второй, более простой, способ это «поэлементное» сравнение дат: сначала сравниваются года, если этого недостаточно, то месяцы и, затем, дни. Ниже приводится пример реализации этого способа. Однако тут тоже могут быть варианты.

Программа на языке Паскаль: 

type date = record
        year:integer;
        month:1..12;
        day:1..31;
     end;
 
var d1, d2, dmy: date;
 
begin
    with d1 do begin
        year := 1990;
        month := 5;
        day := 15
    end;
    with d2 do begin
        year := 2005;
        month := 12;
        day := 25
    end;
 
    write('Год: ');
    readln(dmy.year);
    write('Месяц: ');
    readln(dmy.month);
    write('День: ');
    readln(dmy.day);
 
    if (dmy.year > d1.year) and (dmy.year < d2.year) then
        writeln('Yes');
 
    if dmy.year = d1.year then
        if dmy.month > d1.month then
            writeln('Yes')
        else
            if dmy.month = d1.month then
                if dmy.day > d1.day then
                    writeln('Yes');
 
    if dmy.year = d2.year then
        if dmy.month < d2.month then
            writeln('Yes')
        else
            if dmy.month = d2.month then
                if dmy.day < d2.day then
                    writeln('Yes');
 
readln
end.

Комментарии

Алгоритм для произвольного

Алгоритм для произвольного интервала неверный начиная со

if dmy.year = d1.year then
        if dmy.month > d1.month then
            writeln('Yes')

Помогите найти ошибку

На вход программе подаются сведения об учениках, сдававших экзамен по информатике. Подаются в формате строки в виде Фамилия Имя №школы (число) баллы(число), например Валеева Гульназ 57 88. Нужно определить школу с самым высоким средним баллом, и вывести. Если таких школ несколько, то вывести только количество. У меня комп выводит только нули. Искала ошибку, но не нашла.
Вот программа

Program Uchenik;
Type uchen=Record
fam:string[30];
im:string[20];
sh:integer;
q:integer;
end;
var b:array[1..100] of uchen;
a:array[1..100] of string;
p,c:array[1..100] of real;
i,j,m,n,l,r:integer;
k:real;
begin
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
for j:=1 to 60 do
if a[i][j]<>' ' then
begin
b[i].fam[j]:=a[i][j];
delete(a[i],j,1);
end
else
begin
delete(a[i],j,1);
break;
end;
for i:=1 to n do
for j:=1 to n do
if a[i][j]<>' ' then
begin
b[i].im[j]:=a[i][j];
delete(a[i],j,1);
end
else
begin
delete(a[i],j,1);
break;
end;
for i:=1 to n do
for j:=1 to 10 do
if a[i][j]<>' ' then
val(a[i][j],b[i].sh,m)
else
begin
delete(a[i],j,1);
break;
end;
for i:=1 to n do
for j:=1 to 5 do
val(a[i][j],b[i].q,l);
r:=0;
for i:=1 to n do
begin
c[i]:=0;
p[i]:=0;
end;
for j:=1 to n do
k:=b[j].sh;
begin
for i:=1 to n do
if b[i].sh=k then
begin
c[i]:=c[i]+b[i].sh;
p[i]:=p[i]+1;
end;
end;
for i:=1 to n do
c[i]:=c[i]/p[i];
k:=c[1];
for i:=1 to n do
if c[i]>k then
k:=c[i];
for i:=1 to n do
if c[i]=k then
r:=r+1;
if r=1 then
for i:=1 to n do
if c[i]=k then
write(b[i].sh,c[i])
else
write(r);
end.