Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций_2015.doc
Скачиваний:
36
Добавлен:
03.03.2016
Размер:
532.48 Кб
Скачать
    1. Аппарат формальних і фактичних аргументів Приклад 12.4

Завдання. Знайти максимальний із трьох елементів.

#include<stdio.h>

int max_int (int a, int b)

{ return (a>b) ? a : b; /*для 2-х перемінних*/

}

main()

{ int x,y,z;

int m1,m2;

scanf(“%d,%d,%d”,&x,&y,&z);

/*максимум із x,y,z*/

m1=max_int(x, y);

m2=max_int(m1, z);

printf(“\nmax(%d,%d,%d)”,x,y,z;m2);

}

Ім'я функції

Тип аргументу

Імена аргументів

main

Фактичні

x,y,m1,z

Printf

Фактичні

“”(ФОРМАТНИЙ РЯДОК)

x,y,z,m2

max_int

Формальні

Фактичні

a,b

x,y,m1,z

Scanf

Фактичні

“”(ФОРМАТНИЙ РЯДОК)

x,y,z

Аргументи поділяють на трьох типу:

-вхідні;

-вихідні; що

-обновлюються.

Аргументи, що приходять у функцію, не змінюють своїх значень і використовуються для формування інших значень називаються вхідними.

Аргументи, що одержують свої значення і повертають їх із функції називаються вихідними.

Ті аргументи, що є одночасно вхідними і вихідними називаються що обновляються.

функція

вхідні аргументи

вихідні

аргументи

max_int

a,b

------------------

scanf

форматний рядок

x,y,z

Printf

x,y,z,m2

форматний рядок

------------------

    1. Опис прототипу функції

Тому що в «СИ» усі функції незалежні друг від друга, те обов'язково у функції , що викликає , описувати прототипи що викликаються функцій.

Для опису синтаксису прототипу існує два засоби:

1.

<тип результату> <ім'я функції >( );

2. (повний)

<тип результату> <ім'я функції > <деклорація типів аргументів>( );

Приклад 12.5

Варіант 1 : int max_int(int, int);

Варіант 2 : int max_int();

Варіант 3 : int max_int( int a1, int a2)

Припускається використання будь-якого з варіантів.

13 Передача аргументов

13.1 Способы передачи аргументов

-по значению;

-по имени (по наименованию);

-по ссылке.

13.1.1 По значению.

Пример 13.1

#include<stdio.h>

int int max_int(int a, int b)

{return a>b ? a:b;}

main()

{ int max_int(int a, int b);

m1,l;

m1=max_int(5,9);

l=strlen("по значению");

В качестве фактических аргументов передаются либо изображения констант, либо выражения.

Этот способ используется для передачи входных аргументов.

Формальный

Фактический

имя скалярной переменной

Изображение константного выражения

-имя массива символов

-имя литерного указателя

13.1.2 Передача аргументов по имени

Пример 13.2

int max_int(int a, int b)

{return a>b ? a:b;}

main()

{ int max_int(int a, int b);

int a,b,m1;

int x[]={-1,10,-200,-9};

int m2,l1,l2,l3;

char s[]="пл наименованию";

char *ms[]={"Белеет","парус"};

int *px;

char *pms;

int i;

scanf("%d",&a);

/*значение а вводит пользователь*/

b=25;

m1=max_int(a,b);

/*max_int вызывается и ей передаётся значение*/

px=x;

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

{m2=max_int(*px++,x[i+1]);

printf("m2=%d",m2);

}

l1=strlen(s);

pms=ms;

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

{l2=strlen(ms[i]);

l3=strlen(*pms++);

printf("l2=%d l3=%d",l2,l3);

}

}

Этот способ используется только(!!!) для передачи входных аргументов.

Формальный

Фактический

-имя скалярной переменной;

-имя скалярной переменной;

-имя элемента массива;

-указатель на элемент массива;

-имя структуры;

-имя структуры;

-имя элемента массива структур;

-указатель на элемент массива структур;

-имя массива;

-имя массива;

Строки:

-имя массива символов;

-имя литерного указателя;

-имя массива символов;

-имя литерного указателя;

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

-имя элемента массива литерных

указателей;

13.1.3 Передача аргумента по ссылке

Пример 13.3

/*так нельзя!!!!!!!!!!*/

void obmen(int a,int b)

{ int r;

r=a;

a=b;

b=r;

}

Пример 13.4

/*нужно только так!!!!*/

…………

void obmen(int *a,int *b)

{ int r;

r=*a;

*a=b;

*b=r;

}

main()

{

int x,y;

void obmen(int *,int *);

scanf("%d %d",&x,&y);

printf("x=%d y=%d",x,y);

obmen(&x,&y);

printf("x=%d y=%d",x,y);

}

Формальный

Фактический

-имя указателя на скалярную переменную;

-адрес скалярной переменной;

-адрес элемента массива;

-имя массива;

-имя массива;

-имя указателя на структуру;

-адрес структуры;

Этот способ используется для передачи выходных и обновляемых аргументов.

!!! Количество, типы и порядок следования формальных и фактических аргументов должны совпадать.

13.2 Особенности передачи аргументов функций в языке С

Все аргументы передаются по значению: вызываемой функции-копии.

!!! Вызываемая функция не может непосредственно изменить переданные ей параметры.

Пример 13.5

/*возведение x в степень n*/

/*вариант 1*/

int power 1(int x, int n)

{

int i, p;

p=1;

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

p=p*x;

return p;

}

Пример 13.6

/*вариант 2*/

int power 2(int x, int n)

{

int p;

for(p=1; n>0; --n)

p=p*x;

return p;

}

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

а фактический по адресу.

Механизм передачи аргументом массива иной: элементы массива не копируются, так как аргументами передаётся адрес массива.

13.3 Особые случаи передачи аргументов.

13.3.1 Передача аргументом одномерного массива

формальный

тело

массив переменных, граница опущена

переменные с индексом

указатель на переменную

указатели

13.3.2Передача аргументом многомерного массива

Замечание.При передаче многомерного массива обязательна передача количества элементов по первому измерению, остальные можно опустить.

Пример.

main()

{double xyz[10][15][7];

f(double[][15][7]);

...

}

f(double a[][15][7])

{...}

Для двумерного массива обязательно объявление количества столбцов,

а строк- необязательно.

Пример.

f1(int mpr[2][9]) {...};

f2(int mpr[][9]) {...};

f3(int(*pmpr)[9]) {...};

13.3.3 ПЕРЕДАЧА АРГУМЕНТОВ СТРУКТУРЫ

В общем случае над структурами допустимы следующие операции:

-копирование ~передача аргументов

-присваивание ~возврат функции как -взятие адреса результата

-доступ к ее членам

-инициализация

Существует 3 подхода к передаче структур в функцию и возврата из нее:

-передача ее членов по отдельности

-как единого целого

-указателя на структуру

Обьекты типа:

точка” “прямоугольник”

struct point struct rect

{ int x; { struct point1;

int y; struct point2;

} }

Пример 13.9

/*Формирование точки по ее компонентам X и Y*/

struct point makepoint (int x, int y)

{ struct point temp;

temp.x=x;

temp.y=y;

return temp;

}

(0;0) 640

350

Обьекты “экран” и “середина экрана”

Пример 13.10

#define MAXX 639

#define MAXY 349

#define MINX 0

#define MINY 0

...

struct rest screen;

struct point middle;

struct point makepoint(int,int);

screen.pt1=makepoint(MINX,MINY);

screen.pt2=makepoint(MAXX,MAXY);

middle=makepoint ((screen.pt1.x+screen.pt2.x)/2

screen.pt1.y+screen.pt2.y)/2);

Пример 13 11

/*Сложение двух точек*/

struct point addp(struct point pl, struct point p2)

/*функция возвращает результатом структуру и получает аргументами структуру*/

{ pl.x+=p2.x;

pl.y+=p2.y;

return pl;

}

Пример13.13

struct point * ps;

struct point t;

struct point makepoint(int, int);

t=makpoint(15, 25);

ps=&t;

/* *ps - структура t

(*ps).x - =15

(*ps).y - =25 */

printf (“ Это t: (%d, %d)”, (*ps). x, (*ps).y);

!!! prio(.)>prio(*)

Оператор

Синтаксис

< указатель на структуру >

< имя члена структуры >

Семантика

Если p -указатель на структуру, то

p<член структуры> есть ее член.

Бинарный, левоассоциотивный оператор, имею- щий высший приоритет.

Для 13.13

printf (“Это t: (%d,%d)”,psx, psy);

Пример 13.14

struct rect2, *pr;

pr=&r;

/* Эквивалентно */

1) r.pt1.x

2) prpt1.x

3) (r.pt1).x

4) (prpt1).x

Пример 13.15

/* Передается аргументом по ссылке */

main()

{

struct point p;

struct makepoint (int, int);

void put(struct point * );

p=makepoint(10, 12);

put (&p);

}

void put (struct point *p) ;

{

printf (“х=%d, y=%d”, *px, *py);

}

Пример 13.16

/* Учет приоритета оператора*/

struct

{

int len;

char *str;

}*p;

++plen; /* len++, а не p++*/

++(plen);

(++p)len; /* 1) ++p; 2) len* */

(p++)len; /* 1) len; 2) p++*/

p++len;

*pstr; /* то, на что ссылается str */

*(pstr);

*pstr++; /*1)то, на что ссылается str; 2)str++*/

(*pstr)++; /* то, на что ссылается str и его ++*/

*p++str; /* 1)на что ссылается str; 2) p++*/

СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ

  1. Берри Р., Миккинз Б. Язык Си: Введение для программистов. - М.: Финансы и статистика, 1988. - 191с.

  2. Болски М.И. Язык программирования Си: Справочник. - М.: Радио и связь, 1988. - 96с.

  3. Джехани Н. Программирование на языке Си. - М.: Радио и связь.- 270с.

  4. Инструментальная мобильная операционная система ИНМОС/ М.И.Беляев и др - М.: Финансы и статистика, 1985. - 231с.

  5. Керниган Б., Ритчи Д. Язык программирования Си. - М.: Финансы и статистика, 1990. - 230с.

  6. Керниган Б., Ритчи Д., Фьюэр А. Язык программирования Си. Задачи по языку Си. - М.: Финансы и статистика, 1985. - 279с.

  7. Подбельский В.В., Фомин С.С. Программирование на языке Си. - Финансы и статистика, 1998. - 234 с.

  8. Погорелый С.Д., Слободянюк Т.Ф. Программное обеспечение микропроцессорных систем: Справочник. - Киев: Технiка, 1989. - 301с

  9. Сван Т. Освоение Borland C++ 4.5. Практический курс. - К.: Диалектика, 1996. - 320c.

  10. Сван Т. Освоение Borland C++ 4.5. Энциклопедия функций. - К.: Диалектика, 1996. - 320c.

  11. Хэнкок Л., Кригер М. Введение в программирование на языке Си. - М.: Радио и связь, 1986. - 192с.

  12. Уинер Р. Язык Турбо Си. - М.: Мир, 1991. - 384с.

  13. Уэйт М., Прата С., Мартин Д. Язык Си: Руководство для начинающих. - М.: Мир, 1984. - 512с.

  14. Хэзвилд Р., Кирби Л. и др. Искусство программирования на С. Фундаментальные алгоритмы, структуры данных и примеры приложений. – К.: ДиаСофт, 2001. – 736с.

Если в методе требуются вспомогательные переменные, их описывают после метода в том же синтаксисе, что и исходные данные.