Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PL/I: Ongelman ratkontaa...

jalski [30.04.2012 21:54:56]

#

Vappu simoissa ja tylsyyksissäni sain päähäni kirjoitella viestiketjussa mainitun NetworkDays() funktion toteutuksen PL/I:llä.

Alla olevaan bittimerkkijono pohjaiseen ratkaisuun päädyin itse. Jos jollakin tulee mieleen parempi sekä suoraviivaisempi tapa toteutukseen niin sopii paljastaa oma ratkaisutapansa.

*PROCESS MARGINS(1, 140);

 t1: proc options (main);
   dcl from char (8) date ('DDMMYYYY');
   dcl to   char (8) date ('DDMMYYYY');
   dcl holidays (7) char (8) date ('DDMMYYYY')
       init ('01012012', '06012012', '01052012', '06122012', '24122012', '25122012', '26122012');

   from = '01122012';
   to   = '31122012';

   put skip list ('Number of working days in december 2012: ' || trim(workdays(from, to, holidays)));


   (STRINGRANGE, SUBSCRIPTRANGE):
   workdays: proc (from, to, holiday_list) returns (fixed bin (31));
     dcl (from, to) char (8) date ('DDMMYYYY');
     dcl holiday_list (*) char (8) date ('DDMMYYYY') optional;

     dcl (days_from, days_to, day) fixed bin (31);
     dcl total_days fixed bin (31);
     dcl week_index fixed bin (31);
     dcl nworkdays fixed bin (31);
	 dcl i fixed bin (31);
     dcl (result, holiday) bit (*) controlled;
     dcl weeks (7) bit (7) nonasgn init ('1000001'b, '0000011'b, '0000110'b, '0001100'b, '0011000'b, '0110000'b, '1100000'b);

	 dcl (days, weekday, tally, substr, lbound, hbound, copy, omitted) builtin;


     days_from = days(from, 'DDMMYYYY');
	 days_to   = days(to, 'DDMMYYYY');

     total_days = days_to - days_from + 1;
	 if total_days <= 0 then return (0);

     allocate result bit (total_days);

     week_index = weekday(days_from);
     result = copy(weeks(week_index), total_days / 7) || substr(weeks(week_index), 1, mod(total_days, 7));

     if ^omitted(holiday_list) then
       do;
         allocate holiday bit (total_days);
	     do i = lbound(holiday_list) to hbound(holiday_list);
		   day = days(holiday_list(i), 'DDMMYYYY');
		   if (day >= days_from) & (day <= days_to) then
             do;
               holiday = copy('0'b, day - days_from ) || '1'b || copy('0'b, days_to - day);
			   result = result | holiday;
             end;
           end;
          free holiday;
        end;

     nworkdays = tally(result, '0'b);
	 free result;

     return (nworkdays);

   end workdays;

 end t1;

groovyb [01.05.2012 00:48:44]

#

En jaksanut tehdä tarkistuksia sille, että onko esim helatorstai ja vappu samana päivänä, mutta tässä jotain sinneppäin:

using System;
using System.Collections.Generic;

namespace WorkingDays
{
    class Program
    {
        static void Main(string[] args)
        {
            bool ConvertState = false;
            int SelectedYear = 0;

            while (!ConvertState)
            {
                Console.Clear();
                Console.Write("Syötä haluttu vuosi: ");
                string input = Console.ReadLine();
                ConvertState = int.TryParse(input, out SelectedYear);

            }

            int VacationAmount = CountVacationDays(SelectedYear);
            DateTime FirstDay = new DateTime(SelectedYear,1,1);
            DateTime LastDay = new DateTime(SelectedYear,12,31);
            int WorkingDays = 0;
            if(DateTime.IsLeapYear(SelectedYear))
            {
                DateTime LeapDay = new DateTime(SelectedYear,2,29);
                if(LeapDay.DayOfWeek != DayOfWeek.Saturday && LeapDay.DayOfWeek != DayOfWeek.Sunday)
                WorkingDays++;

            }

            for (DateTime DT = FirstDay; DT < LastDay; DT = DT.AddDays(1))
            {
                if (DT.DayOfWeek != DayOfWeek.Saturday && DT.DayOfWeek != DayOfWeek.Sunday)
                    WorkingDays++;

            }

            WorkingDays = WorkingDays - VacationAmount;

            Console.WriteLine("Työpäiviä vuonna {0} on {1} kappaletta", SelectedYear.ToString(), WorkingDays.ToString());
            Console.ReadLine();
        }

        static int CountVacationDays(int Year)
        {
                List<DateTime> VacationList = new List<DateTime>();

                //Static Vacation Days
                VacationList.Add(new DateTime(Year, 1, 1));
                VacationList.Add(new DateTime(Year, 1, 6));
                VacationList.Add(new DateTime(Year, 5, 1));
                VacationList.Add(new DateTime(Year, 12, 6));
                VacationList.Add(new DateTime(Year, 12, 24));
                VacationList.Add(new DateTime(Year, 12, 25));
                VacationList.Add(new DateTime(Year, 12, 26));

                int MovingVacationDays = 4; //Helatorstai,pitkäperjantai, Pääsiäismaanantai,Juhannusaatto
                int TotalVacationDays = 0;

                VacationList.ForEach(delegate(DateTime date)
                {
                    if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday)
                        TotalVacationDays++;
                });

                TotalVacationDays += MovingVacationDays;

                return TotalVacationDays;

        }
    }
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta