Среда окружения
PROMPT=$p$g
COMSPEC=C:\WINDOWS\COMMAND.COM
PATH=C:\BC31\BIN
Proccessor_ArcHitecture=x86
Proccessor_identifier=x86 Family 15 Model 47
Proccessor_Level=15
...
В следующей программе для ее выполнения необходимо набрать заданное слово в командной строке.
Пример.
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(int argc,char **argv)
{clrscr();
char str[]="Secret";
if(strcmp(argv[1],str)!=0)// сравнение 2-х строк
{printf("Error\n"); getch(); return 1;}
printf("Programma ");
printf("%s %c.%c.\n",argv[2],argv[3][0],argv[4][0]);
int x, a=5, b=7,res1;
sscanf(argv[5],"%d",&x); // преобразование строки в целое число
res1=(a+b)*x; //(5+7)*100
printf("res1=%d\n",res1);
getch();
return 0;}
Пусть исполняемый файл этой программы prog2.exe расположен в корневом каталоге диска C:\. Для правильной работы этой программы в командной строке надо набрать вторым словом Secret. Если в командной строке набрать:
c:\>prog1.exe Secret Petrov Ivan Ivanovich 100:
то на экран выведется:
res1=1200
Если второе слово в командной строке будет другим, то на экран выведется Error, и программа завершится.
2.7 Рекурсивные и подставляемые функции
Рекурсивная функция – эта такая функция, которая содержит в себе вызов этой же функции, т.е. самовызывающая функция.
|
|
Рекурсивные функции желательно не использовать, если есть очевидное итерационное решение.
Пример. Вычисление факториала неотрицательного целого числа
long fact(int k) // Определение функции
{if(k<0) return 0;
if (k==0} return 1;
return k* fact(k-1);}
void main()
{int n=5; long F_n=fact(n);
printf (“%d!=%ld”,n,F_n);}
На экран выведется: 5!=120
Функция прерывается при k == 0, последнее выражение(1*fact (1-1)),вычисляет k*(k-1)*(k-2)*(k-3)*(k-4)*1.
Подставляемая функция (inline- функция) – это функция, тело которой подставляется при каждом ее вызове. Такая функция определяется с помощью слова inline.
Inline- функция обрабатывается компилятором как встраиваемая, т.е. вместо каждого вызова этой функции компилятор попытается подставить тело функции. При многократных вызовах код программы может значительно увеличиться, но скорость работы программы повысится за счет отсутствия вызовов этой функции.
Пример.
inline float mod(float x,float y)// Определение функции
{return sgrt(x*x+y*y);}
void main()
{float f1=4.5, f2=-2.5, f3=-1.5,res1,res2;
res1=mod(f1,f2); // 5.1478
//res1=sgrt(f1*f1+f2*f2);
res2=mod(f1,f3); } // 4.743
//res2=sgrt(f1*f1+f3*f3); }
В ВС31 для inline -функции принято: 1) функция не должна быть рекурсивной; 2) функция не должна содержать операторов for, while, do, switch, goto. В этих случаях компилятор выдает предупреждение, и функция будет трактоваться как обычная.
Пример. Функция вводит символы, пока не введется ’q’. Функция рекурсивная, поэтому не может быть реализована как inline -функция.
inline void str() // Функции будет определена как обычная
{char b; if(cin>>b&&b!='q') str();}
2.8 Функции, возвращающие указатель
Если функция возвращает указатель, то в прототипе и в определении функции в качестве возвращаемого типа записывается тип возвращаемого указателя.
|
|
Пример. Функция возвращает адрес элемента массива, значение которого равно нулю. В программе это значение заменяется на 1.
#include <stdio.h>
int *func(int,int []); // прототип функции
void main()
{const N=5;
int *b,arr[N]={3,0,7,0,9}, n=0;
if((b=func(N,arr))!=NULL) // вызов функции
{n++; *b=1;
printf("*b=%d b=%p\n",*b,b);}
printf("выполнено замен %d \n",n);}
int *func(int n,int a[]) // Определение функции
{for (int i=0;i<n;i++)
if(a[i]==0) return &a[i];
return NULL;}
На экран выведется:
*b=1 b=8ff2:0FF2
*b=1 b=8ff2:0FF8
выполнено замен =2
2.9 Функции и структуры
В функции можно передавать и из функций можно возвращать структуры и объединения. В этом случае в качестве возвращаемых типов и в сигнатуре функции записываются структурные типы или типы объединений. При передаче структуры в функцию, в функции создается копия этой структуры, и действия, производимые со структурой внутри функции, не влияют на структуру в вызывающей функции. Если в функцию передается указатель на структуру, то функция будет обрабатывать непосредственно элементы той структуры, на которую в функцию передан указатель.
Пример. В функцию передается структура и указатель на структуру
#include <string.h>
#include <stdio.h>
struct STUD{char name[20];int age;};