Массивы
Часто возникает необходимость хранить не одну переменную, а набор однотипных переменных. Например, список учащихся класса – это набор данных строкового типа, координаты вершин многоугольника или коэффициенты многочлена – это набор числовых данных. Для хранения наборов данных используются структуры данных. Основная структура данных – это массив.
— это структура однотипных данных, занимающих непрерывную область памяти. Массив имеет размер — количество элементов в нем. Каждый элемент массива имеет свой номер (также называемый ), обращение к элементу массива осуществляется путем указания его индекса. В языке C++ элементы нумеруются начиная с 0, поэтому последний элемент массива имеет номер на 1 меньше размера массива.
Массив в языке C задается следующим образом:
тип_элементов идентификатор[размер];
где тип_элементов — произвольный тип данных языка C++, который будут иметь элементы массива, например, int , double и т.д.; идентификатор — имя массива, размер — число элементов в нем.
По стандарту языков C и C++, размер массива должен быть константой, определенной на момент компиляции программы, то есть можно определить массив в виде int A[10 + 5] , но нельзя это сделать в виде int A[n] . Однако, компилятор gcc, которым мы пользуемся, допускает объявления второго вида, но при этом нет никаких гарантий, что ваша программа будет откомпилирована каким-либо другим компилятором.
К элементу массива можно обращаться, как идентификатор [ индекс ] . Например, если было сделано объявление
double A[5];
то таким образом создается 5 элементов массива типа double : A[0] , A[1] , A[2] , A[3] , A[4] .
Пример программы, которая создает массив типа int[] , заданного пользователем размера, считывает с клавиатуры его элементы, затем прибавляет к каждому элементу массива число 1 , затем выводит результат на экран:
#include using namespace std; int main() < int n; // Размер массива int i; // Счетчик в циклах cin >> n; // Считываем размер массива int A[n]; // Объявление массива // Считываем массив for (i = 0; i < n; ++i) < cin >> A[i]; > // Прибавляем по 1 к каждому элементу for (i = 0; i < n; ++i) < A[i] += 1; >// Выводим массив на экран for (i = 0; i < n; ++i) < cout // Переведем курсор на новую строку cout
В этом примере при помощи // обозначается начало комментария, весь текст после начала комментария и до конца строки компилятором игнорируется. Второй способ объявления комментария: в начале комментария поставить знаки /* , а в конце – */ . Это позволяет делать комментарии, занимающие несколько строк. В языке C допустимы только такие комментарии.
Контейнер vector в языке C++
В языке C++ появился более удобный, по сравнению с классическим массивом в языке C, контейнер vector. Он является аналогом обычных массивов, но поддерживает дополнительные возможности, например, его размер можно изменять по ходу программы.
Для использования контейнера vector необходимо в начале программы подключить заголовочный файл vector :
#include
Вектор A данных типа int объявляется так:
vector A;
В данном случае будет создан вектор нулевого размера. При необходимости создать вектор нужного размера можно задать размер вектора в качестве параметра конструктора:
vector A(n);
В любой момент можно изменить размер вектора при помощи вызова метода resize . Текущий размер вектора можно узнать про помощи метода size .
Обращение к элементам вектора осуществляется так же, как к элементам массива, при помощи квадратных скобок.
Массивы
Часто возникает необходимость хранить не одну переменную, а набор однотипных переменных. Например, список учащихся класса – это набор данных строкового типа, координаты вершин многоугольника или коэффициенты многочлена – это набор числовых данных. Для хранения наборов данных используются структуры данных. Основная структура данных – это массив.
— это структура однотипных данных, занимающих непрерывную область памяти. Массив имеет размер — количество элементов в нем. Каждый элемент массива имеет свой номер (также называемый ), обращение к элементу массива осуществляется путем указания его индекса. В языке C++ элементы нумеруются, начиная с 0, поэтому последний элемент массива имеет номер на 1 меньше размера массива.
Массив в языке C++ задается следующим образом:
тип_элементов идентификатор [ размер ];
где тип_элементов — произвольный тип данных языка C++, который будут иметь элементы массива, например, int , double и т.д.; идентификатор — имя массива, размер — число элементов в нем.
К элементу массива можно обращаться, как идентификатор [ индекс ] . Например, если было сделано объявление
то таким образом создается 5 элементов массива типа double : A[0] , A[1] , A[2] , A[3] , A[4] .
Пример программы, которая создает массив типа int[] , заданного пользователем размера, считывает с клавиатуры его элементы, затем прибавляет к каждому элементу массива число 1 , затем выводит результат на экран:
#include
using namespace std;
int main()
int n; // Размер массива
int i; // Счетчик в циклах
int arr[n]; // Объявление массива (так делать нельзя), лучше вместо такого объявления массива использовать std::vector arr(n);
// Прибавляем по 1 к каждому элементу
for(i=0;i
// Выводим массив на экран
for(i=0;i
cout return 0;
>
В этом примере при помощи // обозначается начало комментария, весь текст после начала комментария и до конца строки компилятором игнорируется. Второй способ объявления комментария: в начале комментария поставить знаки /* , а в конце – */ . Это позволяет делать комментарии, занимающие несколько строк. В языке C допустимы только такие комментарии. ::min()>@w< >— минимальное значение типа @code —> ::max()>@w< >— максимальное значение типа @code. —>
Упражнения
- (A) Выведите на экран все элементы массива с четными индексами (то есть A[0] , A[2] , A[4] , . ).
- (B) Выведите на экран все четные элементы массива (то есть те элементы, которые являются четными числами).
- (C) Найдите количество положительных элементов в массиве. Программа должна считать массив и вывести единственное число – количество положительных элементов в массиве.
- (D) Дан массив. Найдите количество элементов массива, которые больше предыдущего элемента в этом массиве.
- (E) Массив содержит только ненулевые числа. Определите, есть ли в данном массиве два соседних элемента с одинаковыми знаками. Программа должна вывести YES , если есть два числа с одинаковыми знаками и NO иначе.
- (F) Дан массив. Определите, сколько в этом массиве элементов, которые строго больше обоих своих соседей.
- (G) Дан массив. Переставьте элементы массива в обратном порядке без использования дополнительного массива. Программа должна считать массив, поменять порядок его элементов, вывести результат на экран (просто вывести элементы массива в обратном порядке – недостаточно!).
- (H) Переставьте соседние элементы массива (0-й элемент поменять с 1-м, 2-й с 3-м и т.д. Если элементов нечетное число, то последний элемент остается на своем месте)
- (I) Циклически сдвиньте элементы массива вправо (0-й элемент становится 1-м, 1-й становится 2-м, . последний становится 0-м, то есть массив превращается в массив ).
- (J) Найдите значение наибольшего элемента в массиве.
- (K) Дан массив, отсортированный по возрастанию (каждый элемент массива не меньше предыдущего элемента, например, ). Найдите количество различных чисел в этом массиве. 2 ,x ^2>+. +@code@formula,x n-1 ,x^(n-1)>.> —>
Массивы в Си.
Когда необходимо хранить и обрабатывать большое количество цифровой информации о множестве объектов удобно использовать массивы информации.Массив – это набор однотипных объектов с общим именем, у каждого объекта есть свой уникальный номер(индекс) с помощью которого можно с ним работать, изменять , запрашивать значение.Каждый такой объект называется элементом массива. Номер элемента массива – это его индекс.
Объявление массива в Си
Чтобы работать с массивом данных в Си его необходимо сначала, так же как и переменную объявить в начале программы или процедуры.
Нумерация элементов, индексов в Си начинается с 0. Чтобы объявить, массив нужно
Тип массива Имя массива [количество элементов массива -1];
Например, объявлен массив из 5 целочисленных элементов координат точек x
Типы элементов массива могут быть вещественные float, символьные char
Присвоение значений элементам массива.
Задать первоначальные значения элементам массива можно явно при его объявлении для этого используются фигурные скобки и в них через запятую перечисляются значения элементов массива. Число элементов должно совпадать с размером массива
задаст первоначальные значение x[0]=10 ; x[1]=20; x[2]=3; x[3]=5; x[4]=100;
Можно задать значения присвоением
ввести значение элемента массива можно и с клавиатуры
scanf(“%d”, &x[1]); // элемент массива x с индексом 1 будет введен с клавиатуры
Работа с массивами в Си
При работе с массивами удобно использовать цикл for для того чтобы обработать все элементы массива
Общий формат обработки данных всего массива в Си
Имя массива [i]= выражение; // обработка элемента массива с индексом i
Пример программы 20. Вводится массив с клавиатуры, значения элементов массива увеличивается в 2 раза. Получившийся массив выводится на экран.
// работа с массивом
int a[9];// объявление целочисленного массива a из 10 элементов
int i;// переменная для работы с массивом в цикле
// ввод элементов массива с клавиатуры
printf(«Введите элемент массива %d\n», i);
// увеличиваем элементы массива в 2 раза
// выводим массив на экран
Поиск минимального и максимального элемента массива в Си
При поиске минимального (максимального) элемента в массиве необходимо “пробежать” по всем элементам массива сравнивая его элементы с текущим минимумом (максимумом) . Если текущий элемент окажется меньше текущего минимального значение , то минимальному значению присваивается этот элемент массива.
Пример программы 21. Поиск минимального и максимального значения массива.
// работа с массивом поиск минимального и максимального значений
int a[9];// объявление целочисленного массива a из 10 элементов
int i;// переменная для работы с массивом в цикле
int min;// переменная для минимального значения
int max;// переменная для максимального значения
// ввод элементов массива с клавиатуры
printf(«Введите элемент массива %d\n», i);
min =a[0];// присваиваем минимальному значению значение первого элемента
max=a[0];// присваиваем максимальному значению значение первого элемента
// пробегаем по всем элементам массива
// если текущий элемент массива меньше текущего минимума то присваиваем его значение минимуму
// если текущий элемент массива больше текущего максимума то присваиваем его значение максимуму
// выводим значения на экран
printf(«Максимальное значение %d\n»,max);
printf(«Минимальное значение %d\n»,min);
Вернуться к содержанию Перейти к следующему уроку Матрицы в Си
Как получить значение определенного элемента массива, а не его адрес?
Задача заключалась в том, чтобы найти максимальный элемент массива и вывести 5 чисел, что следуют после него в счете.
#include int main() < int arr[5]; int size = 5; for (int i = 0; i < 5; i++) < scanf_s("%d", &arr[i]); >int max = arr[0]; for (int i = 1; i < size; i++) if (arr[i] >max) max = arr[i]; printf("Max=%d\n", &max); int k=1; do < int j= max + 1; k = k + 1; printf("Next: %d\n", &j); >while (k != 6); >
я понимаю, что выводятся адреса, но как получить значения? помогите, запутався :С
Отслеживать
задан 22 янв 2021 в 20:48
Мешок Картошки Мешок Картошки
27 5 5 бронзовых знаков
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Вы прям и выводите адрес
printf("Max=%d\n", &max);
амперсанд в данном случае как раз и означает — возврати адрес. Поэтому, пишем так
printf("Max=%d\n", max);
Что происходит в цикле в конце — не совсем понятно, но если хотелось просто вывести массив, то это так
for (int i = 0; i < size; i++) printf("%d\n", arr[i]);
Отслеживать
ответ дан 22 янв 2021 в 20:56
112k 6 6 золотых знаков 93 93 серебряных знака 159 159 бронзовых знаков
В цикле (в вопросе) попытка вывести 5 чисел от max+1 до max+5
22 янв 2021 в 20:59
возможно. но я не уверен
22 янв 2021 в 21:00
да, так, я планировал рекурсивную функцию добавить, а как иначе вывести следующих 5 чисел после максимального из массива-не знаю
22 янв 2021 в 21:04
а вы этого не можете сделать. Если даже максимальное - это самое первое, то за ним будет только 4 числа (весь массив только на 5 элементов). Попробуйте более точно сформулировать задачу
22 янв 2021 в 21:05
последующие 5 не из массива, просто по натуральному ряду. например, максимальное 6, тогда последующие 5: 7,8,9,10,11
22 янв 2021 в 21:07
Что если сделать счетчик, которой определит номер элемента max и потом сделать for с этого элемента до конца?
Отслеживать
ответ дан 22 янв 2021 в 20:54
33 6 6 бронзовых знаков
действительно, как вариант, сейчас попробую)
22 янв 2021 в 20:56
Чтобы вывести не адрес, а значение нужно писать не printf("Max=%d\n", &max); , а printf("Max=%d\n", max); . То есть без & .
Так же вот пример, как можно вывести дальше 5 чисел после максимального:
int k = max + 1; while(k
#include int main() < int arr[5]; int size = 5; for (int i = 0; i < 5; i++) < scanf("%d", &arr[i]); >int max = arr[0]; for (int i = 1; i < size; i++) if (arr[i] >max) < max = arr[i]; >printf("Max=%d\n", max); int k = max + 1; while(k >
Отслеживать
ответ дан 22 янв 2021 в 21:04
Павел Ериков stand with Russia Павел Ериков stand with Russia
5,650 1 1 золотой знак 12 12 серебряных знаков 31 31 бронзовый знак
В общем случае: если у вас известен адрес, то значение по этому адресу можно получить с помощью оператора разыменования * .
В этом смысле вы могли бы написать
printf("Max=%d\n", *&max);
и получить то, что вам требуется. Опять же, операторы * и & , так сказать, взаимно друг друга компенсируют, так что *& можно удалить, и получить
printf("Max=%d\n", max);
P.S. Ну, раз тут все пишут еще и свои решения исходной задачи, то.
int main() < srand(time(0)); #define SIZE 20 int arr[SIZE]; for (int i = 0; i < SIZE; i++) arr[i] = rand()%100; int max = arr[0]; for (int i = 1; i < SIZE; i++) if (arr[i] >max) max = arr[i]; printf("Max = %d\n", max); for(int k = 1; k