Цель работы 3
1. Задание А 3
1.1. Условие задачи 3
1.2. Таблица внешних спецификаций 4
1.3. Алгоритм 4
1.4. Блок-схема 5
1.5. Примеры входных данных и ожидаемые результаты 6
1.6. Проверка правильности алгоритма с помощью таблицы 7
1.7. Код программы на языке C++ 7
1.8. Тестирование программы 10
2. Задание Б 12
2.1. Условие задачи: 12
2.2. Код программы на языке C++: 12
3. Задание В 14
3.1. Условие задачи: 14
3.2. Таблица внешних спецификаций: 14
3.3. Примеры входных данных и ожидаемые результаты: 14
3.4. Код программы на языке C++: 14
Цель работы
Приобретение навыков:
проектирования разветвляющихся и циклических алгоритмов;
применения операторов цикла;
отладки и тестирования программ;
работа с потоками ввода/вывода и символами.
Задания
Выполнить задание из списка заданий группы А.
Выполнить задание из списка заданий группы Б.
Разработать программу для решения неформальной задачи из группы В.
Задание А
Условие задачи
Реализовать вычисление функции, заданной в виде суммы бесконечного ряда тремя способами в одной программе:
с заданной погрешностью eps,
с заданным числом k первых членов ряда,
по аналитической формуле f(x) используя математические функции библиотек с++
Дополнительные требования:
Выбор способа вычисления реализовать с использованием оператора выбора (switch или if).
Реализовать разные режимы отображения и ввода стандартного потока ввода-вывода.
Проверить ввод числа с плавающей точкой в разных форматах.
Использовать строковый поток (stringstream) для проверки корректности типа ввода.
Ввод 𝑘 первых членов ряда организовать посимвольно.
Таблица внешних спецификаций
Таблица сообщений:
С1: «Ошибка! Введите корректное значение метода (1, 2 или 3)»
С2: «Ошибка! x должно быть в пределах [-1, 1)»
С3: «Некорректный ввод! Повторите ввод»
С4: «Ошибка! eps должно быть в диапазоне (0, 1)»
С5: «Ошибка! k должно быть положительным числом»
С6: «Результат (обычный формат): »
С7: «Результат (научный формат): »
Алгоритм
Вывести меню и запросить у пользователя способ вычисления (1, 2 или 3).
Организовать ввод x и eps/k, обеспечивая циклическую проверку корректности (через stringstream).
В зависимости от выбора:
Способ 1 – Вычисление суммы слагаемых ряда до тех пор, пока текущее слагаемое по модулю больше epsilon.
Способ 2 – Вычисление суммы первых k членов ряда.
Способ 3 – Вычисление аналитически через стандартную функцию log(1 - x).
Вывести результат в различных форматах (fixed, scientific).
Завершение программы.
Блок-схема
Примеры входных данных и ожидаемые результаты
Проверка правильности алгоритма с помощью таблицы
Тест 1, 2: блоки 1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 25
Тест 3: блоки 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 10
Тест 4: блоки 1, 2, 3, 4, 5, 7, 8, 17, 18, 19, 21, 22, 25
Тест 5, 6, 7: блоки 1, 2, 3, 4, 5, 7, 8, 17, 18, 20, 17
Тест 8: блоки 1, 2, 3, 4, 5, 7, 8, 23, 24, 25
Тест 9, 10: блоки 1, 2, 3, 4, 5, 7, 9, 5
Код программы на языке C++
#include <iostream>
#include <cmath>
#include <sstream>
#include <iomanip>
#include <stdexcept> // Для использования исключений
using namespace std;
int main() {
double x, eps, result = 0;
int k, method;
// Циклическая проверка корректности ввода метода расчета (1, 2, 3)
while (true) {
cout << "Выберите метод вычисления (1 — по eps, 2 — по k, 3 — аналитически): ";
string input;
getline(cin, input);
stringstream ss(input);
cout << endl;
try {
if (!(ss >> method) || !(method == 1 || method == 2 || method == 3)) {
throw invalid_argument("Ошибка! Введите корректное значение метода (1, 2 или 3).");
}
break;
} catch (const invalid_argument &e) {
cout << e.what() << endl;
}
}
// Циклическая проверка корректности ввода x в диапазоне [-1, 1)
while (true) {
cout << "Введите значение x (-1 <= x < 1): ";
string input;
getline(cin, input);
stringstream ss(input);
cout << endl;
try {
if (!(ss >> x) || x <= -1 || x >= 1) {
throw out_of_range("Ошибка! x должно быть в пределах [-1, 1).");
}
break;
} catch (const out_of_range &e) {
cout << e.what() << endl;
} catch (...) {
cout << "Некорректный ввод! Повторите ввод." << endl;
}
}
// Обработка методов вычисления
switch (method) {
case 1: { // Метод 1: Сумма ряда по погрешности eps
while (true) {
cout << "Введите погрешность eps (0 < eps < 1): ";
string input;
getline(cin, input);
stringstream ss(input);
cout << endl;
try {
if (!(ss >> eps) || eps <= 0 || eps >= 1) {
throw out_of_range("Ошибка! eps должно быть в диапазоне (0, 1).");
}
break;
} catch (const out_of_range &e) {
cout << e.what() << endl;
} catch (...) {
cout << "Некорректный ввод! Повторите ввод." << endl;
}
}
result = 0;
int n = 1;
while (true) {
double term = pow(x, n) / n;
if (abs(term) < eps) break;
result -= term;
n++;
}
break;
}
case 2: { // Метод 2: Сумма первых k членов ряда
while (true) {
cout << "Введите количество членов ряда k (k > 0): ";
string input;
getline(cin, input);
stringstream ss(input);
cout << endl;
try {
if (!(ss >> k) || k <= 0) {
throw out_of_range("Ошибка! k должно быть положительным числом.");
}
break;
} catch (const out_of_range &e) {
cout << e.what() << endl;
} catch (...) {
cout << "Некорректный ввод! Повторите ввод." << endl;
}
}
result = 0;
for (int i = 1; i <= k; ++i) {
result -= pow(x, i) / i;
}
break;
}
case 3: { // Метод 3: Аналитическое вычисление
result = log(1 - x);
break;
}
}
// Вывод результата в двух форматах
cout << "Результат (обычный формат): " << fixed << setprecision(6) << result << endl;
cout << "Результат (научный формат): " << scientific << result << endl;
return 0;
}
Тестирование программы
Задание Б
Условие задачи:
Работа выполняется без использования строк и массивов. В заданный непустой текст входят только цифры и буквы. Определить, удовлетворяется ли следующее свойство:
13. Сумма числовых значений цифр, входящих в текст, равна длине текста;
Код программы на языке C++:
#include <iostream> // Подключаем библиотеку для ввода/вывода
using namespace std;
int main() {
char c; // Переменная для хранения вводимого символа
int length = 0; // Счетчик длины текста
int digitSum = 0; // Сумма цифр в тексте
cout << "Введите текст (только цифры и буквы, завершите ввод любым другим символом):" << endl;
// Цикл ввода символов
while (cin >> c) {
if (isdigit(c)) { // Если символ является цифрой
digitSum += (c - '0'); // Преобразуем символ в число и добавляем к сумме
length++; // Увеличиваем счетчик длины текста
}
else if (isalpha(c)) { // Если символ является буквой
length++; // Просто увеличиваем счетчик длины текста
}
else { // Если введен любой другой символ, завершаем ввод
break;
}
}
// Проверяем, равна ли сумма цифр длине текста
if (digitSum == length) {
cout << "Свойство выполняется: сумма цифр равна длине текста." << endl;
} else {
cout << "Свойство не выполняется: сумма цифр не равна длине текста." << endl;
cout << "Длина текста: " << length << endl;
cout << "Сумма цифр: " << digitSum << endl;
}
return 0; // Завершаем программу
}
Задание В
Условие задачи:
Задание. Написать циклическую программу для решения следующей задачи.
13. Дано натуральное К. Напечатать К-ую цифру последовательности 12345678910111213..., в которой выписаны подряд все натуральные числа.
Таблица внешних спецификаций:
Таблица сообщений:
С1: «Введите натуральное число K: »
С2: «Ошибка! Введите натуральное число больше 0.»
С3: «K-ая цифра последовательности: »
Примеры входных данных и ожидаемые результаты:
Код программы на языке C++:
#include <iostream>
using namespace std;
int main() {
int K;
cout << "Введите натуральное число K: ";
cin >> K;
cout << endl;
if (K <= 0) {
cout << "Ошибка! Введите натуральное число больше 0." << endl;
return 0;
}
int count = 0;
int currentNum = 1;
// Поиск K-ой цифры
while (true) {
int numDigits = 0;
int temp = currentNum;
// Подсчет количества цифр в числе
while (temp > 0) {
temp /= 10;
numDigits++;
}
if (count + numDigits >= K) {
// Поиск нужной цифры внутри числа
int shift = count + numDigits - K;
for (int i = 0; i < shift; i++) {
currentNum /= 10;
}
cout << "K-ая цифра последовательности: " << currentNum % 10 << endl;
break;
}
count += numDigits;
currentNum++;
}
return 0;
}