#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_STUDENTS 100 #define MAX_RESIDENTS 100 #define MAX_STRING 50 typedef struct { char studentCode[MAX_STRING]; char name[MAX_STRING]; char idCode[MAX_STRING]; } Student; typedef struct { char idCode[MAX_STRING]; char city[MAX_STRING]; } Resident; int loadStudents(Student students[], const char *filename); int loadResidents(Resident residents[], const char *filename); void showAvailableCities(Resident residents[], int residentCount); void toLowerCase(char *str); int isCityValid(Resident residents[], int residentCount, const char *inputCity); void findAndPrintStudents(Student students[], int studentCount, Resident residents[], int residentCount, const char *inputCity); int initializeData(Student students[], int *studentCount, Resident residents[], int *residentCount, char *inputCity); int main() { Student students[MAX_STUDENTS]; Resident residents[MAX_RESIDENTS]; int studentCount, residentCount; char inputCity[MAX_STRING]; if (initializeData(students, &studentCount, residents, &residentCount, inputCity) == -1) { return 1; } findAndPrintStudents(students, studentCount, residents, residentCount, inputCity); return 0; } int initializeData(Student students[], int *studentCount, Resident residents[], int *residentCount, char *inputCity) { *studentCount = loadStudents(students, "F1.txt"); if (*studentCount == -1) return -1; *residentCount = loadResidents(residents, "F2.txt"); if (*residentCount == -1) return -1; showAvailableCities(residents, *residentCount); while (1) { printf("Enter residence: "); scanf("%s", inputCity); toLowerCase(inputCity); if (isCityValid(residents, *residentCount, inputCity)) { break; } else { printf("Error: The city '%s' is not in the available list. Try again.\n", inputCity); } } return 0; } int loadStudents(Student students[], const char *filename) { FILE *file = fopen(filename, "r"); if (file == NULL) { printf("Error opening %s\n", filename); return -1; } int count = 0; while (fscanf(file, "%s %s %s", students[count].studentCode, students[count].name, students[count].idCode) == 3) { count++; if (count >= MAX_STUDENTS) break; } fclose(file); return count; } int loadResidents(Resident residents[], const char *filename) { FILE *file = fopen(filename, "r"); if (file == NULL) { printf("Error opening %s\n", filename); return -1; } int count = 0; while (fscanf(file, "%s %s", residents[count].idCode, residents[count].city) == 2) { toLowerCase(residents[count].city); count++; if (count >= MAX_RESIDENTS) break; } fclose(file); return count; } void showAvailableCities(Resident residents[], int residentCount) { printf("Available cities:\n"); for (int i = 0; i < residentCount; i++) { int duplicate = 0; for (int j = 0; j < i; j++) { if (strcmp(residents[i].city, residents[j].city) == 0) { duplicate = 1; break; } } if (!duplicate) { printf("- %s\n", residents[i].city); } } printf("\n"); } void toLowerCase(char *str) { for (int i = 0; str[i]; i++) { str[i] = tolower(str[i]); } } int isCityValid(Resident residents[], int residentCount, const char *inputCity) { for (int i = 0; i < residentCount; i++) { if (strcmp(residents[i].city, inputCity) == 0) { return 1; } } return 0; } void findAndPrintStudents(Student students[], int studentCount, Resident residents[], int residentCount, const char *inputCity) { printf("\nStudents in %s:\n", inputCity); int found = 0; for (int i = 0; i < residentCount; i++) { if (strcmp(residents[i].city, inputCity) == 0) { for (int j = 0; j < studentCount; j++) { if (strcmp(students[j].idCode, residents[i].idCode) == 0) { printf("%s %s\n", students[j].studentCode, students[j].name); found = 1; } } } } if (!found) { printf("No students found in this city.\n"); } }