Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ файлы

Автор: vi-rus 27.05.2007 18:24

задание : Дан файл, содержащий различные даты. Каждая дата – это число месяц и год. Найти самую раннюю дату.
Программа не работает. Помогите ,ПОЖАЛУЙСТА, найти ошибку.
На всякий случай прикреплю файл.


program zadanie2;
uses crt;
const god:array [1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);
godvisok: array [1..12] of integer =(31,29,31,30,31,30,31,31,30,31,30,31);
type zap = record
year,month,day:integer;
end;
tf= file of zap;
var f:tf;
minindex,i,n,k:integer;
result:file of longint;
min,y,sum,z: longint;
t:text;
data:array[byte] of zap;
massiv:array [1..100] of longint;
begin
clrscr;
sum:=0;
assign(t,'labfile\date.txt');
reset(t);

while not eof(t) do
begin
for i:=1 to 3 do
with data[i] do
begin
read(t, year);
read(t, month);
read(t, day);

z:=trunc(year div 4)*366+(year-trunc(year div 4))*365;{Ї®бзЁв «Ё Ј®¤л}
{ бзЁв Ґ¬ ¬Ґбпжл }
if year mod 4 = 0 then {if year visokosny}
for k:= 1 to month do
begin
sum:=sum+godvisok[k];
end
{end}
else {if year not visokosny}
for k:=1 to month do
begin
sum:=sum+god[k];
end;
{Є®­Ґж}
y:= z+sum+day;
massiv[i]:=y;
sum:=0;
writeln(massiv[i]:10);

end;

end;
readln;
close(t);
for i:=1 to 3 do
begin
min:=massiv[1];
for k:=1 to 3 do if min>=massiv[k] then minindex:=k;

end;
writeln(minindex);

with data[minindex] do begin
writeln(year);
writeln(month);
writeln(day);

end;

readln;


end.




Прикрепленные файлы
Прикрепленный файл  help.rar ( 1.45 килобайт ) Кол-во скачиваний: 167

Автор: volvo 27.05.2007 18:31

Цитата
if min>=massiv[k] then minindex:=k;

Этого делать недостаточно... Так попробуй:

min:=massiv[1]; { Перед циклом }
for i:=1 to 3 do
if min>=massiv[i] then begin
minindex:=i;
min := massiv[i];
end;

Автор: vi-rus 27.05.2007 18:39

Не помогает. Почему-то все элементы массива становятся нулями

Автор: -Seln- 27.05.2007 20:55


var
f: text;
day,month,year: array [1..100] of integer;
date: array [1..100] of longint;
tmp,date_st: string;
i,datescount,ei,code: integer;
earliest: longint;

begin
assign(f,'date.txt');
reset(f);
i:=1;
while not eof(f) do
begin
readln(f,year[i],month[i],day[i]);
str(year[i],tmp); date_st:=tmp;
str(month[i],tmp);
if month[i]<10 then tmp:='0'+tmp; date_st:=date_st+tmp;
str(day[i],tmp);
if day[i]<10 then tmp:='0'+tmp; date_st:=date_st+tmp;
val(date_st,date[i],code);
inc(i);
end;
datescount:=i-1;
earliest:=date[1]; ei:=1;
for i:=2 to datescount do
if date[i]<earliest then begin earliest:=date[i]; ei:=i end;
writeln('Earliest date: ',day[ei],' ',month[ei],' ',year[ei]);
close(f);
end.

Автор: Seln 27.05.2007 20:58

Не знаю, может тебе надо было другим способом делать, но я сделал так.

Автор: volvo 27.05.2007 21:00

Вот так работает - проверено.

program zadanie2;
uses crt;
type
zap = record
year, month, day: integer;
end;

var
i, n: integer;
t: text;
data: array[byte] of zap;
min: zap;

begin
clrscr;
assign(t,'labfile\date.txt'); reset(t);

n := -1;
while not eof(t) do begin

inc(n);
with data[n] do begin { главное - чтобы у тебя в файле числа шли точно в таком же порядке: ГГ ММ ДД }
read(t, year);
read(t, month);
read(t, day);
readln(t);
end;

end;

min := data[0];
for i := 1 to n do
if (data[i].year < min.year) or
((data[i].year = min.year) and (data[i].month < min.month)) or
((data[i].year = min.year) and (data[i].month = min.month) and (data[i].day < min.day))
then min := data[i];

with min do begin
writeln(year);
writeln(month);
writeln(day);
end;
readln;
end.

Автор: Seln 27.05.2007 21:04

А чё файл не закрыл. Так не бывает smile.gif , надо закрывать.
А вообще у меня вроде меньше прога.

Автор: volvo 27.05.2007 21:10

Срочно читать доки: я не обязан закрывать файл:

1) если он был открыт для чтения - потери данных не будет
2) при корректном завершении программы файл будет закрыт автоматически...

Насчет "меньше": это не значит "быстрее" - твой Val будет выполняться гораздо дольше.

Автор: Seln 27.05.2007 21:13

Ну ты кабан!
Насчёт закрытия я шутил. cool.gif

Автор: мисс_граффити 27.05.2007 21:20

lol.gif это был комплимент?

Автор: Seln 27.05.2007 21:23

Цитата(мисс_граффити @ 27.05.2007 18:20) *

lol.gif это был комплимент?


Да, мисс, это был комплимент.



Добавлено через 6 мин.
Цитата(volvo @ 27.05.2007 18:10) *

Насчет "меньше": это не значит "быстрее" - твой Val будет выполняться гораздо дольше.


Интересно, чё у тебя за комп.
Насколько дольше, братан?