Урок 2. Первая программа на языке Си


Арифметические операции

Компьютер умеет не только складывать числа, но и вычитать, умножать, делить. Для выполнения этих действий в языке Си используются знаки арифметических операций:

+ сложение
- вычитание
* умножение
/ деление

Порядок выполнения математических операций в языке программирования такой же, как и в математике: в первую очередь выполняются умножение и деление, во вторую - сложение и вычитание.
Очередность выполнения операций еще называется приоритетом. Таким образом, приоритет умножения выше, чем сложения, а умножение и деление имеют равный приоритет.
Кроме того, в записи математических выражений можно использовать круглые скобки. Использование скобок позволяет изменить приоритет: все, что записано в скобках, выполняется в первую очередь.
Следует обратить внимание на запись выражения, содержащего операцию деления. В языках программирования все выражение записывается "в строку", и если, например, вам нужно записать выражение:

то для его представления не забывать использовать скобки:

(a+b)/(c-d)

Скобки в данном случае как раз позволяют установить нужный порядок выполнения операций.

Задания для самостоятельной работы

1. Составить программу вывода на экран целого числа, вводимого с клавиатуры.
Выводимому числу должно предшествовать сообщение "Вы ввели число".
2. Составить программу вывода на экран целого числа, вводимого с клавиатуры. После выводимого числа должно следовать сообщение " - вот какое число Вы ввели".
3. Составить программу, выводящую на одной строке числа 1, 13 и 49 с одним пробелом между ними.
4. Составить программу, выводящую на одной строке числа 7, 15 и 100 с тремя пробелами между ними.
5. Составить программу вывода на экран в одну строку трех любых целых чисел с двумя пробелами между ними.
6. Вывести на экран числа 50 и 10 одно под другим (составить программу).
7. Составить программу вывода на экран "столбиком" трех любых целых чисел.
8. С помощью присваивания поменять содержимое двух ячеек памяти. Составить программу. (Указание - воспользуйтесь дополнительной вспомогательной ячейкой)
9. С помощью присваивания поменять содержимое двух ячеек памяти, не используя дополнительной ячейки. Составить программу.

Задания представлены по наростанию сложности.
Для выполнивших эти задания просьба выслать отчет по трем любым их них по адресу:
budniko@cs.karelia.ru
Отчет включает пункты:
кто выполнял, задание, программный код с комментариями, результаты прогонки программы, какие ошибки были допущены. (Информация об ошибках - не с целью "наказания", а с целью улучшения уроков)

Урок 4. Как научить компьютер решать задачи

Сам по себе компьютер ничего делать не будет. Компьютеру надо разъяснить по шагам, что и в какой последовательности следует выполнять. Другими словами, должен быть составлен алгоритм решения задачи.

Линейный алгоритм

Составим алгоритм решения математической задачи: найти гипотенузу прямоугольного треугольника, если известны катеты.
Алгоритм в словесной форме записи следующий:

1. Возвести первый катет в квадрат;
2. Возвести второй катет в квадрат;
3. Сложить результаты действий 1 и 2;
4. Вычислить квадратный корень из результата 3-го действия и принять его за значение гипотенузы.

Это пример записи линейного алгоритма. Алгоритм называется линейным, если все этапы решения задачи выполняются строго последовательно.
Для записи алгоритмов для компьютера язык должен быть формализован, то есть подчиняться заранее оговоренным принятым правилам его использования. Таким формализованным языком и является язык программирования, а запись алгоритма на этом языке - программой для компьютера.

Попробуем теперь разработать алгоритм и составить программу вычисления площади квадрата по известной стороне. Будем считать, что длина стороны задана в виде целого числа.
Прежде чем составлять алгоритм, следует определиться, какие данные понадобятся к нему; в программе под эти данные надо будет отвести ячейки памяти. Далее выяснить, какие данные должны быть введены (как правило, это данные, участвующие в вычислениях) и какие будут выведены на экран.
В нашем примере понадобятся две ячейки: одна для хранения длины стороны и другая - значения площади. Запишем полный алгоритм (включая действия ввода/вывода) и саму программу.
Алгоритм вычисления площади квадрата:

1. Ввести значение стороны квадрата;
2. Значение стороны возвести в квадрат и принять его за значение площади квадрата;
3. Вывести значение площади на экран.

Программа приведена ниже:

#include<stdio.h>// подключение библиотеки ввода/вывода
int main()
{
int a,S; // Выделена память: a - сторона квадрата, S - площадь
printf("Введите сторону\n"); //вывод подсказки
scanf("%d", &a); //ввод значения стороны в ячейку a
S=a*a; //вычисление площади
printf("Площадь квадрата=%d\n", S); //вывод результат на экран
}

Константы

Примерами констант являются числа (целые и вещественные), участвующие в вычислениях. Типы констант такие же, как и переменных.
Подробнее, всего в языке Си могут быть константы четырех типов:
- целые числа, записываются как в математике. Если перед числом стоит знак минус, он считается как арифметическая операция:

325, 14, 0, -500

- вещественные числа, состоят из целой и дробной части, причем целая часть от дробной отделяется точкой. Например, число "пи" в вычислениях можно записать в виде вещественной константы с любым разумным числом знаков в дробной части:

3.1415

- строковые константы. Это любой текст, заключенный в двойные кавычки. Строка может содержать некоторые специальные символы, например символ '\n', с которым мы уже встречались и который означает перевод курсора на следующую строку. Например, функция printf() в качестве параметра может содержать текстовую строку:

"Введите сторону:\n"

- любой отдельный символ тоже является константой, он записывается в апострофах (одинарных кавычках):

'a', '+', '@', '\n'

Последняя запись принимается, как уже знаем, за один символ.

Резюме

Для решения поставленной задачи вначале следует разработать алгоритм и определить, какие ячейки памяти понадобятся. Компьютер все действия выполняет над ячейками памяти. Число в ячейку можно поместить либо с использованием функции ввода, либо с помощью присваивания. Компьютер различает числа целые и вещественные.

Вопросы для самопроверки

1. Что такое линейный алгоритм
2. Какие основные типы данных имеются в языке Си
3. Что такое константа
4. Как подключить к программе библиотеку математических функций

Задания для самостоятельной работы

1. Во всех следующих заданиях требуется разработать алгоритм и составить программу на языке Си. Задания приведены по возрастанию их сложности.

1. Дана сторона квадрата. Найти его периметр.
2. Дан радиус окружности. Найти ее диаметр.
3. Дана длина ребра куба. Найти объем куба и площадь его боковой поверхности.
4. Дан радиус окружности. Найти ее длину и площадь круга, ограниченного этой окружностью.
5. Даны катеты прямоугольного треугольника. Найти его периметр.
6. Даны основания и высота равнобедренной трапеции. Найти ее периметр.
7. Найти площадь кольца по заданным внешнему и внутреннему радиусу.
8. Составить программу решения линейного уравнения ax+b=0 (a не равно 0).
9. Даны два числа. Найти их среденн арифметическое и среднее геометрическое.
10. Даны стороны прямоугольника. Найти его периметр и длину диагонали.
11. Даны длины сторон прямоугольного параллелепипеда. Найти его объем и площадь боковой поверхности.
12. Известен объем куба. Найти площадь его боковой поверхности.
13. Известна площадь круга. Найти длину окружности, ограничивающей этот круг.
14. Даны действительные положительные числа a, b, c. По трем сторонам с длинами a, b, c можно построить треугольник. Найти углы треугольника (в радианах и градусах). (Указание - воспользуйтесь теоремой косинусов). Начало формы

Конец формы

 

Алгоритм разветвляющийся

В линейных алгоритмах все команды выполняются одна за другой последовательно. Однако часто приходится выбирать тот или иной вариант действий в зависимости от некоторого условия, то есть, если условие выполняется, поступать одним способом, а если не выполняется - другим.
Рассмотрим следующую задачу. Пусть в ячейках x и y находятся числа. Следует составить алгоритм, который сможет найти большее их этих двух чисел и вывести его на экран.
Каждый раз при решении подобного рода задач на поиск некоторого элемента следует помнить, что все числа, с которыми компьютер манипулирует, должны находитьcя в ячейках памяти, в том числе и наше искомое число. Поэтому отведем под него ячейку с именем z. Тогда алгоритм следующий.

1. Поместить в ячейки x и y числа.
2. Если x>y то поместить в ячейку z число x иначе поместить в ячейку z число y.
3. Вывести z.

В этом алгоритме в шаге 2 записано разветвление. Разветвление всегда начинается со слова ЕСЛИ, после которого обязательно записывается УСЛОВИЕ. Дальнейшая работа алгоритма определяется тем, выполняется или нет УСЛОВИЕ. У нас в качестве условия выступает сравнение содержимого ячеек x и y.
Для организации условных переходов в программе на языке Си используются условный оператор. Существуют две формы условного оператора – полная и сокращенная. Полная форма записывается следующим образом:

if (условие) оператор_1; else оператор_2;

где
оператор_1, оператор_2– любой оператор языка Си (например, присваивание).
Если условие в скобках выполняется (говорят, принимает истинное значение), то выполняется оператор_1, если не выполняется (т.е. условие ложно) - оператор_2.
В операторе if ключевое слово else может отсутствовать. В этом случае говорят о сокращенной форме условного оператора. Сокращенная форма имеет вид:

if (условие) оператор;

Вариант программы с полным условным оператором приведен ниже:

#include<stdio.h>
int main()
{
float x,y,z; // Выделены ячейки памяти
printf("Введите два числа\n"); //вывод подсказки
scanf("%f%f", &x,&y); //ввод значений
if(x>y) z=x; //
else z=y; //
printf("Большее из двух чисел=%f\n", z); //вывод результат на экран
}

Запишем вариант программы с использованием сокращенной формы условного оператора:

#include<stdio.h>
int main()
{
float x,y,z; // Выделены ячейки памяти
printf("Введите два числа\n"); //вывод подсказки
scanf("%f%f", &x,&y); //ввод значений
z=x; //в ячейку z занесем первое из двух чисел
if(y>z) z=y; /*если второе число оказалось больше первого,
то его занесем в ячейку z */
printf("Большее из двух чисел=%f\n", z); //вывод результат на экран
}

По возможности следует избегать программирования условного оператора с else, поскольку это усложняет логику программы и может привести к неверной реализации алгоритма.

Понятие блока операторов

Если в случае выполнения условия вместо одного необходимо выполнить сразу несколько операторов, то они заключаются в фигурные скобки. Несколько операторов, заключенных в фигурные скобки, называются блоком операторов. Условный оператор с блоком оператороввыглядит следующим образом:

if(условие)
{
оператор_1;
оператор_2;
оператор_3;
. . .
}

Рассмотрим пример. Пусть требуется написать программу, решающую линейное уравнение:

k*x+b=0 (k не равно 0)

Эта задача реализуется с помощью простого линейного алгоритма, решение находится по формуле x=-b/k, для работы алгоритма вводятся значения b и k. Однако есть одна тонкость: в условии говорится, что k не должно быть равно нулю. Поскольку заранее неизвестно, какие числа будут введены, надо в программе уметь отделить этот случай. Здесь как раз можно использовать условный оператор, проверяющий значение k, и в случае если k равно 0, остановить выполнение программы с помощью блока операторов. Фрагмент программного кода:

if(k==0)
{
printf("Нет решения\n");
return 0;
}

Здесь использован еще один оператор языка Си - return. Он позволяет немедленно выйти из программы из любой ее точки. Если выход выполняется из функции main(), как в наших программах, управление передается среде Linux. Значение 0 не используется.

Вложенный условный оператор

В операторе if - else непосредственно после ключевых слов if и else должны следовать другие операторы. Если хотя бы один из них является оператором if, его называют вложенным. Согласно принятому в языке Си соглашению, слово else всегда относится к ближайшему предшествующему ему if.
Рассмотрим задачу.
Найти максимальное из трех веденных с клавиатуры чисел. Сразу скажем, эта задача может быть реализована несколькими алгоритмами. Один из них - с использованием вложенного условного оператора. Приведем фрагмент кода:

float x,y,z,max; // Выделены ячейки памяти
printf("Введите числа\n");
scanf("%f%f%f", &x,&y,&z); //ввод значений
if(x>y) // сравниваем первые два числа
if(x>z) max=x;
else max=z; // это else относится к предыдущему if
else // это else относится к самому первому if
if(y>z) max=y;
else max=z; // это else относится к предыдущему if
printf("Большее из трех чисел=%f\n", max); //вывод результат на экран

На примере этой программы видно, как важно записывать строки кода с отступами. При этом видна вся структура программы, понятен программный код, легче обнаруживать ошибки.

Какие ошибки встречаются в программах с условным оператором Начало формы Конец формы

 

Начало формы Конец формы

Резюме

В этом уроке вы познакомились со вторым типом алгоритмов - разветвляющимися алгоритмами. Они реализуются с помощью условного оператора. Условный оператор можно использовать в полной или сокращенной форме.

Вопросы для самопроверки

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

2. адания для самостоятельной работы к уроку 5

3. Во всех заданиях следует составить программу на языке Си. Задания приведены по возрастающей сложности

1. Определить максимальное и минимальное значения из двух различных вещественных чисел.
2. Найти минимальное из трех веденных с клавиатуры чисел.
3. Даны действительные числа x, y, z. Вычислить:

4. Даны действительные числа x, y, z. Вычислить:

5. Написать программу проверки знания даты начала второй мировой войны. В случае неверного ответа программа должна выводить правильный ответ. Рекомендуемый вид экрана во время работы программы:

4. В каком году началась вторая мировая война?
Введите число и нажмите <Enter>
==> 1939
Правильно

 

5. 6. Написать программу, которая вычисляет оптимальный вес человека, сравнивает его с реальным и выдает рекомендацию о необходимости поправиться или похудеть. Оптимальный вес вычисляется по формуле: рост (в сантиметрах) - 100. Рекомендуемый вид экрана во время работы программы:

6. Введите в одной строке рост (в см.) и вес и нажмите <Enter>
==> 170 68
Вам надо поправиться на 2 кг.

 

7. 7. Даны радиус круга и сторона квадрата. У какой фигуры площадь больше?
8. Известны площади круга и квадрата. Определить, уместится ли круг в квадрате.
9. Написать пограмму вычисления площади кольца. Программа должна проверять правильность исходных данных. В случае, если радиус отверстия больше радиуса кольца, программа должна вывести сообщение: "Ошибка! Радиус отверстия не может быть больше радиуса кольца", и закончить свою работу.
10. Составить программу нахождения суммы двух наибольших из трех различных чисел. (Для этой задачи возможны несколько алгоритмов)
11. Даны вещественные числа a, b, c (a не равно 0). Выяснить, имеет ли уравнение

вещественные корни (вывести соответствующее сообщение).
12. Даны вещественные числа a, b, c (a не равно 0). Решить уравнение

В числе возможных вариантов учесть вариант равенства корней уравнения. Если уравнение корней не имеет, вывести сообщение и закончить программу. Имена переменных для корней можно выбрать x1, x2.

Задача о кирпиче

47. Выяснить, пройдет ли кирпич с ребрами a, b, c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия.

Пусть в ячейки a, b, c, x, y введены числа. Первый вариант записи условного оператора:

48. if(x>a && y>b) printf("Кирпич пройдет\n");
else printf("Кирпич не пройдет\n");

49. Однако глядя на этот кирпич и отверстие, мы-то быстро сообразим, что так кирпич не пройдет и его надо повернуть "боком". Компьютер же этого не может видеть, и ему надо подробно разъяснить, как поворачивать этот самый кирпич. Точнее, поскольку порядок ввода значений переменных заранее неизвестен, в записи условия надо рассмотреть все варианты их сочетания. Полный вариант записи условия:

50. if(
x>a && y>b || x>b && y>a ||
x>a && y>c || x>c && y>a ||
x>c && y>b || x>b && y>c
)
printf("Кирпич пройдет\n");
else printf("Кирпич не пройдет\n");

51. Скобки в записи этого условия необязательны, нужный порядок выполнения операций соблюден.

Резюме

53. В этом уроке вы узнали, как записывается сложное логическое условие, познакомились с порядком выполнения логических операций.

Вопросы для самопроверки

55. 1. Какие логические операции вы знаете?
2. Какая логическая операция используется для проверки принадлежности (непринадлежности) числа промежутку?
3. Как работает логическое отрицание?
4. Перечислите приоритет выполнения логических операций.

 

Задания для самостоятельной работы к уроку 6

1. Проверить, принадлежит ли число, введенное с клавиатуры, интервалу (-5.1, 3.6).
2. Известен рост трех человек. Определить, одинаков ли их рост? (вывести сообщение).
3. Даны три вещественных числа a, b, c. Проверить, выполняется ли неравенство a<b< c.
4. Даны действительные положительные числа a, b, c. Выяснить, существует ли треугольник с длинами сторон a, b, c. (Указание. В треугольнике длина стороны не может превышать сумму двух других сторон.)
5. Определить, является ли треугольник со сторонами a, b, c равнобедренным (рассмотреть все возможные сочетания длин сторон).
6. Определить, является ли треугольник со сторонами a, b, c остроугольным (воспользуйтесь теоремой Пифагора).
7. Пройдет ли мяч радиуса r в прямоугольное отверстие со сторонами x и y?
8. Записать программу вычисления площади треугольника по формуле Герона с проверкой существования треугольника с указанными длинами сторон. В случае, если треугольник не существует, вывести сообщение и выполнить выход из программы.
9. Написать программу, которая вычисляет Индекс массы тела (ИМТ) человека и выдает сообщение. Формула вычисления ИМТ:
масса тела в кг (В) разделить на рост в метрах (Р) в квадрате

В/(Р*Р)

Если ИМТ менее 18,5 то Дефицит массы тела.
Если ИМТ в диапазоне 18,5-24,9 то Нормальная масса тела.
Если ИМТ больше 24,9 то Избыточная масса тела.
Рекомендуемый вид экрана во время работы программы:

Введите в одной строке вес и рост (в м.) и нажмите <Enter>
==> 58 1.6
Ваш ИМТ=22.65625. У вас нормальная масса тела.

Зачем нужны циклы?

Теперь задумаемся, как вывести, например, на экран приветствие 3 раза. Конечно, можно написать 3 раза оператор printf(), но если надо вывести строку 100 раз, то программа значительно увеличится. Поэтому надо использовать возможность повторения действий. Такой механизм реализуется с помощью циклов.
Цикл - это последовательность команд, которая выполняется несколько раз.
В языке Си существует три вида циклов. В циклах нам могут понадобиться другие формы оператора присваивания. Поэтому, прежде чем перейти к изучению циклов, вспомним их.

Какие формы оператора присваивания есть еще Начало формы Конец формы

 

Начало формы Конец формы

Табулирование функции

Циклы используются во многих алгоритмах и в сочетании с другими операторами. Это позволяет решать уже довольно широкий класс задач. Одной из таких задач является табулирование функции.
Слово "табулирование" происходит от "таблица", и эта задача означает: получить таблицу значений функции при заданном изменении аргумента. Аргумент при этом изменяется на некотором промежутке с заданной величиной шага, и эти величины совсем не обязательно целые числа. Границы промежутка и величина шага, как правило, вводятся с экрана.
Пусть наша текущая цель - написать программу, которая выводит таблицу значений функции. Возьмем любую нравящуюся нам функцию, ну, например:

и посмотрим, какие значения примет эта функция в диапазоне изменения x от -2 до 2 с шагом 0,5.
Ниже представлен желаемый вид экрана во время работы программы:

В этой программе опять будем использовать циклический алгоритм, параметром цикла будет переменная x. Все переменные по смыслу должны быть переменными вещественного типа. Пусть переменные a и b обозначают начало и конец промежутка, переменная h - величину шага. Листинг программы следующий:

#include<stdio.h>
int main()
{
float a, b, h; // границы промежутка и шаг
float x, y; // аргумент и значение функции
scanf("%f%f%f", &a, &b, &h); // ввод значений границ и шага
/* Вывод шапки таблицы до цикла */
printf("--------------------\n");
printf(" x | y \n");
printf("--------------------\n");
/* Вывод самой таблицы в цикле */
for(x=a; x<=b; x=x+h) // x изменяется от -2 до 2 с шагом 0.5
{
y = -2.4*x*x + 5*x - 3; // вычисление значения функции
printf("%6.1f\t| %6.2f\n", x, y);
}
/* Вывод нижней линии после цикла */
printf("--------------------\n");
return 0;
}

Интересным здесь представляется описание спецификаций формата, содержащееся в текстовой строке:

"%6.1f\t| %6.2f\n"

Прежде всего, мы видим, что между знаком % и спецификацией вещественного типа f вставлено число с целой и дробной частями. Такая запись используется для более удобного представления чисел на экране. Число 6.1 означает, что при печати для значения переменной будет отведено 6 позиций экрана, из них под дробную часть - одна позиция. Таким образом вещественные числа округляются при выводе на экран. (А сколько остается под целую часть? давайте подсчитаем: 6-1 и еще 1 для точки, итого 4 позиции.)

Другое новшество - использование в строке спецификации формата еще одного парного символа '\t', который называется символом табуляции. Один подобный парный символ мы уже использовали много раз: перевод строки '\n'. Символ табуляции позволяет при выводе переместить курсор на определенное число позиций и тем самым выровнять печать. А еще один парный символ '\а' заставит компьютер "пискнуть".

Кроме того, в строке спецификации формата можно использовать практически любые символы (вертикальную черту, пробелы и др.) с тем, чтобы наглядно оформить результат.

Резюме

Конструкция for используется для организации циклов с фиксированным числом повторений. Циклом управляет переменная - параметр цикла.

Вопросы для самопроверки

1. В каких случаях используется оператор цикла с параметром?
2. Какая информация содержится в заголовке цикла?
3. Как работает оператор цикла с параметром?
4. Что такое "тело цикла"?
5. В каком случае в записи тела цикла фигурные скобки можно опустить?
6. Может ли тело цикла с параметром не выполниться ни разу?

2. Задания для самостоятельной работы к уроку 7

3. Во всех заданиях следует составить программу на языке Си. Задания приведены по возрастающей сложности

1. Написать программу, которая 10 раз выводит на экран имя и фамилию.
2. Написать программу, которая выводит на экране изображение шахматной доски. Рекомендуемый вид экрана во время работы программы приведен ниже.

4. * * * *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *

5. 3. Написать программу, которая выводит таблицу степеней двойки (от нулевой до десятой). Ниже представлен рекомендуемый вид экрана во время работы программы:

6. Таблица степеней двойки
---------------------------
0 1
1 2
2 4
3 8
4 16
5 32
. . . и т.д.

7. 4. Написать программу, которая выводит на экран таблицу умножения, например, на 7. Ниже представлен рекомендуемый вид экрана во время работы программы:

8. 7 * 1 = 7
7 * 2 = 14
7 * 3 = 21
7 * 4 = 28
7 * 5 = 35
7 * 6 = 42
. . . и т.д.

9. 5. Написать программу, которая выводит таблицу квадратов первых десяти целых положительных нечетных чисел (возможны различные варианты записи цикла). Ниже представлен рекомендуемый вид экрана во время работы программы:

10. Число Квадрат
---------------------------
1 1
3 9
5 25
7 49
9 81
11 121
. . . и т.д.

11. 6. Напечатать таблицу соответствия между весом в фунтах и весом в килограммах для значений 1, 2,..., 10 фунтов (1 фунт = 453 г.)
7. Получить таблицу температур по Цельсию tc от 0 до 100 градусов и их эквивалентов по шкале Фаренгейта tf, используя для перевода формулу:

12. tf = 9/5*tc + 32

13. 8. Вывести "столбиком" значения sin0,1, sin0,2, ..., sin1,5.
9. Напечатать таблицу стоимости 100, 200, 300, ..., 2000 г конфет (стоимость 1 кг конфет вводится с клавиатуры).
10. Цилиндр объема единица имеет высоту h. Определить радиус основания цилиндра для значений h, равных 0.5, 1, 1.5, 2, ..., 5.

 

Цикл с условием (while)

Очень часто заранее невозможно сказать, сколько раз надо выполнить какую-то операцию, но можно определить условие, при котором она должна заканчиваться. Такое задание на русском языке может выглядеть так: делай эту работу до тех пор, пока она не будет закончена (пили бревно, пока оно не будет распилено; иди вперед, пока есть время). Слово пока на английском языке записывается как while, и так же называется еще один вид цикла.
Цикл while состоит из заголовка и тела цикла:

while(условие)
{
тело_цикла
}

Мы видим, что внешний вид этого цикла проще, чем цикла с параметром (for). Циклом управляет всего одно условие, которое записано в заголовке после слова while в круглых скобках.
Если условие истинно, цикл продолжает выполняться; когда условие становится неверно, цикл заканчивается.
Условие записывается в точности так же, как в условном операторе: можно использовать все операции отношения (больше, меньше и др.) и логические (И, ИЛИ, НЕ), а также арифметические. Главное, что перед выполнением тела цикла сначала проверятся условие, и если оно истинно, тело цикла выполнится, а если ложно - то нет.
Если условие неверно в самом начале, то цикл не выполняется ни разу. Поскольку условие проверяется до выполнения тела, этот цикл называется "циклом с предусловием".
Тело цикла заключается в фигурные скобки; если в теле цикла стоит всего один оператор, фигурные скобки можно опустить.

Сразу возникает вопрос: зачем столько разновидностей циклов и в каких задачах их использовать? Вернемся к примеру предыдущего урока: вывести на экран три раза приветствие. Попробуем его реализовать с помощью цикла while.
Этим циклом управляет только условие, а нам надо, чтобы цикл выполнился ровно три раза, поэтому без счетчика не обойтись. Вот только задавать значения этого параметра придется "вручную": начальное значение - до цикла, а в теле цикла - изменять параметр. Таким образом, листинг программы следующий.

#include<stdio.h>
int main()
{
int i; // параметр цикла
i=1; // начальное значение
while(i<= 3) // цикл: пока i меньше или равно 3
{
printf("Привет!\n"); // тело цикла
i++; // счетчик увеличивается
}
return 0;
}

Результат этой программы будет точно такой же, как и для цикла for из Урока 7, но код длиннее, и, очевидно, неудобней. Когда же лучше while?

Рассмотрим простой пример.
Пусть программа вводит целые положительные числа и печатает их на экране. Поскольку числа вводятся по одному, достаточно одной ячейки памяти. До каких пор будет продолжаться ввод? Давайте договоримся, что если будет введен ноль, ввод прекратится. Листинг следующий.

#include<stdio.h>
int main()
{
int N; // выделил одну ячейку
N=1; // любое ненулевое начальное N
while(N!=0) // цикл: пока N не равно 0
{
scanf("%d", &N); // чтение числа
printf("%d\n", N); // вывод на экран
}
return 0;
}

В этой программе не очень удобным моментом является то, что требуется до цикла задать начальное значение N, иначе значение этой переменной будет неопределенно ("мусор"), и нет гарантии, что в этой ячейке не ноль, и цикл даже на начнется. Другими словами, здесь более удобен цикл, в котором тело выполнятся хотя бы один раз. Такую работу сможет сделать цикл с постусловием.

Резюме

Операторы while и do - while используются для организации циклов, когда числом повторений заранее неизвестно. Циклом управляет только логическое условие. Тело цикла while может ни разу не выполниться, цикл do - while выполнится по крайней мере один раз.

Вопросы для самопроверки

1. В каких случаях используется оператор цикла с условием?
2. Какие операции можно использовать в записи условия?
3. Как работает оператор цикла с постусловием?
4. В каком случае в записи тела цикла фигурные скобки можно опустить?
5. Может ли тело цикла с условием не выполниться ни разу?

 

Задания для самостоятельной работы к уроку 8

1. С помощью цикла while запишите программу табулирования функции (см. задания 6, 7, 8, 9, 10 Урока 7).
2. Записать (еще раз) программу вычисления площади треугольника по формуле Герона с проверкой существования треугольника с указанными длинами сторон (см. Указания к заданию 4 Урока 6). В случае, если треугольник не существует, предложить повторить ввод.

 

Целочисленное деление

С целочисленными и вещественными данными все операции выполняются одинаково, кроме деления. При выполнении арифметических операций действует правило: если операнды одного типа, то результат операции этого же типа. Если умножаем два целых числа - результат тоже целое число. Если делим одно вещественное число на другое, то и частное тоже вещественное число (то есть содержит целую и дробную часть).

Распространяя это правило на операцию деления целых чисел, можно прийти к заключению: если целое делим на целое, результат тоже целое. Дробная часть просто отбрасывается. Таким образом, имея описание переменных и действия:

int n,m k;
n=10;
m=4;
k=n/m;

получим, что k=2 (поскольку при "обычном" делении 10/4=2,5).

Это свойство целочисленного деления используется в разнообразных алгоритмах с целыми числами. Рассмотрим одну такую задачу:
Ввести целое число и определить, сколько в нем цифр.
Для решения этой задачи обычно применяется такой алгоритм. Число делится на 10 нацело (отбрасывается остаток), "укороченное" число заносится в эту же ячейку, и так до тех пор, пока результат деления не равен нулю. С помощью специальной переменной-счетчика считаем, сколько раз выполнялось деление - столько цифр и было в числе.
Понятно, что нельзя заранее определить, сколько раз надо разделить число, поэтому надо использовать цикл с условием. В качестве условия выступает сравнение нашего числа с нулем. Листинг следующий.

#include<stdio.h>
int main()
{
int count; // count - переменная-счетчик
int N; // исходное число
count=0; // обнуляем значение счетчика
printf("\nВведите число N\n");
scanf("%d", &N); // ввод N с клавиатуры
while( N>0 ) // делать, пока N>0
{
N = N / 10; // здесь целочисленное деление,
// результат заносится в эту же ячейку N
count++; // счетчик увеличивается на 1
printf("N=%d count=%d\n", N, count);
}
printf("В этом числе %d цифр\n", count);
}

В этой программе в тело цикла мы поставили оператор печати промежуточных результатов с тем, чтобы наглядно увидеть, как работает программа:

printf("N=%d count=%d\n", N, count);

Пусть при выполнении было введено число 68792. Тогда протокол (порядок действий) работы программы следующий:

Введите число
68792
N=6879 count=1
N=687 count=2
N=68 count=3
N=6 count=4
N=0 count=5
В этом числе 5 цифр

Кстати, в этой программе использовали один из приемов отладки программ: промежуточную печать. Оператор printf() можно ставить в любой точке программы, где мы не совсем уверены в промежуточных результатах.

Остаток от деления

Остается открытым вопрос: окончательно ли пропадает остаток от деления. А вот и нет. Существует специальная операция, похожая на деление (в том смысле, что она тоже является операцией деления), но результат которой как раз и есть остаток от деления. Эта операция обозначается знаком процента % и применяется только для целочисленных переменных.
Например, 8 делится на 4 без остатка, а остаток от деления 9 на 4 равен 1.
Вернемся к ранее приведенному примеру, только теперь используя операцию остаток от деления:

int n,m, k;
n=10;
m=4;
k=n % m;

В результате операции получим остаток от деления k=2, т.к. 10-8=2.
Замечательное свойство остатка от деления то, что он принимает значения от 0 до m-1, где m - делитель. То есть эта операция позволяет получать целые числа в заданном диапазоне. Убедимся в этом на примерах.
Так, остаток от деления любого натурального числа на 8 даст число от 0 до 7. Остаток от деления на 2 - это будут 0 либо 1.

Операцию целочисленного деления применяют в разных целочисленных алгоритмах. Она удобна, если надо, например, из десятичного числа выделить последнюю цифру. В этом случае достаточно число нацело разделить на 10, остаток будет принадлежать диапазону от 0 до 9.
Подумайте, а как выделить из натурального числа две последние цифры? Совершенно верно, найти остаток от деления числа на 100.

С помощью совместного использования обеих операций целочисленного деления можно реализовать много алгоритмов. Попробуем, например, "растащить" трехзначное число на отдельные цифры. Алгоритм рассмотрим на примере.
Пусть наше число равно 678. Сначала, выполнив операцию 678 % 10, получим "младшую" цифру 8, сохраним ее в отдельной ячейке. Далее это же число делим нацело: 678 / 10 оставляет двузначное число 67. Повторим эти действия к двузначному числу, а для однозначного и повторять не надо, оно и так цифра.









Последнее изменение этой страницы: 2016-04-07; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь