Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке С++. Учебное пособие
.pdf
41
double x=5.2, y=-7.7;
double a=-5.2, b=7.7;
cout <<«Absolute value function»<<endl;
cout<<«|m|=«<<abs(m)<<endl //cstdlib
<<«|n|=«<<abs(n)<<endl;
cout<<«|k|=«<<labs(k)<<endl //cstdlib
<<«|l|=«<<labs(l)<<endl;
cout<<«|x|=«<<fabs(x)<<endl; //cmath
cout<<«|y|=«<<fabs(y)<<endl<< endl;
cout<<«ceil function-round up»<<endl;
cout<<«ceil(5.2)=«<<ceil(5.2)<<endl;
cout<<«ceil(-5.2)=«<<ceil(-5.2)<<endl;
cout<<«ceil(-7.7)=«<<ceil(-7.7)<<endl;
cout<<«ceil(7.7)=«<<ceil(7.7)<<endl<<endl;
cout<<«floor function-round down «<<endl;
cout<<«floor(5.2)=«<<floor(5.2)<<endl;
cout<<«floor((-7.7)=«<<floor(-7.7)<<endl;
cout<<«floor(-5.2)=«<<floor(-5.2)<<endl;
cout<<«floor(7.7)=«<<floor(7.7)<<endl<<endl;
cout<<«sqrt function «<<endl;
cout<<«sqrt(16)=«<<sqrt(16)<<endl;
cout<<«sqrt(16.0)=«<<sqrt(16.0)<<endl<<endl;
cout<<«pow function «<<endl;
cout <<«pow(5.2,3)=«<<pow(5.2,3)<<endl;
cout<<«pow(-5.2,3.0)=«<<pow(-5.2,3.0)<<endl;
cout<<«pow(5.2,-3)=«<<pow(5.2,-3)<<endl;
double z=pow(sqrt(4),2);
cout<<«z=«<<z<<endl;
getch();
return 0;
}
Пример использования функции rand-генератора случайных чисел:
#include<iostream>
#include<cstdlib>
#include<conio.h>
using namespace std;
int main()
{
const int A=1;//(A,B)-интервал целых чисел
const int B=6;//A<B
cout<<rand()<<« «<<rand()%rand()<<« «<<endl;
cout<<rand()%(B-A+1)+A<<«:»<<rand()%(B-A+1)+A
<<endl;
cout<<rand()%(B-A+1)+A<<«:»<<rand()%(B-A+1)+A
<<endl;
cout<<rand()%(B-A+1)+A<<«:»<<rand()%(B-A+1)+A
<<endl;
cout<<rand()%(B-A+1)+A<<«:»<<rand()%(B-A+1)+A
<<endl;
cout<<rand()%(B-A+1)+A<<«:»<<rand()%(B-A+1)+A
<<endl;
cout <<«Mininum random number»<<0<<endl;
cout<<«Maximum random number»<<RAND_MAX<<endl;
getch();
return 0;
}

6.3. ПРОТОТИП ФУНКЦИИ
Прототип функции — это ее опережающее объявление.
В прототипе указывается имя функции, тип результата и типы аргументов.
Он не содержит реализации(тела) функции, а всего лишь указывает компилятору,
что ее определение будет дано ниже в тексте программы. Основное преимущество
применения прототипов состоит в том, что опережающие объявление дают воз-
можность программировать вызов функции, которые в данной точке программы
еще не определены.
Если программа использует прототип функции, то обычно он располагается
перед main или внутри нее, а определение (реализация) функции дается после
main. Прототип должен полностью соответствовать заголовочной строке в опреде-
лении функции.
Описание прототипа всегда заканчивается символом точки с запятой:
тип_функции_имя_функции (список_аргументов);
Пример программы для вычисления площади треугольника (по формуле
Герона):
#include<iostream>
#include<cmath>
using namespace std;
double Area (double a, double b, double c);// Прототип
int main()
{
double a,b,c,s;
cout << «The area is» << Area(3.0,4.0,5.0) <<endl;
// Ввод данных с клавиатуры
cin >> a >> b >> c; // 10.0, 22.0, 30.0
s=Area(a,b,c); // The area is 76.5441
cout << «The area is» << s << endl;
return 0;
}
double Area (double a, double b, double c)
{
double p=(a+b+c)/2.0;
double s=sqrt(p*(p-a)*(p-b)*(p-c));
return s;
}
6.4. СПОСОБЫ ПЕРЕДАЧИ ДАННЫХ В ФУНКЦИИ
Чтобы взаимодействовать между собой функции должны обмениваться данными. В С++ это осуществляется с помощью двух подходов. Первый из них осно-
ван на механизме параметров, а другой на глобальных идентификаторах.
Механизм параметров является основным способом обмена информацией
между вызываемой и вызывающей функциями. Параметры, перечисленные в заго-
42

ловке описания функции, называются формальными, а записанные в операторе
вызова функции — фактическими (или аргументами).
При вызове функции в первую очередь вычисляются выражения, стоящие на
месте фактических параметров; затем в стеке выделяется память под формальные
параметры функции в соответствии с их типом, и каждому из них присваивается
значение соответствующего фактического параметра. При этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несо-
ответствии типов выдается диагностическое сообщение.
В языке С++ данные в подпрограмму можно передавать тремя способами:
по значению, по адресу и по ссылке.
Передача данных по значению.
Этот способ передачи данных в подпрограмму является основным и дей-
ствует по умолчанию. При передаче по значению в стек заносятся копии значений
фактических параметров, и операторы функции работают с этими копиями. До-
ступа к исходным значениям параметров у функции нет, а, следовательно, нет и
возможности их изменить.
При передаче по адресу в стек заносятся копии адресов параметров, а функ-
ция осуществляет доступ к ячейкам памяти по этим адресам и может изменить ис-
ходные значения параметров:
#include <iostream>
using namespace std;
// обмен значений аргументов типа int
void swap1(int a,int b) {int c=a; a=b; b=a;}
void swap2(int &a, int &b) {int c=a; a=b; b=c;}
int main() {
int A=10,B=20;
cout<<«A=«<<A<<« «<<«B=«<<B<<endl;
// реально значения переменных не изменится
swap1(A,B);
cout<<«after swap1 A=«<<A<<« «<<«B=«<<B<<endl;
// значения переменных изменились
swap2(A,B);
cout<<«after swap2 A=«<<A<<« «<<«B=«<<B<<endl;
return 0;
}
Ссылочный тип обозначается указанием оператора взятия адреса (&) перед
именем переменной.
43

44
7. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ
Замечание:
В языке С++ существуют следующие структурированные типы: тип-массив;
тип-структура; тип-символьная строка; тип-файл.
Ранние версии языков программирования содержали только простые встро-
енные типы данных — целые, вещественные, логические и т.п. Эти данные можно
было организовывать в массивы. Для вычислительных задач этого было достаточно. По мере развития компьютеры стали использовать для обработки текстов, гра-
фических изображений, ведения баз данных и т.п.
Разнообразие обрабатываемой информации привело к созданию объекта но-
вого типа в языках программирования — данных типа структуры. В структуры
можно объединять разнородные данные — числовые данные, массивы, строки,
сами структуры и т.д. Из структур можно образовывать массивы. Структуру мож-
но использовать как единое целое и по частям.
Понятие структуры является как бы мостиком между обычным программи-
рованием и объектно-ориентированным. Объектно-ориентированные языки оперируют с классами. Класс в каком-то роде — это структура, которая объединяет в
себе данные и функции их обработки. Но, об этом позже.
7.1. МАССИВЫ
До сих пор мы рассматривали примеры работы с небольшим количеством
данных, для работы с которыми достаточно использовать только простые переменные. Если данных много, то использование одних простых переменных становится явно недостаточным. Гораздо удобнее объединять их в более сложную орга-
низацию данных, например, в массивы.
Массив — это совокупность данных одного типа, имеющая одно общее
имя. Доступ к отдельному элементу массива осуществляется путем указания имени массива и номера (индекса) этого элемента. До использования массива его
необходимо определить, т.е. дать ему имя и указать количество и тип элементов.
Индексы в любом массиве на языке C/C++ всегда начинается с 0. Пусть имеется
массив из 5 действительных чисел. Графически этот массив можно изобразить так,
как показано на рисунке ниже:
Объявление массива
Для того, чтобы начать работать с массивом, необходимо дать его описание.
Синтаксис:
тип_элементов_массива_имя_массива (количество_элементов);

45
Семантика:
• тип_элементов_массива — любой стандартный или ранее определённый
пользователем тип данных;
• имя_массива — обычный идентификатор;
• количество_элементов — целое число, большее 0, возможно, именованная
константа.
Например:
int B[5]; char A[3];
— описывается массив В, состоящий из 5 элементов и символьный массив A,
состоящий из 3 элементов. Для массива В будет выделено 5*6=30 байт памяти, для
массива A — 1*3=3 байта памяти.
Тип элементов массива может быть любым, за исключением файлового. Об-
ратим внимание, что нумерация элементов массива всегдаидет с нуля.
Инициализация массива
Инициализацию массива можно выполнить несколькими способами.
Например, при объявлении:
Первый способ:
int mas[4];
mas[0] = 14;
mas[1] = 11;
mas[2] = 22;
mas[2] = 82;
Второй способ:
int mas[8] = {1, 1, 21, 4, 47, 19, 3, 31};
Третий способ:
int mas[5];
for(int i = 0; i < 5; i++) cin>>arr[i];
Ввод и вывод элементов массива:
//объявляем массив из 8-ми элементов
int arr[8];
// ввод элементов массива с клавиатуры
for(int i = 0; i < 8; i++)
{
cout<<«arr[«<<i<<«]=«;
cin>>arr[i];
}

// ввод и вывод элементов массива
// с помощью генератора случайных чисел
int main()
{
const int N=10;
srand(N);
double A[N];
for(int i=0;i<N;i++)
{
A[i]=rand();
cout<<«A[«<<i<<«]=«<<A[i]<<endl;
}
getch();
return 0;
}
// вывод элементов массива
for(int i = 0; i < 8; i++)
{
cout<<«arr[«<<i<<«]=«;
cout<<«arr[«<<i<<«]=«<<arr[i]<<«\n»;
}
Задача 1. Заполнить одномерный массив элементами, отвечающими следу-
ющему соотношению:
cin >> N; /*Ввод количества элементов*/
A[0] = 1;
A[1] = 1;
for(int i=2; i<n; i++)
A[I] = A[I — 1] + A[I — 2];
7.2. ОСНОВНЫЕ АЛГОРИТМЫ ДЛЯ РАБОТЫ С МАССИВАМИ
a) суммирование элементов массива;
b) поиск значений;
c) поиск максимального(минимального) элемента массива;
d) обмен значений двух переменных;
e) подсчет элементов в массиве, удовлетворяющих заданному условию;
f) сортировка элементов в порядке возрастания или убывания.
a1=1; a2=1; ai=a
i-2+ai-1
(i = 3, 4, ..., n).
Задача 1. Напишите программу, запрашивающую у пользователя N целых
чисел(2<=N<=10) и выводящую на экран сумму отрицательных чисел.
46

47
#include<iostream.h>
#include<conio.h>
int main()
{
int n;
int a[9];
cout << «введите количество элементов массива»;
cin >> n;
cout << «введите элементы массива»;
for(int i=0;i < n;i++)
int >> a[i];
int sum=0;
for(int i=0;i < n;i++)
if(a[i]<0) sum=sum+a[i];
cout<<«сумма отрицательных чисел=« << sum;
getch();
return 0;
}
Задача 2. Напишите программу, запрашивающую у пользователя N целых
чисел (2<=N<=30) и выводящую на экран произведение чисел кратных 7.
#include<iostream.h>
#include<conio.h>
int main()
{
int n,a[29],flag=0,p=1;
cout << «введите количество элементов массива»;
cin >> n;
cout << «введите элементы массива»;
for(int i=0;i < n;i++)
cin> > a[i];
for (int j=0;j < n;j++)
if(a[j]%7==0)
{
p*=a[j];
flag=1;
}
if(flag) cout << «p=« << p<<endl;
getch();
return 0;
}
Задача 3. Напишите программу, запрашивающую у пользователя N целых
чисел (2<=N<=30) и выводящую на экран максимальное число и его индекс.
#include<iostream.h>
#include<conio.h>
int main()
{
int n,a[29],max,p=0;
cout<<«введите количество элементов массива»;
cin>>n;
cout<<«введите элементы массива»;
for(int i=0;i<n;i++)
cin>>a[i];
max=a[0];
for (int j=0;j<n;j++)
{

48
if (a[j]>max)
{
max=a[j];
p=j;
}
}
cout<<«max=«<<max<<endl;
cout<<«index=«<<p<<endl;
getch();
return 0;
}
Задача 4. Дан массив вещественных чисел, состоящий из 30 элементов. По-
менять местами максимальный и минимальный элементы.
#include<iostream.h>
#include<conio.h>
int main()
{
int n,k=0,l=0;
double a[29],max,min,swap;
cout<<«введите количество элементов массива»;
cin>>n;
cout<<«введите элементы массива»;
for(int i=0;i<n;i++)
cin>>a[i];
max=a[0];min=a[0];
for (int j=0;j<n;j++)
{
if (a[j]>max) { max=a[j]; k=j;}
if (a[j]<min) { min=a[j]; l=j;}
}
swap=a[k];
a[k]=a[l];
a[l]=swap;
for(int x=0;x<n;x++)
cout<<a[x] << « «;
getch();
return 0;
}
Задача 5. Дан линейный массив. Упорядочить его элементы в порядке
возрастания.
#include<iostream.h>
#include<conio.h>
{Сортировка массива выбором (в порядке возрастания).
Идея решения: пусть часть массива (по K-й элемент включительно)
отсортирована. Нужно найти в неотсортированной части массива
минимальный элемент и поменять местами с (K+1)-м}
// программа сортировка выбором
#include <iostream.h>
void main()
{
int A[30], n;
cout << «Введите количество элементов: «;
cin >> n;
for(int i=0; i<<=«« «Введите=«« a[«=«« i=«« «]=«« «;=«« cin=««>> A[i];
}

49
for(i=0; i<n-1; i++)
{
int k = i;
for(int j=i+1; j<n; j++)
if(A[j]<=A[k]) k = j;
int buf = A[i];
A[i] = A[k];
A[k] = buf;
}
for(i=0; i<n; i++)
{
cout << A[i] << « «;
}
}
Тест: N = 10; элементы массива — 1, 2, 2, 2, -1, 1, 0, 34, 3, 3.
Ответ: -1, -1, 0, 1, 2, 2, 2, 3, 3, 34.
Замечание:
Строка « « не содержит ни одного символа. Она называется пустой строкой.
7.3. СТРОКИ В C++
Строка — последовательность (массив) символов. При использовании в выражениях строка заключается в двойные кавычки , единичный символ в одинарные.
Например: «Informatica», 'a', «My name is Ivan»,» «.
Строка, которая содержится в данной строке называется подстрокой.
Например: «ana» — подстрока строки «ananas».
Например: «Info» — подстрока строки «Informatica».
Описание строки
C-строка представляет собой массив символов, последним элементом которого является маркер конца строки «\0».
Синтаксис:
char_имя_строки(длина);
char — тип данных для хранения символов;
имя_строки — идентификатор, заданный потребителем, с помощью которого осуществляется доступ до строки;
длина — константа дискретного типа, которая задает длину строки.
При задании строки необходимо учитывать завершающий нуль-символ.
Семантика.
Резервирует в ОП (длина) последовательных клеток, равная одному байту.
Первые ((длина)-1) определенны для элементов строки, а последняя клетка служебная и в неё записывается специальный символ ‘\0’, который указывает конец
строки.

50
Например:
char name[5];
// где name — имя строковой переменной
// 5 — размер массива, то есть в данной строке может
// поместиться 4 символа , последнее место отводится
// под нуль-символ.
Инициализирования строк
Строка при объявлении может быть инициализирована начальным значени-
ем одним из трех способов.
Первый способ: char name[5] = { 'I', 'v', 'a', 'n' }.
Второй способ: char name[5] = «Ivan».
Третий способ: char name[] = «Ivan».
Ввод-вывод строк
1. Вывод строки на экран монитора.
Используем стандартную операцию вывода языка С++:
cout << «s=« << s << endl;
2. Используем стандартную операцию ввода языка С++:
cin >> s;
Таким способом можно прочитать со стандартного устройства только строку без пробелов, так как при использовании операции ввода (>>) именно пробел
является разделителем, что позволяет последовательно считать данные в две или
более переменные, например:
int a,b;
cin >> a >> b;
Доступ к элементу строки
Доступ к отдельному символу строки аналогичен доступу до элемента мас-
сива — через его индекс. Нумерация начинается с нуля.
Пример:
char name[]=«Ivan Ivanov»,s;
/* Вывести символы:'I' c индексом 0,'v' с индексом 5,и 'n' c индексом 3. */
cout<<name[0]<<endl;
cout<<name[6]<<endl;
//переменной s присвоить символ 'n'
s=name[3];
cout<<s<<endl;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
