Untitled

 avatar
unknown
plain_text
10 months ago
18 kB
6
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include<winsock2.h>

#define MAX_USERS 100
#define MAX_SESSIONS 100
#define MAX_TODO 100
#define MAX_POMODOROS 100

// Define structures for user accounts, study sessions, and to-do items
typedef struct {
    char description[100];
    int completed;
} ToDoItem;

typedef struct {
    char category[50];
    struct tm startTime;
    struct tm endTime;
    int duration; // in seconds
    int sessionActive; // Indicates if a session is currently active
    int countdownActive; // Indicates if a countdown is currently active
    int countdownDuration; // in seconds
} StudySession;

typedef struct {
    int studyDuration; // in seconds
    int breakDuration; // in seconds
} PomodoroSession;

typedef struct {
    char username[50];
    int sessionCount;
    StudySession sessions[MAX_SESSIONS];
    ToDoItem todos[MAX_TODO];
    int todoCount;
    PomodoroSession pomodoros[MAX_POMODOROS];
    int pomodoroCount;
} User;

// Global array to store users
User users[MAX_USERS];
int userCount = 0;
int loggedIn = -1; // Index of logged-in user, -1 if no user is logged in

// Function prototypes
void clearScreen();
void displayHeader(const char* header);
void displayMainMenu();
void displayUserMenu();
void createUser();
void loginUser();
void startStudyOption();
void endSession();
void showStatistics();
void manageToDoList();
int findUserIndex(const char* username);
void pressEnterToContinue();
void startTimer();
void startCountdown();
void updateCountdown(int totalSeconds);
void pomodoroTimer();
void pausePomodoroTimer(int *remainingTime);

// Function to clear the screen
void clearScreen() {
    #ifdef _WIN32
        system("cls");
    #else
        system("clear");
    #endif
}

// Function to display a header
void displayHeader(const char* header) {
    clearScreen();
    printf("== %s ==\n\n", header);
}

// Function to display the main menu
void displayMainMenu() {
    system("color 3F");
    displayHeader("Main Menu");
    printf("1. Create new user\n");
    printf("2. Login\n");
    printf("3. Exit\n");
    printf("Enter your choice: ");
}

// Function to display the user menu
void displayUserMenu() {
    displayHeader("User Menu");
    printf("1. Start a study session\n");
    printf("2. Show statistics\n");
    printf("3. Manage to-do list\n");
    printf("4. Logout\n");
    printf("Enter your choice: ");
}

// Function to create a new user
void createUser() {
    displayHeader("Create New User");
    if (userCount >= MAX_USERS) {
        printf("Error: Maximum number of users reached.\n");
        pressEnterToContinue();
        return;
    }
    printf("Enter username: ");
    scanf("%49s", users[userCount].username);
    users[userCount].sessionCount = 0;
    users[userCount].todoCount = 0;
    users[userCount].pomodoroCount = 0;
    userCount++;
    printf("User created successfully.\n");
    pressEnterToContinue();
}

// Function to login a user
void loginUser() {
    displayHeader("Login");
    printf("Enter username: ");
    char username[50];
    scanf("%49s", username);
    int index = findUserIndex(username);
    if (index == -1) {
        printf("Error: User not found.\n");
        pressEnterToContinue();
    } else {
        loggedIn = index;
        printf("Login successful.\n");
        pressEnterToContinue();
    }
}

// Function to find a user index
int findUserIndex(const char* username) {
    for (int i = 0; i < userCount; i++) {
        if (strcmp(users[i].username, username) == 0) {
            return i;
        }
    }
    return -1;
}

// Function to press enter to continue
void pressEnterToContinue() {
    printf("\nPress Enter to continue...");
    getchar(); // Wait for Enter key
    while (getchar() != '\n'); // Ensure buffer is empty
}

// Function to start a study session option
void startStudyOption() {
    if (loggedIn == -1 || users[loggedIn].sessionCount >= MAX_SESSIONS) {
        printf("Error: No user logged in or maximum sessions reached.\n");
        pressEnterToContinue();
        return;
    }
    displayHeader("Study Session Options");
    printf("1. Timer\n");
    printf("2. Countdown\n");
    printf("3. Pomodoro Timer\n");
    printf("4. Exit to User Menu\n");
    printf("Enter your choice: ");
    int choice;
    scanf("%d", &choice);
    getchar(); // Clear the newline character after the number input

    switch (choice) {
        case 1:
            startTimer();
            break;
        case 2:
            startCountdown();
            break;
        case 3:
            pomodoroTimer();
            break;
        case 4:
            return; // Exit to user menu
        default:
            printf("Invalid choice. Please try again.\n");
            pressEnterToContinue();
    }
}

// Function to start a timer
void startTimer() {
    if (users[loggedIn].sessions[users[loggedIn].sessionCount].sessionActive) {
        printf("Error: A session is already active. Please end the current session before starting a new one.\n");
        pressEnterToContinue();
        return;
    }
    displayHeader("Starting a New Study Session");
    printf("Enter study category: ");
    scanf("%49s", users[loggedIn].sessions[users[loggedIn].sessionCount].category);
    getchar(); // Clear the newline character after the input
    users[loggedIn].sessions[users[loggedIn].sessionCount].sessionActive = 1;
    time_t start = time(NULL);
    users[loggedIn].sessions[users[loggedIn].sessionCount].startTime = *localtime(&start);
    displayHeader("Timer is on");
    printf("Press 'Enter' to stop the timer...\n");
    while (getchar() != '\n'); // Wait for Enter key
    time_t end = time(NULL);
    users[loggedIn].sessions[users[loggedIn].sessionCount].endTime = *localtime(&end);
    users[loggedIn].sessions[users[loggedIn].sessionCount].duration = (int)difftime(end, start);
    users[loggedIn].sessions[users[loggedIn].sessionCount].sessionActive = 0;
    users[loggedIn].sessionCount++;
    printf("Study session ended. Duration: %02d:%02d:%02d.\n",
           users[loggedIn].sessions[users[loggedIn].sessionCount - 1].duration / 3600,
           (users[loggedIn].sessions[users[loggedIn].sessionCount - 1].duration % 3600) / 60,
           users[loggedIn].sessions[users[loggedIn].sessionCount - 1].duration % 60);
    pressEnterToContinue();
}

// Function to start a countdown
void startCountdown() {
    if (users[loggedIn].sessions[users[loggedIn].sessionCount].countdownActive) {
        printf("Error: A countdown is already active. Please wait for it to finish before starting a new one.\n");
        pressEnterToContinue();
        return;
    }
    displayHeader("Starting a New Countdown");
    printf("Enter countdown time in HH MM SS format: ");
    int hours, minutes, seconds;
    scanf("%d %d %d", &hours, &minutes, &seconds);
    getchar(); // Clear the newline character after the number input
    int totalSeconds = hours * 3600 + minutes * 60 + seconds;
    if (totalSeconds <= 0 || hours < 0 || minutes < 0 || minutes >= 60 || seconds < 0 || seconds >= 60) {
        printf("Error: Invalid countdown time.\n");
        pressEnterToContinue();
        return;
    }
    users[loggedIn].sessions[users[loggedIn].sessionCount].countdownDuration = totalSeconds;
    users[loggedIn].sessions[users[loggedIn].sessionCount].countdownActive = 1;
    updateCountdown(totalSeconds);
}

// Function to update countdown
// Function to update countdown
void updateCountdown(int totalSeconds) {
    displayHeader("Countdown");
    while (totalSeconds > 0) {
        int hours = totalSeconds / 3600;
        int minutes = (totalSeconds % 3600) / 60;
        int seconds = totalSeconds % 60;
        printf("\r%02d:%02d:%02d", hours, minutes, seconds);
        fflush(stdout);
        sleep(1);
        totalSeconds--;
    }
    printf("\nCountdown finished.\n");
    printf("\a"); // Add this line for the bell alert
    users[loggedIn].sessions[users[loggedIn].sessionCount].countdownActive = 0;
    users[loggedIn].sessionCount++; // Increment session count
    pressEnterToContinue();
}


// Function to show statistics
void showStatistics() {
    if (loggedIn == -1) {
        printf("Error: No user logged in.\n");
        pressEnterToContinue();
        return;
    }
    displayHeader("Statistics");
    printf("Total study sessions: %d\n", users[loggedIn].sessionCount);
    for (int i = 0; i < users[loggedIn].sessionCount; i++) {
        printf("Session %d - Category: %s, Duration: %02d:%02d:%02d\n",
               i + 1,
               users[loggedIn].sessions[i].category,
               users[loggedIn].sessions[i].duration / 3600,
               (users[loggedIn].sessions[i].duration % 3600) / 60,
               users[loggedIn].sessions[i].duration % 60);
    }
    printf("Total Pomodoro sessions: %d\n", users[loggedIn].pomodoroCount);
    for (int i = 0; i < users[loggedIn].pomodoroCount; i++) {
        printf("Pomodoro %d - Study Duration: %02d:%02d, Break Duration: %02d:%02d\n",
               i + 1,
               users[loggedIn].pomodoros[i].studyDuration / 60,
               users[loggedIn].pomodoros[i].studyDuration % 60,
               users[loggedIn].pomodoros[i].breakDuration / 60,
               users[loggedIn].pomodoros[i].breakDuration % 60);
    }
    pressEnterToContinue();
}

// Function to manage the to-do list
void manageToDoList() {
    int choice;
    do {
        if (loggedIn == -1) {
            printf("Error: No user logged in.\n");
            pressEnterToContinue();
            return;
        }
        displayHeader("Manage To-Do List");
        printf("1. Add a to-do item\n");
        printf("2. Mark a to-do item as completed\n");
        printf("3. Show to-do list\n");
        printf("4. Return to User Menu\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);
        getchar(); // Clear the newline character after the number input

        switch (choice) {
            case 1: // Add a to-do item
                do {
                    if (users[loggedIn].todoCount >= MAX_TODO) {
                        printf("Error: To-do list is full.\n");
                        break;
                    }
                    displayHeader("Add To-Do Item");
                    printf("Enter the description of the to-do item (or type 'exit' to finish adding): ");
                    char input[100];
                    scanf("%99[^\n]", input);
                    getchar(); // Clear the newline character after the input
                    if (strcmp(input, "exit") == 0) {
                        break;
                    }
                    strcpy(users[loggedIn].todos[users[loggedIn].todoCount].description, input);
                    users[loggedIn].todos[users[loggedIn].todoCount].completed = 0;
                    users[loggedIn].todoCount++;
                    printf("To-do item added. You can add another item or type 'exit' to finish.\n");
                } while (users[loggedIn].todoCount < MAX_TODO);
                break;
            case 2: // Mark a to-do item as completed
                displayHeader("Mark To-Do Item as Completed");
                printf("Enter the index of the to-do item to mark as completed: ");
                int index;
                scanf("%d", &index);
                getchar(); // Clear the newline character after the input
                if (index < 1 || index > users[loggedIn].todoCount) {
                    printf("Error: Invalid to-do item index.\n");
                } else {
                    users[loggedIn].todos[index - 1].completed = 1;
                    printf("To-do item marked as completed.\n");
                }
                break;
            case 3: // Show to-do list
                displayHeader("To-Do List");
                for (int i = 0; i < users[loggedIn].todoCount; i++) {
                    printf("%d. %s [%s]\n", i + 1, users[loggedIn].todos[i].description,
                           users[loggedIn].todos[i].completed ? "Completed" : "Pending");
                }
                break;
            case 4: // Return to User Menu
                return;
        }
        pressEnterToContinue();
    } while (choice != 4);
}

// Function to handle Pomodoro Timer
void pomodoroTimer() {
    displayHeader("Pomodoro Timer");
    printf("Enter Pomodoro study duration in minutes: ");
    int studyMinutes;
    scanf("%d", &studyMinutes);
    getchar(); // Clear the newline character after the input

    printf("Enter Pomodoro break duration in minutes: ");
    int breakMinutes;
    scanf("%d", &breakMinutes);
    getchar(); // Clear the newline character after the input

    if (studyMinutes <= 0 || breakMinutes <= 0) {
        printf("Error: Invalid duration.\n");
        pressEnterToContinue();
        return;
    }

    int studySeconds = studyMinutes * 60;
    int breakSeconds = breakMinutes * 60;
    int totalPomodoroCount = 0;

    while (1) {
        int remainingTime = studySeconds;
        int paused = 0;
        while (remainingTime > 0) {
            displayHeader("Pomodoro Study Session");
            printf("Press 'p' to pause/resume the timer.\n");
            printf("Press 'q' to quit the timer.\n");
            printf("Time remaining: %02d:%02d\n", remainingTime / 60, remainingTime % 60);

            fd_set set;
            struct timeval timeout;
            FD_ZERO(&set);
            FD_SET(STDIN_FILENO, &set);
            timeout.tv_sec = 1;
            timeout.tv_usec = 0;

            int res = select(STDIN_FILENO + 1, &set, NULL, NULL, &timeout);
            if (res > 0) {
                char c = getchar();
                if (c == 'p') {
                    paused = !paused;
                } else if (c == 'q') {
                    printf("Pomodoro timer quit.\n");
                    pressEnterToContinue();
                    return;
                }
            }

            if (!paused) {
                remainingTime--;
            }
        }

        printf("Study session completed! Starting break.\n");
        remainingTime = breakSeconds;
        paused = 0;
        while (remainingTime > 0) {
            displayHeader("Pomodoro Break Session");
            printf("Press 'p' to pause/resume the timer.\n");
            printf("Press 'q' to quit the timer.\n");
            printf("Time remaining: %02d:%02d\n", remainingTime / 60, remainingTime % 60);

            fd_set set;
            struct timeval timeout;
            FD_ZERO(&set);
            FD_SET(STDIN_FILENO, &set);
            timeout.tv_sec = 1;
            timeout.tv_usec = 0;

            int res = select(STDIN_FILENO + 1, &set, NULL, NULL, &timeout);
            if (res > 0) {
                char c = getchar();
                if (c == 'p') {
                    paused = !paused;
                } else if (c == 'q') {
                    printf("Pomodoro timer quit.\n");
                    pressEnterToContinue();
                    return;
                }
            }

            if (!paused) {
                remainingTime--;
            }
        }

        printf("Break session completed!\n");
        pressEnterToContinue();

        // Store Pomodoro session details
        if (users[loggedIn].pomodoroCount < MAX_POMODOROS) {
            users[loggedIn].pomodoros[users[loggedIn].pomodoroCount].studyDuration = studySeconds;
            users[loggedIn].pomodoros[users[loggedIn].pomodoroCount].breakDuration = breakSeconds;
            users[loggedIn].pomodoroCount++;
        }

        printf("Do you want to start another Pomodoro session? (y/n): ");
        char choice = getchar();
        getchar(); // Clear the newline character
        if (choice != 'y') {
            break;
        }
    }
}

// Main function
int main() {
    int choice;
    while (1) {
        if (loggedIn == -1) {
            displayMainMenu();
            scanf("%d", &choice);
            getchar(); // Clear the newline character after the number input
            switch (choice) {
                case 1:
                    createUser();
                    break;
                case 2:
                    loginUser();
                    break;
                case 3:
                    printf("Exiting program.\n");
                    return 0;
                default:
                    printf("Invalid choice. Please try again.\n");
                    pressEnterToContinue();
            }
        } else {
            displayUserMenu();
            scanf("%d", &choice);
            getchar(); // Clear the newline character after the number input
            switch (choice) {
                case 1:
                    startStudyOption();
                    break;
                case 2:
                    showStatistics();
                    break;
                case 3:
                    manageToDoList();
                    break;
                case 4:
                    loggedIn = -1;
                    printf("Logged out successfully.\n");
                    pressEnterToContinue();
                    break;
                default:
                    printf("Invalid choice. Please try again.\n");
                    pressEnterToContinue();
            }
        }
    }
    return 0;
}
Editor is loading...
Leave a Comment