//
// - "Talk to me like I'm a 3 year old!" Programming Lessons -
//
// $Author: Ben Humphrey digiben@gametutorials.com
//
// $Program: Structures
//
// $Description: Using structures in a simple, clear way.
//
// $Date: 7/10/00
//
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
#include <stdio.h> // Стандартный заголовочный файл для printf(), итд..
/* Это структура typedef. Она определяет тип. Тип, который мы определяем, будет называться "MONEY".
"_MONEY" это то, что компилятор определит как структуру. Подстановка typedef перед структурой, это
все равно что использование #define.
Представьте, что структура это ящик с инструментами, которыми являются переменные структуры, такие
как "Dollar" и "Cents". Вы бы предпочли держать все инструменты в руках? Конечно же нет. То же самое
и со структурами. Мы используем структуры для хранения переменных. В данной программе нам не очень
нужны структуры, но я хочу показать использование структур на простом примере.
Большинство используют структуры только для передачи информации в функции.
Итак, ниже мы определяем имя структуры "_MONEY". Знак "_" использовать необязательно, но большинство
людей используют его. Нужно чтобы это имя отличалось от имени внизу typedef.
*/
typedef struct _MONEY {
int Dollars;
double Cents;
} MONEY;
/* Мы создали структуру "_MONEY". Нам нужна переменная для хранения количества долларов,
поэтому мы используем целочисленную переменную. Нам также нужна переменная для центов,
поэтому используем тип с плавающей запятой.
И в конце задаем имя структуры. Теперь "MONEY" означает "struct _MONEY".
*/
// Создадим две одинаковые структуры, чтобы показать различия
struct TEMP { // Это обычная структура без typedef.
int Dollars;
double Cents;
}; // Так как мы не используем имя (как в структуре typedef),
// мы просто ставим точку с запятой.
void main()
{
MONEY Change; // Создадим переменную типа "MONEY". Назовем ее "Change".
struct TEMP Change2; // Видите разницу? Если не использовать typedef, перед именем
// переменной нужно использовать "struct".
// Вот почему большинство используют typedef.
Change.Cents = 0.02;
// Запишем первой структуре 2 цента. Используем "." для доступа к переменным в структуре.
Change.Dollars = 2;
// Запишем 2 доллара. Если у вас visual studio 6, когда вы ставите точку после структуры, появляется список,
// который показывает все переменные структуры.
// Теперь в первой структуре 2 доллара и 2 цента, верно?
Change2.Cents = 0.04;
// Запишем во вторую структуру 4 цента. Не забывайте, мы используем точку для доступа к переменным.
Change2.Dollars = 4;
// Запишем 4 доллара.
// Напечатаем эти структуры.
printf("The change comes out to %d dollars and %.2f cents.\n", Change.Dollars, Change.Cents);
printf("The change comes out to %d dollars and %.2f cents.\n", Change2.Dollars, Change2.Cents);
/* Вы заметили, что я использую ".2" в "%.2f"? Это позволяет выводить только 2 знака после запятой,
благодаря чему не будет напечатано "0.02000000". Если вы забыли, то %d используется для вывода
целых чисел, %f для чисел с плавающей запятой, %s для строк. Есть и другие значения.
На месте этих знаков печатаются переменные, по порядку следования в функции printf, как например
на месте %d печатается Change.Dollars, а на месте %.2f - Change.Cents. */
}
// Примечание
/* Теперь вы знаете как использовать структуры.
Но, вы наверное все еще не очень представляете когда использовать их.
Вы поймете это, когда ваши программы будут большими и вы не захотите использовать
тысячи глобальных переменных.
Например, если у нас структура данных об игроке, мы захотим вести их учет :
Health, Mana, Armor, Weapons, Inventory, Stats и т.д.
И что если мы захотим передать все это в функцию? Если у нас не было бы структуры,
это выглядело бы вот так:
void InitPlayer(int Health, int Mana, ARMOR Armor, WEAPON Weapons, INV Inv, etc..);
Кто захочет все это набирать каждый раз? Нужно будет помнить имена всех переменных.
Если использовать структуру, например PLAYER, таким образом:
typedef struct _PLAYER {
{
int Health;
int Mana;
ARMOR Armor
WEAPON Weapon;
INV Inv;
etc...;
} PLAYER;
то мы можем написать:
void InitPlayer(PLAYER Player);
Теперь нам нужно передавать только струкруру игрока, которую мы создадим в начале игры.
PLAYER Player;
Также, структура может содержать в себе другие структуры, например ARMOR, WEAPON, INV, и т.д.
*/
// © 2001 GameTutorials
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
|