<b>Структуры данных языка Си++</b>

Структуры данных языка Си++

Данный раздел очень важный, так как именно он научит нас использовать всё многообразие средств языка С++ для работы с данными. Практически любая программа так или иначе обрабатывает данные - это основная задача программирования. И от того, как вы правильно структурируете данные зависит очень многое.

КАК написать функцию не возвращающую значение?

В предыдущих примерах мы с вами уже создавали функции сами, например GetCurrentDir(). На практике вы будете на 90% использовать функции, которые создали сами и лишь на 10% стандартные функции СИ. Функции бывают двух типов. Первый тип в языке Pascal называетая процедурой. Это функция, которая не возвращает значения. Такие функции предназначены для того, чтобы сэкономить размер исходного кода программы и не писать один и тот же повторяющийся код несколько раз. Например если вы хотите написать в нескольких местах экрана фразу: "Я люблю С++", вам придётся повторить практически один и тот же код несколько раз:

textcolor(1); gotoxy(1, 1); cprintf("Я люблю Си++");

textcolor(2); gotoxy(2, 2): cprintf("Я люблю Си++");

А если вы хотите заполнить экран такими сообщениями? Страшно и вообразить! Чтобы не повторять этот код, мы объединим его в функцию, которая в качестве аргументов будет принимать строку с текстом, которую мы хотим вывести, координаты экрана, в которых эта строка должна будет появиться, и цвет. Вот как будет выглядеть такая функция:

void OutTextXY(char *text, int x, int y, int color) Тип void ("пустой") означает, что эта функция не имеет типа, так как не возвращает никакого значения. Она предназначена только для выполнения каких-то действий. В скобках перечислены аргументы функции, которые мы будем подставлять в виде чисел. Для аргументов необходимо указать тип.

Дальше мы начинаем использовать функции библиотеки conio.h ("console input/output" - "консольный ввод-вывод"), которая творит настоящие чудеса в текстовом режиме, позволяя менять цвет символов, место их положения - одним словом работает с экраном в симольном режиме.

Функция gotoxy(int x, int y) переводит каретку в координаты x,y - таким образом мы можем вывести текст в любом месте экрана. В текстовом режиме стандарный экран представляет собой поле для отображения 80 символов по горизонатли и 25 по вертикали. Это всё, на что мы можем расчитывать. Поэтому расчитывая место появления текста, необходимо исходить из реальных возможностей.

Функция textcolor(int color) задаёт цвет текста. В системе Windows это практически никак не реализовано. Если мы и работаем с консолью, мы обычно видим чёрный экран с серым текстом, однако в системе Linux очень часто цвет текста бывает разноцветным. Это очень удобно. Например в случае критической ошибки, пользователь получает сообщение красным цветом, а в случае успешной работы программы - зелёным.

Функция clrscr() очищает экран. Есть смысл начинать с неё каждую новую программу, чтобы экран очищался от всяких служебных сообщений, которые были на нём раньше и содержал только результаты работы нашей программы.

Функция getch() в простейшем своём применении ожидаёт нажатия клавиши. Если мы разместим её в конце программы, она не завершится, пока мы не нажмём какую-нибудь клавишу, и мы сможем спокойно просмотреть результаты работы на экране.

//определение нашей функции void OutTextXY(char *text, int x, int y, int color) textcolor(color); gotoxy(x,y); cprintf(text); >

void main() ;

Для игры в шахматы 8Х8

int doska[8][8];

Для "морского боя" - 10Х10

int battle_pole[10][10];

Рассмотрим основные возможности многомерных массивов на примере двухмерного. При объявлении такого массива мы указываем сначала число строк, потом число столбцов, как и в матрицах в математике. int mas[2][2]; Когда мы присваиваем значение одному из элементов такого массива, мы должны обязательно использовать полную индексацию.

Так мы заполняем первую строчку: mas[0][0]=6; mas[1][0]=1989;

а так вторую: mas[0][1]=2; mas[1][1]=2000;

Если мы хотим построить трёхмерный массив, это тоже несложно:

int 3dMas[20][10][8];

3dMas[0][0][0] = 10; 3dMas[0][0][1] = 11; . 3dMas[19][9][7] = 1890;

Массивы всем хороши, но они подходят для хранения данных только одного типа, например int или float. Если же мы хотим структурировать данные разного типа, нам больше подойдут структуры.

КАК создать свою структуру?

Мы уже дважды использовали структуры в своей работе. В первый раз это была структура атрибутов файла ffblk, во-второй структура даты и времени time_t. Мы создавали экземпляры этих структур и заполняли их содержимым, возможно не до конца понимая, что мы делаем. Итак, сейчас мы с ними разберёмся.

Допустим мы хотим хранить данные о компакт-дисках, которые имеются в нашей коллекции. Чем характеризуется диск? Прежде всего названием. Это конечно же строковый тип. Потом год выпуска. Возможно утилиты для работы с Windows 96-го года нам уже не подойдут, поэтому год нам также немаловажен. Следующий параметр - фирма изготовитель. Каждый диск записан какой-то фирмой, и упорядочив свои диски по фирме, мы сразу узнаем, какая фирма производит больше всего дисков, а какая фирма производит самые лучшие диски, то есть произведём некоторую статистику. Для аудиодисков немаловажно знать - сколько на нём песен. Ещё возможно мы хотим запомнить цену (тип float, так цена редко бывает не дробной) и краткую информацию - описание диска (например, какие на диске есть программы или какие представлены исполнители).

Конечно же описать с помощью массива столь разнотипные данные невозможно. Однако при использовании структур, все данные будут сведены вот в такую простенькую структуру:

struct CD cd;

Для того, чтобы в этой структуре что-то хранилось, надо сначала занести в неё эти данные. Напишем пример ввода структуры и вывода её на экран.

#include <iostream.h> #include <conio.h>

//объявляем структуру struct CD cd;

main()

📎📎📎📎📎📎📎📎📎📎