Файл: 43. Глобальные и локальные переменные. Пример на область действия имен (операция ).docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.01.2024

Просмотров: 11

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

43.Глобальные и локальные переменные. Пример на область действия имен (операция ::).

Все идентификаторы, объявленные в блоках функций, являются
ЛОКАЛЬНЫМИ, т.е. они не видимы во внешних блоках. Кроме локальных
идентификаторов, внутри функций могут быть видны некоторые
идентификаторы, объявленные во внешних блоках. Такие идентификаторы
называют ГЛОБАЛЬНЫМИ.
Имя, локализованное в подпрограмме, может совпадать с глобальным
именем, т.к. им назначаются разные области памяти. В этом случае локальное
имя перекрывает глобальное и делает его недоступным. Область видимости
совпадает с областью действия за исключением ситуации, когда во вложенном
блоке описана переменная с таким же именем. Доступ к глобальному имени
можно получить с помощью операции ::.

Первый пример:

#include
int a;
int f1() {//...
}
int f2() {//...
}
int main() {
int b=2;
a = 1;
int a;
a = 2;
printf("\na=%d",a);// a=2
::a = 3;
printf("\na=%d",a);// a=2
printf(" a=%d",::a);// a=3
b+=a;
printf("\nb=%d",b);// b=4
}

Пример использования глобальной переменной:
#include
int a;
void f1() {
a+=1; printf("\na=%d",a); //a=2
}
void f2() {
a+=1; printf("\na=%d",a); //a=3
}
int main() {
int b=2;
a = 1;
f1();
f2();
printf("\na=%d",a);//a=3
}

44.Параметры функции. Виды параметров. Механизм возврата и пример.

Параметры бывают четырех видов:
1) параметры-значения;
2) параметры-переменные;
3) параметры константы.
Отличие между параметрами заключается в способе обмена данными
между вызывающей программой и подпрограммой.

ПАРАМЕТР-ЗНАЧЕНИЕ

Передача параметров-значений в функцию выполняется по
следующим правилам:
1) основная функция main() отводит место в памяти компьютера для
хранения значений фактических параметров: x,y,z;
2) в момент вызова функция my_fun отводит место в памяти для
хранения формальных параметров a,b,c в соответствием с их
описанием;
3) в этот же момент происходит передача фактических значений в
функцию (копирование значений фактических параметров в область
памяти, где размещаются формальные параметры);
4) после этого связь между main() и функций my_fun разрывается.
В функции можно изменять формальные параметры-значения, однако
соответствующие им фактические параметры останутся без изменений.



ПАРАМЕТР-ПЕРЕМЕННАЯ

Перед такими параметрами в списке формальных параметров записывают &.
Механизм передачи параметра-переменной можно пояснить с помощью рисунка:



В этом случае main() и функция fun4 для хранения параметра переменной использует одну и ту же ячейку памяти. Для этого функции
передается ссылка (адрес) на область памяти, где располагается
фактический параметр.
Фактический параметр для этого должен быть переменной! Все
действия над формальным параметром-переменной представляют собой,
по сути, действия над фактическим параметром.

ПАРАМЕТР-КОНСТАНТА

Перед параметром-константой записывается const.
В этом случае в подпрограмму передается ссылка (адрес) на область
памяти, где располагается фактический параметр. Однако, компилятор
блокирует любые присваивания параметру-константе нового значения в
теле подпрограммы.

Пример:

#include
void my_fun(int a, const int b, int &c) {
a++;
//b++;
c=c+1;
printf("\n a=%d b=%d c=%d",a,b,c);// a=2 b=1 c=2
}

int main() {
int x=1,y=1,z=1;
my_fun(x,y,z);
printf("\nx=%d y=%d z=%d",x,y,z);// x=1 y=1 z=2
}

Первый параметр-значение, второй параметр-константа, третий
параметр-переменная.

МЕХАНИЗМ ПЕРЕДАЧИ ПАРАМЕТРОВ И ВОЗВРАТА ЗНАЧЕНИЯ

45. Параметры со значениями по умолчанию. Функции с переменным числом параметров. Примеры.

ПАРАМЕТРЫ СО ЗНАЧЕНИЯМИ ПО УМОЛЧАНИЮ

Чтобы упростить вызов функции, в ее заголовке можно указать
значения параметров по умолчанию. Эти параметры должны быть
последними в списке и могут опускаться при вызове функции. Если при
вызове параметр опущен, должны быть опущены и все параметры,
стоящие за ним. В качестве значений параметров по умолчанию могут
использоваться константы, глобальные переменные и выражения:

#include
int f1(int a, int b = 0);
void f2(int, int = 100, char = 'S');
int main() {
int a=5;
f1(100); f1(a, 1); // варианты вызова функции f1
f2(a); f2(a, 10); f2(a, 10, 'x'); // варианты вызова f2
// f2(a,'x'); // неверно!
}

ФУНКЦИИ С ПЕРЕМЕННЫМ ЧИСЛОМ ПАРАМЕТРОВ

Если список формальных параметров функции заканчивается
многоточием, это означает, что при ее вызове на этом месте можно
указать еще несколько параметров.
Проверка соответствия типов для этих параметров не выполняется,
char и short передаются как int, а float – как double.
В качестве примера можно привести функцию printf, прототип
которой имеет вид:
int printf (const char*, ...);
Это означает, что вызов функции должен содержать по крайней мере
один параметр типа char* и может либо содержать, либо не содержать
другие параметры:

printf("Введите исходные данные"); // один параметр
printf("Сумма: %5.2f рублей", sum); // два параметра
printf("%d %d %d %d", a, b, с, d); // пять параметров

46. Параметры функции. Аргументы в командной строке. Пример.

В момент вызова main получает два аргумента.
В первом, обычно называемом argc, содержится количество
аргументов, задаваемых в командной строке.
Второй argv является указателем на массив литерных указателей.
аrgv[0] – имя программы; argc >=1
Команда: format a: /t:40/n:9

#include 
/* печать аргументов командной строки: */
main(int argc, char *argv[]) {
int i;
printf("argc=%d \n", argc);
printf("argv: \n");
for (i = 1; i < argc; i++)
printf("%s%s", argv[i], (i < argc-1) ? " " : "");
printf("\n");
return 0;
}



Аргумент argv – указатель на начало массива строк аргументов.
Поэтому инструкцию printf можно было бы написать и так:
printf((argc > 1) ? "%s_" : "%s", *++argv);
Как видим, формат в printf тоже может быть выражением.

47. Одномерные статические массивы. Объявление, инициализация, печать.

Одномерный массив – это набор объектов одинакового типа, расположенных
в последовательной группе ячеек памяти, доступ к которым осуществляется по
индексу.
тип имя_массива[размер_массива];
Описание массива в программе отличается от описания простой
переменной наличием после имени квадратных скобок, в которых задается
количество элементов массива:
float а[10]; // описание массива из 10 вещественных чисел


Элементы массива нумеруются с нуля. При описании массива
используются те же модификаторы, что и для простых переменных.
Память, необходимая для размещения статического массива,
выделяется на этапе компиляции, поэтому размерность может быть
задана только целой положительной константой или константным
выражением.
Инициализирующие значения для массивов записываются в фигурных
скобках.
int mas[5]={10, -20, 30, 40, 50};



Значения элементам присваиваются по порядку. Если элементов в
массиве больше, чем инициализаторов, элементы, для которых значения
не указаны, обнуляются:
int b[5] = {33, 22, 11};



Если при описании массива не указана размерность, должен
присутствовать инициализатор, в этом случае компилятор выделит память
по количеству инициализирующих значений.
int x[]={10, -11, 12, -13};



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

int b[5] = {33,22,11};

//b[10]=33;

Пример инициализации и печати массива:

#include 
const int N=10;
int x[N]= {32, 27, 64, 18, 95, 14, 90, 70, 60, 37};
int a[N]= {0, 1, 2, 3};
int z[N]= {0}, y[N];
int main() {
int i;
printf("%d", x[0]); //обращение к первому элементу
x[0]=-10;
printf("\n massiv:\n");//обращение к элементу массива
for (i = 0; i < N; ++i)
printf("%d ", x[i]);
printf("\n y-> \n");
for (i=0; i
scanf("%d",&y[i]);
printf("\n massiv: ");
for (i=0; i
printf("%5d",y[i]);
}



48. Одномерные статические массивы. Поиск минимального элемента.

int search_min (int x[N]){
int min=x[0]; //значение минимального элемента
for(int i=1;i
if (x[i]
min=x[i];
return min; //
}
int search_imin (int x[N]) {
int imin=0; // индекс минимума
for(int i=0; i
if (x[i]
imin=i;
return imin;
}
int main() {
int mas[N]= {1,22,3,4,-5,6,7,28,9,10};
int t=search_min(mas); printf("min=%d\n",t);
t=search_imin(mas);
printf("imin=%d min=%d",t, mas[t]);
}