Добавил:
t.me Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 семестр / Многофайловые программы в С++.docx
Скачиваний:
2
Добавлен:
16.07.2023
Размер:
46.53 Кб
Скачать

Int count_dig(int a) {

int k=0;

while (a!=0) {

k++; //операция увеличения

a/=10; //составная операция присваивания

}

return k;

}

int sum_dig(int a) {

int s=0;

a=abs(a);

while (a!=0) {

s+=a%10;

a/=10;

}

return s;

}

Void del_last_dig(int& a) {

a/=10;

}

Int del_first_dig(int& a) {

int k=count_dig(a);

int r=1;

for (int i=0; i<k-1; ++i)

r*=10;

a%=r;

return a;

}

Содержимое файла довольно необычно для С++, поскольку не содержит ни одной команды подключения заголовочных файлов. Если попробовать откомпилировать такой файл отдельно, то выдается сообщение об ошибке компиляции. Ошибка означает, что имя функции abs() неизвестно, необходимо подключить заголовочный файл, в котором находится объявление функции abs() для целочисленного аргумента. Чтобы исправить эту ошибку, достаточно подключить заголовочный файл <cstdlib>:

#include <cstdlib>

Почему, когда программа была представлена одним файлом, не понадобилось подключать этот заголовочный файл? Это связано с тем, что многие заголовочные файлы С++ сами подключают другие заголовочные файлы. Такая ситуация имеет место и в случае использования заголовочного файла <iostream>.

Файл, содержащий функцию main(), будет выглядеть следующим образом:

#include <iostream>

using namespace std;

/* объявления функций

сами функции описаны после функции main()

*/

int count_dig(int a);//параметр передается по значению

int sum_dig(int a);

void del_last_dig(int& a);//параметр передается по ссылке

int del_first_dig(int& a);

int main() {

int x;

cin>>x;

cout<<count_dig(x)<<endl;

cout<<sum_dig(x)<<endl;

/*следующие две функции изменяют значение параметра, поэтому

сохраним исходное число во вспомогательной переменной

*/

int r=x;

del_last_dig(r);

cout<<x<<' '<<r<<endl;

cout<<del_first_dig(r)<<' '<<r;

}

В полученном варианте программы присутствует еще один недостаток — явное объявление всех функций, вынесенных нами в отдельный файл, перед описанием функции main(). Однако убрать их нельзя, так как в этом случае все имена функций станут неизвестными и при компиляции будет получено сообщение об ошибках, аналогичное предыдущему.

Очевидно, что хорошим решением в этом случае было бы наличие заголовочного файла, содержащего объявления всех функций, вынесенных в отдельный файл. Это удобно тем, что не нужно размещать в основном файле, содержащем функцию main(), объявления всех функций. Достаточно подключить соответствующий h-файл.

В нашем случае это будет заголовочный файл digit.h с таким содержимым:

Int count_dig(int a);

int sum_dig(int a);

Void del_last_dig(int& a);

Int del_first_dig(int& a);

Подключение заголовочного файла, используемого в проекте, выглядит так:

#include "digit.h"

Правило хорошего стиля требует в случае вынесения функций в отдельный cpp-файл создавать соответствующий ему h-файл, содержащий объявления соответствующих функций. Рекомендуется, чтобы имена cpp-файла и соответствующего ему h-файла совпадали.

Что же стоит включать в заголовочные файлы? Основное правило рекомендует ограничиться одними объявлениями. В заголовочном файле не должно быть определений функций.

Заголовочные файлы и библиотеки в С++

Многие библиотеки содержат большое количество функций и переменных. Чтобы избавить программиста от лишней работы и обеспечить логическую последовательность внешних объявлений, в С и С++ используется механизм заголовочных файлов.

Создатель библиотеки представляет заголовочный файл. Для того чтобы объявить в программе функции и внешние переменные этой библиотеки, пользователь просто включает в программу заголовочный файл препроцессорной директивой #include. Заставляя правильно работать с заголовочными файлами, язык С++ гарантирует согласованность библиотек и сокращает количество ошибок благодаря всеобщему использованию одного и того же интерфейса.

Существует достаточно большое количество стандартных библиотечных и соответствующих им заголовочных файлов в языках С и С++.

Пример 2. Найти все простые числа в диапазоне от 2 до N.

Рассмотрим программу для решения задачи поиска простых чисел.

Листинг Prime.cpp — п е р в ы й в а р и а н т

#include <cmath>

#include <iostream>

using namespace std;

bool IsPrime(int x) {

int z = int(sqrt((double)x));

for (int i=2;i<=z; ++i) {

int y=x%i;

if (y=0)

return false;

}

return true;

}