Untitled
full finalunknown
plain_text
7 months ago
22 kB
5
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
// Structure for Donor
typedef struct Donor
{
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];
int totalDonation;
struct Donor *next;
} Donor;
// Structure for Request
typedef struct Request
{
char requesterName[50];
char bloodGroup[5];
int unitsRequested;
char location[50];
char requestDate[15];
int isFulfilled;
int isCancelled;
char donorId[20];
struct Request *next;
} Request;
// Head pointers for linked lists
Donor *donorHead = NULL;
Request *requestHead = NULL;
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[])
{
Donor *current = donorHead;
while (current != NULL)
{
if (strcmp(current->idNumber, id) == 0 || strcmp(current->mobileNumber, mobile) == 0)
{
return 1; // Found a matching donor
}
current = current->next;
}
return 0; // Not found
}
void saveDataToFile() {
// Save donors
FILE *df = fopen("donors.dat", "wb");
if (df == NULL) {
printf("Error saving donors data!\n");
return;
}
Donor *currDonor = donorHead;
while (currDonor != NULL) {
fwrite(currDonor, sizeof(Donor), 1, df);
currDonor = currDonor->next;
}
fclose(df);
// Save requests
FILE *rf = fopen("requests.dat", "wb");
if (rf == NULL) {
printf("Error saving requests data!\n");
return;
}
Request *currRequest = requestHead;
while (currRequest != NULL) {
fwrite(currRequest, sizeof(Request), 1, rf);
currRequest = currRequest->next;
}
fclose(rf);
}
void loadDataFromFile()
{
// Load Donors
FILE *df = fopen("donors.txt", "r");
if (df)
{
Donor *newDonor;
while (1)
{
newDonor = (Donor *)malloc(sizeof(Donor));
if (fscanf(df, "%[^;];%[^;];%[^;];%d;%[^;];%[^;];%[^;];%d;%d;%d;%[^;];%d\n",
newDonor->idNumber, newDonor->mobileNumber,
newDonor->name, &newDonor->age,
newDonor->bloodGroup, newDonor->medicalCondition,
newDonor->lastDonationDate, &newDonor->totalDonationsLastYear,
&newDonor->isBlacklisted, &newDonor->priority,
newDonor->registrationLocation, &newDonor->totalDonation) == 12)
{
newDonor->next = donorHead;
donorHead = newDonor;
}
else
{
free(newDonor);
break; // Exit the loop if fscanf fails
}
}
fclose(df);
}
// Load Requests
FILE *rf = fopen("requests.txt", "r");
if (rf)
{
Request *newRequest;
while (1)
{
newRequest = (Request *)malloc(sizeof(Request));
if (fscanf(rf, "%[^;];%[^;];%d;%[^;];%[^;];%d;%d;%[^\n]\n",
newRequest->requesterName, newRequest->bloodGroup,
&newRequest->unitsRequested, newRequest->location,
newRequest->requestDate, &newRequest->isFulfilled,
&newRequest->isCancelled, newRequest->donorId) == 8)
{
newRequest->next = requestHead;
requestHead = newRequest;
}
else
{
free(newRequest);
break;
}
}
fclose(rf);
}
}
void registerDonor()
{
Donor *newDonor = (Donor *)malloc(sizeof(Donor));
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");
free(newDonor);
return;
}
if (isRegistered(newDonor->idNumber, newDonor->mobileNumber))
{
printf("ID or mobile number already registered.\n");
free(newDonor);
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");
free(newDonor);
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;
newDonor->totalDonation = 0;
newDonor->next = donorHead;
donorHead = newDonor;
saveDataToFile();
printf("Donor registered successfully.\n");
printf("Press Enter to continue...\n");
getchar();
clearScreen();
}
void createRequest()
{
Request *newRequest = (Request *)malloc(sizeof(Request));
time_t t = time(NULL);
struct tm tm = *localtime(&t);
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;
newRequest->isFulfilled = 0;
newRequest->isCancelled = 0;
strcpy(newRequest->donorId, ""); // No donor assigned yet
newRequest->next = requestHead;
requestHead = 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");
Request *current = requestHead;
int id = 0;
while (current != NULL)
{
if (!current->isCancelled)
{
printf("Request ID: %d | Name: %s | Blood Group: %s | Units: %d | Location: %s | Status: %s\n",
id, current->requesterName, current->bloodGroup,
current->unitsRequested, current->location,
current->isFulfilled ? "Fulfilled" : "Pending");
}
current = current->next;
id++;
}
printf("Press Enter to continue...\n");
getchar();
getchar();
clearScreen();
}
void cancelRequest()
{
int id;
printf("Enter Request ID to cancel: ");
scanf("%d", &id);
Request *current = requestHead;
int index = 0;
while (current != NULL)
{
if (index == id)
break;
current = current->next;
index++;
}
if (current == NULL || current->isCancelled)
{
printf("Invalid request ID or already cancelled.\n");
return;
}
printf("Request Details:\n");
printf("Name: %s\n", current->requesterName);
printf("Blood Group: %s\n", current->bloodGroup);
printf("Location: %s\n", current->location);
current->isCancelled = 1;
saveDataToFile();
printf("Request cancelled successfully.\n");
printf("Press Enter to continue...\n");
getchar();
getchar();
clearScreen();
}
void blacklistDonor() {
char searchID[20];
printf("Enter Donor ID to blacklist: ");
scanf(" %[^\n]", searchID);
Donor *current = donorHead;
int found = 0;
while (current != NULL) {
if (strcmp(current->idNumber, searchID) == 0) {
current->isBlacklisted = 1;
found = 1;
printf("\n--- Donor Blacklisted ---\n");
printf("ID Number: %s\n", current->idNumber);
printf("Name: %s\n", current->name);
printf("Blood Group: %s\n", current->bloodGroup);
printf("Mobile Number: %s\n", current->mobileNumber);
printf("Status: Blacklisted.\n");
break;
}
current = current->next;
}
if (!found) {
printf("Donor ID %s not found in donor list.\n", searchID);
} else {
saveDataToFile(); // Ensure the updated blacklist status is saved
}
printf("Press Enter to continue...\n");
getchar();
getchar();
clearScreen();
}
void showBlacklist()
{
Donor *current = donorHead;
int count = 0;
printf("--- Blacklisted Donors ---\n");
printf("%-5s %-25s %-15s %-15s\n", "No", "Name", "Blood Group", "Mobile Number");
printf("---------------------------------------------------------------\n");
while (current != NULL) {
if (current->isBlacklisted) {
printf("%-5d %-25s %-15s %-15s\n", ++count, current->name, current->bloodGroup, current->mobileNumber);
}
current = current->next;
}
if (count == 0) {
printf("No donors currently in blacklist.\n");
}
printf("Press Enter to continue...\n");
getchar();
getchar();
clearScreen();
}
void removeFromBlacklist() {
char searchID[20];
printf("Enter Donor ID to remove from blacklist: ");
scanf(" %[^\n]", searchID);
Donor *current = donorHead;
int found = 0;
while (current != NULL) {
if (strcmp(current->idNumber, searchID) == 0 && current->isBlacklisted) {
current->isBlacklisted = 0;
found = 1;
printf("\n--- Donor Removed from Blacklist ---\n");
printf("ID Number: %s\n", current->idNumber);
printf("Name: %s\n", current->name);
printf("Age: %d\n", current->age);
printf("Blood Group: %s\n", current->bloodGroup);
printf("Mobile Number: %s\n", current->mobileNumber);
printf("Address: %s\n", current->registrationLocation);
printf("Medical Condition: %s\n", current->medicalCondition);
printf("Last Donation Date: %s\n", current->lastDonationDate);
printf("Total Donations (Last Yr): %d\n", current->totalDonationsLastYear);
printf("Total Donation: %d\n", current->totalDonation);
printf("Priority: %d\n", current->priority);
printf("Status: Restored to general donor list.\n");
break;
}
current = current->next;
}
if (!found) {
printf("Donor ID %s not found in blacklist.\n", searchID);
} else {
saveDataToFile();
}
printf("Press Enter to continue...\n");
getchar();
getchar();
clearScreen();
}
void confirmDonation(int requestId, char requesterName[])
{
Request *reqPtr = requestHead;
Donor *donorPtr = donorHead;
int currentIndex = 0;
// Traverse to the request with given ID
while (reqPtr != NULL && currentIndex < requestId)
{
reqPtr = reqPtr->next;
currentIndex++;
}
if (reqPtr == NULL || reqPtr->isCancelled || reqPtr->isFulfilled)
{
printf("Invalid or already processed request.\n");
return;
}
if (strcmp(reqPtr->requesterName, requesterName) != 0)
{
printf("Only the requester can confirm the blood donation.\n");
return;
}
// Search for the donor by ID
while (donorPtr != NULL)
{
if (strcmp(donorPtr->idNumber, reqPtr->donorId) == 0)
break;
donorPtr = donorPtr->next;
}
if (donorPtr == NULL)
{
printf("Donor not found.\n");
return;
}
reqPtr->isFulfilled = 1;
reqPtr->isCancelled = 1;
donorPtr->totalDonationsLastYear++;
time_t now = time(NULL);
struct tm *t = localtime(&now);
strftime(donorPtr->lastDonationDate, sizeof(donorPtr->lastDonationDate), "%Y-%m-%d", t);
saveDataToFile();
saveDataToFile();
printf("Donation confirmed. Request ID %d fulfilled by Donor ID %s.\n", requestId, donorPtr->idNumber);
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;
// Input blood group
printf("Enter Blood Group: ");
scanf("%s", bloodGroup);
printf("\n--- Eligible Donors ---\n");
Donor *current = donorHead;
while (current != NULL)
{
if (current->isBlacklisted)
{
current = current->next;
continue;
}
// Check if location and blood group match and donor is eligible
if (strcmp(current->bloodGroup, bloodGroup) == 0 &&
strstr(current->registrationLocation, location) != NULL &&
daysBetween(current->lastDonationDate, today) >= 120)
{
printf("ID: %s | Name: %s | Age: %d | Blood Group: %s | Mobile: %s | Location: %s\n",
current->idNumber, current->name, current->age,
current->bloodGroup, current->mobileNumber, current->registrationLocation);
found = 1;
}
current = current->next;
}
if (!found)
{
printf("No eligible donors found.\n");
}
printf("Press Enter to continue...\n");
getchar();
getchar();
clearScreen();
}
void showDonorList()
{
printf("\n--- All Registered Donors ---\n");
Donor *current = donorHead;
if (!current) {
printf("No donors registered.\n");
}
while (current != NULL)
{
printf("ID: %s | Name: %s | Age: %d | Blood Group: %s | Mobile: %s | Location: %s\n",
current->idNumber, current->name, current->age,
current->bloodGroup, current->mobileNumber, current->registrationLocation);
current = current->next;
}
printf("Press Enter to continue...\n");
getchar();
getchar();
clearScreen();
}
void editDonorInfo()
{
char id[20];
printf("Enter Donor ID to edit: ");
scanf("%s", id);
Donor *current = donorHead;
while (current != NULL)
{
if (strcmp(current->idNumber, id) == 0)
{
printf("Editing Donor %s\n", current->name);
printf("Enter New Name: ");
getchar();
fgets(current->name, sizeof(current->name), stdin);
current->name[strcspn(current->name, "\n")] = 0;
printf("Enter New Age: ");
scanf("%d", ¤t->age);
printf("Enter New Blood Group: ");
scanf("%s", current->bloodGroup);
printf("Enter New Mobile Number: ");
scanf("%s", current->mobileNumber);
if (!isValidMobile(current->mobileNumber))
{
printf("Invalid mobile number format. Changes aborted.\n");
return;
}
printf("Enter New Medical Condition: ");
getchar();
fgets(current->medicalCondition, sizeof(current->medicalCondition), stdin);
current->medicalCondition[strcspn(current->medicalCondition, "\n")] = 0;
printf("Enter New Last Donation Date (YYYY-MM-DD): ");
scanf("%s", current->lastDonationDate);
printf("Enter New Registration Location: ");
getchar();
fgets(current->registrationLocation, sizeof(current->registrationLocation), stdin);
current->registrationLocation[strcspn(current->registrationLocation, "\n")] = 0;
saveDataToFile();
printf("Donor information updated successfully.\n");
break;
}
current = current->next;
}
if (current == NULL)
{
printf("Donor ID not found.\n");
}
printf("Press Enter to continue...\n");
getchar();
getchar();
clearScreen();
}
void deleteDonor()
{
char idToDelete[20];
Donor *current = donorHead;
Donor *prev = NULL;
int found = 0;
printf("Enter Donor ID to delete: ");
scanf("%s", idToDelete);
while (current != NULL)
{
if (strcmp(current->idNumber, idToDelete) == 0)
{
found = 1;
// Display donor info before deletion
printf("\nDonor Information:\n");
printf("ID: %s\n", current->idNumber);
printf("Name: %s\n", current->name);
printf("Blood Group: %s\n", current->bloodGroup);
printf("Age: %d\n", current->age);
printf("Phone: %s\n", current->mobileNumber);
printf("Location: %s\n", current->registrationLocation);
// Confirm deletion
char confirm;
printf("\nAre you sure you want to delete this donor? (y/n): ");
getchar(); // Clear newline
scanf("%c", &confirm);
if (confirm == 'y' || confirm == 'Y')
{
if (prev == NULL)
{
// First node
donorHead = current->next;
}
else
{
prev->next = current->next;
}
free(current);
saveDataToFile(); // Write updated linked list to file
printf("Donor with ID %s deleted successfully.\n", idToDelete);
}
else
{
printf("Deletion cancelled.\n");
}
break;
}
prev = current;
current = current->next;
}
if (!found)
{
printf("No donor found with ID %s.\n", idToDelete);
}
printf("Press Enter to continue...\n");
getchar();
getchar();
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. Show All Donors\n");
printf("6. Blacklist Donor\n");
printf("7. Show All Blacklist\n");
printf("8. Remove From Black List\n");
printf("9. Search Donor\n");
printf("10. Delete Donor \n");
printf("11. Confirm Blood Donation\n");
printf("12. Edit Donor Info\n");
printf("13. 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:showDonorList();break;
case 6:blacklistDonor();break;
case 7:showBlacklist();break;
case 8:removeFromBlacklist();break;
case 9:
searchDonorByLocationBloodGroupEligibility();
break;
case 10:deleteDonor();break;
case 11:
printf("Enter Request ID: ");
scanf("%d", &reqId);
printf("Enter Donor ID: ");
scanf("%s", donorId);
confirmDonation(reqId, donorId);
break;
case 12:editDonorInfo();break;
case 13:
printf("Exiting program.\n");
break;
default:
printf("Invalid choice.\n");
}
}while (choice != 13); // Exit loop when choice is 13
return 0;
}
Editor is loading...
Leave a Comment