Untitled
final codeunknown
plain_text
7 months ago
16 kB
4
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