- •А.П. Новоселов программирование на языке Си
- •1.1. Порядок создания программы
- •1.2. Ввод и выполнение программы
- •1.3. Модификация программы
- •1.4. Пошаговое выполнение программы
- •1.5. Сообщения компилятора и компоновщика
- •1.6. Действия в случае ошибки выполнения
- •1.7. Ошибки в форматах ввода/вывода
- •1.8. Вычисления с вещественными числами
- •2.1. Лексемы
- •2.2. Идентификаторы
- •2.3. Ключевые слова
- •2.4. Константы
- •3.2. Арифметические операции
- •3.3. Операции отношения и логические операции
- •3.4. Операции присваивания
- •3.5. Поразрядные операции
- •3.6. Библиотека функций
- •1. Вычисление площади и периметра геометрической фигуры
- •2. Вычисления по формулам с вещественными числами
- •3. Арифметические операции для целочисленных данных
- •4. Циклы с заданным числом повторений
- •5. Алгоритмы с разветвлениями
- •6. Циклы с условием окончания
- •7. Последовательная обработка данных
- •8. Поразрядные операции
- •9. Обработка массивов
- •10. Обработка матриц
- •11. Сортировка массивов
- •12. Сортировка матриц
- •1.1. Математическая постановка
- •1.4.2. Содержание результатов работы программы на экране
- •Выполнил: Иванов и.П., гр. Ут – 11, вариант 13(2)
- •1.4.3. Текст программы
- •Выводы по работе
6. Циклы с условием окончания
Цель работы: изучение приёмов программирования алгоритмов с циклами, число повторений операторов в которых при постановке задачи неизвестно; выработка умений отладки и тестирования программ с циклами и разветвлениями, проведение простейшего вычислительного эксперимента.
Задание:В машинных программах значение функцииexp(x)вычисляется как суммаSряда (4). Составить программу для вычисления значенияех по формуле (4).Условие окончания вычислений принять в виде:|uk/sk| < d, uk=xk/k!,гдеd– заданная относительная погрешность вычисления функцииex;ukиsk– соответственно значения члена ряда и суммы ряда наk-ой итерации цикла. Исследовать зависимость числа слагаемых ряда от значенияхпри заданной погрешностиd.
/* Программа 6для вычисления таблицы значений функцииexp(x)по формуле (4) как суммыsстепенного ряда с погрешностьюdи числа слагаемыхkсуммыs. */
#include <stdio.h>
#include <math.h>
main()
{ int i, n;
double d, u, s, x, k;
< Вывод шапки программы, см. программу 1 или 2 >
printf("\n Введите погрешность d, размер таблицы n и n значений x: ");
scanf("%le%d", &d, &n); // ввод значений х в цикле for
printf("\n Таблица функции exp(х), погрешность s = %.3le \n", d);
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) >= d ) // вычисление суммы 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
}
Вопросы и упражнения:
Выполните программу для трёх значений d (1е-2, 1е-4, 1е-6) и трёх значений х (0.1, 1, 10). По результатам на экране сделайте выводы о сходимости ряда для функции ехр(х) по зависимости числа слагаемых k от х и от погрешности d: k(x), k(d).
Как вывести значения ехр(х) и s, чтобы увидеть их несовпадение?.
Модифицируйте программу, добавив цикл по заданному числу m значений d.
Составьте программу вычисления функции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.
Как определить в строке задания число слов: а) в которых заданный символ встречается один раз, б) оканчивающихся на заданный символ?