Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на С.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

I присвоить 0;

}

}

return (0);

}

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

Занятие 21. Заголовочные файлы.

С заголовочными файлами мы уже сталкивались ранее. Буквально в каждой программе мы использовали заголовочный файл "stdio.h". Как вы, наверное, помните, в нем содержатся функции работы со стандартными потоками ввода и вывода (printf(), scanf()).

Нам уже известно, что заголовочные файлы подключаются директивой #include. Те, кто пытался выполнять задания и отправлять свои решения в комментарии, уже знают, что у этой директивы существуют два формата использования.

#include <stdio.h>

//и

#include "myfun.h"

Напомню, что различия между двумя этими директивами состоят в том, где компилятор будет искать подключаемый файл. Если используется первый вариант (с угловыми скобками), то компилятор ищет подключаемый файл в специальном каталоге, в котором хранятся основные подключаемые файлы. Это правило действует для компилятора Visual Studio и для компилятора Borland C++. У меня, например, это каталоги D:\Program Files\Microsoft Visual Studio 9.0\VC\include иC:\BC\INCLUDE соответственно.

Интереснее работает второй вариант этой директивы (с двойными кавычками). В этом случае компилятор прежде ищет подключаемый файл в рабочем каталоге программы. Если же подключаемый файл не обнаружен в рабочем каталоге, то поиск осуществляется в каталоге, предназначенном для хранения основных подключаемых файлов так, как будто мы использовали первый вариант с угловыми скобками. Именно на этом свойстве и было основано моё замечание, когда я просил вам писать в комментариях #include "stdio.h".

Стоит отметить, что описанные выше особенности работы директивы #include могут отличаться в различных компиляторах. Описанный выше способ тестировался в Visual Studio и Borland C++ 3.1. Я бы советовал каждому проверить, как работают эти директивы в его среде разработки.

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

Как создать заголовочный файл.

Поступаем аналогично тому, как мы добавляли файл с исходным кодом в проект.

Рис.1 Меню «Проект»

В меню выбираем «Проект» -> «Добавить новый элемент» или нажимаем сочетание клавишCtrl+Shift+A.

Рис.2 Меню «Добавление нового элемента»

В появившемся окне выбираем тип файла «Заголовочный файл (.h)», вводим имя заголовочного файла и нажимаем кнопку «Добавить». После этого в окне основного проекта, во вкладке обозреватель решения у вас появится новый файл. В примере на рисунке это файл my_lib.h. Кроме того, появится дополнительная вкладка в редакторе.

Рис.3 Новый заголовочный файл my_lib.h

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

К тому же, это очень удобно, когда в главном файле с кодом только лишь одна функции main(), в которой описана основная логика программы, а все остальное вынесено в отдельные файлы.

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

Итак, код основного файла source.cpp

#include <stdio.h>

#include <locale.h>

#include <stdlib.h>

#include <string.h>

#include "struc_str.h"

#include "interface.h"

#include "my_lib.h"

int main(){

setlocale(0,"");

char key_pressed;

do {

system ("CLS");

shapka();

printf("введите команду: ");

key_pressed=getchar();

switch (key_pressed) {

case 'n': new_base(); break;

case 'a': add_pass(); break;

case 'v': view_base(); break;

case 'q': system("CLS"); break;

case 's': search_site_base(); break;

default: system ("CLS");

printf("Неизвестная команда!Попробуйте еще раз.\n");

system("pause");

}// switch

}while ( key_pressed != 'q');

shapka_exit();

return 0;

}

Псевдографический интерфейс программы, как вы, вероятно, уже догадались, описан в заголовочном фале interface.h. Ниже представлен его код.

/*****************************************************************/

/* модуль псевдографического интерфейса */

/*****************************************************************/

void shapka(void); //выводит основную шапку программы

void shapka_view(void); //выводит шапку таблицы поиска и

//просмотра базы данных

void shapka_exit(void); //выводит заключительный экран программы

//-----------------------------------------------------------------

/* Основная шапка программы */

void shapka(void){

printf("************************************************\n");

printf("* Программа для хранения паролей *\n");

printf("************************************************\n");

printf("* Команды используемые в программе *\n");

printf("************************************************\n");

printf("* q - выход a - добавить пароль в базу *\n");

printf("* n - создание новой базы паролей *\n");

printf("* v - просмотр всей базы паролей *\n");

printf("* s - поиск по сайту в базе *\n");

printf("************************************************\n");

return;

}

/* Шапка поиска и просмотра базы */

void shapka_view(void){

printf("************************************************\n");

printf("* Пароль для * Ник * Пароль *\n");

printf("************************************************\n");

printf("* * * *\n");

return;

}

void shapka_exit(void){

printf("************************************************\n");

printf("* Программа для хранения паролей. *\n");

printf("************************************************\n");

printf("* Спасибо за использование моей программы. *\n");

printf("************************************************\n");

printf("* Разработчик: KaDeaT *\n");

printf("* ICQ: 77***08 *\n");

printf("* Официальный сайт: http://maincode.wen.ru *\n");

printf("* E-mail: kadea*@**kep.ru *\n");

printf("************************************************\n");

system("PAUSE");

return;

}

Обратите внимание на оформление это файла. Естественно, оно необязательное, но мне кажется, что это хороший стиль. Вначале мы описываем прототипы функций и рядом с каждой пишем, что она должна делать. Ниже уже следует описание каждой из этих функций. Все основные синтаксические конструкции сохраняются.

Разберемся, как работает основная программа. Объявляется символьная переменнаяkey_pressed, в ней будет храниться код символа, введенного пользователем с клавиатуры. После этого запускается цикл с постусловием do-while. Выход из цикла осуществляется по нажатию клавиши «q», что соответствует завершению работы с программой. В теле цикла очищаем экран консоли (используя system("CLS");) и выводим главный экран программы. За него у нас отвечает функция shapka(), описанная в заголовочном файле interface.h. Этот файл у нас подключен, значит, и функция уже определена. Затем программа просит ввести пользователя символ с клавиатуры, и, в соответствии с этим символом, выполняется одна из ветвей оператора switch.

Функции new_base, add_pass(), view_base() и search_site_base() определены в заголовочном файле my_lib.h. Его код я здесь приводить не буду, но тем, кому интересно, к уроку я прикрепляю архив с готовой программой, инструкцией по её установке и исходными кодами. Можете посмотреть и попытаться разобраться, как она работает. После того, как пользователь нажимает клавишу «q», очищается экран консоли, программа выходит из цикла и вызывает функцию shapka_exit(), которая, как мы уже знаем, отвечает за прощальный экран приложения. Вот, в принципе, и вся программа. Как видите, вся основная структура получилась очень простой и понятной. Без использования заголовочных файлов добиться подобной четкости было бы гораздо сложнее.