Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Definition for arrays:
- // typedef struct arr_##name {
- // int size;
- // type *arr;
- // } arr_##name;
- //
- // arr_##name alloc_arr_##name(int len) {
- // arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};
- // return a;
- // }
- //
- //
- int is_leap_foo (int year) {
- if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
- return 1;
- else
- return 0;
- }
- arr_string recurringTask(char * firstDate, int k, arr_string daysOfTheWeek, int n) {
- // if (n == 0) {
- // arr_string empty = alloc_arr_string(n);
- // return empty;
- // }
- printf("%s", firstDate);
- int mon_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- int mon_days_leap[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- int year_of_go = 1590;
- int day_of_go = 1;
- int month_of_go = 1;
- struct day {
- int day;
- int month;
- int year;
- int day_of_week_num;
- } days[n];
- char num[10] = {0};
- int i = 0;
- num[0] = firstDate[0];
- num[1] = firstDate[1];
- num[2] = '\0';
- days[0].day = atoi(num);
- num[0] = firstDate[3];
- num[1] = firstDate[4];
- num[2] = '\0';
- days[0].month = atoi(num);
- num[0] = firstDate[6];
- num[1] = firstDate[7];
- num[2] = firstDate[8];
- num[3] = firstDate[9];
- num[4] = '\0';
- days[0].year = atoi(num);
- int is_leap;
- if ((days[0].year % 4 == 0 && days[0].year % 100 != 0) || (days[0].year % 400 == 0))
- is_leap = 1;
- else
- is_leap = 0;
- int days_count = 0;
- for (int i = year_of_go ; i < days[0].year; i++) {
- if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
- days_count += 366;
- else
- days_count += 365;
- }
- for (int i = month_of_go; i < days[0].month; i++) {
- if (i == 2 && is_leap == 1)
- days_count += 29;
- else if (i == 2 && is_leap == 0)
- days_count += 28;
- else
- days_count += mon_days[i - 1];
- }
- days_count += days[0].day - 1;
- switch(days_count%7) {
- case 1:
- days[0].day_of_week_num = 2;
- break;
- case 2:
- days[0].day_of_week_num = 3;
- break;
- case 3:
- days[0].day_of_week_num = 4;
- break;
- case 4:
- days[0].day_of_week_num = 5;
- break;
- case 5:
- days[0].day_of_week_num = 6;
- break;
- case 6:
- days[0].day_of_week_num = 7;
- break;
- case 0:
- days[0].day_of_week_num = 1;
- break;
- }
- //=================================================================
- //=================================================================
- //=================================================================
- //=================================================================
- //
- int* needed_days = malloc(sizeof(int) * daysOfTheWeek.size);
- for (int i = 0; i < daysOfTheWeek.size; i++) {
- if (strcmp(daysOfTheWeek.arr[i], "Monday") == 0)
- needed_days[i] = 1;
- else if (strcmp(daysOfTheWeek.arr[i], "Tuesday") == 0)
- needed_days[i] = 2;
- else if (strcmp(daysOfTheWeek.arr[i], "Wednesday") == 0)
- needed_days[i] = 3;
- else if (strcmp(daysOfTheWeek.arr[i], "Thursday") == 0)
- needed_days[i] = 4;
- else if (strcmp(daysOfTheWeek.arr[i], "Friday") == 0)
- needed_days[i] = 5;
- else if (strcmp(daysOfTheWeek.arr[i], "Saturday") == 0)
- needed_days[i] = 6;
- else
- needed_days[i] = 7;
- }
- printf("\n");
- for (int i = 0; i < daysOfTheWeek.size; i++) {
- printf("%d ", needed_days[i]);
- }
- int first_index;
- for (int i = 0; i < daysOfTheWeek.size; i++) {
- if (needed_days[i] == days[0].day_of_week_num) {
- first_index = i;
- break;
- }
- }
- int* needed_days_fir = malloc(sizeof(int) * daysOfTheWeek.size);
- int* needed_days_sec = malloc(sizeof(int) * daysOfTheWeek.size);
- int fir = 0;
- int sec = 0;
- for (int i = 0; i < daysOfTheWeek.size; i++) {
- if (needed_days[i] >= needed_days[first_index]) {
- needed_days_fir[fir] = needed_days[i];
- ++fir;
- } else {
- needed_days_sec[sec] = needed_days[i];
- ++sec;
- }
- }
- for (int i = 0; i < fir; i++) {
- for (int j = i + 1; j < fir; j++) {
- if (needed_days_fir[j] < needed_days_fir[i]) {
- int temp = needed_days_fir[i];
- needed_days_fir[i] = needed_days_fir[j];
- needed_days_fir[j] = temp;
- }
- }
- }
- for (int i = 0; i < sec; i++) {
- for (int j = i + 1; j < sec; j++) {
- if (needed_days_sec[j] < needed_days_sec[i]) {
- int temp = needed_days_sec[i];
- needed_days_sec[i] = needed_days_sec[j];
- needed_days_sec[j] = temp;
- }
- }
- }
- int splush = 0;
- for (int i = 0; i < fir; i++) {
- needed_days[splush++] = needed_days_fir[i];
- }
- for (int i = 0; i < sec; i++) {
- needed_days[splush++] = needed_days_sec[i];
- }
- printf("\n");
- for (int i = 0; i < daysOfTheWeek.size; i++) {
- printf("%d ", needed_days[i]);
- }
- int* needed_days_sub = malloc(sizeof(int) * daysOfTheWeek.size);
- for (int i = 0; i < daysOfTheWeek.size; i++) {
- if (daysOfTheWeek.size == 1) {
- needed_days_sub[0] = 0;
- break;
- } else if (i == daysOfTheWeek.size - 1) {
- if (needed_days[0] < needed_days[i])
- needed_days_sub[i] = 7 - needed_days[i] + needed_days[0];
- else if (needed_days[0] == needed_days[i])
- needed_days_sub[i] = 7;
- else
- needed_days_sub[i] = needed_days[0] - needed_days[i];
- } else {
- if (needed_days[i] > needed_days[i + 1])
- needed_days_sub[i] = 7 - needed_days[i] + needed_days[i + 1];
- else if (needed_days[i] == needed_days[i + 1])
- needed_days_sub[i] = 7;
- else
- needed_days_sub[i] = needed_days[i + 1] - needed_days[i];
- }
- }
- //=================================================================
- //=================================================================
- //=================================================================
- //=================================================================
- //=================================================================
- //=================================================================
- //=================================================================
- //=================================================================
- int count = 1;
- int j = 0;
- struct day reference = days[0];
- for (int i = 1; i < n; i++) {
- if (count != daysOfTheWeek.size) {
- days[i].day = days[i - 1].day + needed_days_sub[j];
- ++j;
- ++count;
- days[i].month = days[i - 1].month;
- days[i].year = days[i - 1].year;
- if (days[i].month == 2 && days[i].day > 28 && (!is_leap_foo(days[i].year))) {
- days[i].month++;
- days[i].day = days[i].day - 28;
- }
- else if (days[i].month == 2 && days[i].day > 29 && (!is_leap_foo(days[i].year))) {
- days[i].month++;
- days[i].day = days[i].day - 29;
- }
- else if ((days[i].month == 1 || days[i].month == 3 || days[i].month == 5 || days[i].month == 7 || days[i].month == 8 ||
- days[i].month == 10 || days[i].month == 12) && days[i].day > 31) {
- days[i].month++;
- days[i].day = days[i].day - 31;
- }
- else if ((days[i].month == 4 || days[i].month == 6 || days[i].month == 9 || days[i].month == 11) && days[i].day > 30) {
- days[i].month++;
- days[i].day = days[i].day - 30;
- }
- if (days[i].month == 13) {
- days[i].month = 1;
- days[i].year++;
- }
- }
- else {
- count = 1;
- j = 0;
- for (int l = 0; l < k; l++) {
- reference.day = reference.day + 7;
- if (reference.month == 2 && reference.day > 28 && (!is_leap_foo(reference.year))) {
- reference.month++;
- reference.day = reference.day - 28;
- }
- else if (reference.month == 2 && reference.day > 29 && (is_leap_foo(reference.year))) {
- reference.month++;
- reference.day = reference.day - 29;
- }
- else if ((reference.month == 1 || reference.month == 3 || reference.month == 5 || reference.month == 7 ||
- reference.month == 8 || reference.month == 10 || reference.month == 12) && reference.day > 31) {
- reference.month++;
- reference.day = reference.day - 31;
- }
- else if ((reference.month == 4 || reference.month == 6 || reference.month == 9 || reference.month == 11) &&
- reference.day > 30) {
- reference.month++;
- reference.day = reference.day - 30;
- }
- if (reference.month == 13) {
- reference.month = 1;
- reference.year++;
- }
- }
- days[i] = reference;
- }
- }
- free(needed_days);
- free(needed_days_sub);
- free(needed_days_fir);
- free(needed_days_sec);
- //=================================================================
- //=================================================================
- //=================================================================
- //=================================================================
- struct day temp_str;
- for (int i = 0; i < n; i++) {
- for (int j = i + 1; j < n; j++) {
- if ((days[j].year < days[i].year) ||
- ((days[j].month < days[i].month) && (days[j].year == days[i].year)) ||
- ((days[j].day < days[i].day) && (days[j].month == days[i].month) && (days[j].year == days[i].year))) {
- temp_str = days[i];
- days[i] = days[j];
- days[j] = temp_str;
- }
- }
- }
- arr_string rez = alloc_arr_string(n);
- char str[15];
- for (int i = 0; i < n; i++) {
- sprintf(str, "%.2d/%.2d/%.4d", days[i].day, days[i].month, days[i].year);
- rez.arr[i] = malloc(15 * sizeof(char));
- strcpy(rez.arr[i], str);
- }
- return rez;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement