Мегаобучалка Главная | О нас | Обратная связь


int area_rect (int l, int w)



2019-11-21 158 Обсуждений (0)
int area_rect (int l, int w) 0.00 из 5.00 0 оценок




{

/*площадь прямоуголника*/

return l*w;

}

Функции, возвращающие указатели

Функция может возвращать указатель. При этом она должна быть определена и объявлена соответствующим образом. Например, если функция возвращает указатель на целое, ее определение обычно имеет вид:

int *f(void)

{

. . .

}

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

Пример 4

Main ()

{

int *f(void);

...

}

В прим. 4 объявление известно внутри функции main().

Пример 5

int *f(void);

Main ()

{

...

}

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

Пример 6

#include "local.h"

Main ()

{

...

}

Прим. 6 напоминает, что объявления функций часто находятся в файлах заголовков, область действия этих объявлений такая же, как в прим. 5.

Пример 7

/* main () - передает адрес массива, содержащего город и улицу,

в функцию getstreet(), которая возвращает указатель на улицу*/

#include <stdio.h>

Int main ()

{

char *getstreet (char *);

static char info[] = " Москва , Арбат ";

printf (" Улица %s\n", getstreet(info));

}

/* Предполагается, что p указывает на строку вида "Город, Улица" */

char *getstreet(char *p)

{

while ( *p != ',')

p++;

return p + 2;

}

Вывод:

Улица Арбат

Пример функции, возвращающей сумму двух целых величин:

#include "stdafx.h"

#include <iostream>

using namespace std;

int sum(int а, int b); // объявление функции

void main()

{

 

int a = 2, b = 3, c, d;

c = sum(a, b); // вызов функции

cin >> d;

cout << sum(c, d) << endl; // вызов функции

 

a = 3*sum(c, d) - b; // вызов функции

cout << a << endl;

return;

}

int sum(int a, int b) // определение функции

{

return (a + b);

}

Объявление и определение функции может совпадать, но перед вызовом компилятор должен знать прототип функции, поэтому одновременное объявление и определение должно следовать перед вызовом функции.

Пример функции нахождения максимума двух чисел:

#include "stdafx.h"

#include <iostream>

using namespace std;

int max( int x, int y) // одновременно объявление и определение функции

{

if (x > y)

return x;

Else

return y;

}

void main()

{

 

int a = 2, b = 3, c, d;

c = max(a, b); // вызов функции

cout << c << endl;

cin >> d;

cout << max(c, d) << endl; // вызов функции

return ;

}

 

Передача массивов в функцию

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

void p rint( int[ 10 ] );

рассматривается компилятором так, как будто оно имеет вид

void print( int * );

Размер массива неважен при объявлении этого параметра. Все три приведенные записи эквивалентны:

void print( int* );

 void print( int[] );

 void print( int[ 10 ] );

Передачамассивов как указателей имеет следующие особенности: изменение значения аргумента внутри функции затрагивает сам переданный объект, а не его локальную копию. Если такое поведение нежелательно, программист должен позаботиться о сохранении исходного значения. Можно также при объявлении функции указать, что она не должна изменять значение параметра, объявив этот параметр константой:

void p rint( const int[ ] );

 Cи-строка является массивом символов, последний элемент которого равен нулю. Во всех остальных случаях при передаче массива в качестве параметра необходимо указывать его размер. Обычно для такого указания используют дополнительный параметр функции. Например:

void print( int *, int size );

Параметр может быть многомерным массивом. Для такого параметра должны быть заданы правые границы всех измерений, кроме первого. Например:

void print( int matrix[][10], int rowSize );

Здесь matrix объявляется как двумерный массив, который содержит десять столбцов и число строк, передаваемое отдельным параметром. Эквивалентным объявлением для matrix будет:

int (*matrix)[10];

Многомерный массив передается как указатель на его нулевой элемент. В нашем случае тип matrix – указатель на массив из десяти элементов типа int. Как и для одномерного массива, граница первого измерения не учитывается при проверке типов. Если параметры являются многомерными массивами, то контролируются все измерения, кроме первого. Заметим, что скобки вокруг *matrix необходимы из-за более высокого приоритета операции взятия индекса. Инструкция

int *matrix[10];

объявляет matrix как массив из десяти указателей на int.

Если массив описан как **m или *m[N] при передаче его в качестве параметра используется описание вида **a или *a[]

void f(int **a, int n, int m) {

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

  for(int j=0;j<m; j++) printf("%5d",a[i][j]);

  printf("\n");

}

}

f(a,5,4) – вызов

Перегрузка функции

При определении функций в программах необходимо указывать тип возвращаемого функцией значения, а также количество параметров и тип каждого из них. Если на языке С++ была написана функция с именем add_values, которая работала с двумя целыми значениями, а в программе было необходимо использовать подобную функцию для передачи трех целых значений, то тогда следовало бы создать функцию с другим именем. Например, add_two_values и add_three_values. Аналогично, если необходимо использовать подобную функцию для работы со значениями типа float, то нужна еще одна функция с еще одним именем. Чтобы избежать дублирования функции, C++ позволяет определять несколько функций с одним и тем же именем. В процессе компиляции C++ принимает во внимание количество аргументов, используемых каждой функцией, и затем вызывает именно требуемую функцию. Предоставление компилятору выбора среди нескольких функций называется перегрузкой.

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

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

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

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

Например, следующая программа перегружает функцию с именем add_values. Первое определение функции складывает два значения типа int. Второе определение функции складывает три значения типа int. В процессе компиляции C++ корректно определяет функцию, которую необходимо использовать:

#include "stdafx.h"

#include <iostream>

using namespace std;

int add_values(int a,int b);

int add_values (int a, int b, int c);

int _tmain(int argc, _TCHAR* argv[]){

cout << "200+801=" << add_values(200,801) << "\n";

cout << "100+201+700=" << add_values(100,201,700) << "\n";

system("pause");

return 0;

}

 

int add_values(int a,int b) {

return(a + b);

}

 

int add_values (int a, int b, int c) {

return(a + b + c);

}

Таким образом, программа определяет две функции с именами add_values. Первая функция складывает два значения, в то время как вторая складывает три значения одного типа int. Компилятор языка С++ определяет, какую функцию следует использовать, основываясь на предлагаемых программой параметрах.

Использование перегрузки функции

Одним из наиболее общих случаев использования перегрузки является применение функции для получения определенного результата, исходя из различных параметров. Например, предположим, что в программе есть функция с именем day_of_week, которая возвращает текущий день недели (0 для воскресенья, 1 для понедельника, ... , 6 для субботы). Программа могла бы перегрузить эту функцию таким образом, чтобы она верно возвращала день недели, если ей передан юлианский день в качестве параметра, или если ей переданы день, месяц и год.

int day_of_week(int julian_day) {

// операторы

}

 

int day_of_week(int month, int day, int year) {

// операторы

}

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

int имя_функции(int имя_аргумента);

int имя_функции(int имя_аргумента);

/*недопустимая перегрузка имени: аргументы имеют одинаковое количество и одинаковый тип*/

Преимущества перегрузки функции:

· перегрузка функций улучшает удобочитаемость программ;

· перегрузка функций C++ позволяет программам определять несколько функций с одним и тем же именем;

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

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

Пример 2.

/*Перегруженные функции имеют одинаковые имена, но разные списки параметров и возвращаемые значения*/

#include "stdafx.h"

#include <iostream>

using namespace std;

int average(int first_number, int second_number, int third_number);

int average(int first_number, int second_number);

 

int _tmain(int argc, _TCHAR* argv[]){// главная функция

int number_A = 5, number_B = 3, number_C = 10;

cout << "Целочисленное среднее чисел " << number_A << " и ";

cout << number_B << " равно ";

cout << average(number_A, number_B) << ".\n\n";

cout << "Целочисленное среднее чисел " << number_A << ", ";

cout << number_B << " и " << number_C << " равно ";

cout << average(number_A, number_B, number_C) << ".\n";

system("PAUSE");

return 0;

}// конец главной функции

 

/*функция для вычисления целочисленного среднего значения 3-х целых чисел*/

int average(int first_number, int second_number, int third_number ) {

return((first_number + second_number + third_number)/3);

} // конец функции

 

/*функция для вычисления целочисленного среднего значения 2-х целых чисел*/

int average( int first_number, int second_number ) {

return((first_number + second_number)/2);

} // конец функции

Пример 3.

/*Перегруженные функции имеют одинаковые имена и типы возвращаемых значений, но разные типы параметров*/

#include "stdafx.h"

#include <iostream>

using namespace std;

#include<stdio.h>

float average(int first_number, int second_number,

         int third_number );

float average(float first_number, float second_number,

         float third_number);

 

int _tmain(int argc, _TCHAR* argv[]){

int A = 5, B = 3, C = 10;

float A1 = 5.1, B1 = 3.4, C1 = 10.5;

printf("Среднее значение 3-х целых чисел = %f\n",

     average(A,B,C)/3.0);

printf("Среднее значение 3-х вещественных чисел = %f\n",

     average(A1,B1,C1)/3.0);

system("pause");

return 0;

}

 

/*функция для вычисления среднего значения 3-х целых чисел*/

float average(int first_number, int second_number,

         int third_number ) {

return ((first_number + second_number + third_number));

}

 

/*функция для вычисления среднего значения 3-х веществен-ных чисел*/

float average(float first_number, float second_number,

         float third_number) {

return ((first_number + second_number + third_number));

}

Примеры

 

Пример 1. Рассмотрим функцию, вычисляющую сумму элементов массива.

 

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

 int Sum ( int A[], int N )

 {

int i, sum;

sum = 0;

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

sum += A[i];

return sum;

 }

main()

{ const int n=20,m=30;

int i, s, A[n], B[m];

printf(" Массив A \n");

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

{ A[i]=rand()%10;

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

}

printf("\n\n Массив B \n");  

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

{ B[i]=rand()%20;

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

}

s = Sum(A,n);

printf("\n\nСумма массива A %d, массива B %d", s, Sum(B,m) );

getch();

return 0;

}

 

Пример 2 : Передача в функцию массива c использованием указателя.

Результат – элементы исходного массива возводятся в квадрат.

 

#include <stdio.h>

#include <conio.h>

void quart(int n, float * x) 

{ int i;

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

x[i]=x[i]*x[i];

}

main()

{ float z[]={1,2,3,4,5};

int j; int n=sizeof(z)/sizeof(z[0]);

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

printf(" %6.2f",z[j]);

quart(n,z);

putchar(‘\n’);

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

  printf("\n %6.2f",z[j]);

getch();

}

 

Пример 3.

 Написать функцию обработки матриц A и B одинакового размера m x n. Получить матрицу C =max(A(i,j),B(i,j)), и матрицу D=min(A(i,j),B(i,j)). Матрицы C и D вывести в главной программе.

 

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

 

const int n=4,m=4;

void MaxMin(int A[][n],int B[][n],int (*C)[n], int (*D)[n],int m)

{ int i,j;

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

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

if (A[i][j]>B[i][j])

{ C[i][j]=A[i][j];

    D[i][j]=B[i][j];

}

else

{ C[i][j]=B[i][j];

    D[i][j]=A[i][j];

}  

return;

}

main ()

{

int A[m][n],B[m][n],C[m][n],D[m][n],i,j;

        

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

{ for (j=0;j<n;j++)

{ A[i][j]=rand()%20;

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

}

puts("\n");

}

puts("\n\n");

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

{ for (j=0;j<n;j++)

{ B[i][j]=rand()%20;

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

}

puts("\n");

}

MaxMin(A,B,C,D,m);

puts("\n\n");

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

{ for (j=0;j<n;j++)

   printf("%5d",C[i][j]);

}

puts("\n");

}

puts("\n\n");

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

{ for (j=0;j<n;j++)

   printf("%5d",D[i][j]);

}

puts("\n");

}

getch();

return 0;

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Как в С++ передаётся в функцию массив?

2. Требуется ли в параметре функции указывать размер одномерного массива?

3. Как можно передавать матрицу в функцию?

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

 

Варианты заданий

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

1. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти максимальный положительный элемент.

Вычислить сумму элементов массива.

2. Дан одномерный массив, состоящий из N вещественных элементов.

Найти максимальный элемент.

Вычислить среднеарифметическое отрицательных элементов массива.

3. Дан одномерный массив, состоящий из N вещественных элементов.

Найти минимальный элемент.

Вычислить произведение не нулевых элементов массива.

4. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти минимальный положительный элемент.

Вычислить сумму положительных элементов массива, кратных 3.

5. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти максимальный положительный элемент.

Вычислить произведение элементов массива.

6. Дан одномерный массив, состоящий из N вещественных элементов.

Найти максимальный элемент.

Вычислить сумму четных элементов массива.

7. Дан одномерный массив, состоящий из N вещественных элементов.

Найти минимальный отрицательный элемент.

Вычислить среднеарифметическое положительных элементов массива.

8. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти максимальный элемент.

Вычислить среднеарифметическое элементов массива.

9. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти минимальный элемент.

Вычислить сумму элементов массива.

10. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти максимальный отрицательный элемент.

Вычислить произведение отрицательных элементов массива.

11. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти максимальный элемент.

Вычислить среднеарифметическое нечетных элементов массива.

12. Дан одномерный массив, состоящий из N вещественных элементов.

Найти минимальный положительный элемент.

Вычислить сумму четных элементов массива.

13. Дан одномерный массив, состоящий из N вещественных элементов.

Найти минимальный отрицательный элемент.

Вычислить произведение ненулевых элементов массива, кратных 3.

14. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти максимальный отрицательный элемент.

Вычислить среднеарифметическое четных элементов массива.

15. Дан одномерный массив, состоящий из N вещественных элементов.

Найти максимальный элемент.

Вычислить среднеарифметическое положительных элементов массива.

16. Дан одномерный массив, состоящий из N вещественных элементов.

Найти минимальный положительный элемент.

Вычислить произведение не нулевых элементов массива.

17. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти максимальный отрицательный элемент.

Вычислить сумму отрицательных элементов массива.

18. Дан одномерный массив, состоящий из N целочисленных элементов.

Найти минимальный элемент.

Вычислить сумму положительных нечетных элементов массива.

19. Дан одномерный массив, состоящий из N вещественных элементов.

Найти минимальный положительный элемент.

Вычислить произведение нечетных элементов массива.

20. Дан одномерный массив, состоящий из N вещественных элементов.

Найти максимальный элемент.

Вычислить среднеарифметическое отрицательных элементов массива.

21. Дана матрица A(N,M) и число k, вводимые с клавиатуры. В k-ой строке найти минимальный элемент.
В том столбце, где этот элемент находится, найти произведение отличных от нуля элементов. Каждый этап решить при помощи подпрограммы,
работающей с вектором.

22. Даны две квадратные матрицы nxn. Напечатать ту из них, которая имеет минимальный "след” (т.е. сумму элементов главной диагонали). При решении создать функцию для нахождения следа матрицы и функцию печати матрицы.

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

24.  Написать функцию, которая вычисляет для двумерного массива с переменной длинной строк сумму элементов каждой строки. Длинна каждой строки хранится в 0 элементе соответствующей строки. Массив сформировать с помощью случайных чисел, и вывести на экран в главной программе



2019-11-21 158 Обсуждений (0)
int area_rect (int l, int w) 0.00 из 5.00 0 оценок









Обсуждение в статье: int area_rect (int l, int w)

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (158)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.011 сек.)