Лекция: Типы задач при работе с массивами
1. Анализ всего или части массива, то есть найти какую–нибудь его характеристику: наименьшее, наибольшее значение, сумму или произведение всех элементов или элементов с некоторым условием, количество элементов с некоторым условием и т.п.
Пример 10. Найти количество положительных, отрицательных и нулевых чисел и вывести их разным цветом.
int main() { const n=10, c1=10, c2=11, с3=12; int k1=0, k2=0;
int a[n]={1, 0,-3,22, -33,-4,0 ,0, -22};
for( int i=0;i<n; i++)
{ if (a[i]>0) { textcolor(c1); k1++; }
else if (a[i]<0) { textcolor(c2); k2++; }
else textcolor (с3);
cprintf("%d ", a[i] ); }
textcolor(c1); cprintf ("\r\n Number of positive %d", k1);
textcolor(c2); cprintf ("\r\n Number of negative %d ", k2);
textcolor(с3); cprintf ("\r\n Number of 0 %d", n-k1-k2);
getch(); return 0; }
2. Поиск в массиве, т. е. определить, есть ли элемент с некоторым условием. Найти индекс и (или) значение первого (последнего) такого элемента, всех таких элементов.
Пример 11. Определить, есть ли в одномерном массиве отрицательные числа. Если есть, вывести “Yes” и номер последнего такого числа, в противном случае вывести “No”.
int main() { const n=10; int a[n]={1, 22, -3, 40, -55 ,-6, 0, -0, -99};
/*Второй тест: нет отрицательных
int a[n]={1, 22, 3, 40, 55, 6, 0, 0, 99};*/
int N0=-1; /* Пусть нет отрицательных.Для поиска последнего отрицательного числа просматриваем массив в обратном порядке.*/
for (int i=n-1; i>=0; i--) if (a[i] <0) { N0=i; break; }
/* Нашли первое с конца, или последнее в массиве отрицательное число, и дальше массив не просматриваем, вышли из цикла с помощью break;*/
if (N0 == -1) cout<<”\nNo”;
/* В массиве нет отрицательного числа, вышли из цикла после того, когда просмотрели все элементы, то есть когда i>=0 стало ложным. */
else /* В массиве было отрицательное число и вышли из цикла с помощью break. */
cout<<"\n Yes, number of the last "<< N0+1;
getch(); return 0; }
Пример 12 объединяет два типа алгоритмов в одной задаче. Ввести массив с экрана. Найти сумму чисел до первого нуля и его номер. Если нуля нет, вывести сумму всех чисел массива.
int main() { const n=5; int a[n]; for(int i=0; i<n; i++) cin>>a[i];
int n2=-1, /* Номер первого нуля.*/
s=0, i=0;
while (i<n ) { if (a[i]==0) { n2=i+1; break; }
s+=a[i++]; }
if (n2 == -1) cout<<«No 0, sum = „<<s;
else { cout<<“Number of the first 0 » <<n2;
if (n2!=1) cout<<", sum before the first 0 = "<<s; }
getch(); return 0; }
3.Построение массива по некоторому правилу, используя при этом индексы, одно или несколько чисел и (или) один или несколько массивов.
Пример 13. Построить массив положительных и массив отрицательных чисел и вывести их.
int main()
{ const n = 10; int a[n], //Исходный массив
b[n], //Массив положительных чисел
d[n]; // Массив отрицательных чисел
cout<<«Array: »; randomize();
for (int i=0; i<n; i++) { a[i]=random(100)-50;
printf ("%5d",a[i]); }
int nd=0, nb=0;
for (int i=0; i<n; i++)
if (a[i]<0) d[nd++] = a[i];
else if (a[i]>0) b[nb++] = a[i];
cout<<"\nPositive array: "; for (int i=0; i<nb; i++)printf ("%5d",b[i]);
cout<<"\nNegative array: "; for (int i=0; i<nd; i++)printf ("%5d",d[i]);
getch(); return 0; }
4. Преобразование массива: изменить их значения, переставить местами некоторые элементы, удалить один или несколько элементов массива, вставить элементы массива и т. п.
Пример 14. Массив преобразовать следующим образом: все числа из отрезка [0,1] увеличить в 10 раз, отрицательные уменьшить в (–2) раза, остальные уменьшить в 10 раз. Преобразованный массив оставить на том же месте.
int main()
{ const n=5; float a[n]= { 0.12, -3.4, .5, 67, 8 };
for (int i=0; i<n; i++)
if(a[i]>=0 && a[i]<=1) a[i] = a[i]*10;
else if (a[i]<0) a[i]=a[i] / (-2);
else a[i] = a[i]/10. ;
for (int i=0; i<n; i++) printf ("%10.3f", a[i]);
getch(); return 0; }
5. Вывод массива в специальном виде (см. § 3).
Одна и та же задача может состоять из нескольких частей, каждая из которых относится к разным типам.
Пример 15. Ввестимассив с экрана. Найти его наибольший и наименьший элементы и переставить их, т. е. на место каждого наибольшего поместить наименьший элемент, на место каждого наименьшего поместить наибольший элемент.
Поиск наибольшего и наименьшего элементов массива относятся к первому типу, а их перестановка — к четвёртому.
int main() { const n=5; int a[n], i;
for (i=0; i<n; i++) { cout<<«a[»<<i<<"] "; cin>>a[i]; }
int min1=a[0], max1=a[0];
for (i=1; i<n; i++) if (min1>a[i]) min1=a[i];
else if ( max1<a[i]) max1=a[i];
cout<<endl<<«Max „<<max1; cout<<“ Min „<<min1 ;
for (i=0; i<n; i++) if (max1==a[i]) a[i]=min1;
else if (min1==a[i]) a[i]=max1;
cout<<“\n The new array\n» ;
for (i=0;i<n;i++) cout<<«a[»<<i<<"]= "<<a[i]<<endl; getch(); return 0; }