Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- typedef struct Donor {
- char name[21];
- char bloodType[3];
- char availability[12];
- } Donor;
- Donor donors[100];
- int donorCount = 0;
- char dataPath[] = "data.txt";
- int searchAvailable(const char * bloodType) {
- int i;
- for (i = 0; i < donorCount; ++i) {
- if (!strcmpi(donors[i].availability, "Available") && !strcmpi(bloodType, donors[i].bloodType)) return i;
- }
- return -1;
- }
- int countBloodType(const char * bloodType) {
- int count = 0;
- int i;
- for (i = 0; i < donorCount; ++i) {
- if (!strcmpi(donors[i].availability, "Available") && !strcmpi(bloodType, donors[i].bloodType)) ++count;
- }
- return count;
- }
- void swapData(Donor * A, Donor * B) {
- Donor tmp = *A;
- *A = *B;
- *B = tmp;
- }
- void sortData() {
- int i, j;
- for (i = 0; i < donorCount; ++i) {
- for (j = 0; j < donorCount - i - 1; ++j) {
- if (strcmpi(donors[j].name, donors[j + 1].name) > 0) swapData(&donors[j], &donors[j + 1]);
- }
- }
- }
- void printData() {
- int i;
- printf("|%-3s|%-20s|%-10s|%-13s|\n", "No.", "Donor Name", "Blood Type", "Availability");
- for (i = 0; i < donorCount; ++i) {
- printf("|%-3d|%-20s|%-10s|%-13s|\n", i + 1, donors[i].name, donors[i].bloodType, donors[i].availability);
- }
- }
- void readData() {
- FILE * file;
- file = fopen(dataPath, "r");
- if (file != NULL) {
- char tmpName[21];
- char tmpBloodType[3];
- char tmpAvailability[12];
- while (fscanf(file, "%20[^#]#%2[^#]#%12[^\n]\n", tmpName, tmpBloodType, tmpAvailability) != EOF) {
- strcpy(donors[donorCount].name, tmpName);
- strcpy(donors[donorCount].bloodType, tmpBloodType);
- strcpy(donors[donorCount].availability, tmpAvailability);
- ++donorCount;
- }
- fclose(file);
- } else {
- printf("Error on opening file\n");
- }
- }
- void writeData() {
- FILE * file;
- file = fopen(dataPath, "w");
- int i;
- for (i = 0; i < donorCount; ++i) {
- fprintf(file, "%s#%s#%s\n", donors[i].name, donors[i].bloodType, donors[i].availability);
- }
- fclose(file);
- }
- void clearScreen() {
- int i;
- for (i = 0; i < 25; ++i) printf("\n");
- }
- void printMenu() {
- printf("+----------------------+\n");
- printf("|Blood Bank Application|\n");
- printf("+----------------------+\n\n");
- printf("1. View Data (Sorted by Donor Name)\n");
- printf("2. Insert New Data\n");
- printf("3. Request Blood Transfusion\n");
- printf("4. Save Data and Exit Application\n\n");
- }
- int inputBloodType(char * input) {
- char tmpInput[3];
- scanf("%3s%*c", tmpInput);
- if (!strcmp(tmpInput, "A") || !strcmp(tmpInput, "B") || !strcmp(tmpInput, "O") || !strcmp(tmpInput, "AB")) {
- strcpy(input, tmpInput);
- return 0;
- }
- return 1;
- }
- int inputstrl(int lowerBound, int upperBound, char * input) {
- char tmpInput[101];
- scanf("%100[^\n]%*c", tmpInput);
- if (strlen(tmpInput) >= lowerBound && strlen(tmpInput) <= upperBound) {
- strcpy(input, tmpInput);
- return 0;
- }
- return 1;
- }
- int alphabetOnly(char * str) {
- int length = strlen(str);
- int i;
- printf("in: %s\n", str);
- for (i = 0; i < length; ++i) {
- char c = toupper(str[i]);
- if ((c < 'A' || c > 'Z') && c != ' ') return 0;
- }
- return 1;
- }
- int inputi(int lowerBound, int upperBound, int * input) {
- int tmpInput;
- if (scanf("%d%*c", &tmpInput) == 0) scanf("%*s");
- else if (tmpInput >= lowerBound && tmpInput <= upperBound) {
- *input = tmpInput;
- return 0;
- }
- return 1;
- }
- int main() {
- readData();
- do {
- clearScreen();
- printMenu();
- int choosenIndex;
- do {
- printf("Input your choice: ");
- } while (inputi(1, 4, &choosenIndex));
- if (choosenIndex == 1) {
- sortData();
- clearScreen();
- printData();
- printf("Number of available blood transfusion:\n");
- printf("- Blood type A : %d\n", countBloodType("A"));
- printf("- Blood type B : %d\n", countBloodType("B"));
- printf("- Blood type AB: %d\n", countBloodType("AB"));
- printf("- Blood type O : %d\n", countBloodType("O"));
- printf("\nPress enter to continue...");
- } else if (choosenIndex == 2) {
- clearScreen();
- char donorName[101];
- char bloodType[3];
- do {
- printf("Donor Name [4-20 characters (alphabet only)]: ");
- } while (inputstrl(4, 20, donorName) || !alphabetOnly(donorName));
- do {
- printf("Donor Blood Type ( A | B | O | AB ): ");
- } while (inputBloodType(bloodType));
- strcpy(donors[donorCount].name, donorName);
- strcpy(donors[donorCount].bloodType, bloodType);
- strcpy(donors[donorCount].availability, "Available");
- ++donorCount;
- } else if (choosenIndex == 3) {
- char bloodType[3];
- sortData();
- clearScreen();
- printData();
- do {
- printf("Blood Type (A | B | O | AB ): ");
- } while (inputBloodType(bloodType));
- int availableIndex;
- if ((availableIndex = searchAvailable(bloodType)) >= 0) {
- printf("Blood transfusion available found\n\n");
- printf("Donor Name : %s\n", donors[availableIndex].name);
- printf("Blood Type : %s\n", donors[availableIndex].bloodType);
- printf("Availability : %s\n", donors[availableIndex].availability);
- printf("Requesting...\n");
- strcpy(donors[availableIndex].availability, "Unavailable");
- } else {
- printf("Sorry, no blablabla\n");
- }
- printf("Press enter to continue...");
- } else {
- break;
- }
- getchar();
- } while (1);
- writeData();
- return 0;
- }
- /* data.txt
- Brandon Holmes#AB#Unavailable
- Eric West#O#Available
- Graciela Hudson#B#Unavailable
- James Hubbard#B#Available
- Olivia Kendrick#O#Unavailable
- Rosa Baynes#AB#Available
- Test data#O#Available
- William Duke#A#Unavailable
- Yorick Mori#O#Available
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement