скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Лекции по C++

(Листинг 6.3а. исходный текст программы MINMAX.CPP)

(Листинг 6.3. исходный текст программы MINMAX.CPP)

СОРТИРОВКА массива - ПРИМЕР в файле list6_4cpp.

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

-      ПОИСК в массиве

означает нахождение в массиве элемента, совпадающего с заданным значением. Методы поиска делятся на две группы: для упорядоченных и неупорядоченных массивов. Метод линейного поиска применяется для неупорядоченных массивов, а метод двоичного поиска - для сортированных массивов. (Пример - list6_5.cpp)

 Рассмотрим понятия ПАРАМЕТРОВ-ФУНКЦИЙ и УКАЗАТЕЛИ НА ФУНКЦИИ:

(Листинг 6.5. исходный текст программы SEARCH.CPP)

БИБЛИОТЕЧНЫЕ ФУНКЦИИ ПОИСКА и СОРТИРОВКИ в непрерывных массивах:

*/

 void *bsearch(const void *key, const void *base, size_t nelem,

    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 имеет специальные форматирующие спецификации (сим­волы) для вывода переменных. Общий вид этих спецификаций таков:

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.