Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
1

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

16.05.2012, 21:11. Показов 5898. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот такое задание нужно сделать на с++ в консольном приложении:

В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) максимальный элемент массива;
2) сумму элементов массива, расположенных до последнего положительного элемента.
Сжать массив, удалив из него все элементы, модуль которых находится в интервале [а, Ь]. Освободившиеся в конце массива элементы заполнить нулями.
3) Создать вектор и поместить в него полученный в п.2 массив. Вывести содержимое вектора на экран.

Для доступа к элементам массивов в работе пользоваться только указателями!
Для заполнения массива использовать функцию int rand(), которая возвращает при каждом обращении к ней псевдослучайное целое число из диапазона 0...0x7fff.

Сложно ли это сделать? Не могли бы помочь?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2012, 21:11
Ответы с готовыми решениями:

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

Найти сумму элементов массива, расположенных до последнего положительного элемента
В массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива, расположенных...

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

Найти сумму элементов массива, расположенных до последнего положительного элемента
В одномерном массиве, состоящем из n вещественных элементов, вычислить: Сумму элементов массива,...

17
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
17.05.2012, 03:59 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Первое и второе


Не идеальное, но решение.

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
 
 
//Функция суммирования
void Summa(int *A,int size,int *sum) 
{
 int dx=size; //Позиция последнего положительного элемента
 int i=size;  //Счетчик циклов
 *sum=0;  //Изначально сумма равна нулю
 
//Проход по массиву с конца в поиске положительного элемента
 while (i>-1)
 {
  if (A[i]>-1) break; //Если нашли положительный, прерываем выполнение цикла
  else {dx--;} //Если не нашли, то меняем позицию dx
  i--;  
 }
 
//Суммирование от первого элемента массива до dx. dx = Позиция последнего положительного элемента
 for (i=0;i<dx+1;i++)
   {
    *sum=*sum+A[i];
   }
}
 
 
//Функция поиска максимального элемента внутри массива
void GetMax(int *A,int *max,int size)
{
 *max=A[0]; //Предположительно максимальный элемент - первый элемент массива
 for (int i=1;i<size+1;i++)
  {
    if (*max<A[i]) *max=A[i]; //При проходе по массиву циклом выполняем проверку и если нашли элемент больше, меняем max
  }
}
 
//Функция создания массива
void CreateArray(int *A,int N)
{
 
 srand(time(NULL));  //Запуск генератора случайных значений
for (int j=0;j<N+1;j++)
{
 //int i=rand()%(0x7fff);  Не знаю как будет правильно
 int i=rand()%(N+100)-50; //Случайная выборка чисел
 A[j]=i;
 cout<<i<<"  "; //Сразу выводим массив на экран
}
 cout<<endl<<endl<<endl;
}
 
void main()
{
 clrscr();
   int N; //Число элементов массива
   int max,summa; //То что нужно найти по заданиям
 
   cout<<"Elementov: ";
   cin>>N; N=N-1; //Вводим число элементов
 
   int *S=new int[N]; //Создаем массив выбранной размерности
     CreateArray(S,N); //Вызываем функцию генерирующую массив
     GetMax(S,&max,N); //Вызываем функцию поиска максимального элемента
     Summa(S,N,&summa); //Суммируем элементы массива
   delete []S; //Освобождаем память
 
 
//Вывод результатов на экран
   cout<<"RESULT"<<endl;
   cout<<"Max =   "<<max<<endl;
   cout<<"Summa = "<<summa<<endl;
 getch();
 return;
}
И не понял вот чего
Диапазон от нуля и дальше, но в задании нужна сумма до последнего положительного. Так они все положительные тогда быть должны и значит это тупо можно отбросить. Выходит и считать обычную сумму всех элементов, хотя и сделано как сказано
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.05.2012, 08:47 3
Цитата Сообщение от Tester123 Посмотреть сообщение
2) сумму элементов массива, расположенных до последнего положительного элемента.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double summ(double *Data, unsigned int N)
{
 double *p;
 double r;
 bool Flag;
 for (Flag=false, r=0.0, p=Data+N-1; p>=Data; --p)
 {
  if (*p>0.0)
  {
   flag=true;
  }
  if (flag)
  {
   r+=*p;
  }
 }
 return r;
}
Добавлено через 5 минут
Цитата Сообщение от Tester123 Посмотреть сообщение
Сжать массив, удалив из него все элементы, модуль которых находится в интервале [а, Ь]. Освободившиеся в конце массива элементы заполнить нулями.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned int f(double *Data, unsigned int N, double a, double b)
{
 double *last;
 double *p;
 last=Data+N-1;
 for (p=Last; p>=Data; --p)
 {
  if ((*p>=a)&&(*p<=b))
  {
   *p=*last;
   *last=0.0;
   --last;
  }
 }
 return (unsiged int)(last-Data);
}
Добавлено через 1 минуту
О сохранении относительного порядка оставшихся элементов речи не было.
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
17.05.2012, 19:43  [ТС] 4
Странно, компилируется, запускается, но как только ввожу число элементов - ошибка.
А ещё не знаю как вывести массив после сжатия и вектор.
2-ой комментарий, спасибо, но куда это нужно вставить?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.05.2012, 19:57 5
Цитата Сообщение от daslex Посмотреть сообщение
cin>>N; N=N-1; //Вводим число элементов
int *S=new int[N]; //Создаем массив выбранной размерности
Ты вводишь количество элементов и в квадратных скобках тоже должно быть количество. Ошибка происходит, когда доходишь до N-1-го элемента, так как его просто нет, их всего N-1, а первый индекс =0 и тогда последний N-2.
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
17.05.2012, 20:07  [ТС] 6
Пробовал менять, что-то не то...
Скрин:
Найти сумму элементов массива, расположенных до последнего положительного элемента
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.05.2012, 20:10 7
Ну цикл то надо до N-1.
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
17.05.2012, 20:15  [ТС] 8
Тогда в массиве получается на 2 элемента меньше
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
17.05.2012, 22:54 9
Цитата Сообщение от taras atavin Посмотреть сообщение
Ты вводишь количество элементов и в квадратных скобках тоже должно быть количество. Ошибка происходит, когда доходишь до N-1-го элемента, так как его просто нет, их всего N-1, а первый индекс =0 и тогда последний N-2.
Странно вы размышляете
Давайте подумаем. Предположим пользователь решил создать 10 элементов.
Я отнимаю от введенного 10 один элемент= 9 элементов.

Теперь я создаю массив в 9 элементов (цифра в скобках)+нулевой элемент массива = Массив в 10 элементов.


Все элементы на месте, причем тут N-2? Этот N-1 сделан сразу и один раз только чтобы не писать его в каждой функции снова и снова, а можно было просто писать N

Так как я переписывал вручную, я мог допустить ошибки, но вы или написали на вскидку или не подумали. Как вы заметили, даже пользователь при N-2 получил на 2 элемента меньше.

В моих экспериментах при проходе циклом проблем не было и все считало как должно
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
17.05.2012, 23:28 10
Я не знаю в чем проблема, но могу предположить что какая-то из функций, использованных в DosBox bc 3.1 некорректно работает внутри Visual Studio и скорее проблема не в алгоритме написанного кода, а именно в этих функциях.

Прикрепил скрин и все работает (я циклом у себя дописывал), но так и не увидел ошибки при многократных попытках ее словить.

Проверил тот код, что написал с тем что в исходнике, опечаток не нашел
Миниатюры
Найти сумму элементов массива, расположенных до последнего положительного элемента  
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
17.05.2012, 23:44  [ТС] 11
Я заменил <iostream.h> на <iostream>, добавил пару других библиотек, потому что иначе выдавало ошибку - 'time' identifier not found. Добавил using namespace std; Удалил clrscr - 'clrscr' : undeclared identifier. И после этих изменений у меня такая ошибка, что описана выше.
А студиа у вас какая? У меня 2005.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
18.05.2012, 16:08 12
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Специально скачал Visual Studio 2005.

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// temp.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "iostream"
#include "time.h"
 
using namespace std;
 
void Summa(int *A,int size,int *sum)
{
 int dx=size;
 int i=size;
 *sum=0;
 
 
 while (i>-1)
 {
  if (A[i]>-1) break;
  else {dx--;}
  i--;
 }
 
 for (i=0;i<dx+1;i++)
   {
    *sum=*sum+A[i];
   }
}
 
void GetMax(int *A,int *max,int size)
{
 *max=A[0];
 for (int i=1;i<size+1;i++)
  {
    if (*max<A[i]) *max=A[i];
  }
}
 
void CreateArray(int *A,int N)
{    
 srand(unsigned(time(0)));
 for (int j=0;j<N+1;j++)
  {
     int i=rand()%(100)-50; //Ставьте ваше
     A[j]=i;
     cout<<i<<"  ";
   }
 cout<<endl<<endl<<endl;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
   int N;
   int max,summa;
 
   cout<<"Elementov: ";
   cin>>N; 
 
   int *S=new int[N];
   N=N-1;
    CreateArray(S,N);
    GetMax(S,&max,N);
    Summa(S,N,&summa);
   delete []S;
 
 
   cout<<"RESULT"<<endl;
   cout<<"Max =   "<<max<<endl;
   cout<<"Summa = "<<summa<<endl;
 
    system("PAUSE");
    return 0;
}
Ошибок как не ловил, так и не наблюдаю
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
18.05.2012, 23:03  [ТС] 13
Работает. Спасибо!
А про сжатие массива и вектор кто-то понял как делать?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
19.05.2012, 02:03 14
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вместе с сжатием
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// temp.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "iostream"
#include "time.h"
 
 
using namespace std;
 
void Show(int *A,int size)
{
 for (int i=0;i<size+1;i++)
 {
  cout<<A[i]<<"  ";
 }
 cout<<endl;
}
 
void Compress(int *A,int size,int a,int b)
{
     int pos=0,i=0;
     bool flag;
int *buf=new int[size+1];    
   while (i<size+1) 
   {
       if ((A[i]<a)||(A[i]>b))
       {
         buf[pos]=A[i];
         pos++;
       }
      i++;
   }
   memmove(A,buf,size*sizeof(size));
 
   for (i=pos;i<size+1;i++)
   {
    A[i]=0;
   }
   cout<<endl;
delete []buf;
}
 
void Summa(int *A,int size,int *sum)
{
 int dx=size;
 int i=size;
 *sum=0;
 
 
 while (i>-1)
 {
  if (A[i]>-1) break;
  else {dx--;}
  i--;
 }
 
 for (i=0;i<dx+1;i++)
   {
    *sum=*sum+A[i];
   }
}
 
void GetMax(int *A,int *max,int size)
{
 *max=A[0];
 for (int i=1;i<size+1;i++)
  {
    if (*max<A[i]) *max=A[i];
  }
}
 
void CreateArray(int *A,int N)
{    
 srand(unsigned(time(0)));
 for (int j=0;j<N+1;j++)
  {
     int i=rand()%(100)-50; //Ставьте ваше
     A[j]=i;
     cout<<i<<"  ";
   }
 cout<<endl<<endl<<endl;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
   int N,a,b;
   int max,summa;
 
   cout<<"Elementov: ";
   cin>>N; 
   cout<<"Diapason: "<<endl;
   cin>>a>>b;
 
   int *S=new int[N];
   N=N-1;
    CreateArray(S,N);
    GetMax(S,&max,N);
    Summa(S,N,&summa);
    Compress(S,N,a,b);
    cout<<"Compress:   ";
    Show(S,N);
    
   delete []S;
 
 
   cout<<"RESULT"<<endl;
   cout<<"Max =   "<<max<<endl;
   cout<<"Summa = "<<summa<<endl;
 
    system("PAUSE");
    return 0;
}

По поводу того что написал ранее. - В скобках массива указано ровно столько сколько создаю. Без всяких плюс нулевой элемент. taras atavin правильно говорил, я неправильно. Просто сделал я так, что этот мой минус один учитывается внутри всех функций в условиях циклов, поэтому код работает.
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
19.05.2012, 10:36  [ТС] 15
Спасибо!
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
22.05.2012, 22:41  [ТС] 16
Возникла проблема, после сжатия нули должны быть в конце массива, а не на местах удалённых элементов. Вот мучаю код, это функцию Print нужно изменить? Может подскажите что добавить?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
22.05.2012, 23:27 17
Вы с моим кодом колдуете?
В написанном вам коде тут нули и добавляются в конец массива.

Слова Print во всей теме нет, не понял о чем вы

Вот скрин, разве нули не в конце массива??
Миниатюры
Найти сумму элементов массива, расположенных до последнего положительного элемента  
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
22.05.2012, 23:38  [ТС] 18
Точно, что-то я намудрил с кодом. Вернул всё назад, осталось в вектор как-то массив занести и вывести
0
22.05.2012, 23:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2012, 23:38
Помогаю со студенческими работами здесь

Найти сумму элементов массива, расположенных до последнего положительного элемента
В одномерном массиве, который состоит из N действительных элементов, вычислить: Сумму элементов...

Найти сумму элементов массива, расположенных до последнего положительного элемента
В одномерном массиве, состоящем из n вещественных элементов, вычислить 2. Сумму элементов массива,...

Найти сумму элементов массива, расположенных до последнего положительного элемента
2) сумму элементов массива, расположенных до последнего положительного элемента. #include...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru