Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
231112.docx
Скачиваний:
16
Добавлен:
01.03.2025
Размер:
2 Мб
Скачать
☆

Int main()

{

using namespace std;

double total, choices;

// Ввод общего количества номеров и количества номеров, которые нужно угадать

cout << "Enter the total number of choices on the game card and\n"

"the number of picks allowed:\n";

while ((cin >> total >> choices) && choices <= total)

{

cout << "You have one chance in ";

cout << probability(total, choices); // вычисление и вывод шансов

cout << " of winning.\n";

cout<< "Next two numbers (q to quit) : ";

// Ввод следующих двух чисел (q для завершения)

cout << "bye\n";

}

return 0;

}

// Следующая функция вычисляет вероятность правильного

// угадывания picks чисел из numbers возможных

long double probability (unsigned numbers, unsigned picks)

{

long double result = 1.0; // несколько локальных переменных

long double n; unsigned p;

for (n = numbers, p = picks; p > 0; n--, p--)

result = result * n / p ;

return result;

}

Обратите внимание, что увеличение количества вариантов в игровой карточке существенно снижает шансы на выигрыш.

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

Первый — это формальные параметры (numbers и picks), объявленные в заголовке функции внутри круглых скобок.

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

Функции и массивы

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

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

Давайте посмотрим, как должен выглядеть интерфейс функции. Поскольку функция вычисляет сумму, она должна возвращать ответ. Если вы поглощаете печенье целиком, то можно использовать функцию с типом возврата int. Чтобы функция знала, какой массив суммировать, ей понадобится передавать в качестве аргумента имя массива. И чтобы не ограничивать ее массивами определенного размера, нужно будет также передавать ей размер массива. Единственный новый ингредиент здесь — это имя массива в качестве одного из формальных аргументов. Давайте посмотрим, что получилось:

int sum_arr(int arr[], int n)

// arr = имя массива, n = размер

Выглядит вполне правдоподобно. Квадратные скобки указывают на то, что arr — массив, а тот факт, что они пусты, говорит о том, что эту функцию можно применять с массивами любого размера. Но бывает, что некоторые вещи не являются тем, чем кажутся: arr — на самом деле не массив, а указатель! Однако хорошей новостью будет то, что остальную часть функции можно записать так, как если бы аргумент arr все- таки был массивом. Для начала убедимся на примере, что такой подход работает, а потом разберемся, почему.

В листинге 7.5 иллюстрируется применение указателя, как если бы он был именем массива. Программа инициализирует массив некоторыми значениями и затем использует функцию sum_arr () для вычисления суммы. Обратите внимание, что sum_arr () работает с arr, как если бы он был именем массива.

// arrfuni.срр -- функция с аргументом-массивом

#include <iostream>

const int ArSize = 8;

int sum_arr(int arr[], int n); // прототип

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]