Организация циклов в языке С
Задание 5
- Подсчитайте число итераций цикла для подсчета суммы ряда.
- Напишите программу с нулевой инициализацией переменной k.
- Напишите условие "загрубения" результата подсчета суммы ряда.
- В программе примените тип float вместо типа double. Проанализируйте результат.
- Вместо оператора цикла do–while примените иной оператор цикла.
Пример 6. Произведите реверс цифр заданного целого числа, вводимого с клавиатуры пользователем.
Задача заключается в том, чтобы, например, число 123 переписать как 321.
Программный код решения примера:
#include <stdio.h> #include <conio.h> int main(void) { long int x, r; printf("\n Enter an integer: "); scanf_s("%ld", &x); printf("\n Reverse-digit number %ld:\n\n\t", x); do { r = x % 10; printf(" %ld", r); x = x / 10; } while ( x != 0); printf("\n\n Press any key: "); _getch(); return 0; }
В программе применена операция арифметическая операция деления по модулю, которая имеет символ процента, т.е. "%". Любой остаток, получающийся в результате деления целых чисел, будет отброшен [3.2]. В шкале старшинства оператор деления по модулю имеет приоритет, равный приоритету операторов умножения и деления. Переменные, используемые в программе, объявлены как длинные числа, поэтому применен тип long int (или long ). В некоторых компиляторах имеются отличия между типами int и long int в смысле максимально поддерживаемого значения числа.
Результат выполнения программы показан на рис. 3.6.
Задание 6
- Предусмотрите подсчет итераций заданного цикла.
- Напишите программу по реверсу числа с оператором цикла while. Протестируйте обе программы, в том числе по вводу числа 0.
- Определите максимальное число вида 123...987..., для которого еще можно применить тип long int.
Пример 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; }
Пример выполнения программы показан на рис. 3.7.
Задание 7
- Напишите программу на основе только оператора цикла for по выводу перевернутой горки букв, а также "левой" и "правой" горки.
- Напишите программу на основе только оператора цикла for по выводу "ромба" букв, относительно введенной буквы.
- Напишите программу по выводу горки букв только на основе оператора цикла while.
Контрольные вопросы
- Как организуются составные операторы циклов в языке С?
- Как организуются вложенные циклы в языке С?
- В каких случаях может произойти зацикливание при использовании оператора цикла с предусловием?
- В каких случаях может произойти зацикливание при использовании оператора цикла с постусловием?
- Сколько условий требуется для работы оператора цикла с параметром?
- Чем отличаются префиксное и постфиксное инкрементирование и декрементирование?
- Какое различие в операторах цикла между префиксным и постфиксным инкрементированием?
- Сколько операторов отношения в языке С? Перечислите их.
- Как реализуется взаимозаменяемость операторов цикла while и for?
- В чем сходство и различие между циклами с предусловием и с постусловием?