Untitled
final codeunknown
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