Смекни!
smekni.com

Одномерные массивы (стр. 2 из 6)

Пример 2.1

Переставить первый и последний элемент массива x[] местами. Количество элементов массива n.

Решение

В С нумерация элементов массива начинается с нуля, поэтому номер последнего элемента массива (n–1) .

1 способ: tmp=x[0]; x[0]=x[n-1]; x[n-1]=tmp;

2 способ: x[0]=x[0]+x[n-1]; x[n-1]=x[0]-x[n-1]; x[0]=x[0]-x[n-1];

Пример 2.2

Поменять местами заданный элемент массива x[k] с последующим.

Решение

При решении этой задачи необходимо учитывать, что если заданный элемент массива x[k] является последним, то обмен выполнить не возможно, поскольку последующий элемент отсутствует.

if(k == n-1) puts("Обмен не возможен.");else{ tmp=x[k]; x[k]=x[k+1]; x[k+1]=tmp;}

Рисунок 2.4 Алгоритм и фрагмент программы перестановки заданного элемент массива x[k] с последующим

При перестановке с предыдущим элементом, обмен невозможен если заданный элемент является первым (k=0).

2.4 Вычисление суммы элементов массива

Часто возникают задачи, требующие вычислить сумму всех или некоторых элементов массива, например, сумму элементов, стоящих в массиве на заданных местах, или сумму элементов, удовлетворяющих некоторому условию (сумму только положительных элементов, сумму ненулевых элементов второй половины массива и т.д.).

Пусть а[] – заданный массив из n элементов. Сумма всех его элементов в математической форме выглядит следующим образом:

(2.1)

Для вычисления суммы элементов части массива, например, с in–го до ik–го. Следует использовать формулу:

(2.2)

Очевидно, что формула (2.2) получается из формулы (2.1) при in=0 и ik=n–1.

Алгоритм вычисления суммы состоит в следующем:

1. установить значение переменой для накопления суммы (s) в нулевое значение (s=0);

2. в цикле изменяя i от in до ik вычислить суммуэлементов массива по выражениию s=s+ai.

При первой итерации цикла (i=in) получим s=s+ain= 0+ ain. На второй (i=in+1) – s=s+ain+1= ain + ain+1 и т. д. На последней итерации цикла будем иметь s=s+aik= ain + ain+1+…+ aik. Т.е. в цикле по параметру i "старое" значение s, содержащее накопленную сумму на предыдущей итерации, изменяется на значение ai. На рисунке 2.5 представлен алгоритм и фрагменты программ вычисления суммы элементов массива.

*/вычисление суммы элементов массива с in по iks=0;for(i=in;i<ik;i++) s=s+a[i]; // или s+=a[i]; или s+=*(a+i);*/вычисление суммы всех элементов массиваs=0;for(i=0;i<n;i++) s+=a[i];

Рисунок 2.5 Графическая схема и фрагмент программы вычисления суммы элементов массива

Если в алгоритме (рисунок 2.5) в блоке 2 записать i=0, а блоке 3 – (i<n), то получим алгоритм вычисления суммы всех элементов массива.

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

/* с помощью цикла for */s=0;for(i=in;i<ik;i=i+step) s+=a[i]; // или s=s+a[i];/* с помощью цикла while */s=0; i=in;while (i<ik){ s+=a[i]; i=i+step; }

Рисунок 2.6 Графическая схема и фрагмент программы вычисления суммы элементов массива стоящих на заданных местах

Например, чтобы вычислить сумму элементов, стоящих в массиве на четных местах, необходимо "заставить" i принимать значения 1, 3, 5, … (поскольку нумерация элементов массива в С начинается с нуля т.е. элемент массива с индексом a[0] – первый элемент массива). Для этого достаточно в блоке 2 записать i=1, в блоке 3 – (i<n), а в блоке 5 записать i=i+2 (step=2). В программе на языке С соответствующий фрагмент будет выглядеть следующим образом:

s=0;

for(i=1;i<n;i=i+2) // или for(i=1;i<n;i+=2)

s+=a[i]; // или s=s+a[i];

Для вычисления суммы только тех элементов, которые удовлетворяют некоторому условию, необходимо в алгоритме вычисления суммы (рисунок 2.6) блок 4 заменить на ветвление, которое обеспечивает выполнение команды s=s+ai только тогда, когда условие выполнено для рассматриваемого элемента массива ai. В этом случаи алгоритм вычисления суммы примет следующий вид (рисунок 2.7).


/* с помощью цикла for */s=0;for(i=in;i<ik;i+=step) if( условие ) s+=a[i]; // или s=s+a[i];/* с помощью цикла while */s=0; i=in;while (i<ik){ if( условие ) s+=a[i]; i=i+step;}

Рисунок 2.7 Графическая схема и фрагмент программы вычисления суммы элементов массива стоящих на заданных местах

Применим полученный алгоритм для вычисления суммы положительных элементов массива стоящих на нечетных местах. Для этого в блоке 2 запишем i=0, в блоке 3 (i<n), в 4 условие – (a[i]>0), а в блоке 6 изменение параметра цикла (step=2) i=i+2. Тогда соответствующий фрагмент программы можно записать в виде:

s=0;

for(i=0;i<n;i+=2)

if( a[i]>0 ) s+=a[i]; // или s=s+a[i];

Рассмотрим примеры использования рассмотренных алгоритмов.

Пример 2.3.

В одномерном массиве a размерностью n, вычислить сумму элементов массива, меньших заданного значения В и стоящих на местах, кратных трем.


Решение

Объединим алгоритмы ввода – вывода массива (рисунок 2.2) и вычисления суммы (рисунок 2.7). Для сокращения записи графической схемы алгоритма ввода и вывода массива, здесь и в дальнейшем используем простые блоки вида:

В алгоритме для вычисления искомой суммы рассматриваются только те элементы, которые в массиве стоят на местах, кратных трем, при этом необходимо учитывать что нумерация элементов массива в С начинается с нуля т.е. элемент массива с индексом a[0] это первый элемент массива. Таким образом, элементы стоящие на местах кратных трем – а2, а5, а8, …, индекс элемента массива (он же – параметр цикла) должен последовательно принимать значения 2, 5, 8, …, т.е. изменяться от 2 с шагом 3, что и достигается изменениями в блоках 2 и 6 алгоритма вычисления суммы (рисунок 2.7). Так в блоке 2 запишем i=2, в блоке 3 (i<n), а в блоке 6 – (step=3) i=i+3. Для суммирования из рассмотренных элементов только тех, которые меньше заданного В, используется ветвление с условием аi (блок 4). Окончательный алгоритм вычисления суммы заданных элементов примет, следующий вид (рисунок 2.8). В задаче будем использовать динамический способ задания массива. В данном примере для обращения к элементам массива используются указатели. Как уже отмечалось в разделе 1.1, имя массива является указателем на его первый элемент.



Используемые переменные:n – число элементов массива;a[] – динамический массив;s – сумма элементов массива;B – заданное число;i – параметр цикла;
#include <stdio.h>main(){ int n,i; float s, B; puts("Введите число элементов массива a"); scanf("%d",&n); float *a=new float[n]; for (i=0;i<n;i++) { printf("Введите число a[%2d]=",i); scanf("%f",a+i); } puts("Введите B"); scanf("%f",&B); s=0; for(i=2;i<n;i+=3) if(*(a+i)<B) s+=*(a+i); puts("Массив a"); for(i=0;i<n;i++) printf("%.1f ",*(a+i)); printf("&bsol;n"); printf("Сумма чисел, меньших %.1f, стоящих на местах, кратных 3, равна %.2f&bsol;n",B,s); delete[] a; // освобождение памяти return(0);}

Рисунок 2.8 Графическая схема и программа примера 2.3

2.5 Подсчет количества элементов массива, удовлетворяющих заданному условию

Подсчет количества элементов массива, удовлетворяющих заданному условию, производится по алгоритмам, аналогичным вычислению суммы. Отличие заключается в том, что вместо добавления элемента массива к сумме, переменная – счетчик (k) увеличивается на единицу (k=k+1). Таким образом, если в графических схемах алгоритмов, рисунок 2.5–2.7, вместо s=0 и s=s+ai записать k=0 и k=k+1, то получим алгоритмы подсчета количества элементов массива.

Пример 2.4.

В одномерном массиве a размерностью n, вычислить количество элементов равных заданному числу B и стоящих на четных местах.

Решение.

Графическая схема алгоритма решения задачи и фрагмент программы изображена на рисунке. 2.9.

/* с помощью цикла for */k=0;for(i=1;i<n;i+=2) if(a[i]==b ) k++; // или k=k+1;/* с помощью цикла while */k=0; i=1;while (i<n){ if(a[i]==b) k++; i=i+2;}

Рисунок 2.9 Графическая схема и программа для примера 2.4

Следующий пример показывает, как в одном алгоритме находить сумму и количество элементов, удовлетворяющих заданному условию.