- •Лабораторный практикум Дисциплина «Информатика»
- •230400 «Информационные системы и технологии»
- •1.1. Порядок создания программы
- •1.2. Ввод и выполнение программы
- •1.3. Модификация программы
- •1.4. Пошаговое выполнение программы
- •1.5. Сообщения компилятора и компоновщика
- •1.6. Действия в случае ошибки выполнения
- •1.6. Помощь справочной службы
- •1. Вычисление площади и периметра геометрической фигуры
- •2. Вычисления по формулам с вещественными числами
- •3. Арифметические операции для целочисленных данных
- •4. Циклы с заданным числом повторений
- •5. Алгоритмы с разветвлениями
- •6. Циклы с условием
- •7. Последовательная обработка данных
- •8. Поразрядные операции
6. Циклы с условием
Цель работы: изучение приёмов программирования алгоритмов с циклами, число повторений операторов в которых при постановке задачи неизвестно; выработка умений отладки и тестирования программ с циклами и разветвлениями, проведение простейшего вычислительного эксперимента.
Задание: В машинных программах значение функции exp(x) вычисляется как сумма S ряда (4). Составить программу для вычисления значения ех по формуле (4). Условие окончания вычислений принять в виде: |uk/sk| < e, uk = xk/k!, где е – заданная относительная погрешность вычисления функции ex, uk и sk – соответственно значения члена ряда и суммы ряда на k-ой итерации цикла. Исследовать зависимость числа слагаемых ряда от значения х при заданной погрешности е.
/* Программа 6 для вычисления таблицы значений функции exp(x) по формуле (4) как суммы s степенного ряда с погрешностью e и числа слагаемых k суммы s. */
#include <stdio.h>
#include <math.h>
main()
{ int i, n;
double e, u, s, x, k;
< Вывод шапки программы, см. программу 1 или 2 >
printf("\n Введите погрешность e, размер таблицы n и n значений x: ");
scanf("%le%d", &e, &n); // ввод значений х в цикле for
printf("\n Таблица функции exp(х), погрешность s = %.3le \n", e);
printf(“\n\n \t x \t\t exp(x) \t\t s \t k"); // первая строка таблицы
for( i = 1; i <= n; i++ )
{ scanf("%le", &x); // ввод х из буфера клавиатуры
u = 1; s = 1; // значения u и s при k = 0
k = 0;
while ( fabs(u/s) >= e ) // вычисление суммы s
{ u = u*x / ++k; // рекуррентные формулы для u и s
s = s + u;
} // вывод строки таблицы:
printf("\n %7.3lf %10.3le %10.3le %5.0lf ", x, exp(x), s, k );
} // конец цикла for
}
Вопросы и упражнения:
-
Выполните программу для трёх значений e (1е-2, 1е-4, 1е-6) и трёх значений х (0.1, 1, 10). По результатам на экране сделайте выводы о сходимости ряда для функции ехр(х) по зависимости числа слагаемых от х и от погрешности е: k(x), k(e).
-
Как вывести значения ехр(х) и s, чтобы увидеть их несовпадение.
-
Модифицируйте программу, добавив цикл по заданному числу m значений е.
-
С оставьте программу вычисления функции ln(x) по разложению в ряд (5).
7. Последовательная обработка данных
Цель работы: выработка умений алгоритмизации и программирования задач последовательной обработки данных без запоминания всего объема данных в памяти компьютера, изучение программирования функций.
Задание: с клавиатуры вводится последовательность символов (строка), разделенных пробелом на слова, последний символ – точка. На экран следует вывести строку, без цифр, удвоить знаки "+" и "–" и подсчитать количество слов (k), содержащих заданный символ ch.
/* Программа 7. ТЕСТ: строка “A36 Bbb +CА5PA s–EH 99 ++”. сh = ‘A’
Результат: A Bbb ++CAPA s– –EH ++++ , k = 2
*/
#include <stdio.h>
int fun_ch( char ch ); // Прототип функции,
/* Предусловие: нет. // Описание прототипа функции
Вход: ch – символ.
Процесс: из вводимой с клавиатуры последовательности символов, оканчивающейся точкой и разделённой пробелом на слова, функция выводит символы на экран, удаляя из введённой строки цифры и удваивая знаки "+" и "–", и подсчитывает количество слов (k), содержащих заданный символ ch.
Выход: k.
Постусловие: нет.
*/
void main()
{ char ch ; int k ;
// < Вывод шапки результатов программы, см. программу 1 или 2 >
printf("\n Введите символ: ");
scanf( "%c", &ch );
k = fun_ch( ch );
printf(“\n Число слов в строке с символом %c равно %d”, ch, k );
}
int fun_ch( char ch )
{ char c = ‘ ‘; // пробел
int k = 0, f = 0; // f – флаг регистрации символа сh в слове
printf("\n Введите последовательность символов, ");
printf("оканчивающуюся точкой: \n");
while (c != '.')
{ scanf("%c", &c);
if ((c == ‘ ‘ || c == ‘.‘) && f > 0 ) // конец слова и в слове есть ch
{ k++; f = 0; }
if ( c == ch ) f++;
if ((c == '+') || (c == '–')) // || – операция "или"
printf("%c%c", c, c);
else if ((c < '0') || (c > '9'))
printf("%c", c);
}
return k;
}
Вопросы и упражнения:
-
Для чего перед главной функцией main() нужно указывать прототип функции, которая располагается после main()?
-
Какую информацию должны содержать разделы Предусловие и Постусловие описания прототипа функции?
-
Сохранится ли значение переменной ch в main(), если в fun_ch() аргументу ch присвоить другое значение?
-
Дополните функцию выводом на экран номеров слов с символом ch, полагая номер первого слова 1.
-
Как определить в строке задания число слов: а) в которых заданный символ встречается один раз, б) оканчивающихся на заданный символ?