<<< назад

Гайд по оформлению лабораторных работ Дунаевой.



Собственно далее речь пойдёт о том, как оформлять лабораторные работы (программы) по программированию. Если для вас это лишнее, и вообще не интересно и не нужно ("да я и так сдал" или "я это всё и без тебя знал", ну или "я намного быстрее и проще это делаю!") - пожалуйста, закрываем и не читаем. Ну а если вы считаете что можете написать лучше - флаг вам в руки :3 Так вот...

Используемая среда: русская Visual Studio 2012. Описывать процесс буду с нуля. Т.е. совсем с нуля, вплоть до "нажать туда, тыкнуть туда".
Слева будет написан текст, а справа представлены скриншоты с примерами, они увеличиваются, если кликнуть по ним мышкой - попробуйте :)

1) Приступим. Для начала создаём пустой проект.
2) Прописываем имя проекта (графа Имя), жмём Ок
3) Далее...
4) Тут ставим галку "Пустой проект" (убираем галку про SDL), жмём Готово
Итак, мы имеем пустой проект. Далее подробнее про то, как устроен наш будущий проект: Мы имеем три папки, по которым мы в скором времени раскидаем наши файлы. Названия говорят сами за себя - в "исходный код" мы будем кидать основной код, в "заголовочные файлы" - собственно заголовочные файлы. Приступим. Предположим мы хотим сделать программу, в которой помимо "мейна" имеется ещё 2 блока функций, которые различаются по тематике (например func1-2 отвечают за вычисление, а func3-4 за ещё что-нибудь, например за вывод на экран). Что мы должны сделать в первую очередь? Создать файл main.c, куда мы поместим главную функцию main()
5) Создаём новый файл в "исходных кодах" (показываю один раз, далее буду просто проговаривать "создаём новый файл в...")
5.1) Правой кнопкой по папке "исходных кодов", Добавить, Создать элемент
5.2) Выбираем "файл с++", прописываем имя нового файла (main.c), жмём Добавить.
6) Теперь нам нужно создать файл в "заголовочных файлах", выбираем "Заголовочный файл", обзовём его group1.h
Тут небольшая пауза. Лучше назвать его так, что бы его название намекало на его содержимое. А содержать он будет какую-то определённую группу функций, например функции для расчётов. В таком случае можно его назвать calculate.h. ВНИМАНИЕ: имя вашего файла не должно совпадать с каким либо из стандартных (stdlib.h или stdio.h например). Должно получиться что-то такое.
7) Создадим "файл с++" group1.c" (имя, как вы наверное заметили, пишем в точности такое же, как и в 6 пункте)
8) Аналогично создаём group2.h и group2.c соответственно.
9) Начинаем заполнять файлы В файле main.c мы будем использовать функции из group1, в group1 мы будем использовать функции из group2, а в group2 мы, в свою очередь, будем использовать функции из group1 (обычно такое не совсем логично, но мы рассмотрим данный пример для наглядного применения такой вещи, как "защита от повторного включения"). Исходя из этого начинаем работать с включением. А работаем мы по такой схеме:
9.1) В каждом сишнике (***.с будем называть сишниками, ***.h соответственно ашниками) кроме мейна прописываем #include "название.h". Например, в файле group1.c будет #include "group1.h". Это нужно для того, что бы ашник был привязан к сишнику. Замечу, что обратной процедуры делать не надо - вписывать инклюд на сишник в ашник не следует. Зачем нужна такая привязка - упомяну чуть позже. Итак, мы привязали их попарно.
9.2) Связываем между собой ашники и мейн. Мейну нужен group1, значит инклюдим в мейне group1.h. group1 нуждается в group2, значит мы инклюдим в group1 group2. Ну и наконец group2 нуждается в group1, и поэтому в group2 мы инклюдим group1. Замечу, что ранее оговаривалось что в ашниках инклюдить сишники не надо, а всё потому, что они включаются в проект автоматически. Эти автоматические связи я обозначил зелёными стрелками.
Итааак... Немного теории. Мы связали все файлы проекта в одну большую конструкцию. Самое время начать говорить о том - а зачем всё это нужно? Разделение по файлам - штука удобная, хотя по началу непривычная и требует много сил. Как оно работает: компилятор при создании исполняемого файла (***.ехе) все эти файлы совмещает в один. Совмещает начиная с файла main.с по следующему алгоритму: как только он видит препроцессорную директиву #include - он вставляет (да да, именно просто тупо вставляет) всё содержимое указанного файла. И тут ВНЕЗАПНО мы получаем рекурсию. Потому как раскрывая #include "group1.h" мы получаем строку #include "group2.h", и так далее. Что бы исключить такое - мы используем защиту от повторного включения: содержимое каждого ашника мы заключаем в так называемый ifndef. Выглядит это так:

#ifndef названиеашникакапсом_H
#define названиеашникакапсом_H

всё содержимое ашника

#endif
Как же оно работает? Директива ифндеф (извиняюсь за транслит) проверяет, был ли "задефайнен" данный идентификатор. И далее, если он не задефайнен, мы его дефайним и выполняем всё содержимое. Если же он уже был задефайнен - компилятор закрывает глаза на всё, что находится между ифндефом и ендифом (endif). А поскольку у каждого файла этот идентификатор разный - мы получаем, что каждый файл мы видим не более одного раза, но тем не менее просматриваем мы каждый из них. В конечном тексте мы уже имеем полный код, в котором ничего не упущено, и в котором уже нет никаких include'ов. Красота да и только :3 Осталось только наполнить это всё кодом.
Осталось только наполнить это всё кодом. Делаем следующим образом: в main мы создаём только функцию main() а так же в этом же мейне прописываем все классы/структуры/дефайны которые нужны в мейне. Не следует прописывать в мейне то, что там просто не нужно. Например если в мейне не нужен stdio.h (в мейне нет работы с вводом/выводом) то и #include в мейне быть НЕ ДОЛЖНО. Идём далее. Везде кроме мейна применяются следующие правила: 1) Все функции находятся в сишнике. Все классы/структуры/дефайны/инклюды (всё кроме функций) прописываются в ашнике. Так же в ашнике объявляются функции. Это значит, что если в сишнике (например group1.с) есть функция

int func1(int x)
{
...
}
то в ашнике (group1.h) должна быть строчка
int func1(int x);
которая является объявлением данной функции. Как вы можете видеть: ошибок нет. ВНИМАНИЕ: весь этот код не несёт никакой смысловой нагрузки, и написан только для примера. Удачи вам в написании лаб :)

статья написана Е. Никитиным.



<<< назад