Вы на НеОфициальном сайте факультета ЭиП

На нашем портале ежедневно выкладываются материалы способные помочь студентам. Курсовые, шпаргалки, ответы и еще куча всего что может понадобиться в учебе!
Главная Контакты Карта сайта
 
Где мы?
» » » Простые типы данных, вычисления по формулам и управление алгоритмом с использованием условного оператора

Реклама


Простые типы данных, вычисления по формулам и управление алгоритмом с использованием условного оператора

Просмотров: 2205 Автор: admin

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

Пример №1. Программа с использованием условного оператора if вычисляет значение корней квадратного уравнения вида a×x2+b×x+c=0.

1.       Анализ условия задачи. Квадратное уравнение может иметь одно или два решения или не иметь их вообще. Результат решения зависит от определителя уравнения, вычисляемого по формуле .

2.       Входными данными будут коэффициенты уравнения a, b, c, причем, чтобы уравнение осталось квадратным необходимо, чтобы первый коэффициент был отличен от нуля. Имена переменных, обозначающих коэффициенты, могут совпадать с их математической записью, то есть a, b, c. Тип коэффициентов вещественный.

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

4.       Для вычисления определителя потребуется ввести новую переменную, которая будет хранить значение определителя. Эта переменная не является результатом решения задачи, но необходима для решения. Ее следует отнести к рабочим переменным программы и обозначить буквой d, как и в постановке задачи.

5.       Определение необходимых формул вычисления, их последовательности и правил записи.

6.       Кодирование алгоритма. При выполнении алгоритма можно выполнить предварительное словесное описание:

1)      Ввести значения коэффициентов (названы a, b ,c).

2)      Вычислить дискриминант (назван d).

3)      Если дискриминант отрицательный, решения нет, Вывести сообщение.

4)      Если дискриминант > или = 0, решение есть, вычислить значения корней и вывести на печать.

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

// Код программы примера №1.

#include <stdio.h>

#include <math.h>

void main (void)

{

float    a, b, c, d;

float    x1, x2;

// Ввод входных данных

printf ("\nВведите коэффициенты квадратного уравнения.\n");

scanf ("%f%f%f", &a, &b, &c);

           d = b*b – 4*a*c;                                      //Вычисление дискриминанта d.

           if (d >= 0.0)

                       {

                                  x1 = ( – b + sqrt(d)) / (2.*a);      //Вычисление корней.

                                  x2 = ( – b – sqrt(d)) / (2.*a);

                                  printf ("Корни равны x1=%6.2f x2=%6.2f\n", x1, x2);

                       }

                       else

                                  printf ("Корней нет\n");            //Печать сообщения.

}

В этом примере не предусмотрен случай равных корней, например, при a=2, b=4, c=2. Для того чтобы отследить этот случай, потребуется внести изменение в текст программы.

Пример №2. Когда для принятия решения требуется проверка более одного условия, появляется множественное ветвление. В данном примере можно предусмотреть случай равных корней, при этом в условном операторе появляется второе условие: d = 0, а значит, и второй оператор проверки условия.

Схема алгоритма условно может быть изображена так:

if (d > 0)

       {

                 // Блок операторов, чтобы вычислить два корня.

       }

       else

                 if (d==0)

                          {

                                    //Блок операторов, чтобы вычислить один корень.

                          }

                          else

                                    {

                                             //Вывод сообщения о том, что решения нет.

                                    }

       }

Структура ветвления рассматривает только взаимоисключающие варианты. Выполнение оператора if при использовании многих условий, если они не выделены блоком, разворачивается по принципу матрешки, то есть каждый else принадлежит ближайшему сверху if. Отступы в тексте программы позволяют лучше увидеть логику выбора решения.

// Код программы примера №2.

#include <stdio.h>

#include <math.h>

void main (void)

{

float    a, b, c, d;

float    x1, x2;

printf ("\nВведите коэффициенты квадратного уравнения\n");

scanf ("%f%f%f", &a, &b, &c);

d = b*b – 4*a*c;

if (d >0.0)

           {

                       x1 = ( – b + sqrt (d)) / (2.*a);

                       x2 = ( – b – sqrt (d)) / (2.*a);

                       printf ("Корни равны x1=%6.2f x2=%6.2f\n", x1, x2);

           }

           else

// Дискриминант d вещественное значение, сравнивать его с нулем можно только с

// некоторой степенью точности, например, так: |d|<0.00001.

                       if ( fabs (d) <= 0.00001)               // Приблизительно равен нулю.

                                  {

                                             x1 = ( – b + sqrt (d)) / (2.*a);

                                             printf ("Корни одинаковы x1=x2=%6.2f\n", x1);

                                  }

                                  else

                                             printf ("Корней нет\n");

} // Endofmain

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

Для организации повторного выполнения задачи используется циклический алгоритм. Цикл будет управляться внешним событием, порожденным пользователем. Таким событием является нажатие клавиши. Общепринято использовать клавишу Esc для завершения процесса, клавишу Enter для продолжения или любую другую.

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

// Код программы примера №3. Показывает пример диалога в общепринятом виде.

// Для управления используется цикл do…while с выходом по условию

// «нажата клавиша Esc».

#include <stdio.h>

#include <math.h>

#include <conio.h>               // Библиотека консольного ввода-вывода.

#define           ESC    27         // Код клавиши Esc в символьном представлении.

void main (void)

{

float    a, b, c, d;

float    x1, x2;

char     key;                             // Переменная key для обработки события.

// Первое выполнение алгоритма обязательно, поэтому необходим цикл do...while

do

{

           // Проверка корректности вводимых данных.

           // Если введенное значение а близко к нулю, цикл ввода повторяется.

           do

           {

                       printf ("\nВведите коэффициенты квадратного уравнения \n");

                       scanf ("%f%f%f", &a, &b, &c);

           } while (fabs (a) < 0.001)

// Ввод выполнен правильно.

d = b*b – 4*a*c;

if (fabs (d) <= 0.00001)

           {

                      x1 = ( – b + sqrt (d)) / (2.*a);

                       printf ("Корни одинаковы x1 = x2 = %6.2f\n", x1);

           }

           else

                      if ( d > 0)

                                  {

                                              x1 = ( – b + sqrt (d)) / (2.*a);

                                             x2 = ( – b – sqrt (d)) / (2.*a);

                       printf ("Корни равны x1=%6.2f x2=%6.2f\n", x1, x2);

                       }

                                  else

                                  printf ("Корней нет\n");

// Обработка события «нажатие клавиши».

printf ("Клавиша ESC – завершение работы, Any Key – продолжение...");

// Ожидание события «нажатие клавиши».

key = getch ();                         // Функция getch () читает символьный код клавиши.

} while ( key != ESC )            // Код клавиши Esc прописан в директиве define.

// End of while

}

Пример №4. Использование вложенных условных операторов в программах с проверкой многих условий. Примером сложного выбора является Задание оценки знаний ученика по результатам тестирования. Пусть известен результат ЕГЭ (от 0 до 100 баллов). Оценка по пятибалльной шкале должна быть выставлена по правилам:В записи этих правил есть некоторая избыточность с точки зрения механизмов, по которым выполняется оператор условия. Так как ветвление, это только взаимоисключающие варианты, то в первой ветви истинность условия ЕГЭ <= 40 означает получение результата. Если же это условие ложно, то к проверке второго условия 40 < ЕГЭ <= 60 приходят только то значения ЕГЭ, которые не удовлетворяют первому условию, то есть только ЕГЭ > 40, значит, их не нужно включать в запись условия. Так же и во всех последующих ветвях. В каждой ветви выполняется только один оператор. Логика вложенных операторов условия присоединяет каждый else к ближайшему сверху if.

// Код программы примера №4.

#include <stdio.h>

#include <conio.h>

void main (void)

{

int       Test;                          // ЕГЭ.

int       Ball;                           // Оценка.

do

{

           printf ("Введите результат ЕГЭ испытуемого\n");

           scanf ("%d", &Test);

           if(Test<=40)

                       Ball = 2;

                       else

                                  if(Test<=60)

                                             Ball = 3;

                                             else

                                                        if(Test<=80)

                                                                  Ball = 4;

                                                                  else

                                                                           Ball = 5;

           printf("Оценка в аттестате: %d\n", Ball);

printf("Если больше нет испытуемых, нажмите ESC\n");

}while (getch() != 27);

}

Обратите внимание, что цикл по-прежнему управляется событием, но в этом примере вспомогательная переменная key не используется.

Пример №5. Использование сложных логических выражений в программах с проверкой многих условий.
В любом случае использование множественных вложений операторов условия затрудняет «читабельность» программы, хотя зачастую его можно избежать, объединяя простые условия в логические выражения везде, где для поиска решения требуется проверка более одного условия. Пусть требуется проверить, принадлежит ли точка с произвольными координатами (x,y) указанной области, например, изображенной на рис. 1, где область заштрихована. Предполагается, что известны длина стороны квадрата (обозначим L) и радиус окружности (обозначим R), где не обязательно L > R, то есть область может быть пустой.

Запишем условие математически с помощью системы неравенств:

Для соблюдения условия нужно, чтобы все три неравенства выполнялись одновременно, поэтому при объединении их в одно требуется использовать логическую операцию «И» (конъюнкция), следующим образом:

x*x + y*y >= R*R && fabs (x) < L/2. && fabs (y) < L/2.

Тогда условный оператор запишется:

if (x*x + y*y >= R*R && fabs (x) < L/2. && fabs (y) < L/2.)

                printf ("Точка принадлежит области \n");

                 else

                 printf ("Точка не принадлежит области \n");

Если не использовать сложное выражение, то приходится использовать вложенные операторы условия, следующим образом:

if (x*x + y*y >= R*R)

           {

           if (fabs (x) < L / 2.)

                       {

                                  if (fabs (y) < L / 2.)

                                             printf ("Точка принадлежит области \n");

}

           }

           else

                       printf("Точка не принадлежит области \n");

Квалифицированный программист отдаст предпочтение первому способу.

Варианты заданий

Задание 1. Прямая L задана на плоскости координатами двух точек (a,b) и (c,d). Прямая L разбивает координатную плоскость на две полуплоскости. Известны также координаты двух точек (x1, y1) и (x2, y2), не лежащих на данной прямой.

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

Задание 2. Составить программу для определения корней системы двух линейных алгебраических уравнений по правилу Крамера. Решение вывести в виде системы уравнений. Иметь возможность повторного обращения в диалоге.

Задание 3. Дано натуральное число N, в записи которого ровно пять знаков.

Определить, является ли это число палиндромом или нет, напечатать сообщение текстом. Значение числа вводить в диалоге, иметь возможность повторного обращения.

Задание 4. Окружность на плоскости с центром в начале координат имеет радиус R. Известны также координаты концов некоторого отрезка (x1,y1) и (x2,y2).

Определить, пересекает ли отрезок окружность и сколько раз. Значения координат вводить в диалоге, иметь возможность повторного обращения.

Задание 5. Дано натуральное число N, определяющее возраст человека в годах (N<100).

Дать для этого числа наименование «год», «года» или «лет». Например, «Вам 21 год» или «Вам 43 года». Иметь возможность повторного обращения в диалоге.

Задание 6. На плоскости заданы две окружности координатами центров и радиусами.

Определить, пересекаются ли они или касаются друг друга. Значения вводить в диалоге, иметь возможность повторного обращения.

Задание 7. Даны длины трех отрезков.

Определить, можно ли построить треугольник с такими длинами сторон. Если да, то определить, какой это треугольник: прямоугольный, остроугольный или тупоугольный.

Значения длин вводить в диалоге, иметь возможность повторного обращения.

Задание 8. Заданы декартовы координаты точки на плоскости. Перевести в полярные координаты с учетом номера квадранта. Угол перевести в градусную меру с точностью до минут.

Значения вводить в диалоге, иметь возможность повторного обращения.

Задание 9. По введенным координатам точки (x,y) определить номер четверти координатной плоскости, где находится точка.

Значения координат вводить в диалоге, иметь возможность повторного обращения.

Задание 10. На плоскости задан треугольник длинами своих сторон.

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

Задание 11. На плоскости заданы три точки своими координатами.

Определить расстояния от точек до начала координат и напечатать, какая из точек расположена ближе к началу координат. Значения вводить в диалоге, иметь возможность повторного обращения.

Задание 12. Дано натуральное число N, в записи которого ровно пять знаков.

Определить, имеет ли это число одинаковые цифры или нет. Напечатать сообщение текстом. Значение числа вводить в диалоге, иметь возможность повторного обращения.

Задание 13. Окружность на плоскости с центром в начале координат имеет радиус 1. Известны также координаты левого верхнего угла квадрата со стороной 1.

Определить, принадлежит ли окружности хотя бы одна вершина квадрата. Значения координат вводить в диалоге, иметь возможность повторного обращения.

Задание 14. Окружность на плоскости с центром в начале координат имеет радиус 1.

Определить, пересекает ли прямая y = kx+b окружность или хотя бы касается один раз. Значения k, b вводить в диалоге, иметь возможность повторного обращения.

Задание 15. На плоскости заданы два квадрата координатами левого верхнего угла и длинами сторон.

Определить, пересекаются ли они. Значения вводить в диалоге, иметь возможность повторного обращения.

Задание 16. На плоскости задано кольцо с центром в начале координат и радиусами r1 и r2, где r1<r2. Дана точка своими координатами (x,y).

Определить, находится ли точка внутри кольца. Значения вводить в диалоге, иметь возможность повторного обращения.

Задание 17. Прямоугольной формы кирпич имеет стороны A, B, C. Определить, пройдет ли кирпич в прямоугольное отверстие размером 5 * 8.

Значения вводить в диалоге, иметь возможность повторного обращения.

Задание 18. Даны четыре числа.

Определить, являются ли они элементами арифметической прогрессии. Значения вводить в диалоге, иметь возможность повторного обращения.

Задание 19. На плоскости задан треугольник длинами своих сторон.

Вычислить его медианы:

и найти наибольшую медиану. Значения длин сторон вводить в диалоге, иметь возможность повторного обращения.

Задание 20. Прямоугольной формы контейнер имеет размеры 8*8*12, где 12 - высота контейнера. Дано К прямоугольных блоков размером n*n*2n.

Определить, войдут ли эти блоки в контейнер. Если не войдут, то определить, сколько останется. Размер блоков вводить в диалоге, иметь возможность повторного обращения.


Информация

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

Популярные новости

Статистика сайта



Rambler's Top100



 
Copyright © НеОфициальный сайт факультета ЭиП