Структура языка Си

Структура — это тип данных, который может содержать неограниченное количество именованных подкатегорий (или полей). Например, запись студента может содержать студентов, имя, возраст, средний балл и т. д. Каждая категория информации определяется ее именем и типом (например, имя — это строка, возраст-целое число). Поместив всю эту информацию в «структуру», компьютер может использовать ее как единую «сущность».

В языке C поля и типы должны быть определены до использования структуры. Структуры очень похожи на Matlab, но должны (как и любой другой ТИП в C) быть предопределены. Тип структуры — это название «группы» связанных частей «именованной» информации об одном объекте.

Синтаксис для объявления типа структуры таков:

struct TYPE_NAME
{
TYPE_1 field_1_name;
TYPE_2 field_2_name;
TYPE_3 field_3_name[100]; // массив ‘TYPE_3’
};

Вот фактическая структура:

struct Student
{
charname[100]; // строка длиной до 100 символов
intage; // имя поля — «возраст».тип — «int»
floatgpa; // имя поля — «gpa». type — «float»
};

Помните, что при создании структуры каждое «поле» (именованные подкатегории) должно иметь тип!

Использование структуры

Как только структура определена, ее можно использовать в любом месте, где можно использовать стандартный ТИП. Опять же, рассмотрим структуру, определенную Студентом выше. Для его создания мы используем:

Student student_1; // здесь мы объявляем одну переменную
// тип «student». Имя переменной — «student_1»

Studentstudents[100]; // здесь мы объявляем массив студентов
// тип «Массив студент». Название: «студенты»

Вот пример программы

int
main()
{
Student the_student; // объявить переменную

the_student.age = 5;
sprintf(the_student.name, «Jim»); // remember the_student.anme = «jim»
// не работает.
the_student.gpa = 3,32;

print_student(the_student);

the_student = improve_gpa_of(the_student); // Примечание: мы можем вернуться
// структуры из функций.
}

Помните, что тип «Student» должен быть объявлен либо в верхней части файла .C, либо в специальном файле .h (заголовочном).

Пример программы 2

Давайте напишем программу для представления дробей на языке С. Сначала мы определяем тип структуры в дробях:

struct fraction
{
intnumer; // поля
intdenom;
};

Затем мы определяем прототипы для всех функций, которые мы будем писать (все еще в дробях.h)

voidprint_fraction(Fraction f); // прототипы
Fraction add_fractions(Fractionf1, Fraction f2);
Fractionsimplify_fraction(Fractionfraction);

Обратите внимание на использование ключевого слова Фракции, которое из-за приведенного выше определения структуры является допустимым ТИПОМ для C. Теперь мы начинаем писать Fractions.C файл с нашим фактическим кодом. Сначала мы комментируем, а затем включаем Fractions.x

/*
*
*
* Этот файл содержит код библиотеки дробей, включая:
*
* add_fractions
* print_fraction
* simplify_fraction
*
*/

#include <stdio.h>
#include «fractions.h»

Первая функция-add_fractions 

/*
* Учитывая две дроби, сложите их и верните результат
*
* Входы: f1, f2 (обе фракции)
* Выход: дробь (результат сложения f1 и f2)
*
*/

Fraction
add_fractions(Fraction f1, Fraction f2)
{
result Fraction;

if (f1.denom == f2.denom)
{
result.numer = f1.numer + f2.numer;
result.denom = f1.denom;
return result;
}

// Сомнительный код
result.numer = f1.numer + f2.numer;
result.denom = f1.denom + f2.denom;

returnresult; // Может возвращать структуры!!!
}

Пожалуй, самая сложная функция для написания — это «simplify_fraction».

Алгоритм, который нам нужен, таков:

  • найти наибольший общий делитель числителя и знаменателя.
  • создайте новую дробь, равную старой дроби, деленной на GCD.
  • верните этот результат.

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

/**
* Найти наибольший общий делитель между двумя числами
*
* Возвращает либо GCD, либо 0, что означает отсутствие наибольшего общего делителя
*/
int
greatest_common_divisor(int number_1, int number_2 )
{
intgcd = number_1;

if( gcd> number_2 ) // предположим, что GCD начинается с наименьшего из двух чисел
{
gcd = number_2;
}
while ( gcd> 0 )
{
if ( number_1 % gcd == 0 && number_2 % gdc == 0)
{
returngcd;
}

gcd—;
}

return 0; // нет решения

}

Как только у нас есть эта функция, мы можем использовать ее для упрощения дроби:

/*
* Упростите дробь
*
* Входы: f1 (a))
* Вывод: f1 в упрощенном виде (все еще дробь)
*
* Примечание: это работает только с положительными дробями
*/

Fraction
simplify_fraction(const Fraction frac )
{
// Объявить и инициализировать результат
Fractionresult = frac; // обратите внимание, что слова присваивания для структур

// найти GCD
intgcd = greatest_common_divisor( frac.numer, frac.denom );

while( gcd != 0 ) // пока существует GCD
{
result.numer /= gcd; // разделите как числитель, так и знаменатель
result.denom /= gcd; // на GCD

gcd = greatest_common_divisor( result.numer, result.denom ); // проверка наличия нового GCD

}

returnresult; // вы можете вернуть дробь, потому что это структура

}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *