
- •Глава III. Массивы и указатели
- •9. Массивы
- •9.1. Общие принципы организации массивов
- •9.2. Объявление и инициализация массивов
- •9.3. Заполнение массива данными и вывод элементов массива
- •1. Заполнение массива данными
- •2. Вывод элементов массива
- •9.4. Типовые задачи на обработку одномерных массивов
- •1. Поиск максимального (минимального) значения в массиве и его индекса
- •2. Подсчет суммы значений элементов массива, удовлетворяющих заданному условию
- •3. Подсчет элементов массива, удовлетворяющих заданному условию
- •4. Поиск значений
- •5. Формирование массива по заданному условию
- •6. Перестановка элементов массива в обратном порядке
- •7. Циклический сдвиг элементов массива
- •8. Сортировка элементов массива в порядке возрастания (убывания)
- •9.5. Типовые задачи на обработку двумерных массивов
- •10. Указатели
- •10.1. Назначение указателей
- •10.2. Объявление и инициализация указателей
- •10.3. Операции над указателями
- •10.4. Выражения и арифметические действия с указателями
- •10.5. Связь указателей с массивами
- •10.6. Операторы new и delete. Константа null
- •10.7. Динамические массивы
- •10.8. Массивы указателей
- •Содержание
2. Подсчет суммы значений элементов массива, удовлетворяющих заданному условию
Для решения этой задачи вводим переменную, значение которой будет увеличиваться на значение очередного найденного элемента, удовлетворяющего условию.
3. Подсчет элементов массива, удовлетворяющих заданному условию
Для решения этой задачи вводим счетчик – специальную переменную, значение которой будет увеличиваться на единицу, когда найдется очередной элемент, удовлетворяющий условию.
Пример. Программа подсчета суммы четных и количества отрицательных элементов массива.
#include <stdio.h>
void main()
{
const int n=10;
int i, A[n], S=0, k=0;
// ввод массива А
for(i=0; i<n; i++)
{
if (A[i]%2==0) S=S+A[i]; // подсчет суммы четных элементов
if (A[i]<0) k++; // подсчет количества отрицательных
}
printf("Сумма четных элементов массива: %d\n", S);
printf("Количество отрицательных элементов массива: %d\n",k);
}
4. Поиск значений
1) Поиск одного элемента
Пример. Написать программу поиска элемента x в массиве из n элементов. Значение элемента x вводится с клавиатуры.
Решение.
Для решения задачи разумно применить следующий метод – последовательный просмотр массива и сравнение значения очередного рассматриваемого элемента с данным. Если значение очередного элемента совпадает с x, то запоминаем его индекс в переменной k.
for(i=0; i<n; i++)
if (A[i]==x) k=i;
Этот способ решения поставленной задачи, безусловно, приводит к цели, но обладает рядом существенных недостатков:
если значение x встречается в массиве несколько раз, то найдено будет последнее из них;
после того, как нужное значение уже найдено, массив просматривается до конца, то есть всегда выполняется n сравнений.
Разумно прекратить просмотр сразу после обнаружения заданного элемента или до конца массива. Таким образом, цикл может выглядеть так:
for(i=0; i<n; i++)
if (A[i]==x) {k=i; break;}
или так:
i=0;
while (i<n && A[i]!=x) i++;
Примечание. Если в массиве есть несколько элементов, совпадающих с элементом x, в результате работы программы будет найден первый из них, то есть элемент с наименьшим индексом.
#include <stdio.h>
void main()
{
const int n=10;
int i, A[n], x;
// ввод массива А
printf("Введите искомый элемент\n");
scanf("%d", &x);
i=0;
while (i<n && A[i]!=x) i++;
if (i<n) printf("Индекс искомого элемента: %d\n", i);
else printf("Данный элемент в массиве отсутствует\n");
}
2) Поиск всех элементов, удовлетворяющих условию
Пример. Программа вывода положительных элементов массива и их индексов.
#include <stdio.h>
void main()
{
const int n=10;
int i, A[n];
// ввод массива А
printf("Положительные элементы массива:\n");
for(i=0; i<n; i++)
if (A[i]>0) printf("A[%d]=%d\n", i, A[i]);
}
5. Формирование массива по заданному условию
Пример. Сформировать новый массив В, включив в него все положительные элементы массива А и вывести его на экран.
Решение.
Сначала надо определить, сколько места в памяти надо выделить для массива В. В «худшем» случае все элементы в массиве А будут положительными и войдут в массив В, поэтому массив В должен иметь такой же размер, что и массив А.
Можно предположить такой способ: просматривать весь массив А, и если А[i]>0, переписать его значение в B[i].
-
А
1
-1
3
-2
5
––––––– В
1
?
3
?
5
В этом случае использовать массив В очень сложно, потому что нужные элементы стоят не подряд.
Более красивый способ состоит в следующем. Объявляем временную переменную-счетчик k, в которой будем хранить количество найденных положительных элементов. Сначала она равна нулю. Если нашли очередной положительный элемент, то ставим его в ячейку В[k] и увеличиваем счетчик. Таким образом, все нужные элементы стоят в начале массива B.
-
А
1
-1
3
-2
5
––––––– В
1
3
5
?
?
#include <stdio.h>
void main()
{
const int n=10;
int i, A[n], B[n], k=0;
// ввод массива А
for(i=0; i<n; i++)
if (A[i]>0) // можно сделать и так:
{ B[k]=A[i]; k++; } // if (A[i]>0) B[k++]=A[i];
printf("Результат:\n");
for(i=0; i<k; i++)
printf("%d ", B[i]);
}
Обратите внимание, что переменная в последнем цикле изменяется от 1 до k, так что на экран выводятся только реально используемые элементы массива В.