Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.73
Zalik
2 / 2 / 2
Регистрация: 24.05.2010
Сообщений: 94
#1

Найти сумму первых элементов массива, произведение которых не превышает заданного числа М - C++

15.03.2012, 17:40. Просмотров 3479. Ответов 44
Метки нет (Все метки)

Имеется последовательность чисел a1, a2, ... ,aN, образована по правилу аi=random(N). Найти сумму первых из них (считая слева направо), произведение которых не превышает заданного числа М.
Очень прошу помочь!
http://www.cyberforum.ru/cpp-beginners/thread372448.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2012, 17:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти сумму первых элементов массива, произведение которых не превышает заданного числа М (C++):

Найти произведение первых трех элементов массива, больших заданного числа
В массиве а1, а2, ..., а25 найти произведение первых трех элементов, больших...

Найти сумму элементов массива значения которых меньше заданного числа
Дан одномерный массив 6 элементов. Найти сумму элементов массива значения...

В заданном массиве найти количество элементов, для которых отклонение от заданного числа А не превышает величины Р
В заданном массиве найти количество элементов, для которых отклонение от...

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

Вычислить произведение элементов массива S, значение которых не больше заданного негативного числа
Здесь задали на Борланде С(не С++) ну просто нечто (я нуб в этом деле)...

44
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 11:00 #21
Цитата Сообщение от dimcoder Посмотреть сообщение
говорю же, зависит от компилятора.
Цитата Сообщение от dimcoder Посмотреть сообщение
При моем тесте
- поставь другой компилятор, например перейди с DevC на студию и забудь о ряде ненужных проблем...
1
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
16.03.2012, 11:06 #22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
поставь другой компилятор, например перейди с DevC на студию и забудь о ряде ненужных проблем
По моему вы уходите от темы. Признайте, здесь вы были не правы:
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if -а достаточно чтобы алгоритм не обломился
1
-=ЮрА=-
16.03.2012, 11:15
  #23

Не по теме:

Цитата Сообщение от dimcoder Посмотреть сообщение
Признайте, здесь вы были не правы:
- пишу в студии, пишу для ОС Windows выложил скриншот работы могу и экзешник выложить по коду. Т.е. если ты пишешь в С3.1 или борланд Си или ещё в невесть чём это не мои проблеммы.
dimcoder, по моему от темы ушёл ты - тема Zalik, а если хочется покусаться со мной, то можно в личке.
PS:Я не признаю ни DevC ни ещё ряд IDE что дальше???У тебя платформа какая - предположу Windows - вот будь добр пиши в среде от разработчиков твоей платформы, а не во всяком ужасе которого сейчас расплодилось...

1
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
16.03.2012, 11:32 #24
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я не признаю ни DevC ни ещё ряд IDE что дальше?
Надеюсь стандарт вы признаете.

An allocation function that fails to allocate storage can invoke the currently installed new-handler function (18.6.2.3), if any. [Note: A program-supplied allocation function can obtain the address of the currently installed new_handler using the std::sget_new_handler function (18.6.2.4). —end note ] If an allocation function declared with a non-throwing exception-specification (15.4) fails to allocate storage, it shall return a null pointer. Any other allocation function that fails to allocate storage shall indicate failure only by throwing an exception of a type that would match a handler (15.3) of type std::bad_alloc (18.6.2.1).

Здесь черным по белому написано: если размещающая функция не способна предоставить память, ей следует либо вызвать функцию установленную программистом, либо возвратить null pointer, либо выбросить исключение.

Поэтому предположение
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if -а достаточно чтобы алгоритм не обломился
неверно.
1
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 13:24 #25
Цитата Сообщение от dimcoder Посмотреть сообщение
non-throwing exception-specification (15.4) fails to allocate storage, it shall return a null pointer.
Цитата Сообщение от dimcoder Посмотреть сообщение
либо возвратить null pointer,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(arr = new int[n]))
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
arr = NULL;
,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если выбросит исключение bad alloc приравняй arr = NULL и иди дальше
Может красное заметней будет...
А теперь от себя - ты ровным счётом ничего в топике не сделал для ТС (НОЛЬ полный, даже не удосужился ошибку ему показать, зато настрочил здесь уже 1,5 листа метафор). Ты привёл стандарт я привёл код, рабочий, что дальше?
1
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
16.03.2012, 13:58 #26
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если выбросит исключение bad alloc приравняй arr = NULL
Вот в том то и дело, что если выбросится исключение, то придется с ним что-то делать, а у вас в #19 посте этого не предусмотрено (и программа как сказано в стандарте может выбросить исключение -> terminate).
Цитата Сообщение от dimcoder Посмотреть сообщение
возвратить null pointer
Ваш код будет работать только в этом случае.

Я бы понял такой код:
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
#include <iostream>
using namespace std;
 
int main()
{
        int * arr       = 0;
        unsigned long n = 0;
        while(true)
        {
                cin.clear();
                cin.sync();
                cout<<"Enter num of elements in array\n";
                try
                {
                if(!(cin>>n))
                        cout<<"Input error\n";
                else
                if(!(arr = new int[n]))
                        cout<<"Alllocation memory error\n";
                else
                {
                        cout<<"Allocation successfull\n"
                                <<"number of elements : "<<n<<endl
                                <<"adress of array 0x"<<arr<<endl;
                        delete [] arr;
                }
                }
                catch (bad_alloc& e)
                {
                    cout << "Exception has been thrown: " << e.what() << endl;
                }
                arr = NULL;
        }
        return 0;
}
1
Миниатюры
Найти сумму первых элементов массива, произведение которых не превышает заданного числа М  
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 14:37 #27
Цитата Сообщение от dimcoder Посмотреть сообщение
Я бы понял такой код:
- ну и где тЫ в нём устранил свой bad_alloc???Зашёл в трай кэтч пропечатал ексепшн, ну и где ты удалил это самое ексепшн, м?
1
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
16.03.2012, 15:35 #28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
удалил это самое ексепшн
А зачем его удалять (честно говоря я понятия не имею как "удалять" эксепшн)? Главное предотвратить экстренное завершение программы и дать понять где произошла ошибка. Пропечатал бы я даже там "Allocation memory error", разница была бы небольшая - я делаю то же самое что и вы при возвращении new NULL poiner'a. Главное что программа не завершилась и не было бы stack unwinding'a.
0
Zalik
2 / 2 / 2
Регистрация: 24.05.2010
Сообщений: 94
16.03.2012, 15:38  [ТС] #29
Огромное спасибо всем кто помогал! Вот что в итоге получилось:
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
#include "stdafx.h"
#include <iostream>
#include<CONIO.H>
#include<STDIO.H>
#include <time.h>
#include <stdlib.h>
using namespace std;
 
int main()
{
    int n;
srand(time(NULL));
float *massiv;
cout<<"Vvedite chislo elementov : ";
cin>>n;
 massiv = new float [n];
for (int i=0; i<n; i++)
{
massiv[i] = float (rand()%10);
cout << massiv[i] << " " ;}
    int a;
    cout << endl << "Vvedite chislo" << endl;
    cin >> a;
    int umnog = 1, summa = 0;
    if(massiv[0] < a){
        for(int i = 0; i < 10; i++){
            if(umnog < a){
                umnog *= massiv[i];
                summa += massiv[i];
            }
            else{
                summa = summa - massiv[i - 1];
                break;
            }
        }
    }
    else{
        cout << "Oshibka :-(((";
    }
    cout <<"Summa ravna="<< summa;
 
    getch();
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 17:11 #30
Zalik, т.к. мне в отличие от dimcoder, непо.. как ты будешь сдавать свой код то запиши его так(это твой же код только без 3-х ошибок, которые есть в твоём алгоритме)
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    int M, N, i;
    int *massiv = NULL;
    cout<<"Vvedite chislo elementov : ";cin>>N;
    srand(time(NULL));
    massiv = new int [N];
    for (i = 0; i < N; i++)
    {
        massiv[i] = (rand()%N);
        cout << massiv[i] << " " ;
    }
    cout<<endl<<"Vvedite chislo M : ";
    cin>>M;
    int umnog = 1; 
    int summa = 0;
    for(i = 0; i < N; i++)
    {
        umnog *= massiv[i];
        summa += massiv[i];
        if(M < umnog)
            break;
    }
    if(i == 0)
        cout << "Oshibka pervi element men'she M:-((("<<endl;
    else
        cout <<"Summa ravna="<< summa<<endl;
    system("pause");//Âìåñòî getch
    return 0;
}
1
Миниатюры
Найти сумму первых элементов массива, произведение которых не превышает заданного числа М  
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 17:40 #31
PS Zalik, переставь строку в этом цикле
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(i = 0; i < N; i++)
* * * * {
* * * * * * * * umnog *= massiv[i];
* * * * * * * * if(M < umnog)
* * * * * * * * * * * * break;
summa += massiv[i];
* * * * }
1
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
16.03.2012, 17:50 #32
-=ЮрА=-, если я поправил вас в утверждении
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if -а достаточно чтобы алгоритм не обломился
и вы упорно отказываетесь в это верить, это не значит что мне
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
по..
Также я не понимаю, почему вы до сих пор упорно продолжаете игнорировать мои предыдущие сообщения и аргументы, ваши опровержения которых являются по сути несущественными.
1
-=ЮрА=-
16.03.2012, 17:55
  #33

Не по теме:

dimcoder, достал, поправь лучше алгоритм ТС, если ты конечно в нём видишь ошибки...

1
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
16.03.2012, 17:55 #34
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
2
3
time_t t;
// ...
srand(time(&t));
Зачем в time передавать адрес переменной, которая не будет использоваться в дальнейшем?
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2012, 20:37 #35
Цитата Сообщение от Nameless One Посмотреть сообщение
Зачем в time передавать адрес переменной, которая не будет использоваться в дальнейшем?
- обычно я пишу на многократную генерацию

C
1
2
3
4
5
6
7
time_t t;
while(1)
{
      srand(time(&t));
      //....
      rand();
}
- и этим стараюсь оградить свой код от псевдослучайных последовательностей, хотя для данного алгоритма в принципе можно и srand(time(NULL)); Всё же думаю лучше пусть пользователь сразу привыкнет использовать такую конструкцию, чтобы не ломать голову, а почему эе в коде ниже последовательности повторяются
C
1
2
3
4
5
6
while(1)
{
      srand(time(NULL));
      //....
      rand();
}
Добавлено через 17 минут
Nameless One, можешь как эксперт сказать в большинстве IDE при создании exe уже заложен внутренний фильтр badalloc или нет, т.к. в определённом месте топик уже вышел за рамки конструктивной беседы...
Итак, приложения слинкованные в Release без try catch с компиляором GNU выдали програмное прерывание, с компилятором VisualStudio и BorlandC 6 прошли "предполагаемое место краха" без проблем, где же правда?Мне интересно услышать конкреное мнение, т.к. спор спором но граблей c badalloc в IDE c которыми работаю я не встречал: при невозможности выделения памяти даже в catch(badalloc) алгоритм не заходит, вот сижу и думу думаю...
1
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
17.03.2012, 10:23 #36
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- и этим стараюсь оградить свой код от псевдослучайных последовательностей
вот это не понял

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Nameless One, можешь как эксперт сказать в большинстве IDE при создании exe уже заложен внутренний фильтр badalloc или нет
какой такой «внутренний фильтр»?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Итак, приложения слинкованные в Release без try catch с компиляором GNU выдали програмное прерывание
т.е. исключение, я правильно понял?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
с компилятором VisualStudio и BorlandC 6 прошли "предполагаемое место краха" без проблем, где же правда?
это уже баг конкретной реализации. По умолчанию new (если не указана функция для выделения памяти) должна выбрасывать исключение. Любое другое поведение — это уже отклонение от стандарта. Хотя, в принципе, MS VC++ 6.0 как раз этим и славится. В то время как поведение GCC в данном случае адекватно требованиям стандарта.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Мне интересно услышать конкреное мнение, т.к. спор спором но граблей c badalloc в IDE c которыми работаю я не встречал: при невозможности выделения памяти даже в catch(badalloc) алгоритм не заходит, вот сижу и думу думаю...
а не нужно гадать, нужно просто почитать черновик стандарта
1
-=ЮрА=-
Заблокирован
Автор FAQ
17.03.2012, 11:07 #37
Цитата Сообщение от Nameless One Посмотреть сообщение
Хотя, в принципе, MS VC++ 6.0 как раз этим и славится. В то время как поведение GCC в данном случае адекватно требованиям стандарта.
- я тестировал на 2008-й обижаешь.
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
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
 
int main()
{
    int * arr       = NULL;
    unsigned long n = 1000000000;
    for(int i = 0; i < 3; i++)
    {
        try
        {
            if(!(arr = new int[n]))
                cout<<"Allocation memory error\n";
            else
            {
                cout<<"Allocation done"<<endl
                    <<"Num of elements : "<<n<<endl
                    <<"Memory adress   : "<<arr<<endl;
            }
        }
        catch(bad_alloc &e)
        {
            cout<<e.what()<<endl;
            arr = NULL;
        }
    }
    system("pause");
    return 0;
}
Посмотри скрин работы приложения собранного в 9-ке(надо и скрины пошагового прохождения прилеплю, в catch не заходим). По поводу опций компилятора, как я понял GNU отстроен так чтобы линковать код выбрасывающий исключения, студия уже линкует с тем расчётом чтобы исключений не было. У меня вопрос - что лучше продумывать кучи реакций на исключительные ситуации, либо писать простенькие фильтры, а всё остальное за тебя сделает линковшик. Лично я за 2-й вариант. Так если посудить исключение может выбрасывать и scanf да и printf наверное, что весь код в try catch заворачивать?(какая-та глупость на мой взгляд)

На счёт случайных, долго пояснять - суть сводилась к тому что srand(time(NULL)) каждый раз засеивает внутренний генератор чисел одним и тем же начальным числом, думаю не нужно развивать тему как может отработать алгоритм при одних и тех же начальных условиях time(&t) в любом случае всегда вернёт отличное число(милисекунды то от 1970-го тикают всегда)
0
Миниатюры
Найти сумму первых элементов массива, произведение которых не превышает заданного числа М  
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
17.03.2012, 11:17 #38
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Посмотри скрин работы приложения собранного в 9-ке(надо и скрины пошагового прохождения прилеплю, в catch не заходим). По поводу опций компилятора, как я понял GNU отстроен так чтобы линковать код выбрасывающий исключения, студия уже линкует с тем расчётом чтобы исключений не было. У меня вопрос - что лучше продумывать кучи реакций на исключительные ситуации, либо писать простенькие фильтры, а всё остальное за тебя сделает линковшик. Лично я за 2-й вариант. Так если посудить исключение может выбрасывать и scanf да и printf наверное, что весь код в try catch заворачивать?(какая-та глупость на мой взгляд)
извини, я не понял, выбрасывает ли код, скомпилированный cl.exe, исключение, или нет? Если да, то какая версия выбрасывает, а какая нет? (Как ты наверно догадался, сам я проверить не могу)

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
суть сводилась к тому что srand(time(NULL)) каждый раз засеивает внутренний генератор чисел одним и тем же начальным числом
нет, не одним и тем же

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
думаю не нужно развивать тему как модет отработать алгоритм при одних и тех же начальных условиях time(&t) в любом случае всегда вернёт отличное число(милисекунды то от 1970-го тикают всегда)
srand(time(NULL)) и srand(time(&t)) будут работать одинаково всегда. От того, передашь ли ты функции time аргумент или нет, не зависит ее возвращаемое значение. Почитай документацию на функцию time
1
-=ЮрА=-
Заблокирован
Автор FAQ
18.03.2012, 10:40 #39
Цитата Сообщение от Nameless One Посмотреть сообщение
От того, передашь ли ты функции time аргумент или нет, не зависит ее возвращаемое значение.
- однако посмотри на скрин а также компиляцию этого алгоритма
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <time.h>
 
int main()
{
    int i = 0;
    for(; i < 10; i++)
        printf("%u\n",time(NULL));
    printf("Press any key to continue\n");
    getchar();
    return 0;
}
http://codepad.org/qIYNWBC6
0
Миниатюры
Найти сумму первых элементов массива, произведение которых не превышает заданного числа М  
-=ЮрА=-
Заблокирован
Автор FAQ
18.03.2012, 10:47 #40
На счёт студии, не хочу резать скрины однако скажу что даже при пошаговом прохождении
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
try
* * * * * * * * {
* * * * * * * * * * * * if(!(arr = new int[n]))
* * * * * * * * * * * * * * * * cout<<"Allocation memory error\n";
* * * * * * * * * * * * else
* * * * * * * * * * * * {
* * * * * * * * * * * * * * * * cout<<"Allocation done"<<endl
* * * * * * * * * * * * * * * * * * * * <<"Num of elements : "<<n<<endl
* * * * * * * * * * * * * * * * * * * * <<"Memory adress * : "<<arr<<endl;
* * * * * * * * * * * * }
* * * * * * * * }
* * * * * * * * catch(bad_alloc &e)
* * * * * * * * {
* * * * * * * * * * * * cout<<e.what()<<endl;
* * * * * * * * * * * * arr = NULL;
* * * * * * * * }
- в catch ветвь не заходим. Я и писал что студия линкует без генерации bad_alloc (тест делал на 2008-й версии, с релиза остальных версий прошло менее 3-х лет и использовать их нельзя - есть такой принцип, обкатай 3 года дождись от разработчика пакетов с аддонами и исправлениями а потом уже пиши, так что 10-ку не пробовал)

Добавлено через 4 минуты
Грешным делом подумал вдруг за 10-ть итераций time(NULL) не успевает изменить возвращаемое значение И запустил тест 100 тыс http://codepad.org/cCwx2uLg
2309 1332053092
2310 1332053093
да тик уже виден, про time(NULL) вопрос снял, однако за bad_alloc всё в силе
0
18.03.2012, 10:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 10:47
Привет! Вот еще темы с решениями:

Вычислить произведение элементов массива S, значение которых не больше заданного негативного числа
Здесь задали на Борланде С++ ну просто нечто (я нуб в этом деле) 1.Вычислить...

Найти произведение элементов массива, результат умножения цифр которых больше заданного К
Помогите, пожалуйста, найти произведение тех элементов массива, содержащего...

Найти произведение элементов массива, больше заданного числа А
Новичок в С++, пока даже лекций по циклам не было, но уже дали задание. Не...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru