Формальные переменные – это параметры в заголовке функции пользователя. Формальные параметры используются в теле функции так же, как локальные переменные. Область действия формальных параметров – блок, являющийся телом функции.
Глобальные переменные объявляются вне какой-либо функции. Глобальные переменные могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены и проинициализированы. Область действия глобальных переменных - вся программа с момента их объявления.
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 |


