size_t width, int (*fcmp)(const void*, const void*));
// key - указатель на искомый элемент,
// возвращаемое значение - указатель на элемент (0 - не найден)
// base - базовый адрес массива
// num - число элементов в массиве
// width - размер элемента
// fcmp - указатель на функцию сравнения элементов массива
// Функция возвращает указатель на элемент, а не значение индекса элемента
// Если элемент не обнаружен, возвращается 0.
// Для вычисления индекса можно использовать следующую формулу:
index = (searchRslt - arrayBase) / sizeof(arrayBase[0]);
void *lfind(const void *key, const void *base, size_t *num,
size_t width, int (*fcmp)(const void *, const void*));
void *lsearch(const void *key, void *base, size_t *num,
size_t width, int (*fcmp)(const void *, const void *));
// - если нет элемента, то он вставляется, поэтому возвращаемое значение
// всегда не ноль.
void qsort(void *base, size_t nelem,
size_t width, int (*fcmp)(const void *, const void *));
/*
- При объявлении многомерных массивов вам нужно указать тип массива, его имя и размер (заключенный в свою пару скобок) по каждому измерению. Нижнее значение индекса для любого измерения равно 0. Верхнее значение индекса по любому измерению равно количеству элементов поэтому измерению минус единица.
- Для того чтобы обратиться к многомерному массиву, Вам нужно задать его имя и правильные значения индексов. Каждый индекс должен быть заключен в свою пару скобок.
Пример работы с двумерным массивом:
(Листинг 6.6. Исходный текст программы MATRIX1.CPP)
- При объявлении многомерных массивов им можно присвоить начальные значения. Список ИНИЦИАЛИЗАЦИИ должен быть заключен в фигурные скобки, а элементы в нем должны быть разделены запятыми. Можно при инициализации задать данных меньше, чем размер массива, В этом случае компилятор автоматически присвоит нулевые значения тем элементам, для которых вы не указали начальные значения:
(Листинг 6.7. Исходный текст программы MATRIX2.CPP.)
- Объявление многомерных массивов в качестве параметров функции воз- можно в двух формах: массив-параметр фиксированной размерности и массив-параметр неопределенной длины по первому измерению. При объявлении параметром массива фиксированной размерности указывается размер массива по каждому измерению. В этом случае передаваемые функции аргументы должны соответствовать по типу и размеру параметру. Массив-параметр неопределенной длины объявляется с пустыми скобками для первого измерения, означающими, что передаваемый аргумент может быть любого размера по первому измерению. По другим измерениям размеры аргумента и параметра должны совпадать:
(Листинг 6.8. Исходный текст программы MATRIX3.CPP)
Строки и управление вводом/выводом
Здесь подробнее рассматриваются операции консольного ввода/вывода. C++, как и его предок — язык С — не определяет операции ввода/вывода как часть языка, а выносит операции консольного ввода/вывода в библиотеки ввода/вывода. Такие библиотеки в основном предназначены для работы в MS-DOS. Рассмотрим небольшую выборку функций ввода/вывода, объявляемых в заголовочных файлах STDIO.H и IOSTREAM.H.
Сегодня мы рассмотрим следующие темы:
· Форматированный потоковый вывод
· Потоковый ввод
· Функция printf
· Строки в C++
· Ввод строк
· Использование стандартной библиотеки функций для работы со строками
· Присвоение значений строкам
· Определение длины строки
· Конкатенация строк
· Сравнение строк
· Преобразование строк
· Перестановка символов в строке в обратном порядке
· Поиск символа
· Поиск подстроки
· Форматированный потоковый вывод
C++ имеет целое семейство гибких библиотек функций ввода/вывода. Разработчикам языка было ясно, что функции ввода/вывода из STDIO.H, унаследованные из С, имеют ограничения при работе с классами (вы узнаете больше о классах в главе 8)., В результате в C++ было введено понятие потоков. Вспомним, что потоки, которые уже существовали в С, означают последовательность данных, передаваемых из одной части компьютера в другую. В программах, рассматриваемых ранее, вы видели операцию помещения в поток “, например — в стандартный поток вывода, cout. Встречалась вам и операция извлечения из потока ”, применяемая к стандартному потоку ввода, cin. В этом разделе мы познакомимся с потоковыми функциями width и precision, используемыми при форматировании вывода. Библиотеки потоков C++ содержат большое количество таких функций, позволяющих настроить ваш вывод.
Функция width задает ширину поля вывода. Общая форма использования функции width с потоком cout:
cout.width (widthOf Output);
Функция precision определяет количество значащих цифр после точки для чисел с плавающей точкой. Общая форма использования функции precision с потоком cout:
cout.precision(numberOfDigits) ;
Обратимся к примеру, программе OUT1.CPP, исходный текст которой приведен в листинге 1. Программа, в которую ничего не вводится, просто выводит форматированные целые числа, числа с плавающей точкой и символы с использованием функций width и precision.
Листинг 1. Исходный текст программы OUT1.CPP
01 | // Программа иллюстрирует потоковый форматированный вывод в C++ |
02 | // с использованием функций width и precision |
03 | #include <iostream.h> |
04 | |
05 | int main() |
06 | { |
07 | int anInt = 67; |
08 | unsigned char aByte = 128; |
09 | char aChar = '@'; |
10 | float aSingle = 355.1112; |
11 | double aDouble = 1.131112e+002; |
12 | |
13 | // Вывод простых выражений |
14 | cout.width(3); cout << int(aByte) << " + "; |
15 | cout.width(2); cout << anInt << " = "; |
16 | cout.width(3); cout << (aByte + anInt) << endl; |
17 | |
18 | cout.precision(3); cout << aSingle << " / "; |
19 | cout << aDouble << " ="; |
20 | cout.width(7); cout.precision(4); cout << (aSingle / aDouble) << endl; |
21 | |
22 | cout << "Символьная переменная aChar: " |
23 | << aChar << endl; |
24 | return 0; |
25 | } |
Пример программной сессии:
Введите три числа через пробел: 123
Сумма чисел = 6
Среднее этих чисел = 2
Введите три символа: ABC
Вы ввели символы 'A', 'B', 'C'
Введите число, символ, и число: 12A34.4
Вы ввели 12 A 34.4
Введите символ, число и символ: A3.14Z
Вы ввели A 3.14 Z
В программе из листинга 2 объявляется четыре переменных типа double и три переменных типа char. Оператор вывода в строке 10 предлагает вам ввести три числа. Оператор ввода в строке 11 помещает введенные вами числа в переменные х, у и z. He забывайте, что при вводе чисел их нужно разделять пробелами. Либо вводите каждое число с новой строки. Первое введенное вами число будет помещено в переменную х, второе — в у, а третье окажется в переменной z. Данные в переменные заносятся в том порядке, в котором переменные перечислены в операторе ввода в строке 11. Оператор в строке 12 вычисляет сумму значений переменных х, у и z. Оператор вывода в строках 13 и 14 выводит сумму и среднее значение введенных вами величин.
Оператор вывода в строке 15 предлагает вам ввести три символа. Оператор (ввода в строке 16 последовательно размещает введенные символы в переменных с1, с2, с3. Использовать пробел для разделения вводимых символов не обязательно. Например, вы можете ввести данные и таким образом: 1А2, Bob и 1 D d. Оператор вывода в строках 17—19 выводит введенные вами символы, разделенные пробелами и заключенные в одинарные кавычки.
Оператор вывода в строке 20 предлагает вам ввести число, символ и число. Оператор ввода в строке 21 помещает ваши данные в переменные х, с1 и у. Пробел-разделитель здесь нужен только в том случае, если символ может быть интерпретирован как часть числа. Например, если вам нужно ввести число 12, символ “точка” и число 55, вам нужно набрать на клавиатуре 12 . 55. Вводимый символ “точка” лучше “заключить” в пробелы, чтобы быть уверенным, что поток вода не воспримет эту точку как точку, разделяющую в вещественном числе целую и дробную части. Оператор вывода в строке 22 выводит введенные вами данные разделенные пробелами.
Оператор вывода в строке 23 предлагает вам ввести символ, число и символ. Оператор ввода в строке 24 последовательно размещает введенные значения в переменных с1, х, с2. Пробел-разделитель здесь нужно использовать только в том случае, если символ может быть интерпретирован как часть числа. Например, если вам нужно ввести символ “-”, число 12 и цифру 0, вам нужно набрать на клавиатуре 12 0. Оператор вывода в строке 25 выводит введенные вами данные, разделяя их пробелами.
Функция printf
Просматривая программы, написанные разными людьми, вы часто можете встретить функцию printf. Этот стандартный оператор вывода пришел из языка С. Так как C++ является расширением С, эта функция поддерживается и в этом языке. Многие программисты до сих пор предпочитают использовать старую функцию printf, а не потоки ввода/вывода C++. Вот почему вам эта функция наверняка уже знакома. Но, помимо этого, эта функция имеет несколько очень мощных возможностей, и в ряде случаев она оказывается удобнее функций потоков. Прототип функций можно найти в заголовочном файле STDIO.H.
Функция printf
Общая форма объявления функции printf:
int printf(const char *format[, argument,... ]);
Параметр format является символьным массивом, содержащим выводимый текст. Кроме этого обязательного параметра, могут быть необязательные аргументы. Массив format может содержать специальные форматирующие символы, которые выполняют преобразование необязательных аргументов при выводе.
Функция printf является очень мощной функцией с богатыми возможностями форматирования вывода. В качестве первого шага в освоении ее возможностей рассмотрим Esc-последовательности, позволяющие представлять специальные символы. Esc-последовательность начинается с символа “\” — “обратная косая черта”. Esc-коды представлены в таблице 1.
Таблица 1. Еsс - последовательности
Последовательность | Десятичное значение | Шестнадцатеричное значение | Название |
\а | 7 | 0х07 | Звонок |
\b | 8 | 0х08 | Возврат назад |
\f | 12 | 0х0С | Перевод страницы |
\n | 10 | 0х0А | Новая строка |
\г | 13 | 0x0D | Возврат каретки |
\t | 9 | 0х09 | Табуляция |
\v | 11 | 0х0В | Вертикальная табуляция |
\ | 92 | 0х5С | Обратная черта |
\' | 44 | 0х2С | Апостроф |
\" | 34 | 0х22 | Кавычка |
\? | 63 | 0х3 F | Знак вопроса |
\0 | Восьмеричное число, от 1 до 3 цифр | ||
\XHHH и \xhhh | 0xhhh | Шестнадцатеричное число |
Функция printf имеет специальные форматирующие спецификации (символы) для вывода переменных. Общий вид этих спецификаций таков: