Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3125 / 713 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 4:

Организация циклов в языке С

< Лекция 3 || Лекция 4: 123 || Лекция 5 >

Задание 1

  1. Предусмотрите ввод только отрицательных чисел.
  2. Предусмотрите ввод только неотрицательных чисел.
  3. Предусмотрите вывод чисел и их порядковые номера (т.е. в два столбца).
  4. Предусмотрите вывод чисел на консоль в виде строки.
  5. Предусмотрите ввод и вывод только вещественных чисел.
  6. С учетом предыдущего пункта предусмотрите вывод чисел и их порядковые номера (т.е. в два столбца).
  7. Рассмотреть варианты форм инкрементирования. Выполните вывод на консоль.

Пример 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.

Выполнение программы посимвольного ввода данных

Рис. 3.2. Выполнение программы посимвольного ввода данных

Задание 2

  1. В программу введите комментарии с помощью символов // и /*...*/.
  2. В качестве вводимых символов используйте буквы своей фамилии (буквами латинского алфавита). В отчет вставьте полученный результат.
  3. В качестве вводимых символов использовать свою фамилию и имя. В отчет вставьте полученный результат.
  4. Сделайте вывод своей фамилии и имени по главной диагонали дисплея.
  5. В качестве символов введите числа от 1 до (2+Х), где Х – номер компьютера, за которым выполняется лабораторная работа. В отчет вставьте полученный результат.
  6. Выполните дублирование символов с помощью функции 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.

Таблица десятичных кодов букв латинского алфавита

Рис. 3.3. Таблица десятичных кодов букв латинского алфавита

Форматированный вывод данных предусматривает выравнивание по правому краю, для чего предусматриваются числовые спецификаторы типа %4d и %2c для целых чисел и символов в функции printf().

Задание 3

  1. Примените префиксную форму инкрементирования переменной j.
  2. Инкрементирование переменной j создайте отдельно в теле цикла.
  3. Инициализацию переменной j начните с нуля. Результат выполнения программы должен быть тот же самый, что и в приведенной программе.
  4. Напишите программу для вывода кодов букв из заданного диапазона на усмотрение пользователя, например, от 'j' до 'w'.
  5. В цикле for заполните все поля.
  6. Напишите программу для вывода кодов букв латинского алфавита прописных и строчных букв в одной таблице.
  7. Выведите буквы своей фамилии и коды этих букв.

Напишите программу расчета значений функции распределения потока Эрланга 4-го порядка с параметром \lambda = 2.3 на отрезке времени от 0 до 5 (условных единиц) с шагом 0.2:

F_k(t)=1-\sum\limits_{j=0}^{k}\frac{(\lambda t )^j}{j!}{e}^{-\lambda t}.

Программный код решения примера:

#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-го порядка

Рис. 3.4. Расчет функции распределения Эрланга 4-го порядка

Задание 4

  1. В заголовке внешнего цикла for добавьте первое поле и устраните третье поле.
  2. Предусмотрите вывод количества значений рассчитанной функции Эрланга.
  3. Предусмотрите ввод параметров программы, а именно: порядок потока Эрланга k, параметр \lambda, конечную величину временного интервала, шаг по времени.

Пример 5. Вычислите с точностью до "машинного нуля" значение суммы числового ряда:

\frac 1 {1\cdot 2\cdot  3}+ \frac 1 {2\cdot 3\cdot  4}+\frac 1 {3\cdot 4\cdot  5}+\frac 1 {4\cdot 5\cdot  6}+\cdots

Программный код решения примера:

#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.

Результат подсчета суммы бесконечного ряда

Рис. 3.5. Результат подсчета суммы бесконечного ряда
< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов