|
Хочу получить удостоверение. Сколько стоит оплата? |
Одномерные массивы
Массивами являются переменные, содержащие несколько элементов одного типа. Доступ к отдельному элементу осуществляется с помощью его индекса. Элементы массива располагаются в памяти компьютера последовательно, и индекс первого элемента равен нулю. Имя массива является постоянным значением, представляющим собой адрес первого элемента.
Для того чтобы работать с элементами массива нужно в начале его объявить (задать тип составляющих его элементов), а затем инициализировать его, т.е. присвоить элементам массива определенные значения.
Рассмотрим несколько вариантов определения и инициализации массивов. В первом случае с помощью директив препроцессора #define определяется размер массивов, затем указывается тип их элементов, после чего уже инициализируются элементы.
В приводимой ниже программе производится интерполяция функции методом Лагранжа.
//==========================================================
// Name : lagrange_interpolation.cpp
// Author : Marat
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;
//Размер массива
#define array_size 5
int main() {
double x[array_size], y[array_size];
int i,k;
double z; //Вводимое значение X
double p; //
double g; //Интерполируемое значение Y
for(i=0;i<array_size;i++)
{
cout<<"\nx["<<i+1<<"] = "; cin>>x[i];
cout<<"\ny["<<i+1<<"] = "; cin>>y[i];
}
cout<<"\nFor what X value do you want calculate Y one? So, X = ";
cin>>z;
g=0;
for(k=0;k<array_size;k++)
{
p=1;
for(i=0;i<array_size;i++)
{
if(i==k) goto alpha;
p*=(z-x[i])/(x[k]-x[i]);
alpha:; }
g+=p*y[k];
}
cout<<"\nX = "<<z<<", Y = "<<g<<endl;
return 0;
}
Результат:
x[1]=0 y[1]=0 x[2]=1 y[2]=1 x[3]=2 y[3]=4 x[4]=3 y[4]=9 x[5]=4 y[5]=16 For what X value do you want to calculate Y one? So, X = 2.5 X=2.5, Y=6.25
Рассмотрим другие способы определения и инициализации массивов.
//==========================================================
// Name : array_properties_1.cpp
// Author : Marat
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;
int main() {
//Одновременно с заданием типа элементов массива
//происходит и инициализация элементов
double d[5]={1.2, 6.4, -8, 0.378, 5.6};
for(int i=0;i<5;i++)
{
cout<<"\nd ["<<i+1<<"] = "<<d[i];
}
cout<<"\n"<<endl;
//Количество элементов массива заранее не известно
char country[]="Russia";
//Определим количество элементов символьного массива
//В связи с тем, что в конце строки
//ставится символ '\0' вычитаем единицу
int n=sizeof(country)/sizeof(country[0])-1;
for(int i=0;i<n;i++)
{
cout<<"\ncountry ["<<i+1<<"] = "<<country[i];
}
cout<<"\n"<<endl;
return 0;
}
Результат:
d [1] = 1.2 d [2] = 6.4 d [3] = -8 d [4] = 0.378 d [5] = 5.6 country [1] = R country [2] = u country [3] = s country [4] = s country [5] = i country [6] = a
В первом случае мы явно указываем количество элементов массива (5), а также их тип (double), а затем присваиваем элементам значения (числа в фигурных скобках, разделенные запятой). При этом очень важно, чтобы количество элементов массива, находящихся в скобках не превышало заданный размер массива (иначе компилятор выдаст сообщение об ошибке).
Во втором случае мы заранее не знаем количество элементов символьного массива и пишем char country[] (country – имя массива). Для того чтобы найти количество элементов этого массива используем функцию sizeof().
Функция sizeof()
Эта функция используется двояко. С одной стороны с ее помощью можно определять размер памяти (количество байт), выделяемых под одну переменную определенного типа, например так: sizeof(int). С другой стороны, можно определять объем памяти, выделяемый под весь массив: sizeof(имя_массива), или под какой-либо из его элементов: sizeof(имя_массива[i]).
//==========================================================
// Name : size_of.cpp
// Author : Marat
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;
int main() {
cout<<"\nsizeof(char) = "<<sizeof(char);
//символьный
cout<<"\nsizeof(short) = "<<sizeof(short);
//короткое целое
cout<<"\nsizeof(int) = "<<sizeof(int);
//целое
cout<<"\nsizeof(long) = "<<sizeof(long);
//длинное целое
cout<<"\nsizeof(float) = "<<sizeof(float);
//вещественное
cout<<"\nsizeof(double) = "<<sizeof(double);
//вещественное двойной точности
cout<<"\nsizeof(long double) = "<<sizeof(long double);
//длинное вещественное двойной точности
cout<<"\n"<<endl;
double a[]={1.35, 6.12, -.6389, 41.4};
int b=sizeof(a);
//Количество байт, отводимых под массив
int c=sizeof(a[0]);
//Количество байт, отводимых под первый элемент
int n=b/c;
//Размер массива
cout<<"\nTotal memory, allocated to array = "<<b;
cout<<"\nMemory, allocated to first arrays member = "<<c;
cout<<"\nArray's size = "<<n;
cout<<"\n"<<endl;
return 0;
}
Результат:
sizeof(char) = 1 sizeof(short) = 2 sizeof(int) = 4 sizeof(long) = 4 sizeof(float) = 4 sizeof(double) = 8 sizeof(long double) =8 Total memory, allocated to array = 32 Memory, allocated to first arrays member = 8 Array's size = 4
Если мы, предположим, объявили целочисленный массив из десяти элементов, а сами указали только пять, то оставшиеся 5 элементов этого массива будут пустыми (это вполне нормально):
//==========================================================
// Name : array_properties_2.cpp
// Author : Marat
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;
int main() {
int a[10]={1, 4, 5, 8, 9};
for(int i=0;i<10;i++)
{
cout<<"\na["<<i<<"] = "<<a[i];
}
cout<<"\n"<<endl;
return 0;
}
Результат:
a [0] = 1 a [1] = 4 a [2] = 5 a [3] = 8 a [4] = 9 a [5] = 0 a [6] = 0 a [7] = 0 a [8] = 0 a [9] = 0
В следующем примере решения уравнения линейной регрессии с помощью функции sizeof определяется размер массивов.
//==========================================================
// Name : linear_regression.cpp
// Author : Marat
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;
#include<math.h>
//Решение уравнения линейной регрессии
//y=ax+b
int main() {
double x[]={0, 0.9, 1.98, 3.05, 4.2, 5.02, 6.3};
double y[]={1, 3.1, 4.8, 7.2, 8.9, 11.5, 12.7};
int n=sizeof(x)/sizeof(x[0]);
double s1=n;
double s2=0;
double s3=0;
double s4=0;
double s5=0;
for(int i=0;i<n;i++)
{
s2+=x[i];
s3+=y[i];
s4+=pow(x[i],2);
s5+=y[i]*x[i];
}
double d1=s1*s4-pow(s2,2);
double d2=s3*s4-s5*s2;
double d3=s1*s5-s2*s3;
double a=d2/d1;
double b=d3/d1;
for(int i=0;i<n;i++)
{
cout<<"\nx["<<i<<"] = "<<x[i]<<"\t y["<<i<<"] = "<<y[i];
}
cout<<"\nRegression equation is following ";
cout<<"\nY = "<<a<<" + "<<b<<"*x ";
double s=0;
for(int i=0;i<n;i++)
{
s+=pow((y[i]-(a+b*x[i])),2);
}
cout<<"\nSum of square deviations is "<<s<<endl;
return 0;
}
Результат:
x[0]=0 y[0]=1 x[1]=0.9 y[1]=3.1 x[2]=1.98 y[2]=4.8 x[3]=3.05 y[3]=7.2 x[4]=4.2 y[4]=8.9 x[5]=5.02 y[5]=11.5 x[6]=6.3 y[6]=12.7 Regression equation is following Y=1.20386+1.90084*X Sum of square deviations is 1.204