Лабораторная работаПрограммированиеГод: 2025ИРНИТУ: Иркутский национальный исследовательский технический университет
👁 13💼 0

Готовая лабораторная: Сумма ряда и строковые задачи

Загружена: 20.02.2026 06:22

Реализация численных и символьных задач на языке C++. Рассмотрены три способа вычисления суммы бесконечного ряда (по eps, по k и аналитически), плюс две вспомогательные задачи: проверка свойства суммы цифр и поиск K-ой цифры в конкатенированной последовательности. Практическая ценность — готовые исходники с валидацией ввода и тестами для лабораторных по программированию.

Содержание

Цель работы	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;
}

Подробное описание

📘 О чем эта работа

В отчете представлены лабораторные задания по основам структурного программирования на языке C++. Объектом являются численные методы и алгоритмы символьной обработки: сумма бесконечного ряда, проверка цифровых свойств текста и поиск K-ой цифры в последовательности натуральных чисел. Рассматриваются реализация алгоритмов, проверка корректности ввода и вывод результатов в разных форматах.

📚 Что внутри

Работа содержит подробное описание каждого задания и сопровождающие артефакты:

  • Таблица внешних спецификаций: набор сообщений об ошибках и подсказок (C1..C7) для интерфейса консольной программы.
  • Алгоритмы и блок-схема для задания по сумме ряда: выбор метода (switch/if), циклическая проверка ввода через stringstream, критерий останова по eps и суммирование первых k членов.
  • Исходные коды на C++ для всех трёх заданий: вычисление ряда (используется pow, log,iomanip), проверка символов без массивов, и алгоритм поиска K-ой цифры в цепочке '1234567891011...'.
  • Тестовые примеры и таблица проверок: набор из 10 тестов для метода суммы ряда с ожидаемыми результатами и сообщениями об ошибках.
  • Перечень переменных и область допустимых значений (ОДЗ): x, eps, k, result, method, K, count, currentNum и др.
  • Пояснения по валидации ввода: использование stringstream для проверки чисел, посимвольный ввод для k, обработка некорректных символов.

📊 Для кого подходит

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

✨ Особенности

Конкретика реализации: реализация трех режимов вычисления суммы ряда (по заданной погрешности eps, по числу членов k и аналитически через log(1-x)), корректная работа в пределах -1 ≤ x < 1, контроль eps (0 < eps < 1) и проверка целочисленного k. Для символьной задачи использован ввод без массивов, подсчет длины и суммы цифр; в задаче с K-ой цифрой реализован пошаговый подсчет цифр в текущем числе и извлечение требуемой цифры.

Готовые к использованию исходники включают форматированный вывод: fixed и scientific с настройкой точности, а также подробные комментарии в коде и примеры запуска, которые облегчат проверку и отладку.

❓ Частые вопросы

Подойдет ли для моего ВУЗа?
Структура соответствует типовым требованиям: цель, алгоритм, таблица спецификаций, код и тестирование.

Можно адаптировать?
Да. Комментарии в коде и отдельные таблицы сообщений позволяют быстро изменить формат ввода/вывода, критерии погрешности или расширить тесты.