русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Практическая часть


Дата добавления: 2015-06-12; просмотров: 1193; Нарушение авторских прав


Рассмотрим примеры программ с операторами циклов while, for и do–while.

Пример 1. Напишите программу вывода на экран пользователя целых положительных чисел с помощью оператора while. Начальное и последнее число должно задаваться пользователем с клавиатуры.

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

#include <stdio.h>#include <conio.h> int main(void) {int i, j = 0, n;printf("\n\t Enter the primary natural number: ");scanf_s("%d", &i);printf("\t Enter the last natural number: ");scanf_s("%d", &n); printf("\n\t The numbers are:");while (i <= n) {printf("\n\t %3d", i);++i;++j; }printf("\n\t Total numbers: %d\n", j); printf("\n Press any key: "); _getch(); return 0; }

Рис. 6.1. Результат выполнения программы с вводом целых чисе

Возможный результат выполнения программы показан на рис. 6.1.

В программе использована функция scanf_s(), принятая в MS Visual Studio. В программе применено инкрементирование переменных, принятое в языке С, а именно ++i или ++j означает, что переменные увеличиваются на единицу. При этом знаки "++" могут располагаться перед именем переменной или после. Отличие в том, что ++i – это значение переменной после увеличения, а i++ – сначала переменная имеет заданное значение, а потом происходит ее увеличение. Для переменных цикла обе формы равнозначны.

Условием цикла является то, что пока переменная i меньше или равна переменной n (предполагается, что n больше начального значения i ), то будут выполняться действия (печать и увеличение переменной j ), заложенные в теле цикла. Расчет выражения, заключенного в круглые скобки оператора, предназначен для проверки нестрогого неравенства переменной i по отношению к переменной n. Если это неравенство выполняется, то в теле цикла происходят печать и увеличение (инкрементирование) переменных i, j.



Пример 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(). Без него при компиляции программы могут выводиться предупреждения, хотя программа с предупреждениями работает.

Результат выполнения программы показан на рис. 6.2.

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

Примечание. Прототип функции getchar() имеет следующий вид:

#include <stdio.h>int getchar(void);

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

Результат выполнения программы показан на рис. 6.3.

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

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

Пример 4. Напишите программу расчета значений функции распределения потока Эрланга 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; */t *= (L*t); /* Lt = Lt * (L*t); */

Вычисление факториала выполнено с помощью произведения и выделения отдельного слагаемого суммы, когда рассчитывается 0!

В программе также предусмотрено накопление суммы для каждого шага времени t. Для расчета экспоненты в заголовок программы включена библиотека математических функций #include <math.h>.

Результат выполнения программы показан на рис. 6.4

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

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

Результат выполнения программы показан на рис. 6.5.

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

Пример 6. Произведите реверс цифр заданного целого числа, вводимого с клавиатуры пользователем.

Задача заключается в том, чтобы, например, число 123 переписать как 321.

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

#include <stdio.h>#include <conio.h> int main(void) { long int x, r=0; printf("\n Enter an integer: "); scanf_s("%ld", &x); printf("\n Reverse-digit number %ld:\n\n\t", x); do { r =r*10+ x % 10; x /= 10; } while ( x != 0); printf(" %ld", r); printf("\n\n Press any key: "); _getch(); return 0;}

Переменные, используемые в программе, объявлены как длинные числа, поэтому применен тип long int (или long ). В некоторых компиляторах имеются отличия между типами int и long int в смысле максимально поддерживаемого значения числа.

Результат выполнения программы показан на рис. 6.6.

Рис. 6.6. Результат программы по реверсу числа

Пример 7. На основе только оператора цикла for напишите программу по выводу "горки" заглавных букв, симметрично убывающих к букве, введенной пользователем. Также на основе оператора цикла for предусмотрите защиту от неправильного ввода.

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

#include <stdio.h>#include <conio.h> int main (void) { int p = 0; char ch = 'A'; char i, j, k, ch2, kk, chA; chA = ch; printf("\n Enter a capital letter between \"A\" and \"S\": ");scanf_s("%c", &ch2, sizeof(char)); for(chA -= 1; chA >= ch2; chA-- ) { printf("\n Error! Press any key: "); _getch(); return -1; } for (kk = 'S'+1; kk <= ch2; kk++) {printf("\n Error! Press any key: "); _getch(); return -1;} k = ch2;for ( kk = ch; kk <= k; kk++) { printf("\n "); for (ch2 = ch; ch2 <= k-p ; ch2++) printf(" "); for (j = ch; j <= kk ; j++) printf(" %c", j); for (i = kk; i > ch; i-- ) printf(" %c", i-1); p++; } printf("\n\n Press any key: "); _getch(); return 0;}

Пример выполнения программы показан на рис. 6.7.

Рис. 6.7. Пример горки букв

Контрольные вопросы

  1. Как организуются составные операторы циклов в языке С?
  2. Как организуются вложенные циклы в языке С?
  3. В каких случаях может произойти зацикливание при использовании оператора цикла с предусловием?
  4. В каких случаях может произойти зацикливание при использовании оператора цикла с постусловием?
  5. Сколько условий требуется для работы оператора цикла с параметром?
  6. Чем отличаются префиксное и постфиксное инкрементирование и декрементирование?
  7. Какое различие в операторах цикла между префиксным и постфиксным инкрементированием?
  8. Сколько операторов отношения в языке С? Перечислите их.
  9. Как реализуется взаимозаменяемость операторов цикла while и for?


<== предыдущая лекция | следующая лекция ==>
Оператор goto | Задание.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 3.099 сек.