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




План

Одномерные массивы.. 1

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

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

Строки. 6

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

Некоторые библиотечные функции обработки строк. 8

Функция strcpy () 8

Функция strcat () 9

Функция strcmp() 9

Функция strlen () 10

Использование признака завершения строки. 12

Массив (array) — это коллекция перемен­ных одинакового типа, обращение к которым происходит с применением общего для всех имени. В С++ - массивы могут быть одно- или многомерными, хотя в основном используются одномерные массивы. Массивы представляют собой удобное средство группирования связанных переменных.

Чаще всего используются символьные массивы, в которых хранятся строки. Как упоминалось выше, в C++ не определен встроенный тип данных для хранения строк. Поэтому строки реализуются как массивы символов. Такой подход к реализации строк дает С++ - программисту больше "рычагов" управления по сравнению с теми языками, в кото­рых используется отдельный строковый тип данных.

Одномерные массивы

Одномерный массив — это список связанных переменных. Для объявления одномер­ного массива используется следующая форма записи:

тип имя_массива [размер];

Здесь с помощью элемента записи тип объявляется базовый тип массива. Базовый тип определяет тип данных каждого элемента, составляющего массив. Количество элемен­тов, которые будут храниться в массиве» определяется элементом размер. Например, при выполнении приведенной ниже инструкции объявляется int-массив (состоящий из 10 элементов) с именем sample, int sample[10];

Индекс идентифицирует конкретный элемент массива.

Доступ к отдельному элементу массива осуществляется с помощью индекса. Индекс описывает позицию элемента внутри массива. В C++ первый элемент массива имеет нулевой индекс. Поскольку массив sample содержит 10 элементов, его индексы изменя­ются от 0 до 9. Чтобы получить доступ к элементу массива по индексу, достаточно ука­зать нужный номер элемента в квадратных скобках. Первым элементом массива sample является sample[0], а последним — sample[9]. Например, следующая программа помещает в массив sample числа от 0 до 9.

// Masiv1.cpp

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{

int sample[10]; // Эта инструкция резервирует область

// памяти для 10 элементов типа int. int t;

// Помещаем в массив значения

for(int t=0; t<10; ++t) sample[t]=t;

// Отображаем массив,

for(int t=0; t<10; ++t) cout << sample[t] <<' ';

_getch();

return 0;

}

В C++ все массивы занимают смежные ячейки памяти. (Другими словами, элементы массива в памяти расположены последовательно друг за другом.) Ячейка с наименьшим адресом относится к первому элементу массива, а с наибольшим — к последнему. Например, после выполнения этого фрагмента кода

int i[7];

int j;

for(j=0; j<7; j++) i[j]= j;

массив i будет выглядеть следующим образом.

Для одномерных массивов общий размер массива в байтах вычисляется так:

всего байтов = размер типа в байтах х количество элементов

Массивы часто используются в программировании, поскольку позволяют легко обрабатывать большое количество связанных переменных.

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

 

// Masiv2.cpp:

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <math.h> // или #include <cstdlib>

using namespace std;

int main()

{

int sample[10]; // Эта инструкция резервирует область

// памяти для 10 элементов типа int.

int t;

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

for(t=0; t<10; ++t) sample[t]=rand();

// Отображаем массив,

for(t=0; t<10; ++t) cout << sample[t] <<' ';

_getch();

return 0;

}

 
 

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

#include <iostream> #include <cstdlib> using namespace std;

int main ()

{

int i, min, max;

int list[10];

for(i=0; i<10; i++) list[i] = rand();

// Находим минимальное значение.

min = list[0];

for(i=l; i<10; i++)

if(min > list[i]) min = list[i];

cout << "Минимальное значение: " << min << '\n';

// Находим максимальное значение.

max = list[0];

for(i=l; i<10; i++)

if{max< list[i]) max= list[i];

cout << "Максимальное значение:” << max<< '\n’;

return 0;

}

В C++ нельзя присвоить один массив другому. В следующем фрагменте кода, например, присваивание а = b; недопустимо.

int а[10], b[10];

//..

а =b; // Ошибка!?!

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

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

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

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

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

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

int main()

{

int crash[10],i;

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

return 1;

}

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

Язык 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 <<'\n';

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

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

for(b=size-l; b>=a; b--)

{

if(nums[b-l] > nums[b])

{

// Элементы неупорядочены.

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

t = nums[b-1];

nums[b-l] = nums[b];

nums[b] = t;

}

}

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

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

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

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

return 0;

}

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

Строки

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

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

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

char str [11];

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

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

"Привет"

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

"#$%@@#$"

" "

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

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: