Консультация № 185843
17.04.2012, 13:06
76.05 руб.
0 6 1
Здравствуйте! У меня возникли сложности с таким вопросом:
помогите написть программу на делфи с пояснением каждой строчки.....вот задание

type
day=1..31; mon=1..12; year=1..2000;
date=record
d:day;
m:mon;
y:year;
end;
{ считать все даты по новому стилю }
Написать программу, использующую функцию kolday(d), подсчитывающую, сколько дней прошло от 1 января 1 года до даты d.

Обсуждение

Неизвестный
17.04.2012, 14:22
общий
17.04.2012, 14:24
Должно выглядеть примерно так. В компиляторе не проверял, возможно что-то упустил.
Будут вопросы - пишите - исправлю/разъясню.
Код:
function kolday(d: date): integer;
const kd: array [1..12] of integer=(0,31,59,90,120,151,181,212,243,273,304,334);
var res: integer;
begin
{Расcчитаем количество дней в целых годах, с учетом високосных }
res := (d.y-1)*365 + (d.y-1) div 4;
{Прибавим количество дней в целых месяцах прошедших с начала года }
res := res + kd[d.m];
{Если год високосный и месяц даты после февраля нужно прибавить еще один поправочный день}
if (d.y mod 4=0) and (d.m>2) then res := res + 1;
{ Ну и наконец, прибавим количество дней прошедших от начала месяца}
res := res + (d.d-1);
kolday := res;
end;

С уважением, Дмитрий
давно
Профессионал
153662
1070
17.04.2012, 14:54
общий
А вот мой вариант:
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, DateUtils, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
EditDay: TLabeledEdit;
EditMon: TLabeledEdit;
Edityear: TLabeledEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function kolday(dd: tdate): integer;
var
Dat: TDate;
begin
Dat:= EncodeDate({y}1, 1, 1); // Собрали дату
result:= DaysBetween(dd, dat); // Посчитали дни прошедшие с 01.01.0001 до текущей даты
end;

procedure TForm1.Button1Click(Sender: TObject);
var
y, m, d: word;
dd: tdate;
begin
d:= StrToInt(EditDay.Text); // Запомнили день
m:= StrToInt(EditMon.Text); // Запомнили месяц
y:= StrToInt(Edityear.Text); // Запомнили год
dd:= EncodeDate(y, m, d); // Собрали дату
// Выводим на заголовок формы подсчитаные дни
Form1.Caption:= IntToStr(kolday(dd)) + ' дней прошло с 01.01.0001 до ' + DateToStr(dd);
end;


end.
Прикрепленные файлы:
6408514fb761c90908cb30dd14e7130b.rar
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
19.04.2012, 15:46
общий
Адресаты:

Оформите ответом, пожалуйста, раз автор не высказал никаких претензий.
Неизвестный
19.04.2012, 15:53
общий
это ответ
Здравствуйте, Бондаренко Сергей Николаевич!

Процедура подсчета дней выглядит так:
Код:
function kolday(d: date): integer;
const kd: array [1..12] of integer=(0,31,59,90,120,151,181,212,243,273,304,334);
var res: integer;
begin
{Расcчитаем количество дней в целых годах, с учетом високосных }
res := (d.y-1)*365 + (d.y-1) div 4;
{Прибавим количество дней в целых месяцах прошедших с начала года }
res := res + kd[d.m];
{Если год високосный и месяц даты после февраля нужно прибавить еще один поправочный день}
if (d.y mod 4=0) and (d.m>2) then res := res + 1;
{ Ну и наконец, прибавим количество дней прошедших от начала месяца}
res := res + (d.d-1);
kolday := res;
end;

С вопросами милости просим в мини-форум.

С уважением, Дмитрий
Неизвестный
19.04.2012, 21:00
общий
мне нужно,чтобы всё выводилось в концоле,а не в форме......с пояснениями пожалуйста
Неизвестный
20.04.2012, 06:57
общий
Тогда посмотрите это:
Код:
program CheckDays;

{$APPTYPE CONSOLE}

uses SysUtils;

{Описываем типы}
type day=1..31; mon=1..12; year=1..2000;
date=record
d:day;
m:mon;
y:year;
end;

{Описываем переменную для хранения текущей даты}
var curdat: date;

{Функция вычисления количества дней между d и 01.01.0001}
function kolday(d: date): integer;
const kd: array [1..12] of integer=(0,31,59,90,120,151,181,212,243,273,304,334);
var res: integer;
begin
{Расcчитаем количество дней в целых годах, с учетом високосных }
res := (d.y-1)*365 + (d.y-1) div 4;
{Прибавим количество дней в целых месяцах прошедших с начала года }
res := res + kd[d.m];
{Если год високосный и месяц даты после февраля нужно прибавить еще один поправочный день}
if (d.y mod 4=0) and (d.m>2) then res := res + 1;
{ Ну и наконец, прибавим количество дней прошедших от начала месяца}
res := res + (d.d-1);
kolday := res;
end;

{Основная программа}
begin
{ TODO -oUser -cConsole Main : Insert code here }
{Запрашиваем у пользователя день месяц и год даты}
write('Введите день: ');
readln(curdat.d);
write('Введите месяц: ');
readln(curdat.m);
write('Введите год: ');
readln(curdat.y);
writeln;
{Рассчитываем с помощью функции и выводим на экран искомое количество дней}
writeln('Количество дней между 01.01.0001 и ',curdat.d:2,'.',curdat.m:2,'.',curdat.y:4, kolday(curdat));
readln;
end.


С уважением, Дмитрий
Форма ответа