Лекции.ИНФО


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



На границах массивов погранзаставы нет

В C++ не выполняется никакой проверки "нарушения границ" массивов, т.е. ничего не может помешать программисту обратиться к массиву за его пределами. Если это происходит при выполнении инструкции присваивания, могут быть изменены значения в ячейках памяти, выделенных некоторым другим переменным или даже вашей программе. Другими словами, обращение к массиву (размером N элементов) за границей N-гo элемента может привести к разрушению программы при отсутствии каких-либо замечаний со стороны компилятора и без выдачи сообщений об ошибках во время работы программы. Это означает, что вся ответственность за соблюдение границ массивов лежит только на программистах, которые должны гарантировать корректную работу с массивами. Другими словами, программист обязан использовать массивы достаточно большого размера, чтобы в них можно было без осложнений помещать данные, но лучше всего в программе предусмотреть проверку пересечения границ массивов.

Например, С++-компилятор "молча" скомпилирует и позволит запустить следующую программу на выполнение, несмотря на то, что в ней происходит выход за границы массива crash.

Осторожно! Не выполняйте следующий пример программы. Это может разрушить вашу систему.

// Некорректная программа. Не выполняйте ее!

Int main()

{

 int crash[10], i;

 for(i=0; i<100; i++) crash[i]=i;

 return 1;

}

В данном случае цикл for выполнит 100 итераций, несмотря на то, что массив crash предназначен для хранения лишь десяти элементов. При выполнении этой программы возможна перезапись важной информации, что может привести к аварийной остановке программы.

Вас, возможно, удивляет такая "непредусмотрительность" C++, которая выражается в отсутствии встроенных средств динамической проверки на "неприкосновенность" границ массивов. Напомню, однако, что язык C++ предназначен для профессиональных программистов, и его задача — предоставить им возможность создавать максимально эффективный код. Любая проверка корректности доступа средствами C++ существенно замедляет выполнение программы. Поэтому подобные действия оставлены на рассмотрение программистам. Как будет показано ниже в этой книге, при необходимости программист может сам определить тип массива и заложить в него проверку нерушимости границ.

Сортировка массива

Одной из самых распространенных операций, выполняемых над массивами, является сортировка. Существует множество различных алгоритмов сортировки. Широко применяется, например, сортировка перемешиванием и сортировка методом Шелла. Известен также алгоритм Quicksort (быстрая сортировка с разбиением исходного набора данных на две половины так, что любой элемент первой половины упорядочен относительно любого элемента второй половины). Однако самым простым считается алгоритм сортировки пузырьковым методом. Несмотря на то что пузырьковая сортировка не отличается высокой эффективностью (и в самом деле, его производительность неприемлема для сортировки больших массивов), его вполне успешно можно применять для сортировки массивов малого размера.

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

В следующей программе реализована сортировка массива (целочисленного типа), содержащего случайные числа. Эта программа заслуживает внимательного разбора.

// Использование метода пузырьковой сортировки

// для упорядочения массива.

#include <iostream>

#include <cstdlib>

using namespace std;

Int main()

{

 int nums[10];

 int a, b, t;

 int size;

 size = 10; // Количество элементов, подлежащих сортировке.

 // Помещаем в массив случайные числа.

 for(t=0; t<size; t++) nums[t] = rand();

 // Отображаем исходный массив.

 cout << "Исходный массив: ";

 for(t=0; t<size; t++) cout << nums[t] << ' ';

 cout << '';

 // Реализация метода пузырьковой сортировки.

 for(a=1; a<size; а++)

  for(b=size-1; b>=a; b--) {

   if(nums[b-1] > nums[b]) { // Элементы неупорядочены.

    // Меняем элементы местами.

    t = nums[b-1];

    nums[b-1] = nums[b];

    nums[b] = t;

   }

  }

 }

 // Конец пузырьковой сортировки.

 // Отображаем отсортированный массив.

 cout << "Отсортированный массив: ";

 for(t=0; t<size; t++)

  cout << nums[t] << ' ';

 return 0;

}

Хотя алгоритм пузырьковой сортировки пригоден для небольших массивов, для массивов большого размера он становится неэффективным. Более универсальным считается алгоритм Quicksort. В стандартную библиотеку C++ включена функция qsort(), которая реализует одну из версий этого алгоритма. Но, прежде чем использовать ее, вам необходимо изучить больше средств C++. (Подробно функция qsort() рассмотрена в главе 20.)

Строки

Чаще всего одномерные массивы используются для создания символьных строк. В C++ строка определяется как символьный массив, который завершается нулевым символом ('0'). При определении длины символьного массива необходимо учитывать признак ее завершения и задавать его длину на единицу больше длины самой большой строки из тех, которые предполагается хранить в этом массиве.

Строка — это символьный массив, который завершается нулевым символом.

Например, объявляя массив str, предназначенный для хранения 10-символьной строки, следует использовать следующую инструкцию.

char str [11];

Заданный здесь размер (11) позволяет зарезервировать место для нулевого символа в конце строки.

Как упоминалось выше в этой книге, C++ позволяет определять строковые литералы. Вспомним, что строковый литерал — это список символов, заключенный в двойные кавычки. Вот несколько примеров.

"Привет"

"Мне нравится C++"

"#$%@@#$"

""

Строка, приведенная последней (""), называется нулевой. Она состоит только из одного нулевого символа (признака завершения строки). Нулевые строки используются для представления пустых строк.

Вам не нужно вручную добавлять в конец строковых констант нулевые символы. С++-компилятор делает это автоматически. Следовательно, строка "ПРИВЕТ" в памяти размещается так, как показано на этом рисунке:

Считывание строк с клавиатуры

Проще всего считать строку с клавиатуры, создав массив, который примет эту строку с помощью инструкции cin. Считывание строки, введенной пользователем с клавиатуры, отображено в следующей программе.

// Использование cin-инструкции для считывания строки с клавиатуры.

#include <iostream>

using namespace std;

Int main()

{

 char str[80];

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

  cin >> str; // Считываем строку с клавиатуры.

 cout << "Вот ваша строка: ";

 cout << str;

 return 0;

}

Несмотря на то что эта программа формально корректна, она не лишена недостатков. Рассмотрим следующий результат ее выполнения.

Введите строку: Это проверка

Вот ваша строка: Это

Как видите, при выводе строки, введенной с клавиатуры, программа отображает только слово "Это", а не всю строку. Дело в том, что оператор ">>" прекращает считывание строки, как только встречает символ пробела, табуляции или новой строки (будем называть эти символы пробельными).

Для решения этой проблемы можно использовать еще одну библиотечную функцию gets(). Общий формат ее вызова таков.

gets(имя_массива);

Если в программе необходимо считать строку с клавиатуры, вызовите функцию gets(), а в качестве аргумента передайте имя массива, не указывая индекса. После выполнения этой функции заданный массив будет содержать текст, введенный с клавиатуры. Функция gets() считывает вводимые пользователем символы до тех пор, пока он не нажмет клавишу <Enter>. Для вызова функции gets() в программу необходимо включить заголовок <cstdio>.

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

// Использование функции gets() для считывания строки с клавиатуры.

#include <iostream>

#include <cstdio>

using namespace std;

Int main()

{

 char str[80];

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

 gets(str); // Считываем строку с клавиатуры.

 cout << "Вот ваша строка: ";

 cout << str;

 return 0;

}

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









Читайте также:

  1. I – внешняя среда II – мембрана III – содержимое клетки
  2. S:Укажите вид предложения: Рассказать об этом человеке хотелось так, чтобы придерживаться фактов и чтобы было интересно. (Д.Гранин)
  3. Активные морфонологические процессы в структуре русского производного слова.
  4. Асимметрия производного слова как отражение
  5. Ащита населения и территорий от чрезвычайных ситуаций природного характера (стихийных бедствий)
  6. Билет № 11. Дизъюнкция высказываний и её свойства (доказательство одного из них).
  7. В данном курсовом проекте необходимо произвести расчет загрузки и оценить мореходные качества т/х «Олюторский залив» на рейс заданной дальностью .
  8. В какой мере ребенок проявляет свою способность к саморазвитию? В чем Вы видите необходимость воспитания?
  9. В некоторых случаях необходимо выполнить расчет зануления для конкретных электродвигателей.
  10. В то время как использование одного Laetrile во многих случаях оказывается эффективным, все же лучшие результаты обычно достигаются вместе с побочной терапией.
  11. В. ПРИНЦИП МЕЖДУНАРОДНОГО ДЕПОНИРОВАНИЯ
  12. Ввод данных из входного порта


Последнее изменение этой страницы: 2016-03-17; Просмотров: 116;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная