Using a structure representing a person's name
/* Beginning C, Third Edition By Ivor Horton ISBN: 1-59059-253-0 Published: Apr 2004 Publisher: apress */ #include <stdio.h> #include <string.h> #include <ctype.h> #define FIRST_NAME_LEN 31 #define SECOND_NAME_LEN 51 #define NUMBER_LEN 16 #define MAX_NUMBERS 50 #define TRUE 1 #define FALSE 0 /* Structure defining a name */ struct Name { char firstname[FIRST_NAME_LEN]; char secondname[SECOND_NAME_LEN]; }; /* Structure defining a phone record */ struct PhoneRecord { struct Name name; char number[NUMBER_LEN]; }; struct Name read_name(); /* Read a name from the keyboard */ void show(struct PhoneRecord record); /* Output a phone record */ int has_name(struct PhoneRecord record, struct Name name); /* Test for a name */ void main() { char answer = 'n'; struct PhoneRecord records[MAX_NUMBERS]; /* Array of phone records */ struct Name aName; /* Stores a name */ int count = 0; /* Number of phone records */ int found = FALSE; /* Records when a name has been found */ int i = 0; /* Loop control variable */ /* Read an arbitrary number of phone records from the keyboard */ do { records[count].name = read_name(); /* Read the name */ printf("Enter the number for this name: "); scanf(" %[ 0123456789]",records[count++].number); /* Read the number - including spaces */ printf("Do you want to enter another(y or n)?: "); scanf(" %c", &answer); }while(count<=MAX_NUMBERS && tolower(answer) == 'y'); /* Search the array of phone records for a number */ do { printf("Enter a name for which you want the number."); aName =read_name(); for(i = 0 ; i<count ; i++) { if(has_name(records[i], aName)) /* Test for the name */ { if(!found) /* If this is the first time */ { found = TRUE; /* Reset found flag */ printf("The numbers for this name are:\n"); /* and output the heading */ } printf("%s\n", records[i].number); /* Output the number for the name */ } } if(found) /* If the name was found */ found = FALSE; /* Reset the found flag */ else /* Otherwise output message */ printf("No numbers found for this name.\n"); printf("Do you want to search for another (y or n)? "); scanf(" %c" , &answer); }while(tolower(answer) == 'y'); for(i = 0 ; i<count ; i++) show(records[i]); printf("\n"); } /* Function to read a name and store it in a Name structure */ struct Name read_name() { struct Name name; printf("Enter a first name: "); scanf(" %s", &name.firstname); printf("Enter a second name: "); scanf(" %s", &name.secondname); return name; } /* Function to output a record */ void show(struct PhoneRecord record) { printf("\n%s %s %s", record.name.firstname,record.name.secondname, record.number); } /* Function to test whether the name is the same as in a record */ int has_name(struct PhoneRecord record, struct Name name) { return (strcmp(name.firstname, record.name.firstname)==0 && strcmp(name.secondname, record.name.secondname)==0); }