Add the permanent phonebook-capacity guard to add_contact(). Before starting a new insertion, check whether contact_count has reached the maximum capacity of 100. When the phonebook is full, print Phonebook Full and leave the existing records unchanged. Retain every previously implemented ID reading, validation, duplicate detection, name input, phone validation, storage, and counter-update behavior.
One or more complete Add Contact operations beginning with menu choice 1, followed by ID, name, and phone values. The sequence may contain enough successful additions to fill the phonebook, and ends with menu choice 0.
Successful insertions behave exactly as in Task 10. Any Add operation attempted when contact_count is 100 prints Phonebook Full and does not read or store another contact.
The phonebook capacity is exactly 100. Valid IDs are positive and unique. Phone length is 1 to 14 characters. No insertion may occur when contact_count is already 100.
1 101 Alice 1234567890 1 101 Bob 9999999999 0
Contact Book Ready.
Phonebook Capacity: 100
Contacts: 0
Modules Ready.
Menu:
Add
ID: 101
Valid ID
Name: Alice
Phone: 1234567890
Valid Phone
Contact Added
Menu:
Add
Phonebook Full
Menu:
Exit
The capacity guard prevents writes beyond the phonebook array. Because the project supports exactly 100 contacts, the guard must run before reading or storing a new record once contact_count reaches 100.
#include <stdio.h>
#include <string.h>
struct Contact {
int id;
char name[50];
char phone[15];
};
struct Contact phonebook[100];
int contact_count = 0;
void add_contact();
void display_contacts();
void search_contact();
void update_contact();
void delete_contact();
void add_contact() {
// Write your code here
int id;
if (scanf("%d", &id) == 1) {
printf("\nID: %d", id);
if (id > 0) {
printf("\nValid ID");
{
int duplicate = 0;
for (int i = 0; i < contact_count; i++) {
if (phonebook[i].id == id) {
duplicate = 1;
break;
}
}
if (duplicate) {
printf("\nDuplicate ID");
return;
}
}
getchar();
if (fgets(phonebook[contact_count].name,
sizeof(phonebook[contact_count].name), stdin) != NULL) {
phonebook[contact_count].name[
strcspn(phonebook[contact_count].name, "\n")
] = '\0';
printf("\nName: %s", phonebook[contact_count].name);
{
char phone_input[100];
if (fgets(phone_input, sizeof(phone_input), stdin) != NULL) {
phone_input[
strcspn(phone_input, "\n")
] = '\0';
printf("\nPhone: %s", phone_input);
if (strlen(phone_input) >= 1 &&
strlen(phone_input) <= 14) {
strcpy(phonebook[contact_count].phone, phone_input);
printf("\nValid Phone");
phonebook[contact_count].id = id;
contact_count++;
printf("\nContact Added");
} else {
printf("\nInvalid Phone");
}
}
}
}
} else {
printf("\nInvalid ID");
}
}
}
void display_contacts() {
}
void search_contact() {
}
void update_contact() {
}
void delete_contact() {
}
int main() {
int choice;
printf("Contact Book Ready.");
printf("\nPhonebook Capacity: %d", 100);
printf("\nContacts: %d", contact_count);
while (1) {
printf("\nMenu:");
if (scanf("%d", &choice) != 1) {
break;
}
switch (choice) {
case 1:
printf("\nAdd");
add_contact();
break;
case 2:
printf("\nDisplay");
display_contacts();
break;
case 3:
printf("\nSearch");
search_contact();
break;
case 4:
printf("\nUpdate");
update_contact();
break;
case 5:
printf("\nDelete");
delete_contact();
break;
case 0:
printf("\nExit");
return 0;
default:
printf("\nInvalid Choice");
break;
}
}
return 0;
}Embedded systems rely on efficient low-level programming to interact directly with hardware. In this course, you will learn how to write practical Embedded C programs used in real microcontroller-based systems. Rather than focusing only on theory, this course follows a practice-driven approach. Each lesson includes hands-on coding exercises that simulate real firmware development tasks used