- •1.2Типы данных
- •1.2.1Объявление переменной
- •1.2.2Категории типов данных
- •1.2.3Целый тип данных
- •1.2.4Данные с плавающей точкой (вещественные типы)
- •1.3Знаки операций
- •1.3.3Простое присваивание
- •1.3.4Составное присваивание
- •1.3.5Приоритеты операций и порядок вычислений
- •1.4Структура и компоненты программы на языке си
- •1.5Организация ввода-вывода в стиле си
- •1.6.1 Манипуляторы и форматирование ввода-вывода
- •1.7Математические функции
- •2Алгоритм. Элементы структурного программирования
- •2.1Понятие алгоритма
- •2.2Основные требования к алгоритмам
- •2.3Элементы структурного программирования
- •3Программирование алгоритмов линейной структуры
- •4Алгоритмы и программы ветвящейся структуры. Условный оператор if. Переключатель switch
- •4.1Алгоритмы и программы ветвящейся структуры
- •4.1.1Условный оператор if
- •If (выражение) оператор1;
- •4.1.2Логические операции
- •4.2Примеры составления алгоритмов и программ с использованием условного оператора If
- •4.3Переключатель switch
- •5Алгоритмы и программы циклической структуры
- •5.1 Понятие цикла. Разновидности циклов
- •5.3Оператор while
- •5.4Оператор do while
- •5.5Оператор continue
- •6Регулярные типы данных. Массивы
- •6.1 Понятие регулярного типа
- •6.2Алгоритмы сортировки массивов
- •6.3 Постановка задачи сортировки и методы её решения
- •6.4Алгоритм прямого упорядочения (Алгоритм сортировки выбором элемента)
- •6.5Алгоритм попарного сравнения соседних элементов («пузырьковая» сортировка)
- •6.6Алгоритм сортировки выбором элемента
- •6.7Методы доступа к элементам массивов, использование указателей
- •6.8Организация многомерных массивов. Указатели на многомерные массивы
- •7.1Описание и определение функции
- •7.2Вызов функции
- •7.3Передача параметров в функцию
- •7.4Описание прототипа функции
- •7.5Функция с переменным количеством параметров
- •7.6Понятие сигнатуры функции
- •7.7Подставляемые (встраиваемые) функции
- •7.8Передача параметров в главную функцию
- •7.9Рекурсивные вызовы функции
- •7.10Примеры составления функций
- •8Указатели
- •8.1Понятие указателя
- •8.2Инициализация указателей
- •8.3Операции с указателями
- •8.4Ссылки
- •9Структуры (struct)
- •10Динамические структуры данных
- •3.1 Односвязные списки
- •Д обавление в начало списка.
- •2 ) Добавление в середину списка.
- •У даление первого элемента списка.
- •3 )Удаление элемента из середины списка.
- •Int Data; //поле данных
- •If (!q) //...И он первый в списке
- •3.2 Стек
- •3.3 Очередь
- •11Динамические массивы
- •12Функции и массивы
- •13Указатели на функции
- •14.1Файловый ввод/вывод с помощью потоков
- •14.2 Дополнительные функции файлового ввода/вывода
- •14.3Режимы файлов
- •14.4 Двоичные файлы
- •14.5Произвольный доступ к файлам
- •Список использованных источников
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 слева от звездочки задает постоянство значения, на которое он указывает. Для инициализации указателей использована операция получения адреса &.
Величины типа указатель подчиняются общим правилам определения области действия, видимости и времени жизни.