Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Область действия переменных

Читайте также:
  1. II Частные производные функции нескольких переменных
  2. III Полный дифференциал функции нескольких переменных. Дифференциалы высших порядков
  3. IV ДЕЙСТВИЯ ЛОКОМОТИВНОЙ БРИГАДЫ И ОСОБЕННОСТИ УПРАВЛЕНИЯ ТОРМОЗАМИ ПОЕЗДА ПРИ ПЕРЕХОДЕ НА РЕЗЕРВНОЕ УПРАВЛЕНИЕ ЭЛЕКТРОННЫМ КРАНОМ МАШИНИСТА
  4. IV. Преемственность ресурсов взаимодействия
  5. Part 12 . Область моих научных интересов
  6. VII. СРОК ДЕЙСТВИЯ МУНИЦИПАЛЬНОГО КОНТРАКТА
  7. Анализ взаимодействия бизнеса и некоммерческих организаций

Каждая переменная до использования должна быть описана.

Локальные переменные. Переменные, объявленные в теле функции, являются локальными переменными этой функции. Формальные параметры подпрограммы, также считаются локальными для этой подпрограммы. Областью действия локальной переменной является блок, в котором эта переменная объявлена.

Глобальные переменные. Глобальные переменные объявляются до всех функций или между определениями функций. Областью действия глобальной переменной является вся программа.

Глобальные переменные доступны из любой функции программы, где не объявлены локальные переменные с такими же именами. Однако не рекомендуется использовать их для обмена данными между функциями, т.к. это затрудняет отладку программы. Могут возникнуть трудно обнаруживаемые ошибки из-за того, что любая функция может изменить любую глобальную переменную. Рекомендуется, чтобы прототип функции полностью определял ее сопряжение с другими функциями.

Задача 19. Составить программу вычисления c = n! / (m! * (n-m)!)

В вычисляемом выражении требуется трижды вычислять факториал вида k!, где k! = 1*2*...*k при целом k > 0, 0! = 1.

Вычисление факториала удобно оформить как подпрограмму.

Решение А. Использование подпрограммы, не возвращающей значение.

Пусть вызов подпрограммы p_fakt (k, f) обозначает действие - операцию присваивания f = k!;. Здесь k - исходные данные, а f - результат. Таким образом, подпрограмма p_fakt() имеет входной параметр k и выходной параметр f.

Обозначим факториалы: n!, m! и (n-m)! через f1, f2 и f3, соответственно. Получим программу 19a.

Подпрограмма вычисления факториала p_fakt содержит повторение умножений, т. е. имеет циклическую структуру. Текущим множителем служит вспомогательная переменная j, изменяющаяся с шагом +1.

/* Программа 19а. Вычисление c=n!/(m!*(n-m)!) */

/* с помощью подпрограммы, не обладающей значением */

# include <stdio.h>

void p_fakt (int k, int *f); /* прототип функции */

/* Вычисление c = n! / (m! * (n-m)!) */

void main(void)

{ int n, m, c; /* исходные данные и результат */

int f1, f2, f3; /* n!, m!, (n-m)! */

printf("\nВведите два исходных целых числа ");

scanf("%d %d", &n, &m);

p_fakt (n, &f1); /* f1 = n! */

p_fakt (m, &f2); /* f2 = m! */

p_fakt (n-m, &f3); /* f3 = (n-m)! */

c = f1 / (f2 * f3);

printf ("\n c = %d", c);

}

/* Подпрограмма: f = k!; */

void p_fakt (int k, int *f)

{ int j; /* текущий множитель */

*f=1;

for (j=2; j<=k; j++)

*f = *f * j;

return; /* здесь не обязателен */

}

/* Программа 19б. Вычисление c=n!/(m!*(n-m)!) */

/* с помощью подпрограммы, обладающей значением */

#include <stdio.h>

int fakt (int k); /* прототип функции */

 

/* Вычисление c = n! / (m! * (n-m)!) */

void main(void)

{ int n, m, c; /* исходные данные и результат */

printf("\nВведите два исходных целых числа ");

scanf("%d %d", &n, &m);

c = fakt(n) / (fakt (m) * fakt (n-m));

printf ("\n c = %d", c);

}

/* Функция k! */

int fakt (int k)

{ int f; /* k! */

int j; /* текущий множитель */

f=1;

for (j=2; j<=k; j++)

f = f * j;

return f; /* значение функции */

}

Пояснения к программе.

1. В программах 19а, 19б вызовы подпрограмм расположены в тексте программы раньше, чем определения этих подпрограмм. Поэтому в начале программы объявлены функции, т.е. записаны их прототипы.

2. В программе 19б результат работы подпрограммы fakt передается как значение функции. Поэтому переменная f является не параметром, а вспомогательной локальной переменной и записывается без звездочки.

3. В программе 19а вызов функции p_fakt, не обладающей значением, может записываться только как самостоятельный оператор. В программе 7.1б вызов функции fakt, обладающей значением, может являться операндом в выражении.

4. В программе 19а при выводе результата можно заменить строки:

c = f1 / (f2 * f3);

printf ("\n c = %d", c);

строкой:

printf ("\n c = %d", f1/(f2*f3));

Тогда переменная c и ее определение становятся ненужными. В программе 19б также можно обойтись без переменной с.


Контрольные вопросы и упражнения.

1. Что указывается в заголовке функции? Чем отличается определение функции от объявления функции?

2. Что такое прототип функции и когда он необходим в программе?

3. Объясните различие между передачей параметров по значению и передачей параметров по ссылке.

4. В чем особенность передачи параметра, являющегося массивом?

5. В чем отличие между локальными и глобальными переменными?

6. Какие переменные доступны в функциях main(), f1(), f2()?

int z;

f1 (float t)

{ int x, y;

}

char s[80];

int f2 (int n, char m[])

{int k=0, p=1, z;

}

void main ()

{ float b;

int k, nom;

gets (s);

f1 (b);

k= f2 (nom, s);

}

7. Напишите определение функции, обменивающей местами значения переменных x, y.

8. Напишите подпрограмму для решения следующей задачи. Определить, является ли заданная последовательность чисел знакочередующейся. Приведите пример ее вызова.

9. Напишите подпрограмму подсчета количества положительных чисел в заданной последовательности. Приведите два типа подпрограмм.


Дата добавления: 2015-07-26; просмотров: 55 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Параметры подпрограмм| Пример 20.

mybiblioteka.su - 2015-2024 год. (0.011 сек.)