Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите не пашет алгоритм по вычеслению прожитых дней...
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
prevedmuraved
не пойму чё ей не хватает...

program pr;
uses crt,dos;
var dn,an,ln:word;
procedure days;
var f:text;
a:array[1..28,1..12] of integer;
i,j:integer;
ac,lc,dc,zc:word;
begin
getdate(ac,lc,dc,zc);
assign(f,'D:\pascal\TP\BIN\exem\tebel1.txt');
reset(f);
for i:=1 to 28 do begin
for j:=1 to 12 do begin
read(f,a[i,j]);
end;
readln(f);
end;
close(f);

end;
begin
writeln('dati data dvs de nastere ( dd ll aaa/EXEMPLU: 05 08 1999 )');
readln(dn,ln,an);
end.



М
Небольшие программы лучше все же помещать в текст мессаджа (с тегами code=pas), а не прикреплять файлом
Lapp

volvo
Цитата
чё ей не хватает...
Как минимум - вызова процедуры (или более логичных действий по подсчету количества прожитых дней). Ну, ввел данные, что дальше? Где они используются?

Кстати, о процедуре. А что в том файле хранится, можно открыть тайну? И почему матрица - именно размером 28*12? unsure.gif
prevedmuraved
извините не тот фаил закачал..... huh.gif sad.gif cray.gif
program pr;  
uses crt,dos;
var an,dn,ln:integer;
anulc,datac,lunac,k:word;
function cluna(mm:word):integer;
var dk:word;
begin
case mm of
1 : cluna:=31;
2 : cluna:=28;
3 : cluna:=31;
4 : cluna:=30;
5 : cluna:=31;
6 : cluna:=30;
7 : cluna:=31;
8 : cluna:=31;
9 : cluna:=30;
10 : cluna:=31;
11 : cluna:=30;
12 : cluna:=31;
end; end;
function days(dd,ll,aa:integer):integer;
var at,abc,sdays,i:integer;
begin
getdate(anulc,lunac,datac,k);
writeln('sevodnia-----------',datac,' ',lunac,' ',anulc);
if aa mod 4=0 then abc:=1 else abc:=0;
if (anulc mod 4=0)and(lunac>=3) then abc:=abc+1;
if anulc=aa then begin
for i:=ll to lunac-1 do
sdays:=sdays+cluna(i);
sdays:=sdays-dd+datac;
writeln(sdays,'-*-*-');
end
else begin
at:=anulc-aa-1;
sdays:=sdays+at*365;
for i:=ll to lunac-1 do
sdays:=sdays+cluna(i);
sdays:=sdays-dd+datac;
writeln(sdays,'*-*-*-*');
end;
sdays:=sdays+abc;
end;
begin clrscr;
writeln('(dd ll aaaa)');
readln(dn,ln,an);
writeln(days(dn,ln,an));
readkey;
end.
volvo
А теперь - по русски напиши тот алгоритм, который используется в программе. Только не надо опять увиливать и писать что-то другое. Не надо. Ты хочешь получить готовую работоспособную программу, прилагая свои усилия - поможем, но начинай прилагать: описывай алгоритм.

Хочешь получить программу, не прилагая усилий? "Бесплатных пирожных не бывает" (С) Перемещаемся в "Задачи на заказ" и готовь кошелек.
prevedmuraved
Цитата(volvo @ 9.06.2010 6:07) *

Только не надо опять увиливать и писать что-то другое. Не надо.

я не увиливою... (просто они у меня в разных папках с темеже именами)
и тот и этот code должен расчитывать прожитые дни.

Цитата(volvo @ 9.06.2010 6:07) *

Ты хочешь получить готовую работоспособную программу, прилагая свои усилия - поможем, но начинай прилагать: описывай алгоритм.

этот алгоритм сделал я. но не поиму почему он показывает неправельные даты (результат на много больше чем надо ).

Цитата(volvo @ 9.06.2010 6:07) *

А теперь - по русски напиши тот алгоритм, который используется в программе.

вроде всё по руски... ткни ато я не вижу..

volvo
Цитата
и тот и этот code должен расчитывать прожитые дни.
Это - не алгоритм. Это - задача. Алгоритм - это детальное описание (повторяю, к компилятору вообще не лезь, расскажи на русском языке), как ты будешь делать эту задачу. Что надо найти для определения нужного тебе результата? Каким образом ты это ищешь? Почему именно так? (это к вопросу о високосности года, если что)

И не надо мне предлагать разбираться в программе. Во-первых, это мне малоинтересно, тут с первого взгляда видно, что оно без капитальной переделки работать не будет. А во-вторых, пока у тебя не будет четкой последовательности действий - любые твои попытки написать программу обречены на провал. Ты себе и другим объяснить не можешь на том языке, который для тебя - родной, а хочешь объяснить компьютеру, на абсолютно чужом тебе языке? Не смеши...
prevedmuraved
вычитываю из нынешнего года год рождения пользователя
потом умножаю на 365 дней
потом проверяю есле год рождения високосный... есле да то добавляю 1 день
потом добавляю все високосные ((нынешний год- год рождения) mod 4 )

volvo
Цитата
вычитываю из нынешнего года год рождения пользователя
И все? А если я родился 4-го мая 2009, а сегодня - 1 мая 2010, что будет?

Вычитаем из 2010 (текущий год) 2009 (год рождения). = 1
Умножаем на 365 = 365.

Год рождения - не високосный (а вот проверяешь ты это неправильно, недостаточно просто поделить на 4, это частичное решение), значит ничего не делаю. Между датами високосных нет, ничего не делаю. Итого ответ = 365? Неправда. 365 будет 4-го мая, а пока 361... Ты не учитываешь, какой день от начала года - дата рождения, а какое - текущая дата. Это тоже надо учитывать.

Так что проблема у тебя с алгоритмом, я ж говорил... Исправляй, пиши опять описание, посмотрим, как тебе удастся справиться с этим. Программу пока не делай, только напиши словами...
prevedmuraved
тогда нужно проверять:
* если месяц рождения > текущего --- тогда считаем дни от текущего до месяца рожд.-1 и вычитываем тек дату.
* если месяц рождения < текущего --- тогда считаем дни от м.рождения до тек. месяца-1 добавляем тек. дату и вычитываем дату рождения
TarasBer
Ладно, подскажу.
Удобнее перевести дату рождения и текущую дату в одно целое число типа longint, означающее, например, число дней с 1 января 00 года, вычесть, всё.
То есть достаточно написать одну функцию DateToInt
prevedmuraved
Цитата(TarasBer @ 10.06.2010 6:41) *

Удобнее перевести дату рождения и текущую дату в одно целое число типа longint, означающее, например, число дней с 1 января 00 года, вычесть, всё.
То есть достаточно написать одну функцию DateToInt

а можно по подробнее а то я чёт не понял... blink.gif rolleyes.gif
Lapp
Цитата(prevedmuraved @ 10.06.2010 10:52) *
а можно по подробнее а то я чёт не понял... blink.gif rolleyes.gif
Ну, чего тут непонятного? Считаем все в днях от Рождества Христова.
prevedmuraved
Цитата(Lapp @ 10.06.2010 7:02) *

Считаем все в днях от Рождества Христова.

ааа... ну или с дня рождения... smile.gif
Lapp
Цитата(prevedmuraved @ 10.06.2010 11:22) *
ааа... ну или с дня рождения... smile.gif
Если ты делаешь прогу для всех, а не для одного избранного человека, то нужна какая-то универсальность.. Выбери какой-нибудь момент (например, 1 января 1900г.) - и от него все считай. С нулевым годом действительно есть проблемы (точный учет високосных годов), так что лучше ограничить себя - сто лет достаточно..
А вообще - лучше не изобретать велосипед, а взять готовую формулу. Есть библиотеки для работы с датами.
TarasBer
Цитата(prevedmuraved @ 10.06.2010 11:22) *

ааа... ну или с дня рождения... smile.gif

Со дня рождения очень неудобно считать, об этом тебе и талдычат. Возьми в качестве отправной точки удобную дату. Но 1900 год тоже не самый вариант, посколько он невисокосен, хотя косит под високосность. Из-за этого целая история случилась при написании Ворда при попытке сделать совместимость с форматами какого-то древнего редактора.
prevedmuraved
всё можно закрывать тему... cool.gif
пасиба за помощь... give_rose.gif
Код

{$N+}
program pr;
uses crt,dos;
var dn,ln,an:word;
ac,lc,dc,zc:word;
sec:longint;
function cl(luna:word):integer;
begin
case luna of
1 : cl:=31;
2 : cl:=28;
3 : cl:=31;
4 : cl:=30;
5 : cl:=31;
6 : cl:=30;
7 : cl:=31;
8 : cl:=31;
9 : cl:=30;
10 : cl:=31;
11 : cl:=30;
12 : cl:=31;
end;
end;

function days(dd,ll,aa:word):integer;
var  i,dsc:integer;
begin

        dsc:=0;
if ln>lc then begin
                 for i:=1 to lc-1 do
                 dsc:=dsc+cl(i);
                 for i:=ln to 12 do
                 dsc:=dsc+cl(i);
                 end

else if ln<lc then begin
                 for i:=ln to lc-1 do
                 dsc:=dsc+cl(i);
                 end;
days:=(dsc-dn+dc)+((ac-aa-1)*365)+((ac-aa)div 4);
end;
begin
clrscr;
   getdate(ac,lc,dc,zc);
  writeln('segodnea ',dc:5,lc:5,ac:11);
writeln('dd mm gggg ');
readln(dn,ln,an);
sec:=days(dn,ln,an)*3660;
writeln('you are :');
writeln(days(dn,ln,an),     ' days old');
writeln(days(dn,ln,an)*24,' hours old ');
writeln(days(dn,ln,an)*1440,' min old ');
writeln(sec,' sec old ');

end.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.