Программирование >>  Структурное программирование 

1 ... 85 86 87 [ 88 ] 89 90 91 ... 342


Ваша программа должна печатать четкие инструкции, что нужно делать для перемеш;ения дисков с начального колышка на конечный. Например, чтобы передвинуть группу из трех дисков с колышка 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 равным нулю, и если стало, напечатайте сообщение Извините. Вы обанкротились! Пока игра продолжается, печатайте различные сообщения, чтобы создать некоторый разговорный фон типа: О! Вы собираетесь разориться, ха! , или Испытайте судьбу! , или Вам везет! Теперь самое время обменять фишки на деньги! .



1 ... 85 86 87 [ 88 ] 89 90 91 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика