C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C struct. Структури і функції


Як і будь-який інший об'єкт, структура може використовуватися в якості параметра функції і також може бути повертається об'єктом функції.

Розглянемо використання структур у функціях на прикладі:

#include <stdio.h>
 
struct time
{
    int hour;
    int minute;
    int second;
};
 
// прототип функции
struct time addminutes(struct time, int);
 
int main(void)
{
    struct time current_time = {17, 38, 10};
    int minutes = 21;
     
    struct time result_time = addminutes(current_time, minutes);
    printf("%d:%d:%d \n", result_time.hour, result_time.minute, result_time.second);
     
    result_time = addminutes(current_time, 23);
    printf("%d:%d:%d \n", result_time.hour, result_time.minute, result_time.second);
     
    result_time = addminutes(current_time, 382);
    printf("%d:%d:%d \n", result_time.hour, result_time.minute, result_time.second);
    return 0;
}
 
struct time addminutes(struct time t, int minutes)
{
    struct time result ={t.hour, t.minute, t.second};
    int h, d;
    // прибавляем минуты
    result.minute += minutes;
    // если минут больше 59, делим на 60
    if(result.minute >=60)
    {
        h = result.minute / 60;
        // от минут вычитаем 60 * h
        result.minute -= 60 * h;
        // к часам прибавляем h
        result.hour +=h;
    }
    // если часов больше 23, делим на 24
    if(result.hour >=24)
    {
        d = result.hour / 24;
        // от часов вычитаем d * 24
        result.hour -= 24 * d;
    }
    return result;
}

На початку програми визначена структура time, яка представляє час і містить три елементи для зберігання значень для годин, хвилин і секунд.

В кінці програми визначена функція addminutes() , додає до дати кілька хвилин. Перший параметр функції представляє структуру time, а другий - кількість хвилин, яке треба додати. Значення, що повертається функції також представляє структуру time. У самій функції за допомогою деякої найпростішої логіки створюємо новий об'єкт структури time, присвоюємо йому значення, передані через перший параметр, і додаємо потрібну кількість хвилин.

Потім в функції main послідовно викликаємо функцію addminutes, додаючи до деякого часу різну кількість хвилин.

Консольний висновок програми:

#include <stdio.h>
 
struct time
{
    int hour;
    int minute;
    int second;
};
 
// прототип функции
void addminutes(struct time, int);
 
int main(void)
{
    struct time current_time = {17, 38, 10};
     
    addminutes(current_time, 21);
    printf("In main \t %d:%d:%d \n", current_time.hour, current_time.minute, current_time.second);
     
    return 0;
}
 
void addminutes(struct time t, int minutes)
{
    int h, d;
    // прибавляем минуты
    t.minute += minutes;
    // если минут больше 59, делим на 60
    if(t.minute >=60)
    {
        h = t.minute / 60;
        // от минут вычитаем 60 * h
        t.minute -= 60 * h;
        // к часам прибавляем h
        t.hour +=h;
    }
    // если часов больше 23, делим на 24
    if(t.hour >=24)
    {
        d = t.hour / 24;
        // от часов вычитаем d * 24
        t.hour -= 24 * d;
    }
    printf("In addminutes \t %d:%d:%d \n", t.hour, t.minute, t.second);
}

Якщо ми запустимо програму, то побачимо що передається структура current_time в функцію addminutes після виконання цієї функції не зміниться:

#include <stdio.h>
 
struct time
{
    int hour;
    int minute;
    int second;
};
 
// прототип функции
void addminutes(struct time *, int);
 
int main(void)
{
    struct time current_time = {17, 38, 10};
    struct time * p_time = &current_time;
    addminutes(p_time, 21);
    printf("In main \t %d:%d:%d \n", current_time.hour, current_time.minute, current_time.second);
     
    return 0;
}
 
void addminutes(struct time *t, int minutes)
{
    int h, d;
    // прибавляем минуты
    t->minute += minutes;
    // если минут больше 59, делим на 60
    if(t->minute >=60)
    {
        h = t->minute / 60;
        // от минут вычитаем 60 * h
        t->minute -= 60 * h;
        // к часам прибавляем h
        t->hour +=h;
    }
    // если часов больше 23, делим на 24
    if(t->hour >=24)
    {
        d = t->hour / 24;
        // от часов вычитаем d * 24
        t->hour -= 24 * d;
    }
    printf("In addminutes \t %d:%d:%d \n", t->hour, t->minute, t->second);
}

Тепер в функцію передається покажчик на структуру p_time, який містить адресу структури current_time. В результаті будь-яка зміна значень з цього вказівником призведе до зміни самої структури current_time. І результати програми будуть вже відрізнятися:

#include <stdio.h>
#include <stdlib.h>
 
struct time
{
    int hour;
    int minute;
    int second;
};
 
// прототип функции
struct time * input(void);
 
int main(void)
{
    struct time * p_time = input();
    printf("%d:%d:%d \n", p_time->hour, p_time->minute, p_time->second);
     
    free(p_time);   // освобождаем память
    return 0;
}
 
struct time * input()
{
    // выделяем память для структуры
    struct time * p_time = (struct time *) malloc(sizeof(struct time));
    // ввод значений
    printf("Enter hour: ");
    scanf("%d", &p_time->hour);
    printf("Enter minutes: ");
    scanf("%d", &p_time->minute);
    printf("Enter seconds: ");
    scanf("%d", &p_time->second);
     
    return p_time;
}

У функції input спочатку виділяємо пам'ять для структури, отримуючи покажчик на виділений блок пам'яті.

Потім по черзі вводимо значення для елементів структури і повертаємо покажчик з функції.

У функції main викликаємо функцію input, отримуючи з неї указаетель. Використовуючи отриманий покажчик, можна отримати значення елементів структури. І в кінці звільняємо виділену під структуру динамічну пам'ять.

Консольний висновок програми:

Введіть годину: 22
Введіть хвилини: 14
Введіть секунди: 18
22:14:18

Наш партнер:
beta test mp3 playlist downloader