Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcija-12.pdf
Скачиваний:
26
Добавлен:
10.02.2016
Размер:
367.6 Кб
Скачать

return 0;

}

Тестовые примеры должны включать: a[imin]) расположен левее a[imax]); a[imin]) расположен правее a[imax]);

a[imin]) и a[imax]) совпадают; //ситуация корректно обрабатывается во втором примере (d=0).

Нахождение суммы элементов вещественного массива, расположенных правее последнего отрицательного элемента

Используем динамический массив:

int main()

 

 

 

{

 

 

 

 

int n;

 

 

 

 

cout << "n=?";

 

 

 

cin >>

n;

 

 

 

int i,

ineg=0;

new double [n];

 

double

sum, *a =

 

cout << "a[i]= ?";

cin >> a[i];

//ввод массива

for (i

= 0; i<n;

i++)

for (i

= 0; i<n;

i++) cout << a[i] << " ";

//вывод массива

for (i

= 0; i<n;

i++)

if (a[i] < 0) ineg = i;

 

for (sum = 0, i=

ineg+1; i < n; i++) sum += a[i];

 

cout << "\nsum:

" << sum;

 

delete

[] a;

 

 

 

_getch();

 

 

 

return

0;

 

 

 

}

 

 

 

 

С целью оптимизации программы может возникнуть мысль объединить цикл нахождения номера с циклами ввода и контрольного вывода, однако т.к. это разные по смыслу действия, то это ухудшит «ясность» программы. После отладки программы контрольный вывод можно удалить или закомментировать.

Это не очень удачный вариант программы!!!

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

int main()

{

 

 

 

int n;

 

 

 

cout << "input n\n"; cin >> n;

 

double

sum, *a = new double [n];

 

int i;

 

 

 

cout << "input a[i]\n";

//ввод массива

for (i

= 0; i<n; i++)

cin >> a[i];

for (i

= 0; i<n; i++) cout << a[i] << " ";

//вывод массива

int ineg = -1;

if (a[i] < 0) ineg = i;

 

for (i

= 0; i<n; i++)

 

if (ineg != -1) {

for (sum = 0, i= ineg+1; i < n; i++) sum += a[i];

 

 

 

cout << "\n S=" << sum <<endl;

}

0\n" << endl;

 

else

cout << "\n<0:

 

delete

[] a;

 

 

_getch();

 

 

return

0;

 

 

}

 

 

 

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

31

Можно предложить и более рациональное решение этой задачи: просматривать массив в обратном порядке, суммируя его элементы, и завершить цикл, как только встретится отрицательный элемент:

int main()

 

{

n;

 

int i,

 

cout <<

"input n\n"; cin >> n;

 

double

*a = new double [n];

 

cout <<

"input a[i] :\n ";

//ввод массива

for (i

= 0; i<n; i++) cin >> a[i];

bool flag_neg = false; double sum = 0;

for (i = n-1; i>=0; i--) {

if (a[i] < 0) {flag_neg = true; break;} sum +=a[i];

}

if (flag_neg )

cout << "\n S=" << sum << endl; else cout << "\n<0: 0";

delete [] a; _getch(); return 0;

}

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

Программирование – лекция 12 (лекции Стрикелевой Л.В.)

32

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]