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

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

10.2. Классы памяти.  Рекурсивные функции

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

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

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

НЕ нашли? Не то? Что вы ищете?

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

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

               void z1(int  *x, int  *y)

               { int t;

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

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

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

#include<stdio. h>

#include<conio. h>

#include<iostream. h>

double factor(double num)

{

if (num= =1) return 1.;

return num*factor(num-1.);

       }

       void main()

  { int arr[100];  //Максимум 100 чисел

       int size, i;

       cout<<”Введите количество чисел: ”<<endl;;

       cin>>size;

       cout<<“ Введите числа:”<<endl;

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

cin>>arr[i];

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

cout<<”Факториал ”<<arr[i]<<”=”<<factor(arr[i]);

getch();

  }

/*  Введите количество чисел: 3

       Введите числа: 5 13 17

       Факториал 5 = 120

       Факториал 13 = 6227020800

       Факториал 17 = 355687428096000  */

Практическое занятие № 11

Тема. Командная строка. Параметры функции main()

Цель: Рассмотреть возможность передачи аргументов головному модулю запущенной на выполнение программы – функции main(), посредством командной строки.

       Краткие теоретические сведения по теме

Аргументы командной строки  - это текст, записанный после имени запускаемого на выполнение  .com или. ехе  файла, либо передаваемый программе с помощью опции интегрируемой среды Borland C++ - arguments.

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

       Borland C++ поддерживает три  параметра функции main(). Для их обозначения рекомендуется использовать общепринятые имена argc, argv, envp (но не запрещается использовать любые другие имена). Вход в функцию main при использовании командной строки имеет вид:

       int main (int argc, char *argv[], char *envp[])

{  Тело функции}

Либо:

int main (int argc, char **argv, char **envp)

{  Тело функции}

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

       Второй параметр (char **argv, char *argv[])является указателем на массив их указателей на слова (т. е. сами параметры) из командной строки. Каждый параметр хранится в виде ASCIZ – строки. Под словом понимается любой текст, не содержащий символов пробела или табуляции. Запятые, точки и прочие символы не рассматриваются как разделители. Последним элементом массива указателей является нулевой указатель (NULL).

       Например, пусть программа L13_5.exe запускается сл. образом:

C:\BorlandC\bin\L13_5.exe  ddd  123  bcde  a+b

и заголовок функции main имеет вид:

       void main(int argc, char *argv[])

       {...}

тогда argc = 5 и создается массив из  пяти указателей, каждый из которых указывает на отдельное слово (аргумент).

       Третий  параметр функции main (char **envp) случит для передачи в программу информации о системном окружении операционной системы, т. е. о среде, в которой выполняется программа. Он является указателем на массив указателей, каждый указатель определяет адрес, по которому записана строка информации о среде, определяемая операционной системой. При знаком конца массива (как и в char *argv[]) является нулевой указатель. Среда, в которой выполняется программа, определяет некоторые особенности поведения оболочки и ядра операционной системы.

  11.1. примеры программ с использованием параметров командной строки

Ниже приведены программы, демонстрирующие разные способы вывода на экран аргументов командной строки.

//пример: вывести параметры командной строки посимвольно.

#include<iostream. h>

#include<conio. h>

#include <stdio. h>

void main(int argc, char *argv[])

{ int i, j;

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

       { j=0;

               while(argv[i][j]) cout<<argv[i][j++]<<” “;

}

getch();

}

/* пример: если в командной строке параметры отсутствуют, то вывести на экран текст: «Командная строка: пустая», иначе вывести на экран текст:  «Командная строка:» и далее ее содержимое. */

#include<iostream. h>

#include<conio. h>

#include <stdio. h>

char ss[]=”Командная строка: ”; /*глобальная переменная, она видима в main, но адрес ее будем получать из GetStrn*/ 

char *GetStrn(void){return ss;} //функция

void main(int argc, char *argv[])

{ char *s;

  if (argc > 1)  s=argv[1];

        else s=”пустая.”;

       cout<<GetStrn()<<s; // cout<<ss<<s;

getch();

}

//пример: вывести содержимое командной строки на экран строками.

#include<stdio. h>

void main(int argc, char **argv) 

{

  int i;

  cout<<”Имя программы:” <<*argv<<endl;

  for(i=1;i<argc;i++)

       cout<<”  “<<argv[i];

getch()

11.2 Структуры


       Язык программирования Borland C++ поддерживает определяемые пользователем структуры – структурированный тип данных. Он является собранием одного или более объектов (переменных, массивов, указателей, других структур и т. д.), которые для удобства работы с ними сгруппированы под одним именем.

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

11.2. Объявления шаблонов структур

Общий синтаксис объявления шаблона структуры:

         struct имя_ шаблона

{

  тип1  имя_переменной1;

  тип2  имя_переменной2;

// другие члены данных;

}

Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется описанием:

  struct имя_структуры {

  описание элементов;

  };

         Для выделения памяти под структуру надо определить структурную переменную:

  struct имя_структуры имя_переменной;

При определении структур можно задавать начальные значения  элементам структур. Для ввода значений элементов структур можно  использовать оператор cin>> потокового ввода или оператор ввода  scanf.

  Над структурами допускаются следующие операции:

  1) Взятие адреса структуры. Адрес структуры может быть получен  путем применения операции указатель (&) к структурной переменной.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26