|
Программирование >> Структурное программирование
Ваша программа должна печатать четкие инструкции, что нужно делать для перемеш;ения дисков с начального колышка на конечный. Например, чтобы передвинуть группу из трех дисков с колышка 1 на колышек 3, ваша программа должна напечатать следующую последовательность перемещений: 1 -> 3 (Это означает перемещение одного диска с колышка 1 на колышек 3) 1 2 3 -> 2 1-3 2 -> 1 2-3 1 3 3.43. Любая программа, которая может быть разработана как рекурсивная, может быть разработана и как итеративная, хотя иногда с большими трудностями и меньшей ясностью. Попытайтесь написать итеративную версию задачи о Ханойских башнях. Если вам это удастся, сравните вашу итеративную версию с рекурсивной, разработанной в упражнении 3.42. Исследуйте вопросы производительности, ясности и возможности обосновать корректность программ. 3.44. (Визуализация рекурсии) Интересно наблюдать рекурсию в действии . Модифицируйте функцию факториал на рис. 3.14 так, чтобы печатать ее локальную переменную и параметр рекурсивного вызова. Для каждого рекурсивного вызова отобразите выходные данные в отдельной строке и добавьте отступ. Сделайте все возможное для того, чтобы выходные данные были ясными, интересными и значимыми. Ваша цель - разработать и реализовать такой формат выходных данных, который поможет лучше понять рекурсию. Вы можете добавлять такие изобразительные возможности во многие другие примеры и упражнения по рекурсии в этой книге. 3.45. Наибольший общий делитель (ПОД) двух целых чисел х и у - это наибольшее целое, на которое без остатка делится каждое из двух чисел. Напишите рекурсивную функцию nod, которая возвращает наибольший общий делитель чисел х и у. ПОД для х и у определяется рекурсивно следующим образом: если у равно О, то nod(x, у) возвращает х; в противном случае nod(x, у) равняется nod(y, х % у), где % - это операция вычисления остатка. 3.46. Можно ли рекурсивно вызывать функцию main? Напишите программу, содержащую функцию main. Включите в нее локальную переменную count типа static, дав ей начальное значение 1. Давайте ей приращение и печатайте значение count при каждом вызове main. Запустите вашу программу. Что произойдет? 3.47. Упражнения с 3.35 по 3.37 посвящены разработке компьютерных программ для обучения слушателей начальных школ умножению. В данном упражнении попытайтесь их усовершенствовать. а) Модифицируйте программу так, чтобы позволить пользователю ввести уровень своих возможностей. Первый уровень означает, что в задачах используются только одноразрядные числа, второй уровень означает использование двухразрядных чисел и т. д. Ь) Модифицируйте программу так, чтобы позволить пользователю выбрать тип арифметических операций для изучения. Опция 1 пусть означает только операцию сложения, 2 - операцию вычитания, 3 - операцию умножения, 4 - операцию деления, 5 - случайную смесь операций этих типов. 3.48. Напишите функцию distance, которая вычисляет расстояние между двумя точками (х1, у1) и (х2, у2). Все числа и возвращаемые значения должны быть типа float. 3.49. Что делает следующая программа? tinclude <iostream.h> main() int с; if ( ( с = cin.getO ) != EOF) { main () ; cout c; return 0; 3.50. Что делает следующая программа? #include <iostream.h> int mystery(int, int); main () int X, y; cout Введите два целых числа: ; cin х >> у; cout Результат равен mystery(х, у) endl; return 0; Параметр b должен быть положительным целым чтобы предотвратить беконечную рекурсию int mystery(int а, int b) if (b == 1) return a; else return a + mystery(a, b - 1); 3.51. После того, как вы определили, что делает программа в упражнении 3.50, преобразуйте программу в соответствующую функцию, удалив ограничение, требующее, чтобы второй аргумент быть неотрицательным. 3.52. Напишите программу, которая проверяет как можно больше математических функций библиотеки на рис. 3.2. Поупражняйтесь с каждой из этих функций, выводя в вашей программе на печать таблицы возвращаемых значений для различных значений аргументов. 3.53. Найдите ошибку в каждом из приведенных ниже фрагментов программ и объясните, как ее исправить: a) float cube(float); /* прототип функции */ cube(float number) /* описание функции */ { return number * number * number; b) register auto int x = 7; c) int randomlumber = srand (); d) float у = 123.45678; int x; X = y; cout (float) X endl; e) double square(double number) { double number return number * number; f) int sum(int n) { if (n == 0) return 0; else return n + sum(n); 3.54. Модифицируйте программу игры в крепе на рис. 3.10 так, чтобы можно было заключать пари. Оформите в виде функции часть программы, которая моделирует одну игру в крепе. Присвойте переменной bankBalance начальное значение 1000 долларов. Предложите игроку ввести ставку в переменную wager. Используя цикл wMle, проверьте, что wager не больше, чем bankBalance, и, если больше - предложите пользователю повторно ввести wager до тех пор, пока не будет введено правильное значение ставки. После введения правильного значения wager запустите моделирование одной игры в крепе. Если игрок выиграл, увеличьте bankBalance на wager и напечатайте новое значение bankBalance. Если игрок проиграл, уменьшите bankBalance на wager, напечатайте новое значение bankBalance, проверьте, не стало ли значение bankBalance равным нулю, и если стало, напечатайте сообщение Извините. Вы обанкротились! Пока игра продолжается, печатайте различные сообщения, чтобы создать некоторый разговорный фон типа: О! Вы собираетесь разориться, ха! , или Испытайте судьбу! , или Вам везет! Теперь самое время обменять фишки на деньги! .
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |