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

книги / Технологии разработки объектно-ориентированных программ на язык C++. Основы структурного программирования на алгоритмическом языке C++

.pdf
Скачиваний:
4
Добавлен:
12.11.2023
Размер:
3.17 Mб
Скачать

int main() {

const int size = 10;

int arr1[size] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; int arr2[size];

int *ptr_arr1 = arr1;

// Сейчас он ссылается на первый элемент массива

int *ptr_arr2

= arr2;

 

cout << "{ ";

 

 

 

for (int i = 0;

i< size; i++) {

 

ptr_arr2

=

ptr_arr1;

// Копируем адрес

одного

элемента cout << *ptr_arr2 << " "; // Выводим этот

элемент ptr_arr1++; // Переходим на следующий ptr_arr2++;

}

cout << "}"; /*

Сейчас наш массив пуст, но ссылается на элементы первого массива

*/

/*

А теперь покажем, как именно заполнить массив элементами первого

*/

int *p1 = arr1;

// Сейчас он ссылается на первый элемент массива int *p2 = arr2;

cout << endl<<"{ ";

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

*p2 = *p1;

//

Копируем элементы

cout << *p2 << " "; //

Выводим этот

элемент

p1++;

//

Переходим на

следующий

p2++;

}

cout << "}"; system("pause");

71

return 0;

}

Пример:

Скопировать элементы одного массива в другой, копируя значения, а не адреса.

В данном случае копирование производится иным образом. Создается новый массив, и в него копируются значения элементов. Порядковый номер элемента в первом массиве соответствует порядковому номеру элемента во втором массиве.

int *mas2 = new int[n];

for (int i = 0; i < n; i++) { mas2[i] = mas[i];

значения в новый массив cout<< mas2[i]<<" ";

}

//Создаем доп. массив

//В цикле обращаемся к элементам /* Поочередно заносим

*/

//Сразу выводим эти значения

Пример:

В цикле заполнить массив. Каждому элементу присвоить его порядковый номер.

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

 

int mas [n];

// Создаем массив с количеством

 

элементов n

int *p = mas;

// Указатель на первый элемент

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

*p = i;

// Присвоение элементу

 

его порядкового номера

p++;

// Сдвиг на следующий элемент

}

 

 

72

Задания для самостоятельной работы:

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

Разработать и написать программу: создание массива из заданного количества элементов, после чего добавление нового элемента на указанное пользователем место и с указанным значением (это следует делать через создание нового массива, увеличенного на 1, а потом последовательно копировать элементы и вставить

внужное место новый элемент).

Разработать и написать программу для поиска в двумерном массиве строки с наибольшей суммой элементов.

9.9. Массивы символов – строки

Строка – это массив символов. Строке можно сразу присвоить значение, заключенное в двойные кавычки. Признаком конца строки является нулевой символ «\0». Этот символ должен входить в массив.

Например, описание строки из 15 символов выглядит следующим образом:

char str[15] = “Всем привет!!!”; // Символов 14 + \0

С помощью двумерных массивов можно создать массив строк:

char mass[3][15] = {“Привет”, “Я тут”, “Мы друзья”};

Напишем программу, чтобы показать объявление строк:

#include <iostream> using namespace std; int main() {

setlocale(LC_ALL, "rus");

// Описываем 3 строки, s3 – указатель char str[20], *st, s[40];

cout << "Введите строку "; cin >> str; // Ввод строки str

cout << "Ваша строка " << str << endl;

/*

Запись в st адреса строки, где хранится s. Теперь в переменных-указателях st и s хранится значение одного и того же адреса

73

*/

 

st = s;

 

cout << "Введите строку ";

 

cin >> st;

// Ввод строки st

// Вывод на экран строк st и s, причем это одно и то же cout << "Ваша строка " << st << endl;

cout << "Ваша строка " << s << endl; system("pause");

return 0;

}

Результат работы программы представлен на рис. 9.7.

Рис. 9.7. Результат работы программы со строками

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

cin.getline(char *s, int n);

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

Операции над строками

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

Далее описаны наиболее часто используемые операции со строками:

strlen(имя_строки) определяет длину указанной строки без учета нуль-символа;

74

strcpy_s(str1, str2) выполняет побайтовое копирование символов из строки str2 в строку str1;

strncpy_s(str1, str2, n) выполняет побайтовое копирование n символов из строки str2 в строку str1, возвращает значение str1;

strcat_s(str1, str1) объединяет строку str2 со строкой str1, ре-

зультат сохраняется в str1;

strncat_s(str1, str2, n) объединяет n символов строки str2 со строкой str1, результат сохраняется в str1;

strcmp(str1, str2) сравнивает строку str1 со строкой str2

ивозвращает результат типа int:

0, если строки эквивалентны;

> 0, если строка str1 < str2;

< 0, если str1 > str2 с учетом регистра;

stricmp(str1, str2) сравнивает строку str1 со строкой str2

ивозвращает результат типа int:

0, если строки эквивалентны;

< 0, если строка str1 < str2;

> 0, если str1 > str2 без учета регистра;

strchr(s, c) производит поиск первого вхождения символа c в строке s. В случае удачного поиска возвращает указатель на место первого вхождения символа c. Если элемент не найден, то возвращает 0;

gets_s(s) считывает строку из входного потока;

atof(const char *s) преобразует строку в вещественное число;

atoi(const char *s) преобразует строку в целое число.

Одна из важных операций не входит в данную библиотеку: для преобразования числа в строку можно воспользоваться функцией sprintf из библиотеки stdio.h.

Тип данных string

Помимо массива символов существует тип данных string, который является строкой. Для работы с этим типом необходимо подключить библиотеку string. Объявление происходит точно так же, как и с обычной переменной:

string str = “Hello, my friends”;

75

Ввод данных в такую строку может производиться операторами cin и getline аналогично массиву символов. Доступ к i-му элементу можно получить так же, как в массиве str[i]. Это значит, что данную строку можно обрабатывать по символам в цикле.

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

string st1, st2;

 

 

cin.getline (st1, 256);

// Ввод строк

cin.getline (st2, 256);

 

 

if (st1

!= st2) {

//

Сравнение

st1 =

st2;

//

Присваивание

}

else st1 = st1 + st2; // Соединение cout << st 1 << “ ” << st2; // Вывод

Для обработки строк можно использовать следующие операции:

st.substr(pos, len) возвращает подстроку из строки st начиная

сномера pos длиной len символов;

st.empty() возвращает значение true, если строка st пуста, false – в противном случае;

st.insert(pos, s) вставляет строку s в строку st начиная с пози-

ции pos;

st.remove(pos, len) удаляет из строки st подстроку len длиной pos символов;

st.find(s, pos) возвращает номер первого вхождения строки s в строку st, поиск начинается с номера pos, параметр pos может отсутствовать, в этом случае поиск идет с начала строки;

st.findfirst(s, pos) возвращает номер первого вхождения любого символа из строки s в строку st, поиск начинается с номера pos, который может отсутствовать.

Подключение алфавита русского языка

Чтобы на консоль можно было выводить не только латинские, но и русские буквы, необходимо подключить библиотеку windows.h и использовать две функции (рис. 9.8):

76

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

Рис. 9.8. Результат работы программы со строками (с подключением алфавита русского языка)

Первая команда обеспечивает корректный ввод русских букв, а вторая – вывод.

Чтобы понять принцип работы с такими строками, рассмотрим пример программы, аналогичный примеру для массива символов:

#include <iostream>

 

 

#include <windows.h>

//

Подключение русского языка

#include <string>

//

Работа со строками

using namespace std;

 

 

int main() {

SetConsoleCP(1251); // Ввод русских букв SetConsoleOutputCP(1251); // Вывод русских букв

// Описываем 3 строки, s3 – указатель char str[20], *st, s[40];

cout << "Введите строку ";

cin.getline(str, 256);

// Ввод строки str

cout << "Ваша строка "

<< str << endl;

/*

Запись в st адреса строки, где хранится s. Теперь в переменных-указателях st и s хранится значение одного и того же адреса

*/

st = s;

cout << "Введите строку "; cin >> st; //Ввод строки st

77

// Вывод на экран строк st и s, причем это одно и то же cout << "Ваша строка " << st << endl;

cout << "Ваша строка " << s << endl; system("pause");

return 0;

}

Задания для самостоятельной работы:

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

Все слова строки, которые начинаются с цифры, отсортировать по убыванию.

78

Глава 10. ФУНКЦИИ

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

10.1. Объявление и определение функций

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

Функция получает на вход данные, производит с ними вычисления, а потом возвращает результат (рис. 10.1).

Рис. 10.1. Схема работы функций

В программе функция определяется следующим образом:

тип имя_функции (список_параметров) { тело функции;

}

Тело функции – это блок (несколько операторов) или составной оператор (оператор возвращения, включающий изменение параметров). Внутри функции нельзя определить другую функцию.

В теле функции должен быть оператор, который возвращает полученное значение функции. Он может иметь две формы:

return <выражение>;

return;

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

79

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

Это важно! Функция может вернуть любой тип, кроме массива или функции, но может вернуть указатель на массив или функцию.

Список параметров – это те величины, которые требуется передать в функцию. Элементы списка разделяются запятыми. Для каждого параметра указывается тип и имя.

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

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

В качестве примера напишем функцию для вычисления факториала (рис. 10.2):

#include <iostream> using namespace std;

// Объявление функции для нахождения факториала int factor(int chislo) {

/*

Функция, которая возвращает целые значения и в качестве параметра принимает одно целое значение

*/

int result = 1;

//Создаем переменную для результата for (int i = 1; i <= chislo; i++)

//В цикле умножаем числа по порядку result *= i;

return result;

// Возвращаем посчитанный факториал

}

int main() {

setlocale(LC_ALL, "Rus");

80

Соседние файлы в папке книги