• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Задача На Массив

  • Автор темы Deymonn
  • Дата начала
D

Deymonn

Условие: Задан целочисленный знаковый массив из N элементов.
Необходимо: 1) Найти среднее значение чисел в диапазоне от А до В
2) Найти сумму элементов до минимального
3) Найти произведение элементов после максимального
Вот мой не до конца работающий код, точнее он сделан по пункту 1 и есть небольшой фундамент для 2 и 3 пункта. Помогите реализовать 2 и 3 пункт у самого не получается.
C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

int main()
{
int* a;
int T=0,A,B,len, max, min;
unsigned char r=0;
float SZ;
srand(time(NULL));
printf("Vvedite razmer massiva:\n");
do 
{
scanf("%d", &len);					  
} while ((len < 1));
do{printf("\n Vvedite diaposon A= ");
scanf("%d", &A);
printf("\n Vvedite diaposon B= ");
scanf("%d", &B);}while(A>B);
a = new int[len]; 
for (int i = 0; i < len; i++)
{
printf("%d ", a[i] = rand()%200 - 100); 
if (i == 0)							 
{  
min = a[0];
max = a[0];
continue;
}
if (a[i] > max)
{
max = a[i];

}
if (a[i] < min)
{ 
min = a[i];		
}
if((a[i]>=A)&&(a[i]<=B))
{T+=a[i];
r++;
SZ=0;}
SZ=(float)T/r;
}
delete []a;

printf("\n Srednee znachenie v diaposone=%.6f", SZ);
printf("\nMAX = %d, MIN = %d", max, min);
getch();
return 0;
}

Допустим массив из 5 элементов :
3 5 6 -5 2
Диапазон А=2
Диапазон В=6
Тогда Среднее значение в диапазоне = 2+3+5+6/4=4
Минимальный элемент = -5
Сумма до минимального = 3+5+6=14
Максимальное значение = 6
Произведение после максимального = -5*2= 10
Сумму и произведение не получается реализовать, очень буду признателен за помощь )
 
W

Whatka

в одном цикле не получится
запоминай в первом цикле не значение максимального\минимального элемента а индекс
а во втором цикле,зная индекс проблем не будет найти сумму\произведение
 
D

Deymonn

Вот попробовал не одним циклом в итоге выдает космические цифры, при любом колве ел-в в массиве произ-е и сумма одинаковые числа всегда
C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

int main()
{
int* a;
int index,len,max,pro, min,sum;
srand(time(NULL));
printf("Vvedite razmer massiva:\n");
do 
{
scanf("%d", &len);					  
} while ((len < 1));

a = new int[len]; 
for (int i = 0; i < len; i++)
{
printf("%d ", a[i] = rand()%200 - 100); 
min = a[0];
index = 0;
for (int i=0; i<len; i++)

if (min>a[i])
{
min = a[i];
index = i;
}

sum=0;
for (i=0; i<index; i++)
{
sum+=a[i];
}
max = a[0];
index = 0;
for ( i=0; i<len; i++)
if (max<a[i])
{
max = a[i];
index = i;
}
pro = 1;
for (i=index+1; i<len; i++)
pro*=a[i]; 

}
delete []a;
printf("\nSUM=%d",&sum);
printf("\nPRO=%d",&pro);

printf("\n MIN = %d \n MAX = %d", min, max);
getch();
return 0;
}
 
W

Whatka

вот по этому раньше учили сначала рисовать блок-схемы,а потом только писать программы

смотри на свою первую задачу её надо немного исправить только
ты одним(!!) циклом ищешь среднее арифметическое и индексы(максимума и минимума)
а вторым(после первого)
уже считаешь сумму и произведение

я тебе намекаю что только 2 цикла будет))
 
D

Deymonn

Вот программа перестает работать на выводе рандомных элементов 8(
C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

int main()
{
int* a;

int sum=0,pro=1,T=0,A,B,len, max, min,index,index1;
unsigned char r=0;
float SZ;
srand(time(NULL));
printf("Vvedite razmer massiva:\n");
do 
{
scanf("%d", &len);					  
} while ((len < 1));
do{printf("\n Vvedite diaposon A= ");
scanf("%d", &A);
printf("\n Vvedite diaposon B= ");
scanf("%d", &B);}while(A>=B);
a = new int[len]; 
for (int i = 0; i < len; i++)
{
printf("%d ", a[i] = rand()%200 - 100); 
if (i == 0)							 
{  
min = a[0];
max = a[0];
continue;
}
if (a[i] > max)
{
max = a[i];
index=i;

}
if (a[i] < min)
{ 
min = a[i];
index1=i;		
}
if((a[i]>A)&&(a[i]<B))
{T+=a[i];
r++;
SZ=0;}
SZ=(float)T/r;
}
for ( i = 0; i < len; i++) 
{
i=index+1;
if(i<len)
{
pro*=a[i];
i++;
}

i=0;
if(i<index1)
{
sum+=a[i];
}
}
delete[]a;
printf("\n SUM=%d", sum);		
printf("\n Pro=%d", pro);
printf("\n Srednee znachenie v diaposone=%.6f", SZ);
printf("\nMAX = %d, MIN = %d", max, min);
getch();
return 0;
}
 
R

rrrFer

Deymonn


Код:
if((a[i]>A)&&(a[i]<B))
{T+=a[i];
r++;
SZ=0;}
SZ=(float)T/r;
}
for ( i = 0; i < len; i++) 
{
я это читать не могу, расставь нормально скобочки и отступы.
 
W

Whatka

быстро накидал,должно работать
C++:
//
#include <conio.h>
#include <time.h>
#include <iostream>
using namespace std;
void main()
{
setlocale(LC_ALL,".1251");
int *a;
int len;
cout<<"Размер массива:";
cin>>len;
if(len==0)
len++;
a = new int[abs(len)]; 

int A,B;
cout<<"Граница A:";
cin>>A;
cout<<"Граница B:";
cin>>B;
if(A==B)
B++;
if(A>B)
swap(A,B);

int T(0);
unsigned int r(0);
int min(0),max(0);
srand(time(NULL));
for (int i=0;i<len;++i)
{
a[i]=rand()%200-100; 
cout<<a[i]<<" ";
if (a[i] > a[max])
max = i;
if (a[i] < a[min])
min = i;
if( (a[i]>A) && (a[i]<B) )
{
T+=a[i];
r++;
}

}
float SZ(0);
if(r!=0)
SZ=T/r;
cout<<"\nСреднее арифметическое в диапозоне:"<<SZ<<endl;
int sum(0),pro(1);
for (int i=0;i<len;i++) 
{
if(i>max)
pro*=a[i];
if(i<min)
sum+=a[i];
}
delete[]a;
cout<<"Сумма до минимального:"<<sum<<endl;
cout<<"Произведение после максимального:"<<pro<<endl;
getch();
}
//
 
D

Deymonn

Спасибо большое,я на с++ ничего не понимаю т.к. начал изучать си только 3 месяца назад) но тут по форумам полазил и теперь все работает!)
 
W

Whatka

ну мы не можем создать массив нулевой длины
там могло стоять любое число len+=10; например
просто я выбрал единицу
 
R

rrrFer

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

Код:
a = new int[abs(len)];
этот код еще более невероятен. Т.е. юзер хочет создать массив отрицательной длины, но мы вместо того чтобы сказать ему что он дyрак [уберите к черту этот дебильный плагин с форума(который заменяет ругательные слова на всякую ерунду дyрак - это игра, зачем заменять это слово на "мир"?)] создадим массив какой-то левой длины, но само значение длины оставим отрицательным. Т.е. память мы зачем то выделим, но программа работать не будет. Посмотри все же на стандартные контейнеры, я думаю, они работают так как работают, потому что именно такой реакции на всякие кривые данные ожидает большинство программистов.
 
W

Whatka

ну на счёт длины абсолютно прав))
нет конечно и в общем тоже (чего таить)

просто моя цель была,чтобы программа в любом случае не падала
+ программа так тривиальна что не хочется её усложнять
различными вещами,которые обычно необходимы\полезны\удобны\т.д.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!