Итоги: Изменение структур через указатели
Часть раздела Logic & Flow путешествия по C на Coddy — урок 49 из 63.
Задание
ЛегкоСоздайте программу на языке C, которая демонстрирует полноценную систему управления сотрудниками с использованием динамического выделения памяти, указателей на структуры и функций. Ваша программа должна:
- Определить
structс именемEmployeeсо следующими полями:- Целое число
idдля хранения идентификатора сотрудника - Символьный массив
nameразмером 50 для хранения имени сотрудника - Символьный массив
departmentразмером 30 для хранения названия отдела - Число с плавающей точкой
salaryдля хранения зарплаты сотрудника - Целое число
yearsOfServiceдля хранения стажа работы (в годах)
- Целое число
- Написать функцию с именем
fillEmployeeData, которая:- Принимает указатель на структуру
Employeeв качестве параметра - Считывает информацию о сотруднике из входных данных в следующем порядке: ID, имя, отдел, зарплата, стаж работы
- Присваивает значения полям структуры, используя оператор "стрелка"
- Рассчитывает бонус на основе стажа работы: если стаж >= 5 лет, бонус составляет 10% от зарплаты, в противном случае — 5% от зарплаты
- Добавляет бонус к зарплате:
empPtr->salary += bonus;
- Принимает указатель на структуру
- Написать функцию с именем
displayEmployee, которая:- Принимает указатель на структуру
Employeeв качестве параметра - Выводит информацию о сотруднике в точно таком же формате:
Employee Details:ID: [id]Name: [name]Department: [department]Salary: [salary]Years of Service: [yearsOfService]
- Принимает указатель на структуру
- Написать функцию с именем
promoteEmployee, которая:- Принимает указатель на структуру
Employeeв качестве параметра - Увеличивает зарплату на 15%, используя оператор "стрелка"
- Увеличивает стаж работы на 1
- Выводит
Employee promoted successfully!
- Принимает указатель на структуру
- В функции main:
- Объявить указатель на структуру
Employeeс именемempPtr - Использовать
malloc()для динамического выделения памяти для одной структурыEmployee - Проверить, было ли выделение памяти успешным:
- Если
empPtrравенNULL, вывестиMemory allocation failedи завершить программу - Если выделение прошло успешно, вывести
Memory allocated successfully
- Если
- Вызвать
fillEmployeeDataдля заполнения данных о сотруднике - Вывести
Initial employee data: - Вызвать
displayEmployeeдля отображения начальной информации о сотруднике - Вызвать
promoteEmployeeдля повышения сотрудника - Вывести
After promotion: - Снова вызвать
displayEmployeeдля отображения обновленной информации - Освободить динамически выделенную память с помощью
free(empPtr) - Вывести
Memory freed successfully
- Объявить указатель на структуру
Эта задача объединяет все ключевые концепции главы: определение структур, динамическое выделение памяти с помощью malloc(), проверку на ошибки выделения, передачу указателей на структуры в функции, использование оператора "стрелка" для доступа и изменения полей структуры, а также правильную очистку памяти с помощью free(). Функции демонстрируют, как указатели позволяют напрямую изменять исходные данные структуры.
Попробуйте сами
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// TODO: Определите структуру Employee здесь
// TODO: Реализуйте функцию fillEmployeeData здесь
// TODO: Реализуйте функцию displayEmployee здесь
// TODO: Реализуйте функцию promoteEmployee здесь
int main() {
// TODO: Объявите empPtr и выделите память
// TODO: Проверьте, была ли память выделена успешно
// TODO: Заполните данные сотрудника, отобразите начальные данные, повысьте и отобразите после повышения
// TODO: Освободите память и выведите сообщение об успехе
return 0;
}Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции