Одномерные массивы
Else
Do
Обработка данных последовательности
В качестве примера рассмотрим следующую задачу:
Дана последовательность целых ненулевых чисел. Индикатор окончания – число ноль. Определить сумму элементов и количество отрицательных чисел в последовательности.
Для решения задачи используем накопитель и счетчик для получения суммы элементов и количества отрицательных чисел.
// Обработка последовательности - 1
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
void main()
{
int a; float sum=0; int ko=0; int f=0;
cout<<"\nInput posledovatelnost (0)\n";
cin>>a;
while (a!=0)
{ sum+=a;
if (a<0) ko++;
f=1;
cin>>a;
}
if (f==1)
printf("Sum = %.3f, Kol.otr. = %i.\n",sum,ko);
else printf("Posledovatelnost is empty !\n");
getch();
}
Отметим, что при использовании оператора while оператор ввода cin>>a приходится использовать 2 раза, первый – вне цикла для обработки пустой последовательности и второй – внутри цикла для ввода очередных элементов.
Для анализа ситуации, когда обрабатывается пустая последовательность, используется механизм фиксации события (флажок int f=0).
А теперь рассмотрим вторую форму организации цикла с использованием оператора do...while.
// Обработка последовательности - 2
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
void main()
{
int a; float sum=0; int ko=0; int f=0;
cout<<"\nВведите последовательность. (0)\n";
{cin>>a;
if (a!=0)
{ sum+=a;
if (a<0) ko++;
f=1;
}
}
while (a!=0);
if(f==1)
printf("Sum=%.3f,Kol.otr.=%i.\n",sum,ko);
printf("Последовательность пуста!\n");
getch();
}
В этом случае, чтобы исключить обработку индикатора окончания, необходимо дважды анализировать условие: if(a<0)и while(a!=0).
Еще один вариант программы связан с использованием оператора досрочного выхода из цикла - break. Другие способы определения окончания последовательности также должны быть реализованы с учетом того, что обрабатываться могут лишь элементы последовательности, а не служебные или иные виды данных.
4.2 Сложные структуры данных – массивы
Массив – это группа элементов одного типа, расположенных друг за другом в памяти, и имеющих одно общее имя. Элемент часто называют компонентой массива.
Каждый элемент массива может быть обозначен с помощью указателя – индекса, который может быть вычислен.
Например, объявим массив данных:
int mas[4];
Т.е. объявлен массив элементов целого типа, состоящий из 4-х элементов. Размер массива в этом случае составляет 4 х 2 = 8 байт.
Индекс массива начинается с 0.
Как и обычные переменные, элементы массива могут быть инициализированы при объявлении:
int mas[4]={12, -7, 19, 5};
int mas[4]={6, 3};
Остальные элементы будут равны 0.
Индексы можно вычислять:
tmp = mas[i+1]; Если i=2 тогда tmp=8.
Например, следующий фрагмент выводит значения массива на экран:
for (int i=0; i<4; i++)
cout<<mas[i]<<" ";
А вот этот фрагмент позволяет вводить данные в массив в диалоговом режиме:
for (int i=0; i<4; i++)
{cout<<i<<" = "; cin>>mas[i];
cout<<"\n";
Массив не может быть пустым. В C++ можно использовать одно, двух, трех и более мерные массивы. Например, двухмерный массив 2 х 3 объявляется следующим образом:
int msb[2][3]={{12,3,-5},{19,5,4}};
Массив msb располагается в памяти он так:
![]() | ||
0, 0 | msb[0][0] | |
0, 1 | msb[0][1] | |
0, 2 | -5 | msb[0][2] |
1, 0 | msb[1][0] | |
1, 1 | msb[1][1] | |
1, 2 | msb[1][2] | |
![]() |
Самый правый индекс в паре будет меняться чаще всего.
Чтобы вывести построчно двухмерный массив, можно использовать следующий программный фрагмент:
for (int i=0; i<2; i++)
{ for (int j=0; j<3; j++)
cout<<msb[i][j]<<" = ";
cout<<"\n";
}
В качестве завершающего примера приведем реализацию программы, которая определяет количество "совершенных" чисел в одномерном массиве. Совершенным называют натуральное число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого́ числа).
// Task 51 Количество совершенных чисел
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
int mas[12]={12,7,6,67,34,28,32,17,18,9};
int sover (int a);// -- prototype
void main()// --- MAIN ---
{ int i,j;
int k=0;
for (i=0;i<9;i++)// Обработка массива
{if(sover(mas[i])==1)
{k++; printf("%4i\n",mas[i]);};
};
printf("k=%2i.\n",k);
getch();
}
int sover (int a)// 1 – если число a совершенное.
{ int Sum=0;
for(int i=1;i<=a-1;i++)
{if (a%i==0) Sum+=i;};
if (Sum==a) return 1;
return 0;
}