Организация циклов в языке С
Задание 1
- Предусмотрите ввод только отрицательных чисел.
- Предусмотрите ввод только неотрицательных чисел.
- Предусмотрите вывод чисел и их порядковые номера (т.е. в два столбца).
- Предусмотрите вывод чисел на консоль в виде строки.
- Предусмотрите ввод и вывод только вещественных чисел.
- С учетом предыдущего пункта предусмотрите вывод чисел и их порядковые номера (т.е. в два столбца).
- Рассмотреть варианты форм инкрементирования. Выполните вывод на консоль.
Пример 2. Напишите программу посимвольного ввода предложения "Hello, world" и подсчитать число символов в нем (включая запятую и пробел).
Программный код решения примера:
#include <stdio.h> #include <conio.h> int main(void) { int c, i = 0; printf("\n Enter symbol-by-symbol the offer \"Hello, world\",\n press twice Ctrl+Z and press Enter:\n"); printf("\t"); while ((c = getchar()) != EOF) { printf("\t"); c = getchar(); ++i; } printf("\n\t The number of characters: %d\n", i); printf("\n Press any key: "); _getch(); return 0; }
В программе ввод символьных данных должен завершиться комбинацией клавиш Ctrl+Z, что будет соответствовать окончанию ввода (файла), т.е. EOF. Оператор цикла while будет выполняться до тех пор, пока не встретится так называемый конец файла EOF. В предложении \"Hello, world\" два обратных слэша включены для вывода на консоль двойных кавычек.
Функции printf("\t") осуществляют табуляцию вводимых символов. Подсчет числа вводимых символов выполняется с помощью переменной цикла (счетчика) i, которая инкрементируется в теле цикла.
Заголовочный файл #include <conio.h> служит для поддержания консольного ввода-вывода для функции _getch(). Без него при компиляции программы могут выводиться предупреждения, хотя программа с предупреждениями работает.
Результат выполнения программы показан на рис. 3.2.
Задание 2
- В программу введите комментарии с помощью символов // и /*...*/.
- В качестве вводимых символов используйте буквы своей фамилии (буквами латинского алфавита). В отчет вставьте полученный результат.
- В качестве вводимых символов использовать свою фамилию и имя. В отчет вставьте полученный результат.
- Сделайте вывод своей фамилии и имени по главной диагонали дисплея.
- В качестве символов введите числа от 1 до (2+Х), где Х – номер компьютера, за которым выполняется лабораторная работа. В отчет вставьте полученный результат.
- Выполните дублирование символов с помощью функции putchar(), которая отображает символы на экране пользователя.
Примечание. Прототип функции putchar() имеет следующий вид:
#include <stdio.h> int putchar (int ch);
Пример 3. Напишите программу табличного вывода строчных букв латинского алфавита и их десятичных кодов с помощью оператора цикла for.
Как известно, в латинском алфавите 26 букв. Поэтому можно создать массив символов этих букв. С учетом того, что тип char представляет собой целочисленный тип, то можно обойтись без создания массива.
Программный код решения примера:
#include <stdio.h> #include <conio.h> int main(void){ int j = 1; char a = 'a'; printf("\n Table code characters:\n"); for ( ; a <= 'z'; ++a) printf("\n %4d) %2c: code%4d", j++, a, a); printf("\n\n Press any key: "); _getch(); return 0; }
Результат выполнения программы показан на рис. 3.3.
Форматированный вывод данных предусматривает выравнивание по правому краю, для чего предусматриваются числовые спецификаторы типа %4d и %2c для целых чисел и символов в функции printf().
Задание 3
- Примените префиксную форму инкрементирования переменной j.
- Инкрементирование переменной j создайте отдельно в теле цикла.
- Инициализацию переменной j начните с нуля. Результат выполнения программы должен быть тот же самый, что и в приведенной программе.
- Напишите программу для вывода кодов букв из заданного диапазона на усмотрение пользователя, например, от 'j' до 'w'.
- В цикле for заполните все поля.
- Напишите программу для вывода кодов букв латинского алфавита прописных и строчных букв в одной таблице.
- Выведите буквы своей фамилии и коды этих букв.
Напишите программу расчета значений функции распределения потока Эрланга 4-го порядка с параметром = 2.3 на отрезке времени от 0 до 5 (условных единиц) с шагом 0.2:
Программный код решения примера:
#include <stdio.h> #include <conio.h> #include <math.h> int main(void) { int j, f, k = 4; double F, Lt, s, t = 0.0, Tend = 5.0; float L = 2.3F; printf("\n Erlang function of order %d, Lambda = %1.2f:\n\n", k, L); for ( ; t <= Tend; t += 0.2) { s = 0.0; f = 1; Lt = 1.0; for (j = 1; j <= k; ++j) { f *= j; Lt *= (L*t); s += (Lt/f)*exp(-L*t); } F = 1 - exp(-L*t) - s; printf("\t %lg\n", F); } printf("\n\n Press any key: "); _getch(); return 0; }
В программе использованы вложенные циклы for. Применены специфические условия изменения переменных (но характерных для языка С ):
t += 0.2; /* t = t + 0.2; */ f *= j; /* f = f * j; */ Lt *= (L*t); /* Lt = Lt * (L*t); */
Вычисление факториала выполнено с помощью произведения и выделения отдельного слагаемого суммы, когда рассчитывается 0!
В программе также предусмотрено накопление суммы для каждого шага времени t. Для расчета экспоненты в заголовок программы включена библиотека математических функций #include <math.h>.
Результат выполнения программы показан на рис. 3.4.
Задание 4
- В заголовке внешнего цикла for добавьте первое поле и устраните третье поле.
- Предусмотрите вывод количества значений рассчитанной функции Эрланга.
- Предусмотрите ввод параметров программы, а именно: порядок потока Эрланга k, параметр , конечную величину временного интервала, шаг по времени.
Пример 5. Вычислите с точностью до "машинного нуля" значение суммы числового ряда:
Программный код решения примера:
#include <stdio.h> #include <conio.h> int main(void) { double denom; double sum1 = 0.0, sum2 = 0.0; int k = 1; denom = k * (k + 1) * (k + 2); // знаменатель ряда do { sum1 = sum2; sum2 += 1.0 / denom; denom = denom / k * (k + 3); ++k; } while (sum1 < sum2); printf("\n\t The amount of numerical series: %lg\n", sum2); printf("\n Press any key: "); _getch(); return 0; }
В приведенной программе сумма вычисляется как значение переменной sum2. Ее предыдущее значение сохраняется в переменной sum1. Так как приближенное значение с добавлением неотрицательных слагаемых не уменьшается, условием продолжения цикла служит отношение sum1 < sum2 (поскольку растет знаменатель denom ). Когда при добавлении очередного слагаемого значение суммы остается неизменным (за счет конечной разрядной сетки для представления вещественных чисел), нарушается условие sum1 < sum2 и цикл прекращается. Таким образом, конечность разрядной сетки представления вещественных чисел в компьютере определяет собой "машинный нуль".
Инициализация знаменателя сделана до начала цикла. Форматный вывод результата выполнен с помощью спецификатора символа "l".
Результат выполнения программы показан на рис. 3.5.