Типы определяемые программистом.

Массив

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

Float a[10];

нумеруется от 0

int b[5] = {0, 1, 3} инициализация.

Элементы которым в списки инициализации ничего не соответствуют обнуляются.

Int c[] = {5,8,14} – тогда компилятор объявит массив с 3 элементами.

Если границы не указаны, то должна быть инициализация.

Размерность массива может быть указана только целой положительной константой или константным выражением.

 

Преобразование целочисленного значения массив символов

#include<iostream>

int main()

{

const char zero = '0';

char cipher;

cost short maxlen = 12;

short j, k,number;

char buffer[maxlen];

cin >> number;

k = 0;

do

{

buffer[k++] = number % 10 + zero;

number = number / 10

}

while(number > 0)

k—;

for(j=k; j >=0; j—_

count << buffer[j];

return 0;

}

 

Сортировка целочисленного массива методом выбора.

#include<iostream>

using namespace std;

int main()

{

const int n = 20;

int b[n], i;

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

{

cin >> b[i];

}

for(i = 0; i < n-1; i++)

{

int imin = i;

for (int j = i+1; j < n; j++)

{

if (b[j] < b[imin])

{

imin = j;

}

}

int a = b[i];

b[i] = b[imin];

b[imin] = a;

}

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

{

cout << b[i]<< endl;

}

return 0;

}

 

Для ускорения поиска в информационных системах данные предварительно упорядочиваются по некоторому признаку. Например по возрастанию числовых значений или по алфавиту.

Ускорение поиска достигается за счет последовательного уменьшения области поиска примерно в 2 раза. Т.к. На k шаге область поиска уменьшается примерно в 2 ^ k раз, то местоположение искомого значения в совокупности из n элементов. Можно найти за число шагов не превышающего log n(по основанию 2).

 

Этот алгоритм называется дихотомия. Последовательное уменьшение поиска.

 

#include<iostream>

using namespace std;

int main()

{

const short n=5;

short left, right, center;

int x, A[n];

bool found = false;

cin >> x;

for(left = 0; left < n; left++)

cin >> A[n];

left = 0;

right = n-1;

do

{

center = (left+right)/2;

if (x<A[center])

right = center - 1;

else

if(x > A[center])

left = center + 1;

else

found = true;

}

while (left <= right && !found);

if (found)

cout << "Nomber-" << center << endl;

else

cout << "Not found"<< endl;

return 0;

}

 

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

 

Рассмотрим пример.

Копирование элементов одного массива в другой.

#include<iostream>

using namespace std;

int main()

{

int a[100],b [100];

int *pa = a;

int *pb = b;

...

for (int i = 0; i < 100; i++)

*pb = *pa++;// b[i] = a[i]

...

return 0;

}

 

 

Динамические массивы создаются с использованием операции new

int n = 100;

float *p = new float[n];

// создается переменная указатель (р) на поле памяти типа float и в динамической памяти отводится непрерывная область для размещении 100 элементов типа float. Адрес начала этой области предается переменной р.

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

Доступ к элементам динамического массива осуществляется также как к статическим.

p[5] <=> *(p+5)

 

Многомерные массивы задаются указанием каждого измерения.

int matr[5][6]

Массив содержащий 5 строк и 6 столбцов.

В памяти элементы многомерного массива представляются последовательно. Так сто переходе к следующему элементу быстрее меняется паратый индекс.

То есть в памяти элементы матрицы располагаются по строкам.

 

Для доступа к элементам многомерного массива указываются все его индексы.

matr[i][j]

*(matr[i] + j) или *(*(matr + i)+j)

 

Рассмотрим пример:

В целочисленной матрице найти номер строки, содержащий наибольшее количество нулевых элементов.

#include<iostream>

using namespace std;

int main()

{

const int nstr = 4, nstb = 5;

int b[nstr][nstb];

int i, j;

for (i = 0; i < nstr; i++)

for(j = 0; j < nstb; j++)

cin >> b[i][j];

int istr = -1, Maxkol = 0;

for(i = 0; i < nstr; i++)

{

int kol = 0;

for( j = 0l j < nstb; j++)

if (b[i][j] == 0)

kol++;

if(kol > Maxkol)

{

istr = i;

Maxkol = kol;

}

}

cout << "Mass" << endl;

for (i = 0; i < nstr; i++)

for(j = 0; j < nstb; j++)

cout << b[i][j]<<' ';

cout << '\n';

if (istr == -1)

cout<<"Zero no";

else

cout<<"Nomber str"<<istr;

return 0;

}

 

Для создания динамического многомерного массива в операторе new необходимо указать все его размерности.

 

int **m = (int**) new int [nstr][10];

 

Память под двумерный массив можно также выделить программно:

int nstr, nstb;

cout << "ВВедите число строк и столбцов";

cin >> nstr >> nstb;

int **a = new int *[nstr];

for(int i = 0; i < nstr; i++)

a[i] = new int [nsrb];

 

//Дана целочисленная матрица. определить номер строки содержащий наибольшее колличество элементтов

#include<iostream>

#include<cmath>

using namespace std;

 

int main()

{

const int kol_str = 4, kol_stolb = 5;

int b[kol_str][kol_stolb];

int i, j;

for ( i = 0; i < kol_str; i++)

for (j = 0; j < kol_stolb; j++)

cin b[i][j];

int istr = -1, max_kol = 0;

for (i = 0; i <kol_str; i++)

{

int kol = 0;

for(j = 0; j < kol_stolb; j++)

if(b[i][j] == 0) kol++;

if(kol

}

return 0;

}

 

 

каждому элементу массива указалетей на строки a[i] присваевается вдрес поля памяти, веделенного под строку двумерного массива

int **a = new int *[nstr];

for (int I = 0; i< nstr; i++)

a[i]=new int[nstb]

 

освобождение памяти выделенное под динамический массив осуществляется операцией delete[]

 

замечание: *p[10] — массив из десяти указателей, а не указательный массив.

 

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

Нуль символ — это символ код которого равен 0 '\0'

по положению 0 символа определяется фактическая длинна строки.

//gпример

#include<iostream>

#include<cmath>

using namespace std;

 

int main()

{

char str[10] = "Primer";

/*str[0] - 'p'

str[1] - 'r'

str[5] - 'r'

str[6] - '\0'

*/

char str[] = "primer"

return 0;

}

 

Языком с++ не предусмотрены операции присваивание одной строки другой, сравнение. Эти операции приходиться программировать в ручную.

Возможности копирование, сравнения, объединения строк, поиска подстроки, определения длинны строки заложены в библиотеке функции с++.

 

strstr(a,b) = true or false – сравнение

strlen(a) – длина

#inclede <string>

 

//gпример программа для запроса пароля не более 3 раз

#include<iostream>

#include <string>

 

using namespace std;

 

int main()

{

char s[80], passw[]="kuku";

int i, k =0;

for(i = 0; !k && i<3; i++)

{

cout << "enter password";

gets(s);//функция ввода строки

if (strstr(s,passw)) k =1;

}

if (k) cout <<"enter ok";

else cout << "no pasw";

return 0;

}

 

копирование строки в строку можно запрограммировать циклом.

Szc → dest

char szc[10], dest[10];

for(int I = 0; i<=strlen(szc);i++)

dest[i] = szc[i]

 

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