Автор: Пользователь скрыл имя, 17 Января 2011 в 18:57, курс лекций
6 тем.
{
int n=10;
int *a=new int [n];
for (int i=0; i<n;i++)
a[i]=i*i;
print(a, 10 );
return 0;
}
Результат работы программы:
0 1 4 9 16 25 36 49 64 81
Поскольку массив всегда передается в функцию по адресу, то все изменения, внесенные в формальный параметр массив, отразятся на фактическом параметре массиве. Если необходимо запретить изменение массива в функции, то его нужно передавать как параметр константу. Например:
int sum ( const int * mas , const int n )
{ … }
Массив
как возвращаемое
значение функции
Массив может возвращаться в качестве значения функции только как указатель:
#include <iostream>
using namespace std;
int * create(int n)
{
int *mas=new int [n];
for (int i=0; i<n;i++)mas[i]=i*i;
return mas;
}
void print (int *mas, int n)
{
for (int i=0; i<n; i++)
cout<<mas[i]<<"\t";
}
int main()
{
int n=5;
int *a=create( n );
print(a,n);
return 0;
}
Результат работы программы:
0 1 4 9 16
Замечание. В общем случае нельзя возвращать из функции указатель на локальную переменную, поскольку память,выделенная под локальную переменную, освобождается после выхода из функции. Например:
int * f ()
{
int a =5;
return & a ; //нельзя!!!
}
Однако в случае с динамическим массивом mas, который является указателем на область данных в куче, такое действие возможно. Команда return mas возвратит в качестве значения функции адрес в куче, начиная с которого последовательно хранятся элементы массива. После этого локальная переменная mas перестанет существовать и освободится соответствующая ей область стека (см. раздел 2.5). Но куча при этом не освобождается, поэтому элементы массива будут нам доступны.
6.4. Примеры использования одномерных массивов
Одномерные массивы удобно использовать тогда, когда данные можно представить в виде некоторой последовательности, элементы которой проиндексированы. Напомним, что индексация элементов в одномерном массиве в С++ начинается с нуля. При решении задач мы будем использовать статические массивы и обращаться к элементам через индексы.Однако мы советуем вам попробовать модифицировать данные задачи для работы с динамическими массивами.
1. Дан массив из
10 целых чисел. Написать
#include <iostream>
using namespace std;
int main ()
{
int n ;
cout <<" n =";
cin >> n ; //ввели количество элементов массива
int a [ n ]; // объявляем статический массив размерностью n
for ( int i =0; i < n ; ++ i ) //ввод и обработка данных
{
cout <<" a ["<< i <<"]=";
cin >> a [ i ]); // ввод очередного элемента
if ( a [ i ]<0) //если i-тый элемент массива отрицательный,
a [ i ]=0;
} //то заменяем его нулем
for (int i=0;i<10;++i)
cout<<a[i]<<"\t";// вывод
return 0;
}
Результат работы программы:
Исходные данные
2 –4 1 2 –2 0 23 –12 1 -1
Измененные данные
2 0 1 2 0 0 23 0 1 0
2. Дан массив из n целых чисел (n £ 100). Написать программу для подсчета среднего арифметического четных значений данного массива.
#include <iostream>
using namespace std;
int main()
{ int n;
cout<<"n=";
cin>>n;
int a[n], k=0;
float s=0;
for (int i=0;i<n; ++i)
{
cout <<" a ["<< i <<"]=";
cin >> a [ i ]; //ввод очередного элемента в массив
if (!( a [ i ]%2)) // если остаток при делении элемента на 2 равен 0
{
s += a [ i ];
++ k ;
} //то элемент четный -добавить его к сумме и увеличить
} // количество четных элементов на 1
if ( k ) //если k не нулевое,то четные числа в последовательности есть
cout <<" sr ="<< s / k << endl ; //и можно вычислить их среднее арифметическое значение
else
cout <<" четных
чисел в последовательности
return 0;
}
Результат
работы программы
Первая строка для n
= 5
Вторая строка для n = 4
Исходные данные | Ответ |
137–419 | четных чисел в последовательности нет |
246 4 | sr = 4.00 |
Замечание . Выражение a [ i ]%2 будетдават
3. Дан массив из
n действительных чисел (n £ 100).
Написать программу,
#include <iostream>
using namespace std;
int main()
{
int n;
cout<<"n=";
cin>>n;
float a[n];
for (int i=0;i<n; ++i)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
//первоначально полагаем элемент с номером 0 минимальным и максимальным
float min=a[0], max=a[0];
int nmin =0, nmax =0;
for ( int i =1; i < n ; ++ i ) //поиск наибольшего и наименьшего значения в массиве и их номеров
{
if (a[i]<min)
{
min=a[i];
nmin=i;
}
if (a[i]>max)
{
max=a[i];
nmax=i;
}
}
a [ nmax ] = min ; //в позицию наименьшего элемента записываем значение наибольшего
a [ nmin ] = max ; //в позицию наибольшего элемента записываем значение наименьшего
for ( int i =0; i < n ; ++ i )
cout << a [ i ]<<"\ t "; //выводим измененный массив на экран
return 0;
}
Результат работы программы
n=4
Исходные данные | Измененные данные |
1.13.4–41.29.9 | 1.13.49.9-41.2 |
6.5. Двумерные массивы
Двумерные массивы (матрицы, таблицы) – представляют собой фиксированное количество элементов одного и того же типа, объединенных общим именем, где каждый элемент определяется номером строки и номером столбца, на пересечении которых он находится. Нумерация строк и столбцов начинается с нулевого номера. Поэтому если массив содержит три строки и четыре столбца, то строки нумеруются: 0, 1,2; а столбцы: 0, 1, 2, 3. В С++ двумерный массив реализуется как одномерный,каждый элемент которого также массив. При этом массивы бывают статические и динамические.
Статические двумерные массивы
Формат объявления статического двумерного массива:
<базовый тип> <имя массива>[число строк][число столбцов]
Замечания
1) В данном случае
[] являются операцией индексации,
а не признаком
2) Память под статический массив выделяется на этапе объявления массива в стеке или сегменте данных (в зависимости от спецификатора класса памяти, указанного явно или используемого по умолчанию).
Одновременно с
объявлением массива может
//вещественный массив из 4строк и 3 столбцов, массив не инициализирован
float a[4][3];
/*целочисленный массив из 3строк и 2 столбцов, в нулевой строке записаны
единицы, в первой строке - двойки, во второй строке – тройки */
int b[3][2]={1,1, 2, 2, 3, 3} ;
//аналог массива b, но так как количество строк и столбцов не указано явным образом, то содержимое каждой строки помещается в дополнительные фигурные скобки*/
int c[][]={{1,1}, {2, 2}, {3, 3}};
Для обращения к элементу двумерного массива нужно указать имя массива, номер строки и номер столбца (каждый в отдельной паре квадратных скобок), на пересечении которых находится данный элемент массива, например, для массива a обратиться к элементу, расположенному на пересечении строки с номером 0 и столбца с номером 3, можно так: a [0][3].
Ввод и вывод двумерного массива осуществляется поэлементно. В следующем фрагменте программы производится потоковой ввод и вывод элементов целочисленного массива, содержащего 4 строки и 5 столбцов:
int b [4][5]; //объявление массива
for ( int i = 0; i <4; ++ i ) //ввод элементов массива
for (intj = 0; j<5; ++j)
{
cout<<”b[”<<i<<”][”<<j<<”]=”;
cin>>b[i][j];
}
…
for (int i = 0; i<4; ++i,cout<<endl) // вывод
for (int j = 0; j<5; ++j)
cout<<”b[”<<i<<”][”<<j<<”]=”<<
Динамический
двумерные массивы
Замечание. Напомним, динамические массивы отличаются от статических тем, что имя массива является указателем-переменной,а память под элементы массива выделяется программистом в куче с помощью специальной команды new.
Формат объявления динамических массивов:
<базовый тип> ** <имя массива>= new <базовый тип> *[<размерность массива>];
Замечание. В данном случае [] являются операцией индексации, а не признаком необязательного элемента в формате объявления массива.
Например :
int **a= new int *[10];
В данном случае переменная а является указателем на массив указателей целого типа. Чтобы из него получить двумерный массив нам потребуется выделить память под каждый из десяти указателей. Это можно сделать с помощью цикла: