home *** CD-ROM | disk | FTP | other *** search
/ Practical Windows/DOS 1999 November / PW48.ISO / CALEND30.ZIP / cal3.cpp next >
Encoding:
C/C++ Source or Header  |  1999-01-26  |  11.2 KB  |  7 lines

  1. /*
  2.     Calendar3.cpp
  3.     Program that allows the user to enter the year and outputs the year's calendar.
  4.     Amol Lodha -- 15 9 1998 -- CW10 - C++
  5. */
  6. //-------------------------------------------- include directives
  7. #include <iostream.h>
  8. #include "utility.h"
  9. #include <conio.h>  // Win 95
  10. #include <fstream.h>
  11. //-------------------------------------------- constants/type definitions
  12. //-------------------------------------------- function prototypes
  13. void GetInput (int & Year);
  14. void SetupCal (int Year, int M, bool file, fstream & outData);
  15. void PrintMonths (int M, int Year, bool file, fstream & outData);
  16. void SplitYear (int Year, int & C, int & YC);
  17. void FixMonth(int & M, int & Year);
  18. void Compute(int & DN, int M, int D, int YC, int C, int Year);
  19. void PrintDays(int D, int DN, int YC, int C, int Year, int M, int days, int & leftdays,
  20.     int & middays, int & rightdays, int & leftD, int & midD, int & rightD, bool file,
  21.     fstream & outData);
  22. void FindDays (int M, int Year, int & days);
  23. void FirstLine (int DN, int & D, int max, bool file, fstream & outData);
  24. void SaveToDisk(bool & save);
  25. //-------------------------------------------- main function
  26. int main()
  27. {
  28.     char again;
  29.     do
  30.     {
  31.         int Year, M = 1, D = 0, C = 0, YC = 0, days = 0, DN = 0;
  32.         int leftdays = 0, middays = 0, rightdays = 0, leftD = 0, midD = 0, rightD = 0;
  33.         char wait;
  34.         fstream outData;
  35.         outData.open ("file.txt", ios::out);
  36.         if (outData.fail())
  37.                 cout << "Error in reading file. Saving execution terminated.";
  38.         bool save = false, file = false;
  39.         GetInput (Year);
  40.         SetupCal (Year, 1, file, outData);
  41.         PrintDays(D, DN, YC, C, Year, 1, days, leftdays, middays, rightdays, leftD, midD, rightD,
  42.             file, outData);
  43.         SetupCal (Year, 4, file, outData);
  44.         PrintDays(D, DN, YC, C, Year, 4, days, leftdays, middays, rightdays, leftD, midD, rightD,
  45.             file, outData);
  46.         cin.ignore (80, '\n');
  47.         cout <<"Press return to continue: ";
  48.         cin.get(wait);
  49.         SetupCal (Year, 7, file, outData);
  50.         PrintDays(D, DN, YC, C, Year, 7, days, leftdays, middays, rightdays, leftD, midD, rightD,
  51.             file, outData);
  52.         cout << endl;
  53.         SetupCal (Year, 10, file, outData);
  54.         PrintDays(D, DN, YC, C, Year, 10, days, leftdays, middays, rightdays, leftD, midD, rightD,
  55.             file, outData);
  56.         SaveToDisk(save);
  57.         if (save == true)
  58.         {
  59.             clrscr();
  60.             cout << "Saving....";
  61.             file = true;
  62.             outData << "                      Calendar for the Year " << Year << endl;
  63.             SetupCal (Year, 1, file, outData);
  64.             PrintDays(D, DN, YC, C, Year, 1, days, leftdays, middays, rightdays, leftD, midD, rightD,
  65.                 file, outData);
  66.             outData << endl;
  67.             SetupCal (Year, 4, file, outData);
  68.             PrintDays(D, DN, YC, C, Year, 4, days, leftdays, middays, rightdays, leftD, midD, rightD,
  69.                 file, outData);
  70.             outData << endl;
  71.             SetupCal (Year, 7, file, outData);
  72.             PrintDays(D, DN, YC, C, Year, 7, days, leftdays, middays, rightdays, leftD, midD, rightD,
  73.                 file, outData);
  74.             outData << endl;
  75.             SetupCal (Year, 10, file, outData);
  76.             PrintDays(D, DN, YC, C, Year, 10, days, leftdays, middays, rightdays, leftD, midD, rightD,
  77.                 file, outData);
  78.             outData.close();
  79.             cout << "Done." << endl;
  80.             cout << "Your calendar is currently saved in the same directory as cal3.exe " << endl
  81.                 << "and is called file.txt" << endl;
  82.         }
  83.         cout << "Again? (y/n) ";
  84.         cin >> again;
  85.     }
  86.     while (again == 'Y' || again == 'y');
  87.     cout << "It is now safe to turn off this program.";
  88.     return 0;
  89. }
  90. //-------------------------------------------- function definitions
  91. void GetInput (int & Year)
  92. {
  93.     clrscr();
  94.     cout << "Enter the year (>= 1752): ";
  95.     cin >> Year;
  96.     while (Year < 1752)
  97.     {
  98.         cout << "Invalid Year!" << endl << "Enter the year (>= 1752): ";
  99.         cin >> Year;
  100.     }
  101. }
  102. void SetupCal (int Year, int M, bool file, fstream & outData)
  103. {
  104.     int i;
  105.     if (file == false)
  106.     {
  107.         if (M == 1 || M == 7)
  108.             clrscr();
  109.         cout << "                      Calendar for the Year " << Year << endl;
  110.         cout << "---------------------------------------------------------------------" << endl;
  111.         for (i = 0; i < 3; i++)
  112.         {
  113.             PrintMonths (M, Year, file, outData);
  114.             cout << "   ";
  115.             M++;
  116.         }
  117.         cout << endl << "---------------------   ---------------------   ---------------------";
  118.         cout << endl << " S  M  T  W  T  F  S     S  M  T  W  T  F  S     S  M  T  W  T  F  S";
  119.         cout << endl;
  120.     }
  121.     else
  122.     {
  123.         outData << "---------------------------------------------------------------------" << endl;
  124.         for (i = 0; i < 3; i++)
  125.         {
  126.             PrintMonths (M, Year, file, outData);
  127.             outData << "   ";
  128.             M++;
  129.         }
  130.         outData << endl << "---------------------   ---------------------   ---------------------";
  131.         outData << endl << " S  M  T  W  T  F  S     S  M  T  W  T  F  S     S  M  T  W  T  F  S";
  132.         outData << endl;
  133.     }
  134. }
  135. void PrintMonths (int M, int Year, bool file, fstream & outData)
  136. {
  137.     if (file == false)
  138.     {
  139.         switch (M)
  140.         {
  141.             case 1 : cout << "        Jan " << Year << "     ";
  142.             break;
  143.             case 2 : cout << "        Feb " << Year << "     ";
  144.             break;
  145.             case 3 : cout << "        Mar " << Year << "     ";
  146.             break;
  147.             case 4 : cout << "        Apr " << Year << "     ";
  148.             break;
  149.             case 5 : cout << "        May " << Year << "     ";
  150.             break;
  151.             case 6 : cout << "        Jun " << Year << "     ";
  152.             break;
  153.             case 7 : cout << "        Jul " << Year << "     ";
  154.             break;
  155.             case 8 : cout << "        Aug " << Year << "     ";
  156.             break;
  157.             case 9 : cout << "        Sep " << Year << "     ";
  158.             break;
  159.             case 10 : cout << "        Oct " << Year << "     ";
  160.             break;
  161.             case 11 : cout << "        Nov " << Year << "     ";
  162.             break;
  163.             case 12 : cout << "        Dec " << Year << "     ";
  164.             break;
  165.         }
  166.     }
  167.     else
  168.     {
  169.         switch (M)
  170.         {
  171.             case 1 : outData << "        Jan " << Year << "     ";
  172.             break;
  173.             case 2 : outData << "        Feb " << Year << "     ";
  174.             break;
  175.             case 3 : outData << "        Mar " << Year << "     ";
  176.             break;
  177.             case 4 : outData << "        Apr " << Year << "     ";
  178.             break;
  179.             case 5 : outData << "        May " << Year << "     ";
  180.             break;
  181.             case 6 : outData << "        Jun " << Year << "     ";
  182.             break;
  183.             case 7 : outData << "        Jul " << Year << "     ";
  184.             break;
  185.             case 8 : outData << "        Aug " << Year << "     ";
  186.             break;
  187.             case 9 : outData << "        Sep " << Year << "     ";
  188.             break;
  189.             case 10 : outData << "        Oct " << Year << "     ";
  190.             break;
  191.             case 11 : outData << "        Nov " << Year << "     ";
  192.             break;
  193.             case 12 : outData << "        Dec " << Year << "     ";
  194.             break;
  195.         }
  196.     }
  197. }
  198. void PrintDays(int D, int DN, int YC, int C, int Year, int M, int days, int & leftdays,
  199.     int & middays, int & rightdays, int & leftD, int & midD, int & rightD, bool file,
  200.     fstream & outData)
  201. {
  202.     D = 1;
  203.     int daynum = 0, count, max;
  204.     max = M + 2;
  205.     for (count = M; count <= max; count++)
  206.     {
  207.         D = 1;
  208.         Compute (DN, count, D, YC, C, Year);
  209.         FirstLine (DN, D, 9, file, outData);
  210.         if (file == false)
  211.             cout << "    ";
  212.         else
  213.             outData << "    ";
  214.         FindDays (count, Year, days);
  215.         if (count == 1 || count == 4 || count == 7 || count == 10)
  216.         {
  217.             leftdays = days;
  218.             leftD = D;
  219.         }
  220.         else if (count == 2 || count == 5 || count == 8 || count == 11)
  221.         {
  222.             middays = days;
  223.             midD = D;
  224.         }
  225.         else
  226.         {
  227.             rightdays = days;
  228.             rightD = D;
  229.         }
  230.     }
  231.     if (file == false)
  232.         cout << endl;
  233.     else
  234.         outData << endl;
  235.     while (leftD <= rightdays || midD <= middays || rightD <= rightdays)
  236.     {
  237.         for (count = M; count <= max; count++)
  238.         {
  239.             if (count == 1 || count == 4 || count == 7 || count == 10)
  240.             {
  241.                 FirstLine(0, leftD, leftdays, file, outData);
  242.                 if (file == false)
  243.                     cout << "    ";
  244.                 else
  245.                     outData << "    ";
  246.             }
  247.             else if (count == 2 || count == 5 || count == 8 || count == 11)
  248.             {
  249.                 FirstLine(0, midD, middays, file, outData);
  250.                 if (file == false)
  251.                     cout << "    ";
  252.                 else
  253.                     outData << "    ";
  254.             }
  255.             else
  256.             {
  257.                 FirstLine(0, rightD, rightdays, file, outData);
  258.                 if (file == false)
  259.                     cout << endl;
  260.                 else
  261.                     outData << endl;
  262.             }
  263.         }
  264.     }
  265. }
  266. void Compute (int & DN, int M, int D, int YC, int C, int Year)
  267. {
  268.  
  269.     FixMonth (M, Year);
  270.     SplitYear (Year, C, YC);
  271.     DN = ((13 * M - 1) / 5 + D + YC + YC / 4 + C / 4 - 2 * C) % 7;
  272.     while (DN < 0)
  273.         DN = DN + 7;
  274. }
  275. void FixMonth (int & M, int & Year)
  276. {
  277.     if (M == 1 || M == 2)
  278.     {
  279.         M = M + 10;
  280.         Year = Year - 1;
  281.     }
  282.     else
  283.         M = M - 2;
  284. }
  285. void SplitYear (int Year, int & C, int & YC)
  286. {
  287.     C = Year / 100;
  288.     YC = Year - C * 100;
  289. }
  290. void FindDays (int M, int Year, int & days)
  291. {
  292.     if (M == 2 && Year % 400 == 0)
  293.         days = 29;
  294.     else if (M == 2 && Year % 100 == 0)
  295.         days = 28;
  296.     else if (M == 2    && Year % 4 == 0)
  297.         days = 29;
  298.     else if (M == 2)
  299.         days = 28;
  300.     else if (M == 1 || M == 3 || M == 5 || M == 7 || M == 8 || M == 10 || M == 12)
  301.         days = 31;
  302.     else
  303.         days = 30;
  304. }
  305. void FirstLine (int DN, int & D, int max, bool file, fstream & outData)
  306. {
  307.     int i = 0;
  308.     if (file == false)
  309.     {
  310.         if (D <= max)
  311.         {
  312.             if (D < 10)
  313.             {
  314.                 switch (DN)
  315.                 {
  316.                     case 0: cout << " " << D; // SUNDAY
  317.                     break;
  318.                     case 1: cout << "    "  << D; // MONDAY
  319.                     break;
  320.                     case 2: cout << "       " << D; // TUESDAY
  321.                     break;
  322.                     case 3: cout << "          " << D; // WEDNESDAY
  323.                     break;
  324.                     case 4: cout << "             " << D; // THURSDAY
  325.                     break;
  326.                     case 5: cout << "                " << D; // FRIDAY
  327.                     break;
  328.                     case 6: cout << "                   " << D; // SATURDAY
  329.                     break;
  330.                 }
  331.             }
  332.             else
  333.             {
  334.                 switch (DN)
  335.                 {
  336.                     case 0: cout << D; // SUNDAY
  337.                     break;
  338.                     case 1: cout << "   "  << D; // MONDAY
  339.                     break;
  340.                     case 2: cout << "      " << D; // TUESDAY
  341.                     break;
  342.                     case 3: cout << "         " << D; // WEDNESDAY
  343.                     break;
  344.                     case 4: cout << "            " << D; // THURSDAY
  345.                     break;
  346.                     case 5: cout << "               " << D; // FRIDAY
  347.                     break;
  348.                     case 6: cout << "                  " << D; // SATURDAY
  349.                     break;
  350.                 }
  351.             }
  352.             D++;
  353.             i = DN + 2;
  354.             while (i <= 7)
  355.             {
  356.                 if (D <= max)
  357.                 {
  358.                     if (D < 10)
  359.                         cout << "  " << D;
  360.                     else
  361.                         cout << " " << D;
  362.                 }
  363.                 else
  364.                     cout << "   ";
  365.                 D++;
  366.                 i++;
  367.             }
  368.         }
  369.         else
  370.             cout << "                    ";
  371.     }
  372.     else
  373.     {
  374.         if (D <= max)
  375.         {
  376.             if (D < 10)
  377.             {
  378.                 switch (DN)
  379.                 {
  380.                     case 0: outData << " " << D; // SUNDAY
  381.                     break;
  382.                     case 1: outData << "    "  << D; // MONDAY
  383.                     break;
  384.                     case 2: outData << "       " << D; // TUESDAY
  385.                     break;
  386.                     case 3: outData << "          " << D; // WEDNESDAY
  387.                     break;
  388.                     case 4: outData << "             " << D; // THURSDAY
  389.                     break;
  390.                     case 5: outData << "                " << D; // FRIDAY
  391.                     break;
  392.                     case 6: outData << "                   " << D; // SATURDAY
  393.                     break;
  394.                 }
  395.             }
  396.             else
  397.             {
  398.                 switch (DN)
  399.                 {
  400.                     case 0: outData << D; // SUNDAY
  401.                     break;
  402.                     case 1: outData << "   "  << D; // MONDAY
  403.                     break;
  404.                     case 2: outData << "      " << D; // TUESDAY
  405.                     break;
  406.                     case 3: outData << "         " << D; // WEDNESDAY
  407.                     break;
  408.                     case 4: outData << "            " << D; // THURSDAY
  409.                     break;
  410.                     case 5: outData << "               " << D; // FRIDAY
  411.                     break;
  412.                     case 6: outData << "                  " << D; // SATURDAY
  413.                     break;
  414.                 }
  415.             }
  416.             D++;
  417.             i = DN + 2;
  418.             while (i <= 7)
  419.             {
  420.                 if (D <= max)
  421.                 {
  422.                     if (D < 10)
  423.                         outData << "  " << D;
  424.                     else
  425.                         outData << " " << D;
  426.                 }
  427.                 else
  428.                     outData << "   ";
  429.                 D++;
  430.                 i++;
  431.             }
  432.         }
  433.         else
  434.             outData << "                    ";
  435.     }
  436.  
  437. }
  438. void SaveToDisk(bool & save)
  439. {
  440.     char ans;
  441.     cout << "Save calendar to disk? (y/n) ";
  442.     cin >> ans;
  443.     if (ans == 'y' || ans == 'Y')
  444.         save = true;
  445. }
  446.