Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Одномерные массивы: объявление, инициализация, задачи поиска, замены и перестановок элементов массива

Поиск

Одномерные массивы: объявление, инициализация, задачи поиска, замены и перестановок элементов массива

Массив – именованная последовательность областей памяти, хранящих однотипные элементы. Каждая такая область памяти называется элементом массива. Массивы обладают размерностью (большей или равной единице), которой задается число элементов, содержащихся в них, а также измерением, что предполагает возможность описания в программе одно- и многомерных массивов. Количество элементов в массиве называется его размером.

Простейшим аналогом двумерного массива может быть таблица, а трехмерного – несколько таблиц одинакового размера. Математические объекты типа вектор и матрица – примеры аналогов (соответственно одно- и двумерных) массивов.

Тип элемента массива может быть одним из базовых (скалярных), типом другого массива, типом указателя, типом структуры или объединения.

Элементы массива в С++ нумеруется, начиная с нуля. У одномерных массивов после его имени указывается один индекс (порядковый номер), заключенный в прямоугольные скобки [ ], а у многомерных – несколько, каждый из которых заключается в [ ]. Последнее означает, что многомерный массив создается путем определения массива из элементов типа массив.

Все элементы массива имеют одно имя – имя массива и отличаются индексами – порядковыми номерами в массиве. В определении массива можно задать его размерность по каждому измерению. Допустимо явное задание массива либо с помощью указателя (объекта, хранящего адрес начала области набора значений). Резервирование памяти для массива выполняется на этапе компиляции программы.

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

1. Объявление одномерных массивов.

Синтаксис определения массива без дополнительных спецификаторов и модификаторов имеет два формата:

Тип ИмяМассива[ВыражениеТипаКонстанты];

или

Тип ИмяМассива[];

ИмяМассива – идентификатор массива.

Тип – тип элементов объявляемого массива. Элементами массива не могут быть функции, файлы и элементы типа void.

ВыражениеТипаКонстанты – задает количество элементов (размерность) массива. Выражение константного типа вычисляется на этапе компиляции. Данное константное выражение может быть опущено в случаях если:

· при объявлении массив инициализируется;

· массив объявлен как формальный параметр функции;

· массив объявлен как ссылка на массив, явно определенный в другом файле.

Например:

1.int a[100]; //массив из 100 элементов целого типа

2.double d[14]; // массив из 14 элементов типа double

3.char s[]="Программирование"; // символьный массив

4. const int t=5, k=8;

5. float wer[2*t+k];

6. //массив из 2*t+k элементов вещественного типа

7. int sample[853];

8. /*массив из элементов sample[0], sample[1],

9.   sample[2],...,sample[852] типа int*/

равносильно объявлению

const int N_max=853;

int sample[N_max];

равносильно объявлению

#define N_max 853

...

int sample[N_max];

В языке С++ не производится проверки границ массивов: таким образом, исполнение кода не остановится при выходе за границы массива. Если переполнение массива происходит во время выполнения оператора присваивания, то лишние значения могут присвоиться другим переменным или включиться в текст программы. С другой стороны, можно объявить массив размером N и указать индекс элемента, выходящий за пределы N, что не приведет к появлению сообщений об ошибке, как на шаге компиляции, так и на шаге выполнения, даже если это послужит причиной аварийного завершения программы.

Пример 1. Определение размера памяти одномерного массива.

#include "stdafx.h"#include <iostream>using namespace std;#define v 4#define p 3 int _tmain(int argc, _TCHAR* argv[]){ const int q=4, r=1; int i_mas[10];   int k=sizeof(i_mas); cout << "i_mas[10] занимает " << k << " байт\n";   float f_mas[7]={2.0,4.5,8.3,7.0,1.0}; int t=sizeof(f_mas); cout << "f_mas[7]={2.0,4.5,8.3,7.0,1.0} занимает "<< t <<"байт\n"; double d_mas[2*q-r]; int w=sizeof(d_mas); cout << "d_mas[2*q-r] занимает " << w << " байт\n"; double d1_mas[2*v/p]; int w1=sizeof(d1_mas); cout << "d1_mas[2*v/p] занимает " << w1 << " байт\n"; char c_mas[]="Программирование"; int s=sizeof(c_mas); cout << "c_mas[]=\"Программирование\"занимает"<< s <<"байт\n"; system("pause"); return 0;}

Результат выполнения программы:

i_mas[10] занимает 40 байт – 4 байта (тип int) * 10 (количество элементов массива)

f_mas[7] = {2.0,4.5,8.3,7.0,1.0} занимает 28 байт – 4 байта (тип float) * 7 (объявленное количество элементов массива)

d_mas[2*q-r] занимает 56 байт – 8 байт (тип double) * 7 (вычисленное через формулу количество элементов массива)

d1_mas[2*v/p] занимает 16 байт – 8 байт (тип double) * 2 (вычисленное через формулу количество элементов массива)

c_mas[]="Программирование" занимает 17 байт – 1 байт (тип char) * 17 (16 знаков + нулевой байт '\0')

Вывод одномерных массивов

Вывод массивов также целесообразно оформлять в виде отдельной функции. Так как функция вывода не изменяет значения элементов массива, то в качестве одного из параметров такой функции выступает сам массив или указатель на массив. Одномерные массивы удобно выводить в строку или в столбец в зависимости от задачи (Пример 3 и 4). Для организации вывода также используют цикл по индексам элементов или арифметические операции с указателем на массив.

Пример 3.

/*Генерация целочисленного массива числами с клавиатуры и вывод массива в строку*/

#include "stdafx.h"

#include <iostream>

using namespace std;

#define max 20

 

void gen (int k,int *pp);//прототип функции генерации массива

void out (int k,int x[max]);//прототип функции вывода массива

 

int _tmain(int argc, _TCHAR* argv[]){

int a[max],n,*p;

do {

printf("\nВведите количество элементов массива n (n<=20):");

scanf ("%d",&n);

}

while (n>max); //проверка выхода за границы массива

  p=a;

gen(n,p);

out(n,a);

system("pause");

return 0;

}

 

//Описание функции генерации массива с клавиатуры

void gen(int k,int *pp){    

/*передача указателя как параметра позволяет вернуть

сформированный массив в основную программу*/

int i;

printf("\nВведите значения %d элементов массива: \n",k);

for (i=0;i<k;i++){

printf("x[%d]= ",i);

scanf("%d",pp++);

}

}

 

//Описание функции вывода массива в строку

void out (int k,int x[max]){

int i;

printf("\nВывод значений %d элементов массива в строку: \n",k);

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

printf("%d\t",x[i]);

}

 

Пример 4.

/*Описание функции генерации массива значениями элементов арифметической прогрессии*/

void gen(int k,int x[max]) {

int i,d;

printf ("\nВведите нулевой элемент прогрессии: ");

scanf("%d",&x[0]);

printf ("\nВведите разность прогрессии: ");

scanf("%d",&d);

for (i=1;i<k;i++)

x[i]=x[i-1]+d;

}

Пример 5.

//Описание функции вывода массива в столбец

void out (int k,int x[max]){

int i;

printf("\nВывод значений %d элементов массива в столбец: \n",k);

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

printf("x[%i]= %d\n",i,x[i]);

}

Для использования функции генерации случайных чисел необходимо подключить библиотеку <time.h>.

Для написания кода генерации массива случайными целыми числами используется:

1.Функция srand(). Синтаксис:

void srand(unsigned seed);

– функция устанавливает свой аргумент как основу (seed) для новой последовательности псевдослучайных целых чисел, возвращаемых функцией rand (). Сформированную последовательность можно воспроизвести. Для этого необходимо вызвать srand() с соответствующей величиной seed.

Для использования данной функции необходимо подключить библиотечный файл <stdlib.h>.

2.Функция rand (). Синтаксис:

int rand(void);

– функция возвращает псевдослучайное число в диапазоне от нуля до RAND_MAX. Для использования данной функции необходимо подключить библиотечный файл <stdlib.h>.

3.Константа RAND_MAX определяет максимальное значение случайного числа, которое может быть возвращено функцией rand (). Значение RAND_MAX – это максимальное положительное целое число.

4.Часто в задачах требуется выполнить генерацию массива на произвольном промежутке [a,b). Для этого используются следующие выражения:

5. //генерация случайных целых чисел на [a,b)

6.    x[i]=rand()%(b-a)+a;

7. //генерация случайных вещественных чисел на [a,b)

y[i]= rand()*1.0/(RAND_MAX)*(b-a)+a;

Пример 6.

/*Описание функции генерации массива случайными вещественными числами на[a,b)*/void gen(int k,int a, int b, float x[max]){   int i; srand(time(NULL)*1000);   //устанавливает начальную точку генерации случайных чисел for (i=0;i<k;i++){ x[i]=(rand()*1.0/(RAND_MAX)*(b-a)+a);    //функция генерации случайных чисел на [a,b) }}

Задачи поиска в массивах

Решение задач данного вида сводится к установлению того, как обрабатывается каждый элемент или указанные элементы. Затем подбирается подходящая схема перебора, в которую вставляются операторы обработки элементов массива.

Пример 7. Найдем минимальный элемент в одномерном целочисленном массиве, заданном случайными числами на промежутке [-100; 100).

Один из алгоритмов поиска минимального элемента в массиве таков. Будем формировать значение минимального элемента в переменной min. Предположим, что минимальный элемент массива равен нулевому (min=x[0]). Затем выполним просмотр массива с первого элемента до последнего (for (i=1;i<k;i++)). Каждый элемент массива сравниваем со значением переменной min. Если значение очередного i -го элемента массива меньше min, то выполняем присваивание min=x[i].

//Поиск наименьшего элемента в массиве #include "stdafx.h"#include <iostream>using namespace std;#include <time.h> //подключение модуля для генератора случайных чисел#define max 100 void gen (int k,int a, int b,int x[max]); //прототип функции генерации массиваvoid out (int k,int x[max]);//прототип функции вывода массиваint minimum (int k,int x[max]); //прототип функции поиска минимального элемента int _tmain(int argc, _TCHAR* argv[]){ int mas[max],n;   do { printf("\nВведите количество элементов массива n (n<=100):"); scanf ("%d",&n); } while (n>max); gen(n,-100,100,mas); out(n,mas); printf ("\nНаименьший элемент в массиве равен %d", minimum(n,mas)); system("pause"); return 0;} //Описание функции генерации массиваvoid gen(int k,int a, int b, int x[max]){   int i; srand(time(NULL)*1000);   //устанавливает начальную точку генерации случайных чисел for (i=0;i<k;i++){ x[i]= rand()%(b-a)+a;     //функция генерации случайных чисел на [a,b) }}//Описание функции вывода массива в строкуvoid out (int k,int x[max]){ int i; printf("\nВывод значений %d элементов массива в строку: \n",k);   for (i=0;i<k;i++) printf("%-6d",x[i]);}//Описание функции поиска минимального элементаint minimum (int k,int x[max]) { int i,min=x[0]; for (i=1;i<k;i++) if (min>x[i]) min=x[i]; return min;}

Пример 8. Найдем среднее арифметическое элементов одномерного вещественного массива, заданного с клавиатуры.

//Поиск среднего арифметического элементов массива#include "stdafx.h"#include <iostream>using namespace std;#include <time.h>//подключение модуля для генератора случайных чисел#define max 100 void gen (int k, float x[max]); //прототип функции генерации массиваfloat sred_arifm (int k, float x[max]); /*прототип функции поиска среднего арифметического элементов массива*/ int _tmain(int argc, _TCHAR* argv[]){ float mas[max]; int n;   do { printf("\nВведите количество элементов массива n (n<=100):"); scanf ("%d",&n); } while (n>max); gen(n,mas); printf ("\nСреднее арифметическое массива равно %f",             sred_arifm(n,mas)); system("pause"); return 0;} //Описание функции генерации массива с клавиатурыvoid gen(int k, float x[max]){  int i; printf("\nВведите значения %d элементов массива: \n",k);   for (i=0;i<k;i++){ printf("x[%d]= ",i); scanf("%f",&x[i]); }}/*Описание функции поиска среднего арифметического элементов массива*/float sred_arifm (int k, float x[max]) { int i; float sum=0.0; for (i=0;i<k;i++) sum+=x[i]; //вычисление суммы элементов массива return sum/k;}

Задачи замены в массивах предполагают решение задачи на поиск с последующим изменением найденных значений. В основе решения таких задач лежат поисковые алгоритмы с выбором подходящей схемы перебора.

Пример 9. Дан одномерный целочисленный массив, заданный случайными числами на промежутке [-50; 50). Заменить в массиве все отрицательные элементы на элементы им противоположными.

Для решения задачи выполним просмотр массива с начала. Каждый элемент сравним с нулем, при этом отрицательные значения элементов заменим им противоположными (if (x[i]<0) x[i]=-x[i]). В данной задаче целесообразно выполнить вывод массива дважды: до и после замены.

//Замена отрицательных значений элементов противоположными#include "stdafx.h"#include <iostream>using namespace std;#include <time.h>//подключение модуля для генератора случайных чисел#define max 100 void gen (int k, int a, int b,int x[max]); //прототип функции генерации массиваvoid out (int k, int x[max]); //прототип функции вывода массиваvoid zamena (int k, int x[max]);//прототип функции замены int _tmain(int argc, _TCHAR* argv[]){ int mas[max]; int n;   do { printf("\nВведите количество элементов массива n (n<=100):"); scanf ("%d",&n); } while (n>max); gen(n,-50,50,mas); printf("Вывод сгенерированного массива из %d элементов: \n", n); out(n,mas);   zamena (n,mas); printf("\nВывод массива после замены отрицательных           элементов на протипоположные:\n"); out(n,mas); system("pause"); return 0;} //Описание функции генерации массива void gen(int k,int a, int b, int x[max]){   int i; srand(time(NULL)*1000);   for (i=0;i<k;i++){ x[i]=rand()%(b-a)+a; }}//Описание функции вывода массива в строкуvoid out (int k,int x[max]){ int i; for (i=0;i<k;i++) printf("%-6d",x[i]);} //Описание функции заменыvoid zamena(int k,int x[max]){ int i; for (i=0;i<k;i++)     if (x[i]<0) x[i]=-x[i];}

Задания для выполнения

1. Объявите одномерный вещественный массив, в котором 10 элементов. Выполните генерацию массива, используя закономерность: 0; 0,1; 0,12; 0,123,… Выведите массив на экран в столбик. Оформите генерацию и ввод массива с помощью функций.

2. Объявите одномерный целочисленный массив, в котором 15 элементов. Выполните генерацию массива первыми 15 числами Фибоначчи. Выведите массив на экран в строку. Оформите генерацию и ввод массива с помощью функций.

3. Даны два натуральных числа a и b (a<b). Объявите одномерный целочисленный массив, в котором 10 элементов. Выполните генерацию массива первыми десятью цифрами дробной части частного a/b. Выведите массив на экран в столбец. Оформите генерацию и ввод массива с помощью функций. Например, для a =7, b =23 значениями элементов массива будут числа: 3 0 4 3 4 7 8 2 6 0.

4. Объявите одномерный целочисленный массив, в котором не более 100 элементов. Выполните генерацию массива первыми 100 простыми числами. Выведите массив на экран в строку (или в строки по 10 элементов в каждой). Оформите генерацию и вывод массива с помощью функций.

5. Дан одномерный целочисленный массив из N элементов, заданных с клавиатуры. Найти: количество и процентное соотношение положительных, отрицательных и нулевых элементов.

6. Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [a; b). Заменить все элементы массива, кратные 3, на сумму их цифр.

7. Дан одномерный вещественный массив из N элементов (N – нечетное), заданных случайными числами на промежутке [a; b). Поменять местами элементы симметричные относительно центрального.

8. Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [a; b). Поменять местами первый минимальный и последний максимальный элементы.

9. Дан одномерный вещественный массив из N элементов, заданных случайными числами на промежутке [a; b). Выполните циклический сдвиг элементов с n -ой позиции вправо на k позиций.

10. Индивидуальное задание. Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [a; b). Оформите генерацию, вывод массива с помощью функций.

 

Задание
1. Максимальный элемент в массиве.
2. Минимальный элемент в массиве.
3. Среднее арифметическое элементов в массиве.
4. Среднее геометрическое элементов в массиве.
5. Количество положительных элементов в массиве.
6. Количество отрицательных элементов в массиве.
7. Максимальный элемент в массиве, стоящий на четном месте.
8. Максимальный элемент в массиве, стоящий на нечетном месте.
9. Минимальный элемент в массиве, стоящий на четном месте.
10. Разность минимального и максимального элементов в массиве.
11. Среднее гармоническое элементов списка.
12. Минимальный элемент в массиве, стоящий на нечетном месте.
13. Среднее арифметическое элементов в массиве, стоящих на четных местах.
14. Среднее арифметическое элементов в массиве, стоящих на нечетных местах.
15. Среднее геометрическое элементов в массиве, стоящих на четных местах.
16. Среднее геометрическое элементов в массиве, стоящих на нечетных местах.
17. Определить, каких элементов в массиве больше положительных ил отрицательных.
18. Сумму максимального и минимального элементов в массиве.
19. Произведение элементов списка.
20. Максимальный отрицательный элемент в массиве.
21. Минимальный положительный элемент в массиве.
22. Сумму элементов в массиве, стоящих на четных местах.
23. Разность элементов в массиве, стоящих на нечетных местах.
24. Сумму четных элементов в массиве.
25. Разность нечетных элементов в массиве.
26. Максимальный элемент среди четных элементов в массиве.
27. Минимальный элемент среди четных элементов в массиве.
28. Среднее арифметическое среди четных элементов в массиве.
29. Среднее геометрическое среди четных элементов в массиве.
30. Количество положительных среди четных элементов в массиве.

 

Одномерные массивы: объявление, инициализация, задачи поиска, замены и перестановок элементов массива

Массив – именованная последовательность областей памяти, хранящих однотипные элементы. Каждая такая область памяти называется элементом массива. Массивы обладают размерностью (большей или равной единице), которой задается число элементов, содержащихся в них, а также измерением, что предполагает возможность описания в программе одно- и многомерных массивов. Количество элементов в массиве называется его размером.

Простейшим аналогом двумерного массива может быть таблица, а трехмерного – несколько таблиц одинакового размера. Математические объекты типа вектор и матрица – примеры аналогов (соответственно одно- и двумерных) массивов.

Тип элемента массива может быть одним из базовых (скалярных), типом другого массива, типом указателя, типом структуры или объединения.

Элементы массива в С++ нумеруется, начиная с нуля. У одномерных массивов после его имени указывается один индекс (порядковый номер), заключенный в прямоугольные скобки [ ], а у многомерных – несколько, каждый из которых заключается в [ ]. Последнее означает, что многомерный массив создается путем определения массива из элементов типа массив.

Все элементы массива имеют одно имя – имя массива и отличаются индексами – порядковыми номерами в массиве. В определении массива можно задать его размерность по каждому измерению. Допустимо явное задание массива либо с помощью указателя (объекта, хранящего адрес начала области набора значений). Резервирование памяти для массива выполняется на этапе компиляции программы.

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

1. Объявление одномерных массивов.

Синтаксис определения массива без дополнительных спецификаторов и модификаторов имеет два формата:

Тип ИмяМассива[ВыражениеТипаКонстанты];

или

Тип ИмяМассива[];

ИмяМассива – идентификатор массива.

Тип – тип элементов объявляемого массива. Элементами массива не могут быть функции, файлы и элементы типа void.

ВыражениеТипаКонстанты – задает количество элементов (размерность) массива. Выражение константного типа вычисляется на этапе компиляции. Данное константное выражение может быть опущено в случаях если:

· при объявлении массив инициализируется;

· массив объявлен как формальный параметр функции;

· массив объявлен как ссылка на массив, явно определенный в другом файле.

Например:

1.int a[100]; //массив из 100 элементов целого типа

2.double d[14]; // массив из 14 элементов типа double

3.char s[]="Программирование"; // символьный массив

4. const int t=5, k=8;

5. float wer[2*t+k];

6. //массив из 2*t+k элементов вещественного типа

7. int sample[853];

8. /*массив из элементов sample[0], sample[1],

9.   sample[2],...,sample[852] типа int*/

равносильно объявлению

const int N_max=853;

int sample[N_max];

равносильно объявлению

#define N_max 853

...

int sample[N_max];

В языке С++ не производится проверки границ массивов: таким образом, исполнение кода не остановится при выходе за границы массива. Если переполнение массива происходит во время выполнения оператора присваивания, то лишние значения могут присвоиться другим переменным или включиться в текст программы. С другой стороны, можно объявить массив размером N и указать индекс элемента, выходящий за пределы N, что не приведет к появлению сообщений об ошибке, как на шаге компиляции, так и на шаге выполнения, даже если это послужит причиной аварийного завершения программы.



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 128; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.186.132 (0.008 с.)