Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке С++. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
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;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]