Собираем всё воедино
Часть раздела Logic & Flow путешествия по C на Coddy — урок 54 из 63.
Задание
ЛегкоЗавершите создание системы управления контактами, интегрировав все функции, которые вы создали в предыдущих уроках. Ваша программа должна:
- Использовать то же определение структуры
Contactиз предыдущих уроков со следующими полями:- Символьный массив
nameразмером 50 - Символьный массив
phoneразмером 20 - Символьный массив
emailразмером 40 - Целое число
age
- Символьный массив
- Использовать ту же функцию
createContactиз предыдущих уроков, которая:- Динамически выделяет память для структуры
Contact - Инициализирует все поля значениями по умолчанию
- Возвращает указатель на контакт
- Динамически выделяет память для структуры
- Использовать ту же функцию
populateContactиз предыдущих уроков, которая:- Принимает указатель на структуру
Contactв качестве параметра - Запрашивает ввод пользователя и заполняет все поля контакта
- Проверяет вводимые данные
- Принимает указатель на структуру
- Написать функцию
displayContact, которая:- Принимает константный указатель на структуру
Contactв качестве параметра - Выводит каждое поле на отдельной строке в точно таком формате:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- Принимает константный указатель на структуру
- Написать функцию с именем
updateContact, которая:- Принимает указатель на структуру
Contactв качестве параметра - Ничего не возвращает (void)
- Предлагает пользователю выбрать поле для обновления, выводя:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- Считывает выбор пользователя и обновляет соответствующее поле:
- Если выбор 1: выводит
Enter new name:и обновляет имя - Если выбор 2: выводит
Enter new phone:и обновляет телефон - Если выбор 3: выводит
Enter new email:и обновляет email - Если выбор 4: выводит
Enter new age:и обновляет возраст - Если выбор неверный (не 1-4): выводит
Invalid choice
- Если выбор 1: выводит
- После успешного обновления выводит
Contact updated successfully
- Принимает указатель на структуру
- В функции main реализовать полный рабочий процесс управления контактами:
- Создать контакт с помощью функции
createContact - Проверить, было ли создание контакта успешным
- Вызвать функцию
populateContactдля заполнения начальных данных контакта - Вывести
--- Initial Contact --- - Вызвать функцию
displayContactдля отображения начальной информации о контакте - Вывести
--- Updating Contact --- - Вызвать функцию
updateContactдля изменения одного поля - Вывести
--- Updated Contact --- - Снова вызвать функцию
displayContactдля отображения обновленной информации о контакте - Освободить динамически выделенную память
- Вывести
Contact management completed
- Создать контакт с помощью функции
Примечание: Функция displayContact в этом уроке использует простой формат — одна строка на поле без дополнительных деталей или единиц измерения (например, возраст выводится как простое число, а не "25 years old"). Убедитесь, что ваш вывод точно соответствует формату, показанному выше, так как от этого зависят тестовые случаи.
Эта финальная задача объединяет все компоненты вашей системы управления контактами: определение структуры, динамическое выделение памяти, ввод и валидацию данных, форматированный вывод и модификацию данных. Вы продемонстрируете полный жизненный цикл динамически выделенной структуры от создания до очистки, практикуясь в организации функций и правильном использовании указателей на протяжении всего процесса.
Попробуйте сами
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
struct Contact* createContact() {
struct Contact* contact = (struct Contact*)malloc(sizeof(struct Contact));
if (contact != NULL) {
strcpy(contact->name, "");
strcpy(contact->phone, "");
strcpy(contact->email, "");
contact->age = 0;
}
return contact;
}
void populateContact(struct Contact* contactPtr) {
printf("Enter name: ");
fgets(contactPtr->name, sizeof(contactPtr->name), stdin);
contactPtr->name[strcspn(contactPtr->name, "\n")] = '\0';
printf("Enter phone: ");
fgets(contactPtr->phone, sizeof(contactPtr->phone), stdin);
contactPtr->phone[strcspn(contactPtr->phone, "\n")] = '\0';
printf("Enter email: ");
fgets(contactPtr->email, sizeof(contactPtr->email), stdin);
contactPtr->email[strcspn(contactPtr->email, "\n")] = '\0';
printf("Enter age: ");
scanf("%d", &contactPtr->age);
}
void displayContact(const struct Contact *contactPtr) {
printf("=== CONTACT DETAILS ===\n");
printf("Name: %s\n", contactPtr->name);
printf("Phone: %s\n", contactPtr->phone);
printf("Email: %s\n", contactPtr->email);
printf("Age: %d years old\n", contactPtr->age);
printf("========================\n");
printf("Name length: %lu characters\n", strlen(contactPtr->name));
if (contactPtr->age >= 0 && contactPtr->age <= 12) {
printf("Generation: Child\n");
} else if (contactPtr->age >= 13 && contactPtr->age <= 19) {
printf("Generation: Teenager\n");
} else if (contactPtr->age >= 20 && contactPtr->age <= 39) {
printf("Generation: Young Adult\n");
} else if (contactPtr->age >= 40 && contactPtr->age <= 59) {
printf("Generation: Middle-aged Adult\n");
} else if (contactPtr->age >= 60) {
printf("Generation: Senior\n");
}
if (strchr(contactPtr->email, '@') != NULL) {
printf("Email format: Valid\n");
} else {
printf("Email format: Invalid\n");
}
}
int main() {
struct Contact* contact = createContact();
if (contact != NULL) {
populateContact(contact);
displayContact(contact);
free(contact);
printf("Program completed successfully\n");
}
return 0;
}Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции6Управление памятью
Стек против кучиДинамическое выделение — malloc()Использование sizeof() для выделения памятиПроверка ошибок выделения памятиОсвобождение памяти с помощью free()Выделение памяти с помощью calloc()Итоги: Динамический массив9Проект: Простой ввод контактов
Проект: Определение структуры ContactФункция для создания контакта