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

7.10Примеры составления функций

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

#include <stdio.h>

#include <conio.h>

#include <math.h>

float veil(float h, float r) {return(M_PI*r*r*h);}

void main ()

{

float r,h;

float v;

puts("Вычисление объема цилиндра");

printf("Введите высоту и радиус основания ->");

scanf ("%f%f", &h, &r) ;

v = veil(h, r);

printf("Объем цилиндра %3.2f\n", v);

printf("Для завершения нажмите <Enter>");

getch();

}

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

int max(int a, int b)

{if (a > b) return(a);

else return(b);

}

Пример 3. Написать функцию, которая сравнивает два целых числа и возвращает результат сравнения в виде одного из знаков: >, < или =.

#include <stdio.h>

#include <conio.h>

char compare(int a, int b)

{

char res;

if (a > b) res = '>';

else if (a < b) res = '<';

else res = '=';

return(res);

}

void main()

{

int xl,x2; // сравниваемые числа char res; // результат Сравнения

puts("Введите два целых числа и нажмите <Enter>");

printf("->");

scanf("%i%i", &xl, &x2);

res = compare(xl,x2); // вызов функции программиста

printf("%i %c %i\n", xl, res, x2);

puts("\nДля завершения работы программы нажмите <Enter>");

getch();

}

Пример 4. Написать функцию, обеспечивающую решение квадратного уравнения. Параметрами функции должны быть коэффициенты и корни уравнения. Значение, возвращаемое функцией, должно передавать в вызывающую программу информацию о наличии корней уравнения: 2 — два разных корня, 1 — корни одинаковые, 0 — уравнение не имеет решения. Кроме того, функция должна проверять корректность исходных данных. Если исходные данные неверные, то функция должна возвращать -1.

#include "stdio.h"

#include "conio.h"

#include "math.h"

int kvadur(float a, float b, float с, float *xl, float *x2)

// значение функции - количество корней

// или -1, если неверные исходные данные

{

float d; // дискриминант

if (a == 0) return(-1);

d = b*b-4*a*c;

if (d < 0) return(0); // уравнение не имеет решения

*xl = (-b+sqrt(d))/(2*a);

*х2 = (-b-sqrt(d))/(2*a);

if (*xl != *х2) return(2);

else return(1);

}

void main()

{

float a,b,c; // коэффициенты уравнения

float xl,x2; // корни уравнения

int n; // кол-во корней

puts("\nРешение квадратного уравнения");

puts("Введите в одной строке коэффициенты и нажмите <Enter>");

printf("->");

scanf("%f%f%f", &a, &b, &c);

switch (kvadur(a,b,c,&xl,&x2))

{

case -1: puts("Ошибка исходных данных."); break;

case 0: puts("Уравнение не имеет решения.");break;

case 1: printf("Корни одинаковые: x=%3.2f", xl) ;break;

case 2: printf("xl=%3.2f x2=%3.2f", xl, x2);

}

puts("\n Для завершения работы нажмите <Enter>");

getch();

}

8Указатели

8.1Понятие указателя

Когда компилятор обрабатывает оператор определения переменной, например, int i=10;, он выделяет память в соответствии с типом (int) и инициализирует ее указанным значением (10). Все обращения в программе к переменной по ее име­ни (i) заменяются компилятором на адрес области памяти, в которой хранится значение переменной. Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указате­лями.

Итак, указатели предназначены для хранения адресов областей памяти. В C++ различают три вида указателей — указатели на объект, на функцию и на void, от­личающиеся свойствами и набором допустимых операций. Указатель не являет­ся самостоятельным типом, он всегда связан с каким-либо другим конкретным типом.

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

тип (*имя) ( список_типов_аргументов ); Например, объявление:

int (*fun) (double, double):

задает указатель с именем fun на функцию, возвращающую значение типа int и имеющую два аргумента типа double.

Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа (основного или составного). Простейшее объявление указа­теля на объект (в дальнейшем называемого просто указателем) имеет вид:

тип *имя;

где тип может быть любым, кроме ссылки и битового поля, причем тип может быть к этому моменту только объяв­лен, но еще не определен (следовательно, в структуре, например, может присут­ствовать указатель на структуру того же типа).

Звездочка относится непосредственно к имени, поэтому для того, чтобы объявить несколько указателей, требуется ставить ее перед именем каждого из них. На­пример, в операторе

int *а, b, *с; описываются два указателя на целое с именами а и с, а также целая переменная b.

Размер указателя зависит от модели памяти. Можно определить указатель на указатель и т. д.

Указатель на void применяется в тех случаях, когда конкретный тип объекта, ад­рес которого требуется хранить, не определен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов раз­личных типов).

Указателю на void можно присвоить значение указателя любого типа, а также сравнивать его с любыми указателями, но перед выполнением каких-либо дейст­вий с областью памяти, на которую он ссылается, требуется преобразовать его к конкретному типу явным образом.

Указатель может быть константой или переменной, а также указывать на кон­станту или переменную. Рассмотрим примеры:

int l; // целая переменная

const int ci = 1; // целая константа

int *pi; // указатель на целую переменную

const int *pci; // указатель на целую константу

int * const cp = &i; // указатель-константа на целую переменную

const int * const cpc = &ci; // указатель-константа на целую константу

Как видно из примеров, модификатор const, находящийся между именем указа­теля и звездочкой, относится к самому указателю и запрещает его изменение, a const слева от звездочки задает постоянство значения, на которое он указывает. Для инициализации указателей использована операция получения адреса &.

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