Untitled

final code
 avatar
unknown
plain_text
19 days ago
16 kB
2
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_DONORS 100
#define MAX_REQUESTS 100

// Structure for Donor
typedef struct
{
    char idNumber[20];
    char mobileNumber[15];
    char name[50];
    int age;
    char bloodGroup[5];
    char medicalCondition[50];
    char lastDonationDate[15];
    int totalDonationsLastYear;
    int isBlacklisted;
    int priority;
    char registrationLocation[50];
} Donor;

// Structure for Request
typedef struct
{
    char requesterName[50];
    char bloodGroup[5];
    int unitsRequested;
    char location[50];
    char requestDate[15];
    int isFulfilled;
    int isCancelled;
} Request;

Donor donors[MAX_DONORS];
Request requests[MAX_REQUESTS];
int totalDonors = 0;
int totalRequests = 0;

void clearScreen()
{
#ifdef _WIN32
    system("cls");
#else
    system("clear");
#endif
}

int isValidMobile(char mobile[])
{
    if (strlen(mobile) != 11)
        return 0;
    if (mobile[0] != '0' || mobile[1] != '1')
        return 0;
    if (mobile[2] < '3' || mobile[2] > '9')
        return 0;
    for (int i = 0; i < 11; i++)
    {
        if (mobile[i] < '0' || mobile[i] > '9')
            return 0;
    }
    return 1;
}

int customStrptime(const char *date, struct tm *tm)
{
    if (sscanf(date, "%4d-%2d-%2d", &tm->tm_year, &tm->tm_mon, &tm->tm_mday) != 3)
        return -1;
    tm->tm_year -= 1900;
    tm->tm_mon -= 1;
    return 0;
}

int daysBetween(const char *date1, const char *date2)
{
    struct tm tm1 = {0}, tm2 = {0};
    time_t t1, t2;

    if (customStrptime(date1, &tm1) != 0 || customStrptime(date2, &tm2) != 0)
    {
        printf("Error parsing dates.\n");
        return -1;
    }

    t1 = mktime(&tm1);
    t2 = mktime(&tm2);

    return difftime(t2, t1) / (60 * 60 * 24);
}

int isRegistered(char id[], char mobile[])
{
    for (int i = 0; i < totalDonors; i++)
    {
        if (strcmp(donors[i].idNumber, id) == 0 || strcmp(donors[i].mobileNumber, mobile) == 0)
        {
            return 1;
        }
    }
    return 0;
}

void saveDataToFile()
{
    FILE *df = fopen("donors.txt", "w");
    for (int i = 0; i < totalDonors; i++)
    {
        fprintf(df, "%s;%s;%s;%d;%s;%s;%s;%d;%d;%d;%s\n",
                donors[i].idNumber, donors[i].mobileNumber, donors[i].name,
                donors[i].age, donors[i].bloodGroup, donors[i].medicalCondition,
                donors[i].lastDonationDate, donors[i].totalDonationsLastYear,
                donors[i].isBlacklisted, donors[i].priority,
                donors[i].registrationLocation);
    }
    fclose(df);

    FILE *rf = fopen("requests.txt", "w");
    for (int i = 0; i < totalRequests; i++)
    {
        if (!requests[i].isCancelled)
        {
            fprintf(rf, "%s;%s;%d;%s;%d;%d\n",
                    requests[i].requesterName, requests[i].bloodGroup,
                    requests[i].unitsRequested, requests[i].location,
                    requests[i].isFulfilled, requests[i].isCancelled);
        }
    }
    fclose(rf);
}

void loadDataFromFile()
{
    FILE *df = fopen("donors.txt", "r");
    if (df)
    {
        while (fscanf(df, "%[^;];%[^;];%[^;];%d;%[^;];%[^;];%[^;];%d;%d;%d;%[^\n]\n",
                      donors[totalDonors].idNumber, donors[totalDonors].mobileNumber,
                      donors[totalDonors].name, &donors[totalDonors].age,
                      donors[totalDonors].bloodGroup, donors[totalDonors].medicalCondition,
                      donors[totalDonors].lastDonationDate, &donors[totalDonors].totalDonationsLastYear,
                      &donors[totalDonors].isBlacklisted, &donors[totalDonors].priority,
                      donors[totalDonors].registrationLocation) == 11)
        {
            totalDonors++;
        }
        fclose(df);
    }

    FILE *rf = fopen("requests.txt", "r");
    if (rf)
    {
        while (fscanf(rf, "%[^;];%[^;];%d;%[^;];%d;%d\n",
                      requests[totalRequests].requesterName,
                      requests[totalRequests].bloodGroup,
                      &requests[totalRequests].unitsRequested,
                      requests[totalRequests].location,
                      &requests[totalRequests].isFulfilled,
                      &requests[totalRequests].isCancelled) == 6)
        {
            totalRequests++;
        }
        fclose(rf);
    }
}

void registerDonor()
{
    Donor newDonor;
    printf("Enter ID Number: ");
    scanf("%s", newDonor.idNumber);

    printf("Enter Mobile Number: ");
    scanf("%s", newDonor.mobileNumber);
    if (!isValidMobile(newDonor.mobileNumber))
    {
        printf("Invalid mobile number format.\n");
        return;
    }

    if (isRegistered(newDonor.idNumber, newDonor.mobileNumber))
    {
        printf("ID or mobile number already registered.\n");
        return;
    }

    printf("Enter Name: ");
    getchar();
    fgets(newDonor.name, sizeof(newDonor.name), stdin);
    newDonor.name[strcspn(newDonor.name, "\n")] = 0;

    printf("Enter Age: ");
    scanf("%d", &newDonor.age);
    if (newDonor.age < 18)
    {
        printf("Donor must be at least 18 years old.\n");
        return;
    }

    printf("Enter Blood Group: ");
    scanf("%s", newDonor.bloodGroup);

    printf("Enter Medical Condition: ");
    getchar();
    fgets(newDonor.medicalCondition, sizeof(newDonor.medicalCondition), stdin);
    newDonor.medicalCondition[strcspn(newDonor.medicalCondition, "\n")] = 0;

    printf("Enter Last Donation Date (YYYY-MM-DD): ");
    scanf("%s", newDonor.lastDonationDate);

    printf("Enter Registration Location: ");
    getchar();
    fgets(newDonor.registrationLocation, sizeof(newDonor.registrationLocation), stdin);
    newDonor.registrationLocation[strcspn(newDonor.registrationLocation, "\n")] = 0;

    newDonor.totalDonationsLastYear = 0;
    newDonor.isBlacklisted = 0;
    newDonor.priority = 0;

    donors[totalDonors++] = newDonor;
    saveDataToFile();

    printf("Donor registered successfully.\n");
    printf("Press Enter to continue...\n");
    getchar();
    clearScreen();
}

void createRequest()
{
    Request newRequest;
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);

    // Get today's date
    strftime(newRequest.requestDate, sizeof(newRequest.requestDate), "%Y-%m-%d", &tm);

    printf("Enter Requester's Name: ");
    getchar();
    fgets(newRequest.requesterName, sizeof(newRequest.requesterName), stdin);
    newRequest.requesterName[strcspn(newRequest.requesterName, "\n")] = 0;

    printf("Enter Blood Group: ");
    scanf("%s", newRequest.bloodGroup);

    printf("Enter Units Requested: ");
    scanf("%d", &newRequest.unitsRequested);

    printf("Enter Location: ");
    getchar();
    fgets(newRequest.location, sizeof(newRequest.location), stdin);
    newRequest.location[strcspn(newRequest.location, "\n")] = 0;

    backupRequests(); // Backup data before modifying

    newRequest.isFulfilled = 0;
    newRequest.isCancelled = 0;

    requests[totalRequests++] = newRequest;
    saveDataToFile();

    printf("Request created successfully with Date: %s\n", newRequest.requestDate);
    printf("Press Enter to continue...\n");
    getchar();
    clearScreen();
}

void showRequests()
{
    printf("\n--- All Requests ---\n");
    for (int i = 0; i < totalRequests; i++)
    {
        if (requests[i].isCancelled)
            continue;
        printf("Request ID: %d | Name: %s | Blood Group: %s | Units: %d | Location: %s | Status: %s\n",
               i, requests[i].requesterName, requests[i].bloodGroup,
               requests[i].unitsRequested, requests[i].location,
               requests[i].isFulfilled ? "Fulfilled" : "Pending");
    }
    printf("Press Enter to continue...\n");
    getchar();
    getchar();
    clearScreen();
}

void cancelRequest()
{
    int id;
    printf("Enter Request ID to cancel: ");
    scanf("%d", &id);
    if (id < 0 || id >= totalRequests || requests[id].isCancelled)
    {
        printf("Invalid request ID or already cancelled.\n");
        return;
    }
    requests[id].isCancelled = 1;
    saveDataToFile();

    printf("Request cancelled successfully.\n");
    printf("Press Enter to continue...\n");
    getchar();
    getchar();
    clearScreen();
}

void blacklistDonor()
{
    char id[20];
    printf("Enter Donor ID to blacklist: ");
    scanf("%s", id);
    for (int i = 0; i < totalDonors; i++)
    {
        if (strcmp(donors[i].idNumber, id) == 0)
        {
            donors[i].isBlacklisted = 1;
            saveDataToFile();
            printf("Donor blacklisted successfully.\n");
            return;
        }
    }
    printf("Donor not found.\n");
}

void confirmDonation(int requestId, char donorId[])
{
    if (requestId < 0 || requestId >= totalRequests || requests[requestId].isCancelled || requests[requestId].isFulfilled)
    {
        printf("Invalid or already processed request.\n");
        return;
    }

    int foundDonor = -1;
    for (int i = 0; i < totalDonors; i++)
    {
        if (strcmp(donors[i].idNumber, donorId) == 0)
        {
            foundDonor = i;
            break;
        }
    }

    if (foundDonor == -1)
    {
        printf("Donor not found.\n");
        return;
    }

    requests[requestId].isFulfilled = 1;
    donors[foundDonor].totalDonationsLastYear++;

    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    strftime(donors[foundDonor].lastDonationDate, 15, "%Y-%m-%d", t);

    // Mark request as deleted after fulfillment
    requests[requestId].isCancelled = 1;

    saveDataToFile();

    printf("Donation confirmed. Request ID %d fulfilled by Donor ID %s.\n", requestId, donorId);
    printf("Request has been auto-deleted after fulfillment.\n");
}

void searchDonorByLocationBloodGroupEligibility()
{
    char location[50], bloodGroup[5];
    int found = 0;
    char today[] = "2025-04-10"; // Static date for demo

    // Input location
    printf("Enter Location: ");
    getchar();
    fgets(location, sizeof(location), stdin);
    location[strcspn(location, "\n")] = 0; // Remove the newline character from input

    // Input blood group
    printf("Enter Blood Group: ");
    scanf("%s", bloodGroup);

    printf("\n--- Eligible Donors ---\n");

    // Search for eligible donors
    for (int i = 0; i < totalDonors; i++)
    {
        if (donors[i].isBlacklisted)
            continue;

        // Check for matching location, blood group, and eligibility (120 days since last donation)
        if (strcmp(donors[i].bloodGroup, bloodGroup) == 0 &&
            strstr(donors[i].registrationLocation, location) != NULL &&
            daysBetween(donors[i].lastDonationDate, today) >= 120)
        {

            // Print donor details
            printf("ID: %s | Name: %s | Age: %d | Blood Group: %s | Mobile: %s | Location: %s\n",
                   donors[i].idNumber, donors[i].name, donors[i].age,
                   donors[i].bloodGroup, donors[i].mobileNumber, donors[i].registrationLocation);
            found = 1;
        }
    }

    // If no eligible donors were found
    if (!found)
    {
        printf("No eligible donors found.\n");
    }

    printf("Press Enter to continue...\n");
    getchar();
    getchar(); // Consume any leftover newline characters
    clearScreen();
}

void showDonorList()
{
    printf("\n--- All Registered Donors ---\n");
    for (int i = 0; i < totalDonors; i++)
    {
        printf("ID: %s | Name: %s | Age: %d | Blood Group: %s | Mobile: %s | Location: %s\n",
               donors[i].idNumber, donors[i].name, donors[i].age,
               donors[i].bloodGroup, donors[i].mobileNumber, donors[i].registrationLocation);
    }
    printf("Press Enter to continue...\n");
    getchar();
    getchar();
    clearScreen();
}

void editDonorInfo()
{
    char id[20];
    printf("Enter Donor ID to edit: ");
    scanf("%s", id);
    for (int i = 0; i < totalDonors; i++)
    {
        if (strcmp(donors[i].idNumber, id) == 0)
        {
            printf("Editing Donor %s\n", donors[i].name);
            printf("Enter New Name: ");
            getchar();
            fgets(donors[i].name, sizeof(donors[i].name), stdin);
            donors[i].name[strcspn(donors[i].name, "\n")] = 0;

            printf("Enter New Age: ");
            scanf("%d", &donors[i].age);

            printf("Enter New Blood Group: ");
            scanf("%s", donors[i].bloodGroup);

            printf("Enter New Medical Condition: ");
            getchar();
            fgets(donors[i].medicalCondition, sizeof(donors[i].medicalCondition), stdin);
            donors[i].medicalCondition[strcspn(donors[i].medicalCondition, "\n")] = 0;

            printf("Enter New Last Donation Date (YYYY-MM-DD): ");
            scanf("%s", donors[i].lastDonationDate);

            printf("Enter New Registration Location: ");
            getchar();
            fgets(donors[i].registrationLocation, sizeof(donors[i].registrationLocation), stdin);
            donors[i].registrationLocation[strcspn(donors[i].registrationLocation, "\n")] = 0;

            saveDataToFile();
            printf("Donor information updated successfully.\n");
            return;
        }
    }
    printf("Donor not found.\n");
}
// Delete Donor
void deleteDonor()
{
    char idToDelete[20];
    int found = 0;

    printf("Enter Donor ID to delete: ");
    scanf("%s", idToDelete);

    for (int i = 0; i < totalDonors; i++)
    {
        if (strcmp(donors[i].idNumber, idToDelete) == 0)
        {
            found = 1;
            // Shift all subsequent donors left
            for (int j = i; j < totalDonors - 1; j++)
            {
                donors[j] = donors[j + 1];
            }
            totalDonors--;
            saveDataToFile(); // Save updated donor list
            printf("Donor with ID %s deleted successfully.\n", idToDelete);
            break;
        }
    }

    if (!found)
    {
        printf("No donor found with ID %s.\n", idToDelete);
    }

    printf("Press Enter to continue...\n");
    getchar();
    getchar(); // Pause
    clearScreen();
}

int main()
{
    int choice;
    char donorId[20];
    int reqId;

    loadDataFromFile();

    do
    {
        printf("\n===== Blood Bank Management System =====\n");
        printf("1. Register Donor\n");
        printf("2. Create Blood Request\n");
        printf("3. Show All Requests\n");
        printf("4. Cancel Blood Request\n");
        printf("5. Delete Donor\n");
        printf("6. Blacklist Donor\n");
        printf("7. Search Donor\n");
        printf("8. Show All Donors\n");
        printf("9. Confirm Blood Donation\n");
        printf("10. Edit Donor Info\n");
        printf("11. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            registerDonor();
            break;
        case 2:
            createRequest();
            break;
        case 3:
            showRequests();
            break;
        case 4:
            cancelRequest();
            break;
        case 5:
            deleteDonor();
            break;
        case 6:
            blacklistDonor();
            break;
        case 7:
            searchDonorByLocationBloodGroupEligibility();
            break;
        case 8:
            showDonorList();
            break;
        case 9:
            printf("Enter Request ID: ");
            scanf("%d", &reqId);
            printf("Enter Donor ID: ");
            scanf("%s", donorId);
            confirmDonation(reqId, donorId);
            break;
        case 10:
            editDonorInfo();
            break;
        case 11:
            printf("Exiting program.\n");
            break;
        default:
            printf("Invalid choice.\n");
        }
    } while (choice != 10);

    return 0;
}
Editor is loading...
Leave a Comment