Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по ОИиП под ред Бусько.DOC
Скачиваний:
18
Добавлен:
11.05.2015
Размер:
732.67 Кб
Скачать

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

Область действия переменной – это правила, которые устанавливают, какие данные доступны из текущего места программы. Имеются три типа переменных: глобальные, локальные и формальные. Область действия локальных переменных – это те блоки, где локальные переменные объявлены. При выходе из блока локальная переменная и ее значение теряются.

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

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

В языке С каждая переменная принадлежит к одному из четырех классов памяти – автоматическая (auto), внешняя (extern), статическая (static), регистровая (register). Тип памяти указывается ключевым словом (auto, extern, static, register), стоящим перед спецификацией типа переменной. Например, register int a;

По умолчанию (если класс памяти для переменной не указан) переменная относится к классу auto и будет размещена в стеке.

В языке С аргументы при стандартном вызове функции передаются по значению, т.е. в стеке выделяется место для формальных параметров функции и в это выделенное место при ее вызове заносятся значения фактических аргументов. Затем функция использует и может изменять эти значения в стеке. Но при выходе из функции измененные значения теряются. Вызванная функция не может изменить значения переменных, указанных как фактические аргументы при обращении к данной функции. В случае необходимости функцию можно использовать для изменения передаваемых ей аргументов. В этом случае в качестве аргумента необходимо в вызываемую функцию передавать не значение переменной, а ее адрес. А для обращения к значению аргумента-оригинала использовать операцию «*».

Примерфункции, в которой меняются местами значения аргументов x и y:

void z1(int * x, int * y)

{ int t=*x;

*x=*y;

*y=t;

}

Участок программы с обращением к данной функции :

int a=2, b=3;

void z1(int*, int*);

printf(“\n a=%d, b=%d”, a, b);

z1(&a, &b);

printf(“\n a=%d, b=%d”, a, b);

При таком способе передачи в вызываемую функцию аргументов их значения теперь будут изменены, т.е. на экран монитора будет выведено:

a=2, b=3

a=3, b=2

В языке С функции могут вызывать сами себя. В этом случае функция называется рекурсивной.

Примеррекурсивной функции – вычисление факториала числа n!=1*2*3*…*n:

fac(int n)

{

int b;

if (n= =1) return 1;

b=fac (n-1)*n;

return n;

}

Вызов функции в рекурсивной функции не создает новую копию функции, а создает новые копии локальных переменных и параметров. Из рекурсивной функции надо предусмотреть выход, иначе через некоторое время работы с такой рекурсивной функцией система «зависает».

На функцию, как и на другой объект, можно создать указатель. Например, указатель р на функцию, возвращающую значение типа type и имеющую параметры типа type t, type z, объявляется следующим образом:

type (*p)(type1 t1, type2 t2);

В заключение рассмотрим передачу в функции одномерных и двумерных массивов:

  1. Передача одномерного массива:

void main (void)

{

int vec [2Q];

fun(vec);

}

void fun(vec_pav)

int vec_pav [ ];

{

}

  1. Передача двумерного массива:

void main(void)

{

static int mos [2][3]={{1,2,3}, {4,5,6}};

fun (mos);

}

vooid fun(mos_per)

{

int_mos_per [ ][3];

…..

}

Пример работы с функциями

Следующая программа запрашивает элементы целочисленного массива размером 3Х3 и передает сформированный массив в пользовательскую функцию, которая подсчитывает сумму его положительных значений.

#include <stdio.h>

#include <conio.h>

void summa(int a1[ ][3]);

void main(void)

{

int a[3][3];

int i,j;

clrscr();

printf("\n Введите девять целых чисел \n");

for(i=0; i<3; i++)

for(j=0; j<3; j++)

{

printf("\n a[%d][%d]=", i, j);

scanf("%d", &a[i][j]);

}

summa(a);

}

void summa(int a1[ ][3])

{

int i,j,s;

puts(" ФУНКЦИЯ summa ");

puts("----------------------------------");

/* ВЫЧИСЛЕНИЕ СУММЫ ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ МАССИВА */

s=0;

for (i=0; i<3; i++)

{

printf("\n");

for (j=0;j<3;j++)

{

if (a1[i][j]>0)

{

s=s+a1[i][j];

}

}

}

printf("\a СУММА ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ\

МАТРИЦЫ =%d, Press any key... ",s);

getch();

}

Варианты индивидуальных заданий

1. Даны три натуральных числа. Определить их наибольший делитель (определение HOD – см. N 10).

2. Даны отрезки a,b,c,d. Для каждой тройки этих отрезков, из которых можно построить треугольник, вычислить площади треугольников. Площадь треугольника , где.

3. Дано натуральное число N. Определить, если это возможно, пару x,y таких натуральных чисел, что .

4. Дано натуральное число N. Определить все пары x,y натуральных чисел, таких, что ,.

5. Даны действительные числа x,y (x>0, y>1). Получить целое число K (положительное, отрицательное или равное нулю), удовлетворяющее условию <.

6. Дано натуральное число N (N > 99). Определить число сотен в нем.

7. Дано натуральное число N (N 99).Выяснить, верно ли, что N2 равно кубу суммы цифр числа N.

8. Дано натуральное число N (N > 10000). Определить сумму цифр первых K разрядов числа N (K 4).

9. Даны натуральные числа n,m. Получить произведение m последних цифр числа n.

10. Даны натуральные числа n,m. Найти наибольший общий делитель n и m (наименьшее общее кратное n и m), используя алгоритм Евклида.

Пусть n и m – одновременно не равные нулю целые неотрицательные числа и пусть m n. Тогда, если n = 0, то NOD (n,m) = m, и если n ≠ 0, то для чисел m, n, r, где r остаток от деления m на n, выполняется равенство NOD (m,n) = NOD (n,r). Например, NOD (15,6) = =NOD (6,3) = NOD (3,0) = 3.

11. Даны натуральные числа a,b,c,d. Вычислить f(a)·f(b)+f(c)f(d), где

12. Дано натуральное число N. Удалить из записи числа N цифры 0 и 5, оставив прежним порядок остальных цифр. Например, из числа 59015509 должно получиться число 919.

13. Дано натуральное число N. Получить все такие натуральные K, что N делится на K2 и не делится на K3.

14. Даны натуральные целые числа n и m, вычислить A(n,m), где

15. Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу (как, например, 153=13+53+33 ). Получить все числа Армстронга, состоящие из двух, трех и четырех цифр.

16. Имеется n населенных пунктов, перенумерованных от 1 до n (n=10). Некоторые пары пунктов соединены дорогами. Определить, можно ли попасть по этим дорогам из первого пункта в n-й пункт. Информация о дорогах задается в виде последовательности пар чисел i и j ( i<j ) указывающих, что i-й и ј-й населенный пункт пункты соединены дорогой. Признак окончания этой последовательности – пара нулей.

17. Напечатать все цифры числа 2500 и числа 1!+2!+…+100!

18. Даны координаты вершин двух треугольников. Определить, какой из них имеет большую площадь.

19. Три прямые на плоскости заданы уравнением akx+bky=ck (k=1,2,3). Если эти прямые попарно пересекаются и образуют треугольник, тогда найти его площадь.

20. Два простых числа называются «близнецами», если они отличаются друг от друга на 2 (например, числа 41 и 43). Напечатать все пары «близнецов» на отрезке [n,2n], где n – заданное целое число, больше 2.

21. Ввести целое натуральное число N. Сформировать треугольник Паскаля по алгоритму:

C00

C10 C11

C20 C21 C22

C30 C31 C32 C33

C40 C41 C42 C43 C44

………………………..

Здесь , где n!=1·2·3·….·n – факториал числа n.

22. «Ханойская башня». Имеются три колышка A,B и C и n дисков разного размера, перенумерованных от 1 до n в порядке возрастания их размеров. Сначала все диски надеты на колышек A так, как показано на рис.1,а. Требуется перенести все диски с колышка A на колышек С (рис.1,в), соблюдая при этом следующие условия:диски можно переносить только по одному, больший диск нельзя ставить на меньший.

23. Написать программу, которая печатает последовательность действий (в виде «перенести диск с q на r», где q и r – это А,В или С), решающую указанную задачу для n дисков, где n- заданное натуральное число. (При правильном переносе n дисков с А на С обязательно встретится конфигурация, показанная на рис.1,б).

А В С А В С А В С

а) б) с)

Рис. 1

24. «Задача о 8 ферзях».На шахматной доске расставить 8 ферзей так, чтобы они не «били» друг друга (всего существует 92 расстановки).

25.«Метод фон Неймана». Дано n вещественных чисел. Упорядочить их по неубыванию:образовать два массива А и В и записать исходные числа в А; упорядочить пары соседних чисел (А1 и А2, А3и А4и т.д.) и записать их в В; взять из В по две соседние упорядоченные пары и, слив их в упорядоченные четверки, снова записать в А; затем каждые две соседние четверки из В слить в упорядоченные восьмерки и перенести в А и т.д.

26. Даны два массива чисел X и Y размером 100 элементов. Составить программу, меняющую последовательно местами значения элементов xkи yk, не используя промежуточных величин.

27. Дана последовательность из N целых чисел, среди которых нет двух одинаковых. Требуется вычеркнуть минимально возможное количество чисел, так чтобы оставшиеся числа шли в порядке возрастания.

28. Имеется 9 карточек, на которых написаны цифры 1,2,3,4,5,6,7,8,9 (по одной цифре на каждой карточке). Из этих карточек составляются два числа. Первое число – это числитель дроби, а второе число – это знаменатель дроби. Каждая карточка должна быть обязательно использована. Знаменатель дроби состоит из пяти цифр. Например, числитель – 6729, знаменатель – 13458 (все карточки использованы). Дробь 6729/13458 в точности равна ½.

29. Ввести два натуральных числа N и M. Найти такую комбинацию карточек (если она существует), которая образовала бы дробь, равную в точности N/M. Если комбинация не единственная, то вывести их все.