Типы определяемые программистом.
Массив
Массив- именованная конечная совокупность значений, каждый из которых связанный с величиной называемой индексом.
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 вычисляет длинну, то более эффективным будет использованием проверки на нуль символ, непосредственно в цикле