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

Int main() {

int N;

cout<<"N = ";

cin>>N;

for (int i=2;i<=N; ++i)

if (IsPrime(i))

cout<<i<<' ';

cout<<endl;

return 0;

}

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

После запуска программы на выполнение можно увидеть следующие результаты:

N=10

2 3 4 5 6 7 8 9 10

Легко заметить, что не все выведенные числа являются простыми. Следовательно, программа содержит логические ошибки.

Исходя из текста программы, можно сделать вывод, что ошибки следует искать в реализации функции IsPrime. Анализ результатов работы программы показывает, что функция IsPrime всегда возвращает значение true (истина).

Если ошибка сразу не видна, то можно вставить выводы промежуточных результатов или выполнить трассировку функции IsPrime, т. е. реализовать ее пошаговое выполнение.

Проконтролируем значение переменной y после выполнения оператора

int y=x%i;

Запустим программу на выполнение при N=10.

Можно заметить, что хотя y и принимает значение 0, досрочный выход из цикла (и соответственно, из функции) не наблюдается никогда.Значит, условный оператор

if (y=0)

return false;

содержит ошибку. Действительно, в выражении y=0 вместо операции сравнения используется операция присваивания, т. е. переменной у всегда присваивается 0, а это значит, что выражение всегда будет принимать значение false (ложь).

В правильном варианте программа имеет следующий вид:

Листинг 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;

}

Int main() {

int N;

cout<<"N = ";

cin>>N;

for (int i=2;i<=N; ++i)

if (IsPrime (i))

cout<<i<<' ';

cout<<endl;

return 0;

}

Обратите внимание, что вычисление значения, ограничивающего повторение цикла, вынесено из заголовка цикла.

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

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

}

В отличие от языка Паскаль в С++ выражение условия в операторе for вычисляется на каждой итерации. Поэтому вычисляемые выражения, значения которых не меняются при выполнении цикла, рекомендуется выносить из условия продолжения цикла.

Директива #include указывает препроцессору, что он должен открыть файл с заданным именем и вставить его содержимое на место директивы.

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

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

Директива с именем файла, заключенным в кавычки, сообщает препроцессору, что поиск заданного файла начинается с текущего каталога.

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

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

Рассмотрим следующий фрагмент:

#include <stdio.h>

#include <stdlib.h>

В современном варианте он выглядит так:

#include <сstdio>

#include <сstdlib>

При просмотре кода программы сразу понятно, когда в программе

используются библиотеки С, а когда — библиотеки С++.

В одной программе две формы подключения стандартных заголовочных файлов библиотек (с префиксом с или с расширением .h), унаследованных из языка C, лучше не смешивать.

Пример 3. Для заданных натуральных чисел n и k определить, равно ли число n сумме k-х степеней своих цифр. Для решения задачи составить функцию целого типа для возведения целого числа в целую степень.

Поместим определение функции в отдельный cpp-файл и создадим для этого cpp-файла заголовочный h-файл.

Листинг файла functions.cpp

int power(int x, int k){

int f=1;

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

f*=x;

return f;

}

Листинг файла task3.cpp

#include <iostream>

#include "functions.h"

using namespace std;