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

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Уважаемые форумчане!Помогите пожалуйста с решением задачи.

  • Автор темы ilya1989
  • Дата начала
I

ilya1989

Значит,условия задачи следующие:
Даны вещественные массивы A[7][4], F[7][4]. Для каждого
массива опpеделить: сpеднее аpифметическое отpицательных
элементов, сpеднее аpифметическое положительных
элементов, наименьшее из всех положительных значений.

Вот код программы,который я смог написать:

Код:
#include <iostream.h>
#include <conio.h>
#define I 7
#define J 4

void VvodMas(double [I][J],char);
void RashetMas(double[I][J],double&,double&,double& );
void PrintRez(double [I][J],char,double& ,double& ,double& );
void main()
{
double A[I][J],F[I][J];
double min_A,min_F;
double sr_ar_otr_A,sr_ar_otr_F;
double sr_ar_pol_A,sr_ar_pol_F;
VvodMas(A,'A');
VvodMas(F,'F');
RashetMas(A,sr_ar_otr_A,sr_ar_pol_A,min_A);
PrintRez(A,'A',sr_ar_pol_A,min_A,sr_ar_otr_A);
RashetMas(F,sr_ar_otr_F,sr_ar_pol_F,min_F);
PrintRez(F,'F',sr_ar_pol_F,min_F,sr_ar_otr_F);
getch();
}

void VvodMas(double o[I][J], char name)
{
int i,j;
cout<<"\nVvedite chislo v elementi massiva "<<name<<"\n";
for(i=0;i<I;i++)
for(j=0;j<J;j++)
{
cout<<"\n["<<i<<"]["<<j<<"] =";
cin>>o[i][j];
}
}

void RashetMas(double a[I][J],double &sr_ar_otr,double &sr_ar_pol,double &min)
{
int i,j;
sr_ar_otr=0;
sr_ar_pol=0;
min=0;
double kol_otr=0;
double kol_pol=0;
double sum_pol=0,sum_otr=0;
for(i=0;i<I;i++)
for(j=0;j<J;j++)
{
if(a[i][j]<0)
{
kol_otr++;
sum_otr+=a[i][j];
sr_ar_otr=(sum_otr/kol_otr);
}
if(a[i][j]>0)
{
min=a[i][j];
kol_pol++;
sum_pol+=a[i][j];
sr_ar_pol=(sum_pol/kol_pol);
cout<<"min "<<min<<"\n";
}
else if(min>a[i][j])
min=a[i][j];
}
}
void PrintRez(double d[I][J],char names,double &sr_pol,double &min,double &sr_otr)
{
cout<<"Massiv "<<names<<":\n";
for(int i=0;i<I;i++)
{
cout<<"\n";
for(int j=0;j<J;j++)
{
cout.width(8);	 // минимальное кол-во позиций
cout.precision(2); // 2 знака после запятой
cout<<d[i][j];
}
}
cout<<"\nSrednee ariphmeticheskoye polozhitel`nih elementov massiva "<<names<<"ravno "<< sr_pol<<"\n";
cout<<"Minimal`noye iz polozhitel`nih znacheniy massiva "<<names<<" ravno "<<min<<"\n";
cout<<"Srednee arifmeticheskoye otritsatel`nih elementov massiva "<<names<<" ravno "<<sr_otr<<"\n";
}
C++:
//Значит,Всё бы ничего,но никак не получается по условию задачи определить минимальный положительный(>0)элемент в массиве.Уже чего только не перепробовал.Учусь на заочке,в программировании я начинающий.
Сразу опишу,что я пытаюсь сделать:
if(a[i][j]>0)//это условие проверяет все положительные элементы,которые >0.Далее,в теле условия видно,что сначала //за минимальный положительный элемент массива(min=a[i][j])берется первый попавшийся введёный элемент в массив. 
{
min=a[i][j];
kol_pol++;
sum_pol+=a[i][j];
sr_ar_pol=(sum_pol/kol_pol);
cout<<"min "<<min<<"\n";
}
else if(min>a[i][j])//а это условие якобы проверяет,есть ли в массиве элементы ещё меньше,чем элемент,сохранённый в переменной min.

//Итог:помогите пожалуйста скорректировать программу таким образом,чтобы в переменной min сохранялось МИНИМАЛЬНОЕ положительное значение массива.Буду Вам за помощь очень признателен! Заранее спасибо!
min=a[i][j];
}
 
D

DarkKnight

[Вставил тэг-кода]
А функции обязательно использовать???? Или можно без них???
 
I

ilya1989

вот именно,что должно быть 3 функции:1-я для ввода данных в массив,2-я для расчёта,3-я для вывода результатов.Так вот все 3 величины должны быть расчитаны в одной функции-функции расчёта.
 
H

hosm

как-то так:
C++:
void RashetMas(double a[I][J],double &sr_ar_otr,double &sr_ar_pol,double &min)
{
int i,j;
sr_ar_otr=0;
sr_ar_pol=0;
int kol_otr=0;
int kol_pol=0;
min=0;
double sum_pol=0,sum_otr=0;
for(i=0;i<I;i++)
for(j=0;j<J;j++)
{
if(a[i][j]<0)
{
kol_otr++;
sum_otr+=a[i][j];
} else{
if(a[i][j]>0)
{
kol_pol++;
sum_pol+=a[i][j];
if (kol_pol==1){//если это 1й положительный
min=a[i][j];
}else if(min>a[i][j])//иначе сравниваем и меняем мин, если надо
min=a[i][j];
}
}
}//закрыли for
//считаем средние
if(kol_otr>0) sr_ar_otr=(sum_otr/kol_otr);
if(kol_pol>0) {
sr_ar_pol=(sum_pol/kol_pol);
cout<<"min "<< min<<"\n";
}
}

Добавлено: В PrintRez просто выводить нужный min...
 
I

ilya1989

это так.....для самоконтроля....в эту функцию эту строку я поместил не просто так....а для отслеживания конечного результата,помещённого в эту переменную min....
 
H

hosm

ааа, ну я так и подумала, что для отладки. но промежуточный вывод потом должен убраться, зачем одно и то же два раза выводить? =) вот суть коммента, извини, что нечетко выразилась.
и обратите внимание на вычисление средних - они считаются уже в конце, после цикла. и тип для счетчиков кол-ва положительных и отрицательных эл-тов я ввела целочисленный.
 
I

ilya1989

Спасибо, OKEN)так это понятно.здесь счётчики kol_otr и kol_pol стоят для расчёта среднего арифметического.Как раз-таки они никакого отношения к моему вопросу и не имеют) Меня другое интересует)а именно переменная min,в которую сохраняется последний результат МИНИМАЛЬНОГО ПОЛОЖИТЕЛЬНОГО ЗНАЧЕНИЯ ЭЛЕМЕНТОВ МАССИВА)И если,допустим,скомпилировать мой изначально скинутый на форум код,и ввести значения 1,2,3,-1,-2,-3...то он прицепится именно к -3,так как элемент меньше 3.....меня интересует,как создать условие,в котором после расчёта среднего арифметического положительных элементов,самый минимальный из введенных положительных элментов будет лежать в переменной min.я уже чего только не перепробовал.и всё безтолку.
 
D

DarkKnight

Меня ужасает код, мне проще новый написать, чем этот откорректировать....
Если автор не против... Я могу накидать.... Ну или посмотреть его, но врятли сегодня...
Ужасный день выдался...
 
I

ilya1989

Да я то непротив)а чем этот код плох)?дело в том,что мне бы самому разобраться в этом не помешало)код-то в принципе законченный)если взглянуть на него внимательно,в функции расчёта всего 3 условия)и вот именно 3-е условие у меня и не пошло....почему-то(((((
 
H

hosm

ilya1989
я же привела код... вы хотите свой разобрать? поехали...
C++:
if(a[i][j]>0)//это условие проверяет все положительные элементы,которые >0.Далее,в теле условия видно,что сначала //за минимальный положительный элемент массива(min=a[i][j])берется первый попавшийся введёный элемент в массив. 
{
min=a[i][j];// каждое!!! положительное значение перезатирает минимум. Никакого сравнения не производится!!!
kol_pol++;
sum_pol+=a[i][j];
sr_ar_pol=(sum_pol/kol_pol);
cout<<"min "<<min<<"\n";
}
else // относится к if(a[i][j]>0). следовательно, код выполняется при a[i][j]<=0
if(min>a[i][j])//а это условие проверяет,есть ли в массиве НЕПОЛОЖИТЕЛЬНЫЕ элементы ещё меньше,чем элемент,сохранённый в переменной min.

//Итог:помогите пожалуйста скорректировать программу таким образом,чтобы в переменной min сохранялось МИНИМАЛЬНОЕ положительное значение массива.Буду Вам за помощь очень признателен! Заранее спасибо!
min=a[i][j];
}

Добавлено:
sr_ar_pol=(sum_pol/kol_pol);
А КАК ВЫ СЧИТАЕТЕ СРЕДНЕЕ, ВЫ СМОТРЕЛИ?
массив 1,2,3,-1,-2,-3
СПЕРВА
sr_ar_pol=1/1
ПОТОМ
sr_ar_pol=(1+2)/2
И еще ПОТОМ
sr_ar_pol=(1+2+3)/3
ЗАЧЕМ СЧИТАТЬ ТРИЖДЫ?
Это просто глупо и неэффективно. Это надо вынести из цикла. Посчитать потом...
И так же для отрицательных!
 
H

hosm

Ваша исходная программа находит последнее положительное значение или минимальное из неотрицательных, находящееся после последнего положительного. вот так :) немного не то, что требуется, а?
 
D

DarkKnight

Держи
C++:
#include <iostream> //(!!!)В этом месте в своей среде поставишь #include <iostream.h>
#include <conio.h>
#include <locale.h>
#define I 7
#define J 4

using namespace std; //(!!!)А это место закомментируешь, иначе будет ошибки сыпать

void VvodMas(double [I][J],char);
void RashetMas(double[I][J],double&,double&,double& );
void PrintRez(double [I][J],char,double& ,double& ,double& );

void main()
{
setlocale(LC_ALL,".1251"); //Локаль добавил

double A[I][J],F[I][J]; //Определил массивы
double min_A = 9999999.0,min_F = 9999999.0; //Определил переменные под мин эл. массива ((!!!)Давай сразу их сделаем очень большими)
double sr_ar_otr_A,sr_ar_otr_F; //средние ариф. отриц. эл-ов
double sr_ar_pol_A,sr_ar_pol_F; 
VvodMas(A,'A');
VvodMas(F,'F'); //Ввел оба массива
RashetMas(A,sr_ar_otr_A,sr_ar_pol_A,min_A); 
PrintRez(A,'A',sr_ar_pol_A,min_A,sr_ar_otr_A);
RashetMas(F,sr_ar_otr_F,sr_ar_pol_F,min_F);
PrintRez(F,'F',sr_ar_pol_F,min_F,sr_ar_otr_F);
getch();
}

void VvodMas(double o[I][J], char name) //В функциях лучше все же явно размерность не задавать, хватит и указателей типо double **o
{
int i,j;
cout<< "\nВведите число в элементе массива"<< name<< "\n";
for(i=0;i<I;i++)
for(j=0;j<J;j++)
{
cout<< "\n["<< i<< "]["<< j<< "] =";
cin>>o[i][j];
}
//Тут тоже со всем согласен, но можно было минимальный элемент, и ср. арифметич. уже тут искать,
//Но впринципи и так сойдет
}

void RashetMas(double a[I][J],double &sr_ar_otr,double &sr_ar_pol,double &min)
{
int i,j;
sr_ar_otr=0; 
sr_ar_pol=0;
//min=0; //Пока не знаю зачем нужна, но наверное все же не понадобится
double kol_otr=0; //c этим тоже согласен
double kol_pol=0;
double sum_pol=0,sum_otr=0;//и с этим
for(i=0;i<I;i++) //Обходим все опять
for(j=0;j<J;j++)
{
if(a[i][j]<0)
{
kol_otr++;
sum_otr+=a[i][j];
//sr_ar_otr=(sum_otr/kol_otr); //(!!!) Не стоит так делать 
}
if(a[i][j]>0) //Тут я бы 0 тоже включил, он больше все же положителен чем отрицателен, но все от задания конечно завист
//Так что менять ничего не буду
{
if (min > a[i][j])
min = a[i][j]; //НУ ВОТ И ВСЕ
//min=a[i][j]; //Не понимаю
kol_pol++;// Тут согласен
sum_pol+=a[i][j];
//sr_ar_pol=(sum_pol/kol_pol); //(!!!)Опять не то что нужно
//cout<< "min "<< min<< "\n";
}
//else if(min>a[i][j]) // Вот теперь понял, но опять же не так немного
//min=a[i][j];
}
//Ну а вот теперь, когда весь массив пробежали найдем среднее арифметич.
if (kol_otr != 0) //Только проверим что бы деления на нуль не вышло
sr_ar_otr =(sum_otr/kol_otr);
if (kol_pol != 0)
sr_ar_pol =(sum_pol/kol_pol);
}

void PrintRez(double d[I][J],char names,double &sr_pol,double &min,double &sr_otr)
{
cout<< "Массив ["<< names<< "]:\n";
for(int i=0;i<I;i++)
{
cout<< "\n";
for(int j=0;j<J;j++)
{
cout.width(8);	 // минимальное кол-во позиций
cout.precision(2); // 2 знака после запятой
cout<< d[i][j];
}
}
cout<< "\nСреднее арифметическое положительных элементов ["<< names<< "] = "<< sr_pol<< "\n";
cout<< "Минимальное положительное значение массива ["<< names<< "] = "<< min<< "\n";
cout<< "Среднее арифметическое отрицательных элементов ["<< names<< "] = "<< sr_otr<< "\n";
}

Добавлено:
А КАК ВЫ СЧИТАЕТЕ СРЕДНЕЕ, ВЫ СМОТРЕЛИ?
массив 1,2,3,-1,-2,-3
СПЕРВА
sr_ar_pol=1/1
ПОТОМ
sr_ar_pol=(1+2)/2
И еще ПОТОМ
sr_ar_pol=(1+2+3)/3
ЗАЧЕМ СЧИТАТЬ ТРИЖДЫ?
Это просто глупо и неэффективно. Это надо вынести из цикла. Посчитать потом...
И так же для отрицательных!
Вот вот ;-) И я о том же ;-)))
 
H

hosm

//min=0; //Пока не знаю зачем нужна, но наверное все же не понадобится
надо, по идее, если нет положительных элементов. не уверена, что инициализируется по дефолту 0, а параметр ф-ции надо обнулить...
if (min > a[j]) min = a[j]; //НУ ВОТ И ВСЕ

а вот тут ты забыл инициализацию min - минимума!!! Для первого положительного мы с чем сравнивать будем?!

Добавлено: смотри вот:
if (kol_pol==1){//если это 1й положительный
min=a[j];
}else if(min>a[j])//иначе сравниваем и меняем мин, если надо
min=a[j];
}

у тебя только с 0 надо сравнить - ты увеличиваешь счетчик после.
min=0 я забыла, кста, надо поправить...
 
H

hosm

double kol_otr=0; //c этим тоже согласен
kol_pol++; - это работает для double? сомневалась, если честно, это ж вроде целочисленная арифметика...

Добавлено: А если в массиве будет только 10 в 7й степени? =) программа поломается?=)

Добавлено: я зануда, если что =) в общем, с вещественными напряжно задавать мин. и макс. значение для поиска максимума и минимума. Обычно такое проще с целочисленными...

Добавлено: что передается не увидела сразу, соррь...
 
D

DarkKnight

OKEN : Лен, ну я вообще использую std::numeric_limits<double>::max();
Только тут подумал, что автора то путать ;-)
Поймет ;-)) Если не поймет, то привет к целочисленному и тогда поймет ;-)
Кстати этот момент я упустил kol_pol и та переменная с кол-вом отрицательных - конечно же должна быть целочисленная (int), а еще точнее size_t (unsigned int)
 
Мы в соцсетях:

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