Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.25 KB | None | 0 0
  1. // Definition for arrays:
  2. // typedef struct arr_##name {
  3. //   int size;
  4. //   type *arr;
  5. // } arr_##name;
  6. //
  7. // arr_##name alloc_arr_##name(int len) {
  8. //   arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};
  9. //   return a;
  10. // }
  11. //
  12. //
  13.  
  14. int is_leap_foo (int year) {
  15.     if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
  16.         return 1;
  17.     else
  18.         return 0;
  19. }
  20.  
  21. arr_string recurringTask(char * firstDate, int k, arr_string daysOfTheWeek, int n) {
  22.     // if (n == 0) {
  23.     //     arr_string empty = alloc_arr_string(n);
  24.     //     return empty;    
  25.     // }
  26.     printf("%s", firstDate);
  27.    
  28.     int mon_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  29.     int mon_days_leap[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  30.    
  31.     int year_of_go = 1590;
  32.     int day_of_go = 1;
  33.     int month_of_go = 1;
  34.     struct day {
  35.         int day;
  36.         int month;
  37.         int year;
  38.         int day_of_week_num;
  39.     } days[n];
  40.     char num[10] = {0};
  41.     int i = 0;
  42.     num[0] = firstDate[0];
  43.     num[1] = firstDate[1];
  44.     num[2] = '\0';
  45.     days[0].day = atoi(num);
  46.     num[0] = firstDate[3];
  47.     num[1] = firstDate[4];
  48.     num[2] = '\0';
  49.     days[0].month = atoi(num);
  50.     num[0] = firstDate[6];
  51.     num[1] = firstDate[7];
  52.     num[2] = firstDate[8];
  53.     num[3] = firstDate[9];
  54.     num[4] = '\0';
  55.     days[0].year = atoi(num);
  56.     int is_leap;
  57.     if ((days[0].year % 4 == 0 && days[0].year % 100 != 0) || (days[0].year % 400 == 0))
  58.         is_leap = 1;
  59.     else
  60.         is_leap = 0;
  61.    
  62.     int days_count = 0;
  63.     for (int i = year_of_go ; i < days[0].year; i++) {
  64.        if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
  65.            days_count += 366;
  66.         else
  67.             days_count += 365;
  68.     }
  69.    
  70.     for (int i = month_of_go; i < days[0].month; i++) {
  71.         if (i == 2 && is_leap == 1)
  72.            days_count += 29;
  73.         else if (i == 2 && is_leap == 0)
  74.             days_count += 28;
  75.         else
  76.             days_count += mon_days[i - 1];
  77.     }
  78.    
  79.     days_count += days[0].day - 1;
  80.    
  81.     switch(days_count%7) {
  82.         case 1:
  83.             days[0].day_of_week_num = 2;
  84.             break;
  85.         case 2:
  86.             days[0].day_of_week_num = 3;
  87.             break;
  88.         case 3:
  89.             days[0].day_of_week_num = 4;
  90.             break;
  91.         case 4:
  92.             days[0].day_of_week_num = 5;
  93.             break;
  94.         case 5:
  95.             days[0].day_of_week_num = 6;
  96.             break;
  97.         case 6:
  98.             days[0].day_of_week_num = 7;
  99.             break;
  100.         case 0:
  101.             days[0].day_of_week_num = 1;
  102.             break;
  103.     }
  104.    
  105.    
  106.     //=================================================================
  107.     //=================================================================
  108.     //=================================================================
  109.     //=================================================================
  110.     //
  111.     int* needed_days = malloc(sizeof(int) * daysOfTheWeek.size);
  112.     for (int i = 0; i < daysOfTheWeek.size; i++) {
  113.         if (strcmp(daysOfTheWeek.arr[i], "Monday") == 0)
  114.             needed_days[i] = 1;
  115.         else if (strcmp(daysOfTheWeek.arr[i], "Tuesday") == 0)
  116.             needed_days[i] = 2;
  117.         else if (strcmp(daysOfTheWeek.arr[i], "Wednesday") == 0)
  118.             needed_days[i] = 3;
  119.         else if (strcmp(daysOfTheWeek.arr[i], "Thursday") == 0)
  120.             needed_days[i] = 4;
  121.         else if (strcmp(daysOfTheWeek.arr[i], "Friday") == 0)
  122.             needed_days[i] = 5;
  123.         else if (strcmp(daysOfTheWeek.arr[i], "Saturday") == 0)
  124.             needed_days[i] = 6;
  125.         else
  126.             needed_days[i] = 7;
  127.     }
  128.    
  129.     printf("\n");
  130.     for (int i = 0; i < daysOfTheWeek.size; i++) {
  131.         printf("%d ", needed_days[i]);
  132.     }
  133.    
  134.    
  135.     int first_index;
  136.    
  137.     for (int i = 0; i < daysOfTheWeek.size; i++) {
  138.         if (needed_days[i] == days[0].day_of_week_num) {
  139.             first_index = i;
  140.             break;
  141.         }            
  142.     }
  143.    
  144.     int* needed_days_fir = malloc(sizeof(int) * daysOfTheWeek.size);
  145.     int* needed_days_sec = malloc(sizeof(int) * daysOfTheWeek.size);
  146.    
  147.    
  148.     int fir = 0;
  149.     int sec = 0;
  150.     for (int i = 0; i < daysOfTheWeek.size; i++) {
  151.         if (needed_days[i] >= needed_days[first_index]) {
  152.             needed_days_fir[fir] = needed_days[i];
  153.             ++fir;
  154.         } else {
  155.             needed_days_sec[sec] = needed_days[i];
  156.             ++sec;
  157.         }
  158.     }
  159.    
  160.    
  161.    
  162.         for (int i = 0; i < fir; i++) {
  163.             for (int j = i + 1; j < fir; j++) {
  164.                 if (needed_days_fir[j] < needed_days_fir[i]) {
  165.                     int temp = needed_days_fir[i];
  166.                     needed_days_fir[i] = needed_days_fir[j];
  167.                     needed_days_fir[j] = temp;
  168.                 }
  169.             }
  170.         }
  171.    
  172.    
  173.    
  174.         for (int i = 0; i < sec; i++) {
  175.             for (int j = i + 1; j < sec; j++) {
  176.                 if (needed_days_sec[j] < needed_days_sec[i]) {
  177.                     int temp = needed_days_sec[i];
  178.                     needed_days_sec[i] = needed_days_sec[j];
  179.                     needed_days_sec[j] = temp;
  180.                 }
  181.             }
  182.         }
  183.    
  184.     int splush = 0;
  185.    
  186.     for (int i = 0; i < fir; i++) {
  187.         needed_days[splush++] = needed_days_fir[i];
  188.     }
  189.    
  190.     for (int i = 0; i < sec; i++) {
  191.         needed_days[splush++] = needed_days_sec[i];
  192.     }
  193.    
  194.     printf("\n");
  195.     for (int i = 0; i < daysOfTheWeek.size; i++) {
  196.         printf("%d ", needed_days[i]);
  197.     }
  198.    
  199.    
  200.     int* needed_days_sub = malloc(sizeof(int) * daysOfTheWeek.size);
  201.    
  202.     for (int i = 0; i < daysOfTheWeek.size; i++) {
  203.         if (daysOfTheWeek.size == 1) {
  204.             needed_days_sub[0] = 0;
  205.             break;
  206.         } else if (i == daysOfTheWeek.size - 1) {
  207.             if (needed_days[0] < needed_days[i])
  208.                 needed_days_sub[i] = 7 - needed_days[i] + needed_days[0];
  209.             else if (needed_days[0] == needed_days[i])
  210.                 needed_days_sub[i] = 7;
  211.             else
  212.                 needed_days_sub[i] = needed_days[0] - needed_days[i];
  213.         } else {
  214.             if (needed_days[i] > needed_days[i + 1])
  215.                needed_days_sub[i] = 7 - needed_days[i] + needed_days[i + 1];
  216.             else if (needed_days[i] == needed_days[i + 1])
  217.                needed_days_sub[i] = 7;
  218.             else
  219.                needed_days_sub[i] = needed_days[i + 1] - needed_days[i];
  220.         }
  221.            
  222.     }
  223.    
  224.     //=================================================================
  225.     //=================================================================
  226.     //=================================================================
  227.     //=================================================================
  228.    
  229.    
  230.    
  231.    
  232.    
  233.    
  234.    
  235.    
  236.    
  237.     //=================================================================
  238.     //=================================================================
  239.     //=================================================================
  240.     //=================================================================
  241.    
  242.    
  243.     int count = 1;
  244.     int j = 0;
  245.     struct day reference = days[0];
  246.    
  247.     for (int i = 1; i < n; i++) {
  248.         if (count != daysOfTheWeek.size) {
  249.             days[i].day = days[i - 1].day + needed_days_sub[j];
  250.             ++j;
  251.             ++count;
  252.             days[i].month = days[i - 1].month;
  253.             days[i].year = days[i - 1].year;
  254.             if (days[i].month == 2 && days[i].day > 28 && (!is_leap_foo(days[i].year))) {
  255.                 days[i].month++;
  256.                 days[i].day = days[i].day - 28;
  257.             }
  258.             else if (days[i].month == 2 && days[i].day > 29 && (!is_leap_foo(days[i].year))) {
  259.                 days[i].month++;
  260.                 days[i].day = days[i].day - 29;
  261.             }
  262.             else if ((days[i].month == 1 || days[i].month == 3 || days[i].month == 5 || days[i].month == 7 || days[i].month == 8 ||
  263.                       days[i].month == 10 || days[i].month == 12) && days[i].day > 31) {
  264.                 days[i].month++;
  265.                 days[i].day = days[i].day - 31;
  266.             }
  267.             else if ((days[i].month == 4 || days[i].month == 6 || days[i].month == 9 || days[i].month == 11) && days[i].day > 30) {
  268.                 days[i].month++;
  269.                 days[i].day = days[i].day - 30;
  270.             }
  271.             if (days[i].month == 13) {
  272.                 days[i].month = 1;
  273.                 days[i].year++;
  274.             }
  275.         }
  276.         else {
  277.             count = 1;
  278.             j = 0;
  279.             for (int l = 0; l < k; l++) {
  280.                 reference.day = reference.day + 7;
  281.                 if (reference.month == 2 && reference.day > 28 && (!is_leap_foo(reference.year))) {
  282.                     reference.month++;
  283.                     reference.day = reference.day - 28;
  284.                 }
  285.                 else if (reference.month == 2 && reference.day > 29 && (is_leap_foo(reference.year))) {
  286.                     reference.month++;
  287.                     reference.day = reference.day - 29;
  288.                 }
  289.                 else if ((reference.month == 1 || reference.month == 3 || reference.month == 5 || reference.month == 7 ||
  290.                           reference.month == 8 || reference.month == 10 || reference.month == 12) && reference.day > 31) {
  291.                     reference.month++;
  292.                     reference.day = reference.day - 31;
  293.                 }
  294.                 else if ((reference.month == 4 || reference.month == 6 || reference.month == 9 || reference.month == 11) &&
  295.                           reference.day > 30) {
  296.                     reference.month++;
  297.                     reference.day = reference.day - 30;
  298.                 }
  299.                 if (reference.month == 13) {
  300.                     reference.month = 1;
  301.                     reference.year++;
  302.                 }
  303.             }
  304.             days[i] = reference;  
  305.         }
  306.     }
  307.    
  308.     free(needed_days);
  309.     free(needed_days_sub);
  310.     free(needed_days_fir);
  311.     free(needed_days_sec);
  312.    
  313.     //=================================================================
  314.     //=================================================================
  315.     //=================================================================
  316.     //=================================================================
  317.  
  318.     struct day temp_str;
  319.     for (int i = 0; i < n; i++) {
  320.         for (int j = i + 1; j < n; j++) {
  321.             if ((days[j].year < days[i].year) ||
  322.                 ((days[j].month < days[i].month) && (days[j].year == days[i].year)) ||
  323.                 ((days[j].day < days[i].day) && (days[j].month == days[i].month) && (days[j].year == days[i].year))) {                
  324.                 temp_str = days[i];
  325.                 days[i] = days[j];
  326.                 days[j] = temp_str;
  327.             }
  328.         }
  329.     }
  330.        
  331.     arr_string rez = alloc_arr_string(n);
  332.     char str[15];
  333.        
  334.     for (int i = 0; i < n; i++) {
  335.         sprintf(str, "%.2d/%.2d/%.4d", days[i].day, days[i].month, days[i].year);
  336.         rez.arr[i] = malloc(15 * sizeof(char));
  337.         strcpy(rez.arr[i], str);
  338.     }
  339.    
  340.    
  341.     return rez;
  342.    
  343. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement