shelter09 0 / 0 / 0 Регистрация: 04.11.2014 Сообщений: 12 |
||||
1 |
||||
Произведение последних элементов в массиве17.12.2014, 14:25. Показов 1298. Ответов 4 Метки нет (Все метки)
Задание такое: Найти произведение последних L элементов в массиве A={a[i]}. Помогите дописать код,как найти произведение
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 |
|||||||
Вот как тут
Только наоборот.
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;
}
Компилируем и запускаем. Видим следующий вывод программы.
Проверяем на калькуляторе — все работает как нужно.