Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
09.04.2015
Размер:
212.99 Кб
Скачать

Void Sum(float *s,float *X, int n); //прототип функции Sum

void main ()

{

int i;

float A[10], B[15];

float s1,s2;

clrscr();

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

{

printf("A[%d]=", i );

scanf("%f", &A[i]);

}

printf("**************\n");

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

{

printf("B[%d]=", i );

scanf("%f", &B[i]);

}

printf("**************\n");

Sum (&s1,A, 9);// вызов функции Sum

printf("s1 = %7.2f \n",s1);

Sum (&s2,B,14); // вызов функции Sum

printf("s2 = %7.2f \n",s2);

getch();

} void Sum(float *s,float *X, int N) {int k;

*s =0;

for (k =0; k <=N; k++)

*s += X[k];

}

В этой программе в препроцессорной части описан прототип функции:

void Sum(float *s, float *X, int N);

где: voidтип возвращаемого функцией значения (словоvoid означает, что функция не возвращает значение в место вызова). Чтобы понять, что значит “функция не возвращает значение” нужно усвоить, что такое “возвращает значение”. А это понятие мы рассмотрим чуть позже.Sumимя (идентификатор) функции.float *sпервый формальный параметр, который является указателем на типfloat, а соответствующий фактический параметр должен быть адресом поля типаfloat.float *X - второй формальный параметр, который является указателем на типfloat, а соответствующий фактический параметр должен быть адресом поля типаfloat.int Nтретий формальный параметр, который является переменной типаint, а соответствующий ему фактический параметр должен быть значением поля типаint.

Вся эта информация используется транслятором для проверки правильности вызова функции Sum. Сам же текст функции располагается после главной функции. Отметим, чтоs, XиN– это некоторые локальные переменные функции, которые принимаютзначения фактических параметров, но посколькуs и Xэто значения адресов фактических объектов, то этим обеспечивается замена формальных параметровпо-наименованию.

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

Sum (&s1, A, 9); Sum (&s2, B, 14);

где &s1,A, 9 – список фактических параметров при первом вызове функцииSum.&s2,B,14 - список фактических параметров при втором вызове функцииSum.

В этих операторах &s1и&s2 явно адреса соответственно переменныхs1и s2. Но ведь вторые фактические параметры должны быть тоже адресами, а у насA иB–имена массивов! Нет ли тут ошибки? Ошибки нет! Вспомним, что имя массива эквивалентно адресу его нулевого элемента, поэтомуA==&A[0] и B ==&B[0], т. е. вместоА в оператореSum (&s1, A, 9); можно было написатьSum (&s1, &A[0], 9);, но каждый уважающий себя программист не будет этого делать. Зачем писать “лишние” знаки, если можно этого не делать?!

Текст функции Sum состоит из заголовка:

void Sum(float *s, float *X, int N) и тела функции:

{int k;

*s =0;

for (k =0; k <=N; k++)

*s += X[k];

}

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

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

тип_возвращаемого_значения имя_функции (список_формальных_параметров);

Запомним на будущее два факта:

  • В Си запрещено внутри тела функции определять другую функцию.

  • Заголовок функции отличается от прототипа отсутствием в конце строки точки с запятой ‘;’. Кроме того, в прототипе допускается не указывать имена формальных параметров. В нашем случае прототип можно было бы записать в виде:void Sum(float *,float *, int );. Дело в том, что транслятору на первом этапе нужны не имена формальных параметров, а их количество и их тип.

И еще. Некоторие версии трансляторов при написании главной функции в виде:

main ()

{ ….

}

воспринимают по умолчанию функцию в виде int main (), т. е. считают, что эта функция должна возвращать значение типа int, и выдают сообщение об ошибке. В таком случае следует начало фунции записать как void main (), либо в конце функции вставить оператор return 0; :

main ()

{ ….

return 0;

}

Соседние файлы в папке attachments_05-09-2012_18-55-54