我正在嘗試將持續時間以分鐘為單位的課程添加到作業日從 8:00 到 21:00 舉行的每周計劃中。課程應添加到第一個免費學期。
我的演算法如下:
- 我將每節課轉換為分鐘,并將其與 1260 進行比較(因為 21 小時等于 1260 分鐘)
- 如果數字小于或等于 1260,則應將其添加到上學期末
- 如果數字大于 1260,則應在從 8:00 開始的新作業日添加
代碼:
#include <stdio.h>
#include <string.h>
struct Time {
int hour, minute;
} start, end;
struct Class {
char subject[100];
struct Time start, end;
} schedule[100];
int add = 0;
void add_class(struct Class schedule[], int number_of_classes, char *subject,
int duration) {
int time_in_minutes;
add = duration;
schedule[0].start.hour = 8;
schedule[0].start.minute = 0;
if (number_of_classes == 0) {
time_in_minutes =
(schedule->start.hour) * 60 schedule->start.minute duration;
schedule->end.hour = (int)(time_in_minutes / 60);
schedule->end.minute = time_in_minutes - (schedule->end.hour) * 60;
strcpy(schedule[number_of_classes].subject, subject);
} else {
int previous = number_of_classes - 1;
int temp_hour = schedule[previous].end.hour;
int temp_minute = schedule[previous].end.minute;
time_in_minutes = temp_hour * 60 temp_minute duration;
if (time_in_minutes <= 1260) {
strcpy(schedule[number_of_classes].subject, subject);
schedule[number_of_classes].start.hour = temp_hour;
schedule[number_of_classes].start.minute = temp_minute;
schedule[number_of_classes].end.hour = (int)(time_in_minutes / 60);
schedule[number_of_classes].end.minute =
time_in_minutes - (schedule[number_of_classes].end.hour) * 60;
}
if (time_in_minutes > 1260) {
time_in_minutes = 8 * 60 duration;
schedule[number_of_classes].start.hour = 8;
schedule[number_of_classes].start.minute = 0;
schedule[number_of_classes].end.hour = (int)(time_in_minutes / 60);
schedule[number_of_classes].end.minute =
time_in_minutes - (schedule[number_of_classes].end.hour) * 60;
strcpy(schedule[number_of_classes].subject, subject);
}
}
}
void print_day(int day) {
switch (day) {
case 0:
printf("MONDAY:\n");
break;
case 1:
printf("TUESDAY:\n");
break;
case 2:
printf("WEDNESDAY:\n");
break;
case 3:
printf("THURSDAY:\n");
break;
case 4:
printf("FRIDAY:\n");
break;
default:
printf("WRONG\n");
}
}
void print_schedule(struct Class schedule[], int number_of_classes) {
int i;
int day_printed = 0;
int day = 0;
for (i = 0; i < number_of_classes; i ) {
if (day_printed == 0)
print_day(day);
if (schedule[i].start.hour > 9)
printf("%d:", schedule[i].start.hour);
else
printf("0%d:", schedule[i].start.hour);
if (schedule[i].start.minute > 9)
printf("%d - ", schedule[i].start.minute);
else
printf("0%d - ", schedule[i].start.minute);
if (schedule[i].end.hour > 9)
printf("%d:", schedule[i].end.hour);
else
printf("0%d:", schedule[i].end.hour);
if (schedule[i].end.minute > 9)
printf("%d ", schedule[i].end.minute);
else
printf("0%d ", schedule[i].end.minute);
int time_in_minutes =
(schedule[i].end.hour) * 60 schedule[i].end.minute add;
printf("%s\n", schedule[i].subject);
day_printed ;
if (time_in_minutes > 1260) {
day ;
day_printed = 0;
}
}
}
void main() {
int duration_arr[10] = {100, 200, 100, 300, 500, 600, 200, 100, 400, 300}, i;
char subject_arr[10][15] = {
"Subject 1", "Subject 2", "Subject 3", "Subject 4", "Subject 5",
"Subject 6", "Subject 7", "Subject 8", "Subject 9", "Subject 10"};
for (i = 0; i < 10; i )
add_class(schedule, i, subject_arr[i], duration_arr[i]);
print_schedule(schedule, 10);
}
我的輸出:
MONDAY:
08:00 - 09:40 Subject 1
09:40 - 13:00 Subject 2
13:00 - 14:40 Subject 3
14:40 - 19:40 Subject 4
TUESDAY:
08:00 - 16:20 Subject 5
WEDNESDAY:
08:00 - 18:00 Subject 6
THURSDAY:
08:00 - 11:20 Subject 7
11:20 - 13:00 Subject 8
13:00 - 19:40 Subject 9
FRIDAY:
08:00 - 13:00 Subject 10
正確的輸出應該是星期二的主題 7(因為主題 10 會移到星期四),就像這樣。
我的想法是:
- 從零索引開始,并檢查是否已將課程學期添加到計劃中
- 如果添加了繼續
- 如果小于或等于 1260,則將其添加到最后一次
- 如果它大于 1260,則將其添加到第二天的開始 (8:00)
你能幫我修改我的代碼來實作這個想法或給我一些更好的方法嗎?
uj5u.com熱心網友回復:
您的代碼可以正常作業,但是這個想法有一個缺陷:它在先前添加的 class 之后的第一個可用時隙中適合新類,但它沒有嘗試將類適合在第一個可用時隙中整個星期。請注意,在 add_class 函式中,沒有檢查主題 7 是否可以在星期二放置的行為,它僅與放置主題 6 的星期三進行比較。
這是因為您將類存盤在結構的靜態陣列中,這對于這個問題可能不是最佳的。我認為您最好使用鏈表。您可以創建計劃課程的鏈接串列(還包含星期幾),并且在 add_class 函式中,您可以檢查您正在檢查的內容(一天中的分鐘),但“每天”。然后您可以在正確的位置添加一個新課程(在您的情況下,主題 7 將在主題 5 之后)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446156.html
