Как найти произведение последних элементов в массиве

shelter09

0 / 0 / 0

Регистрация: 04.11.2014

Сообщений: 12

1

Произведение последних элементов в массиве

17.12.2014, 14:25. Показов 1298. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Задание такое:
Задав одномерный массив целочисленных данных А в одном из заданных форматов, реализовать обработку массива, как указа-но в варианте. Длина статического массива N<=20. Значение N ввести с клавиатуры с проверкой на допустимые значения. Предусмотреть возможность ввода значений элементов массива пользователем и с помощью датчика случайных чисел.

Найти произведение последних L элементов в массиве A={a[i]}.

Помогите дописать код,как найти произведение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <windows.h>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    SetConsoleOutputCP(1251);
    const short N = 20;
    short n, mas[N],L,proizv;
    while (true)
    {
        cout << "Введите n-->";
        cin >> n;
        if (n > 0 && n <= N) break;
        cout << "Неправильное значение,повторите попытку" << endl;
    }
    int choise;
    do
    {
        cout << "1 - заполнение массива вручную" <<endl
            << "2 - заполнение случайными числами" <<endl;
        cin >> choise;
        switch (choise)
        {
        case 1:
            cout << "понял,заполняйте сами!" << endl;
            for (int i = 0; i < n; ++i)
            cin >> mas[i];
            break;
            case 2:
            srand((unsigned)time(NULL));
            for (int i = 0; i < n; ++i)
                mas[i] = rand();
            break;
        default:cout << "Неправильное значение!" <<endl;
        }
    } while ((choise < 1 || choise > 2));
    cout << "Массив-->";
    for (int i = 0; i < n; ++i)
        cout << mas[i] << ' ' << endl;
    cout << "введите L-->";
    cin >> L;



0



0 / 0 / 0

Регистрация: 04.11.2014

Сообщений: 12

18.12.2014, 15:41

 [ТС]

2

неужели никто не знает?



0



Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

18.12.2014, 15:50

3

shelter09, а с чем проблема? После ввода L, запускаете цикл for и проходите от конца до L, умножая всё по пути.



0



0 / 0 / 0

Регистрация: 04.11.2014

Сообщений: 12

20.12.2014, 14:39

 [ТС]

4

Тамика, я массивы плохо усвоил,и не могу разобратся как от конца до L пройти,помогите пожалуйста.



0



Тамика

Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

20.12.2014, 19:12

5

Вот как тут

C++
1
for (int i = 0; i < n; ++i)

Только наоборот.

C++
1
for (int i = n-1; i => L; --i)



0



Произведение последних элементов в массиве

Модераторы:Hawk, Romeo, Absurd, DeeJayC, WinMain

dissable1

Сообщения:4
Зарегистрирован:22 дек 2014, 15:04

Задание такое:
Задав одномерный массив целочисленных данных А в одном из заданных форматов, реализовать обработку массива, как указа-но в варианте. Длина статического массива N<=20. Значение N ввести с клавиатуры с проверкой на допустимые значения. Предусмотреть возможность ввода значений элементов массива пользователем и с помощью датчика случайных чисел.

Найти произведение последних L элементов в массиве A={a}.
Я всё сделал ,до произведения.Дальше тупик..

Код: Выделить всё

#include <iostream>
#include <windows.h>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    SetConsoleOutputCP(1251);
    const short N = 20;
    short n, mas[N],L,proizv;
    while (true)
    {
        cout << "Введите n-->";
        cin >> n;
        if (n > 0 && n <= N) break;
        cout << "Неправильное значение,повторите попытку" << endl;
    }
    int choise;
    do
    {
        cout << "1 - заполнение массива вручную" <<endl
            << "2 - заполнение случайными числами" <<endl;
        cin >> choise;
        switch (choise)
        {
        case 1:
            cout << "понял,заполняйте сами!" << endl;
            for (int i = 0; i < n; ++i)
            cin >> mas[i];
            break;
            case 2:
            srand((unsigned)time(NULL));
            for (int i = 0; i < n; ++i)
                mas[i] = rand();
            break;
        default:cout << "Неправильное значение!" <<endl;
        }
    } while ((choise < 1 || choise > 2));
    cout << "Массив-->";
    for (int i = 0; i < n; ++i)
        cout << mas[i] << ' ' << endl;
    cout << "введите L-->";
    cin >> L;

Мне сказали что нужно дальше запускать цикл
for (int i = n-1; i => L; —i) и умножать всё
Но мозг не варит,помогите пожалуйста дописать

Аватара пользователя

Romeo

Сообщения:3091
Зарегистрирован:02 мар 2004, 17:25
Откуда:Крым, Севастополь
Контактная информация:

22 дек 2014, 17:29

Фактически, тебе нужно перемножить элементы массива mas начиная с последнего (с индексом n-1) и заканчивая L-ым с конца (следовательно у него индекс n — 1 — (L — 1), раскрывая скобки получаем n-L).

proizv = mas[n-1] * … * mas[n-L]

Теперь как это из формулы превратить в код программы. Очевидно нужен цикл по индексам, причём границы цикла уже вычислены.

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

Осталась последняя мелочь. Чем инициализировать proizv перед циклом, чтобы накопление отработало корректно. Нулём? Ноль бы подошёл, если бы суммировали элементы. В случае же умножения в качестве инициализрующего значения ноль не подходит, так как перемножение в цикле нуля на любое число снова даст ноль и никакого накопления не получится. Правильный ответ 1.

В результате имеем следующий код:

Код: Выделить всё

proizv = 1;
for (int i = n-1; i >= n-L; --i)
   proizv = proizv*mas[i];

Entites should not be multiplied beyond necessity @ William Occam

Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)

Сообщение «Спасибо» малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой «Reputation» в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

dissable1

Сообщения:4
Зарегистрирован:22 дек 2014, 15:04

22 дек 2014, 20:07

Спасибо большое,помогите пожалуйста ещё с проверкой.Мне нужно чтобы тип результата был short,и чтобы числа ,которые ввожу в массив,были не больше SHRT_MAX и меньше SHRT_MIN.

Аватара пользователя

Romeo

Сообщения:3091
Зарегистрирован:02 мар 2004, 17:25
Откуда:Крым, Севастополь
Контактная информация:

23 дек 2014, 12:38

Считать значение больше SHRT_MAX или меньше SHRT_MIN в переменную типа short ты не сможешь по определению, так как произойдёт переполнение, старший бит пропадёт и число всё равно останется в указанном диапазоне. То есть сравнивать с граничными числами после того, как число было считано в переменную бессмысленно.

В качестве альтернативы предлагаю считать в переменную типа long, проверить границы, а затем, если всё в порядке, переприсвоить значение переменной типа short.

Тут, конечно, можно попасть в зависимость от сумасшедствия пользователя, который может ввести число длинной в сто знаков, зажав какую-то цифру и заснув на минуту, затем проснувшись и нажав Enter. Но проблемы с подобным вводом решаются иначе и сложнее. Тут уже поможет только считывание данных, как строки, отбрасывание слишком длинных строк, как ошибочных, и последующее программное преобразование строки в число, если длина строки нас удовлетворяет.

Entites should not be multiplied beyond necessity @ William Occam

Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)

Сообщение «Спасибо» малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой «Reputation» в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

dissable1

Сообщения:4
Зарегистрирован:22 дек 2014, 15:04

23 дек 2014, 14:34

Да,это я знаю,я просто не знаю как проверять число,которое ввожу в массив.Если была бы переменная,то спокойно написал,вроде
if (a>SHRT_MIN && a<SHRT_MAX) break;
а что тут писать вместо «а»?

Аватара пользователя

Romeo

Сообщения:3091
Зарегистрирован:02 мар 2004, 17:25
Откуда:Крым, Севастополь
Контактная информация:

23 дек 2014, 18:05

А mas нельзя написать вместо а? Я думал, что эта часть понятна сама собой.

Всё, что я писал, куда важнее, так как простая замена a на mas не решит проблемы. Причины выше указаны. Так что нужно, как минимум, объявить переменную типа большего, чем short (к примеру, int или long), считать число в неё, потом сделать проверку и лишь потом, если всё в порядке, записать значение в mas.

Entites should not be multiplied beyond necessity @ William Occam

Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)

Сообщение «Спасибо» малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой «Reputation» в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

dissable1

Сообщения:4
Зарегистрирован:22 дек 2014, 15:04

24 дек 2014, 17:43

а как написать функции ввода и вывода массива?Я думал просто скопировать,но так не работает

Код: Выделить всё

int func1()
{
	s = 0;
	for (; s < n; ++s)
	{
		while (true)
		{
			cin >> mas[s];
			if (mas[s]>SHRT_MIN && mas[s] < SHRT_MAX)
				break;
			cout << "Выход за диапазон,повторите попытку" << endl;
		}
	}
}
int func2()
{
	srand((unsigned)time(NULL));
	for (int i = 0; i < n; ++i)
		mas[i] = rand();
	break;
}

Аватара пользователя

Romeo

Сообщения:3091
Зарегистрирован:02 мар 2004, 17:25
Откуда:Крым, Севастополь
Контактная информация:

24 дек 2014, 19:43

Дело в том, что mas является локальной переменной. Внутри функци func1 и func2 эта переменная не будет видна, так как область её виимости ограничена функцией main. То же самое касается переменной n.

Выхода два:

1. (Правильный) Передать mass и n в качестве параметров в каждую из функций func1 и func2.
2. (Более простой, но кривой) Вынести переменные mass и n за границы функции main в область глобальных данных.

Entites should not be multiplied beyond necessity @ William Occam

Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)

Сообщение «Спасибо» малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой «Reputation» в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

uses crt;
const nmax=100;
var a:array[1..nmax] of shortint;
    n,i,k,L:byte;
    s:integer;
begin
clrscr;
randomize;
repeat
write('Размер массива до ',nmax,' n=');
readln(n);
until n in [1..nmax];
writeln('Массив:');
for i:=1 to n do
 begin
  a[i]:=random(256)-128;
  write(a[i]:5);
 end;
writeln;
writeln;
write('Введите количество отрицательных элементов L=');
readln(L);
s:=0;
i:=n;k:=0;
while (i>0)and(k<L) do
 begin
  if a[i]<0 then
   begin
    k:=k+1;
    s:=s+a[i];
   end;
  i:=i-1;
 end;
if k<L then write('В массиве нет ',L,' отрицательных элементов')
else write('Сумма последних ',L,' отрицательных=',s);
readln
end.

//Pascal ABC.NET 3.1 сборка 1219

Var

 ar:array[1..10] of integer;

 i,n,k:integer;

 b:boolean;

begin

randomize;

 k:=1;

 b:=false;

 writeln(‘Array’);

 for i:=1 to 10 do

  begin

   ar[i]:=random(-10,10);

   write(ar[i]:4);

  end;

writeln;

readln(n);

 for i:=10 downto 10-n+1 do

 if ar[i]>0 then

 begin

 k:=k*ar[i];

 b:=true;

 end;

if b=true then write(‘Res=’,k) else write(‘Res=0’);

end.

Пример работы программы:

Array   0  -8  -7  -9   8  -8   9   2  -7  -6

5

Res=18

Такая задача часто встречается, если вы начали изучение программирования и уже дошли до работы с массивами.

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

Мы с напишем программу, которая выведет сам массив, сумму элементов массива, а также произведение элементов массива. Напишем ее на C++.

Прежде чем написать, давайте немного разберем сам алгоритм, обозначим шаги, которые необходимо будет сделать.

Первое — создадим сам массив, создадим начальную переменную для хранения суммы и начальную переменную для хранения произведения элементов массива.

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

Третье — выводим массив и выводим значения переменных, которые хранят сумму и произведение элементов массива.

Давайте теперь уже напишем программу, которая найдет сумму и произведение элементов массива на C++


#include 
 
using namespace std;
 
int main()
{
	/* Заполним массив значениями */
	int n = 6;
	int mass[n] = {5, 3, 2, 9, 3, 8};
	
	/* Создадим переменные для хранения суммы и произведения */
	int sumValue = 0; // Сумма
	int proValue = 1; // Произведение (по умолчанию 1)
	
	cout << endl << "Массив = ";
	/* Проходим по всем элементам массива */
	for (int i = 0; i < n; ++i) {
		// Вынесем текущий элемент в переменную
		int currentElementValue = mass[i];
		
		// Сразу выведем его
		cout << currentElementValue << " ";
		
		// Пересчитываем сумму элементов массива с текущим значением
		sumValue = sumValue + currentElementValue;
		
		// Пересчитываем произведение элементов массива с текущим значением
		// Если бы по умолчанию proValue был не 1, а 0, то так сделать нельзя было бы
		// т.к. был бы всегда 0 при умножениях.
		proValue = proValue * currentElementValue;
	}
	
	cout << endl << "Сумма элементов массива = " << sumValue;
	cout << endl << "Произведение элементов массива = " << proValue;
	
	
	
	
	return 0;
}

Компилируем и запускаем. Видим следующий вывод программы.

Вывод программы

Проверяем на калькуляторе — все работает как нужно.

Понравилась статья? Поделить с друзьями:
  • Как исправить залитую клавиатуру ноутбука
  • Как найти стояк канализации
  • Как найти камеру для шоу
  • Как найти свои водительские права в госуслугах
  • Как найти фамилию в черном списке