Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование в среде ВС++.doc
Скачиваний:
10
Добавлен:
09.11.2018
Размер:
3.52 Mб
Скачать

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

}

Вопросы и упражнения:

  1. Выполните программу для трёх значений e (1е-2, 1е-4, 1е-6) и трёх значений х (0.1, 1, 10). По результатам на экране сделайте выводы о сходимости ряда для функции ехр(х) по зависимости числа слагаемых от х и от погрешности е: k(x), k(e).

  2. Как вывести значения ехр(х) и s, чтобы увидеть их несовпадение.

  3. Модифицируйте программу, добавив цикл по заданному числу m значений е.

  4. С оставьте программу вычисления функции 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;

}

Вопросы и упражнения:

  1. Для чего перед главной функцией main() нужно указывать прототип функции, которая располагается после main()?

  2. Какую информацию должны содержать разделы Предусловие и Постусловие описания прототипа функции?

  3. Сохранится ли значение переменной ch в main(), если в fun_ch() аргументу ch присвоить другое значение?

  4. Дополните функцию выводом на экран номеров слов с символом ch, полагая номер первого слова 1.

  5. Как определить в строке задания число слов: а) в которых заданный символ встречается один раз, б) оканчивающихся на заданный символ?