Условные операторы и циклы на языке CC. Лабораторная 1. Условные операторы и циклы на языке CC по курсу Программирование
Скачать 93.37 Kb.
|
Минобрнауки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им В.И. Ульянова(Ленина)» Факультет компьютерных технологий и информатики Кафедра вычислительной техники Лабораторная работа №1 на тему: «Условные операторы и циклы на языке C/C++» по курсу «Программирование» Выполнил: Принял: к.т.н., доцент Санкт-Петербург 2016 ОглавлениеОглавление 2 Цель работы Получить практические навыки работы с условными операторами и операторами цикла в языке C/C++. Задание Разработать алгоритм и написать программу на языке Си,определяющую, попадает ли точка, заданная координатами X и Y в указанную пользователем область, находится ли точка на границе области или находится вне области. Для работы алгоритма необходимо рассматривать возможность изменения координат точки и параметров области. Заданная область изображена на рис. 1. Рис. 1. Заданная область Уточнение задания По условию задания пользователь должен ввести радиус окружности, при этом введенный радиус проверяется на положительность до тех пор, пока не будет получено требуемое значение. Затем пользователь должен ввести параметр А для прямой, при этом введенный параметр проверяется на отрицательное значение до тех пор, пока не будет получено отрицательное значение. Далее пользователь должен ввести координаты проверяемой точки. После ввода координат, программа должна вывести результат проверки принадлежности данной точки заданной области (точка лежит внутри области, на её границе или за её пределами) на экран и дать возможность пользователю ввести новые координаты точки и новый отрицательный параметр A или начать программу заново. Математическое описание Принадлежность точки области: ((X*X + Y*Y < R*R) && (X > A) && (X < 0) && (Y > 0)) || ((X < A) && (Y > 0) && (X*X + Y*Y > R*R)) Принадлежность точки границе: ((|X*X + Y*Y - R*R| <= Eps) && (X < 0) && (Y > 0)) || ((|X – A| <= Eps) && (Y >= 0)) || ((Y >= 0) && (Y <= R) && (|X| <= Eps)) || ((X <= 0) && (|Y| <= Eps) && (X >= A)) || ((|Y| <= Eps) && (X + R <= 0)) Контрольные примеры Контрольные примеры представлены в таблице 1. Таблица 1. Контрольные примеры
Описание переменных Описание переменных представлено в таблице 2. Таблица 2. Описание переменных
Описание алгоритма программы Шаг 1. Вывод на экран сообщения 1: «Введите погрешность вычислений:» Шаг 2. Ввод погрешности Eps Шаг 3. Проверка условия Eps < 0. Если выражение истина – вывод на экран сообщения 2: «Некорректный ввод! Введите Eps > 0». Если выражение ложь – переход к шагу 4. Шаг 4. Проверка условия Eps <= 0. Если выражение истина – возвращаем пользователя на шаг 1. Если выражение ложь – переход к шагу 5. Шаг 5. Вывод на экран сообщения 3: «Введите радиус окружности:». Шаг 6. Ввод R. Шаг 7. Проверка условия R <= Eps. Если выражение истина – вывод сообщения 4: «Некорректный ввод! Введите R > Eps.» Если выражение ложь – переход к шагу 8. Шаг 8. Проверка условия R <= Eps. Если выражение истина – возвращаем пользователя на шаг 5. Если выражение ложно – переход к шагу 9. Шаг 9. Вывод на экран сообщения 5: «Введите значение A, задающее прямую X = A, параллельную оси Y. Помните: для нашего случая |А| должен быть меньше радиуса и само значение А должно быть меньше 0» Шаг 10. Ввод А. Шаг 11. Проверка условия A < Eps. Если выражение истина – проверка условия |A| – R = Eps. Если выражение истина – выполняется операция инкремента К, если ложь – операция инкремента не выполняется. Если выражение A < Eps ложно – выполняется операция инкремента переменной К. Переход к шагу 12. Шаг 12. Проверка условия K != 0. Если выражение истинно – возвращаем пользователя на шаг 9, если ложно – переход к шагу 13. Шаг 13. Вывод на экран сообщения 7: «Введите координату Х:». Шаг 14. Ввод Х. Шаг 15. Вывод на экран сообщения 8: «Введите координату У:». Шаг 16. Ввод У. Шаг 17. Проверка условия 1: ((X*X + Y*Y < R*R) && (X > A) && (X < 0) && (Y > 0)) || ((X < A) && (Y > 0) && (X*X + Y*Y > R*R)). Если выражение истинно – вывод сообщения 9: «Точка с указанными координатами лежит внутри закрашенной области». Если выражение ложно – проверка условия 2: ((|X*X + Y*Y - R*R| <= Eps) && (X < 0) && (Y > 0)) || ((|X – A| <= Eps) && (Y >= 0)) || ((Y >= 0) && (Y <= R) && (|X| <= Eps)) || ((X <= 0) && (|Y| <= Eps) && (X >= A)) || ((|Y| <= Eps) && (X + R <= 0)). Если выражение истинно – вывод сообщения 10: «Точка с указанными координатами лежит на границе закрашенной области», если выражение ложно – вывод сообщения 11: «Точка с указанными координатами лежит за границами закрашенной области». Шаг 18. Вывод сообщения 12: «Хотите ввести координаты точки повторно? Введите «1», если да, любую другую цифру, если нет:» Шаг 19. Ввод f. Шаг 20. Проверка f на равенство 1. Если f == 1 истина - передаем управление цикла на шаг 14. Если выражение ложно – переход к шагу 21. Шаг 21. Вывод сообщения 13: «Хотите ввести координаты параметра А повторно? Введите «1», если да, любую другую цифру, если нет:» Шаг 22. Ввод f. Шаг 23. Проверка f на равенство 1. Если f == 1 истина – передаем управление цикла на шаг 9. Если ложно – переход к шагу 24. Шаг 24. Вывод сообщение 14: «Хотите ввести радиус окружности R повторно? Введите «1», если да, любую другую цифру, если нет:» Шаг 25. Ввод f. Шаг 26. Проверка f на равенство 1. Если f == 1 истина – передаем управление цикла на шаг 5. Если ложно – переход к шагу 27. Шаг 27. Вывод сообщения 15: «Хотите ввести все данные заново, начиная с погрешности? Введите «1», если да, любую другую цифру, если нет:» Шаг 28. Ввод f. Шаг 29. Проверка f на равенство 1. Если f == 1 истина – передаем управление цикла на шаг 1. Если ложно – происходит выход из программы. Cхема алгоритма Схема алгоритма представлена на рисунке 2. Сообщение 1: «Введите погрешность вычислений:» Сообщение 2: «Некорректный ввод! Введите Eps > 0» Сообщение 3: «Введите радиус окружности» Сообщение 4: «Некорректный ввод! Введите R > 0» Сообщение 5: «Введите значение A, задающее прямую X = A, параллельную оси Y. Помните: для нашего случая |А| должен быть меньше радиуса и само значение А должно быть меньше 0». Сообщение 6: «Некорректный ввод! А должно быть больше 0 и |A| должен быть меньше R.» Сообщение 7: «Введите координату Х:» Сообщение 8: «Введите координату У:» Сообщение 9: «Точка с указанными координатами лежит внутри области» Сообщение 10: «Точка с указанными координатами лежит на границе области» Сообщение 11: «Точка с указанными координатами лежит за границами области» Сообщение 12: «Хотите ввести координаты точки повторно? Введите «1», если да, любую другую цифру, если нет:» Сообщение 13: «Хотите ввести параметр А повторно? Введите «1», если да, любую другую цифру, если нет:» Сообщение 14: «Хотите ввести радиус окружности повторно? Введите «1», если да, любую другую цифру, если нет:» Сообщение 15: «Хотите ввести все данные повторно, начиная с погрешности? Введите «1», если да, любую другую цифру, если нет:» Условие 1: ((X*X + Y*Y < R*R) && (X > A) && (X < 0) && (Y > 0)) || ((X < A) && (Y > 0) && (X*X + Y*Y > R*R)) Условие 2: ((|X*X + Y*Y - R*R| <= Eps) && (X < 0) && (Y > 0)) || ((|X – A| <= Eps) && (Y >= 0)) || ((Y >= 0) && (Y <= R) && (|X| <= Eps)) || ((X <= 0) && (|Y| <= Eps) && (X >= A)) || ((|Y| <= Eps) && (X + R <= 0)) Рис. 2. Схема алгоритма Исходный код Результаты решения задачи При выполнении программы были получены результаты, совпадающие со значениями, приведенными в таблице 1. Ошибок не обнаружено. Вывод При выполнении лабораторной работы были получены практические навыки использования условных операторов и циклов на языке C/C++. #include #include #include int main() { setlocale(LC_ALL, "Russian"); float R, A, X, Y, Eps, k = 0; int f; do { puts ("Введите погрешность вычислений:"); scanf ("%Eps", &Eps); if (Eps <= 0) puts("Некорректный ввод! Введите Eps > 0"); } while (Eps <= 0); do { puts ("Введите радиус окружности:"); scanf ("%f", &R); if (R <= 0) puts ("Некорректный ввод! Введите R > 0"); }while (R <= 0); do { puts ("Введите значение A, задающее прямую X = A, параллельную оси Y. Помните: для нашего случая |А| должен быть меньше радиуса и само значение А должно быть меньше 0:"); scanf ("%f", &A); if (A < Eps) {if (fabs(A) - R == Eps) k++; } else k++; {if ( k != 0) puts ("Некорректный ввод! А должно быть больше 0 и |A| должен быть меньше R."); } }while (k != 0); do { puts("Введите координату Х:"); scanf("%f", &X); puts("Введите координату Y:"); scanf("%f", &Y); if (((X*X + Y*Y < R*R) && (X > A) && (X < 0) && (Y > 0)) || ((X + R < 0) && (Y > 0) && (X*X + Y*Y > R*R))) puts ("Точка с указанными координатами лежит внутри области"); else {if ((X*X + Y*Y - R*R == Eps) && (X <= Eps) && (Y >= Eps)) || ((X - A == Eps) && (Y >= Eps)) || ((Y >= Eps) && (Y - R <= Eps) && (X == Eps)) || ((X <= Eps) && (Y == Eps) && (X - A >= Eps)) || ((Y == Eps) && (X + R <= Eps)) puts ("Точка с указанными координатами лежит на границе области"); else puts ("Точка с указанными координатами лежит за границами области"); } puts ("Хотите ввести координаты точки повторно? Введите "1", если да, любую другую цифру, если нет:"); scanf("%d", &f); }while(f == 1); puts ("Хотите ввести параметр А повторно? Введите "1", если да, любую другую цифру, если нет:"); scanf("%d", &f); }while(f == 1); puts ("Хотите ввести радиус окружности повторно? Введите "1", если да, любую другую цифру, если нет:"); scanf("%d", &f); }while(f == 1); puts ("Хотите ввести все данные повторно, начиная с погрешности? Введите "1", если да, любую другую цифру, если нет:"); scanf("%d", &f); }while(f == 1); return 0; } |