Создание функций на языке C

CCBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (LabEx) вы научитесь создавать и использовать функции в программировании на языке C. В рамках лабораторной работы рассматриваются основные концепции объявления и определения функций, понимания аргументов функций, возврата значений из функций, работы с функциями типа void и практики использования функций. Вы изучите эти темы на практических примерах и упражнениях, приобретая навыки написания модульного и повторно используемого кода на языке C.

Лабораторная работа начинается с введения в основы объявления и определения функций, демонстрируя, как создавать и вызывать простые функции. Затем она углубляется в понимание аргументов функций, показывая, как передавать различные типы данных в качестве входных параметров функций. Также в лабораторной работе рассматривается концепция возвращаемых значений, которая научит вас возвращать данные из функций. Кроме того, в лабораторной работе исследуется использование функций типа void, которые не возвращают никаких значений. Наконец, у вас появится возможность практиковать и применять изученные концепции на различных упражнениях.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/ControlFlowGroup -.-> c/switch("Switch") c/FunctionsGroup -.-> c/function_declaration("Function Declaration") c/FunctionsGroup -.-> c/function_parameters("Function Parameters") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-438257{{"Создание функций на языке C"}} c/switch -.-> lab-438257{{"Создание функций на языке C"}} c/function_declaration -.-> lab-438257{{"Создание функций на языке C"}} c/function_parameters -.-> lab-438257{{"Создание функций на языке C"}} c/output -.-> lab-438257{{"Создание функций на языке C"}} end

Объявление и определение функций

На этом этапе вы научитесь объявлять и определять функции в программировании на языке C. Функции являются основными строительными блоками, которые помогают организовать и модульно структурировать ваш код.

Начнем с создания нового файла с именем functions_demo.c в директории ~/project:

cd ~/project
touch functions_demo.c

Теперь напишем простое объявление и определение функции:

#include <stdio.h>

// Объявление функции (прототип)
void greet(char* name);

// Главная функция
int main() {
    // Вызов функции
    greet("LabEx User");
    return 0;
}

// Определение функции
void greet(char* name) {
    printf("Hello, %s! Welcome to C programming.\n", name);
}

Разберем основные компоненты:

  • void greet(char* name) - это объявление функции (прототип)
  • Функция принимает указатель на символ (строку) в качестве аргумента
  • void указывает, что функция не возвращает значения
  • Внутри main() мы вызываем функцию с аргументом
  • Определение функции следует после главной функции и реализует фактическую логику

Скомпилируйте и запустите программу:

gcc functions_demo.c -o functions_demo
./functions_demo

Пример вывода:

Hello, LabEx User! Welcome to C programming.

Функции помогают вам:

  • Организовать код в повторно используемые блоки
  • Улучшить читаемость кода
  • Сократить повторения
  • Модульно структурировать программу

Понимание аргументов функций

На этом этапе вы научитесь работать с аргументами функций в программировании на языке C. Аргументы функций позволяют передавать данные в функции, делая их более гибкими и повторно используемыми.

Создадим новый файл с именем function_arguments.c в директории ~/project:

cd ~/project
touch function_arguments.c

Теперь напишем программу, демонстрирующую различные типы аргументов функций:

#include <stdio.h>

// Функция с несколькими аргументами
int calculate_rectangle_area(int length, int width) {
    return length * width;
}

// Функция с аргументом типа с плавающей точкой
float convert_celsius_to_fahrenheit(float celsius) {
    return (celsius * 9/5) + 32;
}

int main() {
    // Использование целочисленных аргументов
    int length = 5;
    int width = 3;
    int area = calculate_rectangle_area(length, width);
    printf("Rectangle Area: %d square units\n", area);

    // Использование аргумента типа с плавающей точкой
    float celsius = 25.0;
    float fahrenheit = convert_celsius_to_fahrenheit(celsius);
    printf("%.1f°C is %.1f°F\n", celsius, fahrenheit);

    return 0;
}

Разберем основные концепции:

  • Функции могут принимать несколько аргументов разных типов
  • calculate_rectangle_area() принимает два целочисленных аргумента
  • convert_celsius_to_fahrenheit() принимает аргумент типа float
  • В языке C аргументы передаются по значению (создается копия)
  • Функция может использовать эти аргументы в своих вычислениях

Скомпилируйте и запустите программу:

gcc function_arguments.c -o function_arguments
./function_arguments

Пример вывода:

Rectangle Area: 15 square units
25.0°C is 77.0°F

Основные моменты о аргументах функций:

  • Аргументы предоставляют входные данные для функций
  • Вы можете передавать переменные или прямые значения
  • Количество и тип аргументов должны соответствовать объявлению функции
  • Аргументы помогают сделать функции более универсальными и повторно используемыми

Возвращение значений из функций

На этом этапе вы научитесь возвращать значения из функций в программировании на языке C. Возвращаемые значения позволяют функциям выполнять вычисления и отправлять результаты обратно в вызывающий код.

Создадим новый файл с именем function_returns.c в директории ~/project:

cd ~/project
touch function_returns.c

Теперь напишем программу, демонстрирующую различные типы возвращаемых значений:

#include <stdio.h>

// Функция, возвращающая целое число
int square(int number) {
    return number * number;
}

// Функция, возвращающая число с плавающей точкой
float calculate_average(int a, int b, int c) {
    return (float)(a + b + c) / 3;
}

// Функция, возвращающая символ
char get_grade(int score) {
    if (score >= 90) return 'A';
    else if (score >= 80) return 'B';
    else if (score >= 70) return 'C';
    else if (score >= 60) return 'D';
    else return 'F';
}

int main() {
    // Использование возвращаемого целого значения
    int num = 7;
    int squared = square(num);
    printf("Square of %d is %d\n", num, squared);

    // Использование возвращаемого значения с плавающей точкой
    int math = 85, science = 92, english = 78;
    float average = calculate_average(math, science, english);
    printf("Average score: %.2f\n", average);

    // Использование возвращаемого символа
    int student_score = 85;
    char grade = get_grade(student_score);
    printf("Student score %d gets grade %c\n", student_score, grade);

    return 0;
}

Разберем основные концепции:

  • Функции могут возвращать различные типы данных
  • square() возвращает целочисленный результат
  • calculate_average() возвращает число с плавающей точкой
  • get_grade() возвращает символ
  • Ключевое слово return отправляет значение обратно в вызывающую функцию
  • Типы возвращаемых значений должны соответствовать объявлению функции

Скомпилируйте и запустите программу:

gcc function_returns.c -o function_returns
./function_returns

Пример вывода:

Square of 7 is 49
Average score: 85.00
Student score 85 gets grade B

Основные моменты о возвращаемых значениях:

  • Возвращаемые значения позволяют функциям выполнять вычисления и отправлять результаты обратно
  • Используйте соответствующие типы возвращаемых значений в зависимости от цели функции
  • Вы можете использовать возвращаемые значения напрямую или сохранять их в переменных
  • Возвращаемые значения делают функции более мощными и гибкими

Работа с функциями типа void

На этом этапе вы узнаете о функциях типа void в программировании на языке C. Функции типа void выполняют действия без возврата значения, что полезно для задач, которые не требуют отправки результата обратно.

Создадим новый файл с именем void_functions.c в директории ~/project:

cd ~/project
touch void_functions.c

Теперь напишем программу, демонстрирующую функции типа void:

#include <stdio.h>

// Функция типа void для вывода приветственного сообщения
void print_welcome() {
    printf("Welcome to the C Programming Lab!\n");
}

// Функция типа void с параметрами для отображения информации о студенте
void display_student_info(char* name, int age) {
    printf("Student Name: %s\n", name);
    printf("Student Age: %d\n", age);
}

// Функция типа void для рисования простого паттерна
void draw_pattern(int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("* ");
        }
        printf("\n");
    }
}

int main() {
    // Вызов функций типа void
    print_welcome();

    // Функция типа void с параметрами
    char* student_name = "LabEx User";
    int student_age = 25;
    display_student_info(student_name, student_age);

    // Функция типа void для рисования паттерна
    int pattern_size = 3;
    printf("\nDrawing a %dx%d pattern:\n", pattern_size, pattern_size);
    draw_pattern(pattern_size);

    return 0;
}

Разберем основные концепции:

  • Функции типа void имеют void в качестве типа возвращаемого значения
  • Они выполняют действия без возврата значения
  • print_welcome() просто выводит сообщение
  • display_student_info() принимает параметры и выводит информацию
  • draw_pattern() создает визуальный паттерн с использованием вложенных циклов
  • Функции типа void вызываются как обычные функции
  • В функциях типа void нельзя использовать return с значением

Скомпилируйте и запустите программу:

gcc void_functions.c -o void_functions
./void_functions

Пример вывода:

Welcome to the C Programming Lab!
Student Name: LabEx User
Student Age: 25

Drawing a 3x3 pattern:
* * *
* * *
* * *

Основные моменты о функциях типа void:

  • Используются для действий, которые не требуют возврата значения
  • Можут принимать параметры
  • Полезны для вывода, логирования или выполнения конкретных задач
  • Помогают организовать и модульно структурировать код
  • Не могут возвращать значение с помощью return

Практика использования функций

На этом последнем этапе вы примените все, что вы узнали о функциях в языке C, создав комплексную программу, которая демонстрирует различные типы функций и их использование.

Создадим файл с именем calculator.c в директории ~/project:

cd ~/project
touch calculator.c

Теперь напишем программу, которая реализует простой калькулятор с различными функциями:

#include <stdio.h>

// Функция для сложения двух чисел
int add(int a, int b) {
    return a + b;
}

// Функция для вычитания двух чисел
int subtract(int a, int b) {
    return a - b;
}

// Функция для умножения двух чисел
int multiply(int a, int b) {
    return a * b;
}

// Функция для деления двух чисел с обработкой ошибок
float divide(int a, int b) {
    if (b == 0) {
        printf("Error: Division by zero!\n");
        return 0;
    }
    return (float)a / b;
}

// Функция типа void для отображения меню калькулятора
void display_menu() {
    printf("\n--- Simple Calculator ---\n");
    printf("1. Addition\n");
    printf("2. Subtraction\n");
    printf("3. Multiplication\n");
    printf("4. Division\n");
    printf("5. Exit\n");
    printf("Enter your choice: ");
}

int main() {
    int choice, num1, num2;
    float result;

    while (1) {
        display_menu();
        scanf("%d", &choice);

        // Условие выхода
        if (choice == 5) {
            printf("Goodbye!\n");
            break;
        }

        // Проверка правильности выбора
        if (choice < 1 || choice > 4) {
            printf("Invalid choice. Try again.\n");
            continue;
        }

        // Получение ввода от пользователя
        printf("Enter two numbers: ");
        scanf("%d %d", &num1, &num2);

        // Выполнение вычислений в зависимости от выбора пользователя
        switch (choice) {
            case 1:
                result = add(num1, num2);
                printf("Result: %d + %d = %d\n", num1, num2, (int)result);
                break;
            case 2:
                result = subtract(num1, num2);
                printf("Result: %d - %d = %d\n", num1, num2, (int)result);
                break;
            case 3:
                result = multiply(num1, num2);
                printf("Result: %d * %d = %d\n", num1, num2, (int)result);
                break;
            case 4:
                result = divide(num1, num2);
                printf("Result: %d / %d = %.2f\n", num1, num2, result);
                break;
        }
    }

    return 0;
}

Разберем основные концепции:

  • Используются различные типы функций (с возвращаемым значением, функции типа void)
  • Функции выполняют конкретные математические операции
  • display_menu() - это функция типа void, которая отображает меню
  • Арифметические функции возвращают результаты вычислений
  • Функция main() реализует калькулятор с меню
  • Включена обработка ошибок при делении на ноль
  • Используется оператор switch для выбора операции

Скомпилируйте и запустите программу:

gcc calculator.c -o calculator
./calculator

Пример взаимодействия:

--- Simple Calculator ---
1. Addition
2. Subtraction
3. Multiplication
4. Division
5. Exit
Enter your choice: 1
Enter two numbers: 10 5
Result: 10 + 5 = 15

--- Simple Calculator ---
...
Enter your choice: 5
Goodbye!

Основные моменты о использовании функций:

  • Комбинируйте различные типы функций
  • Используйте функции для разбиения сложных задач
  • Реализуйте обработку ошибок
  • Создавайте модульный и повторно используемый код

Резюме

В этом практическом занятии вы научились объявлять и определять функции в программировании на языке C, понимать аргументы функций, возвращать значения из функций, работать с функциями типа void и практиковать использование функций. Вы начали с создания простой функции для приветствия пользователя, а затем изучили более сложные функции с несколькими аргументами и возвращаемыми значениями. Вы также узнали, как использовать функции типа void и применять функции в своих программах. Эти фундаментальные концепции являются важными для создания модульного и повторно используемого кода на языке C.