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

Тема в разделе "C/C++/C#", создана пользователем ilya1989, 20 ноя 2010.

  1. ilya1989

    ilya1989 Гость

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

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

    Код (Text):
    #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];
    }
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    [Вставил тэг-кода]
    А функции обязательно использовать???? Или можно без них???
     
  3. ilya1989

    ilya1989 Гость

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    как-то так:
    Код (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...
     
  5. ilya1989

    ilya1989 Гость

    а по конкретнее.....???

    Добавлено:
    и что значит нужный min???это ж не массив min!
     
  6. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    В RashetMas есть строка вывода минимума cout<<"min "<< min<<"\n";
    Зачем она там?
     
  7. ilya1989

    ilya1989 Гость

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    ааа, ну я так и подумала, что для отладки. но промежуточный вывод потом должен убраться, зачем одно и то же два раза выводить? =) вот суть коммента, извини, что нечетко выразилась.
    и обратите внимание на вычисление средних - они считаются уже в конце, после цикла. и тип для счетчиков кол-ва положительных и отрицательных эл-тов я ввела целочисленный.
     
  9. ilya1989

    ilya1989 Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Меня ужасает код, мне проще новый написать, чем этот откорректировать....
    Если автор не против... Я могу накидать.... Ну или посмотреть его, но врятли сегодня...
    Ужасный день выдался...
     
  11. ilya1989

    ilya1989 Гость

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Совершенно ничем ;-)) Просто голова звенит ;-)) Разбираться тяжко ;-)))
    Через часик гляну твой код....
     
  13. ilya1989

    ilya1989 Гость

    я понимаю;-)спасибо)))я буду очень признателен за помощь))))
     
  14. hosm

    hosm * so what *

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Ваша исходная программа находит последнее положительное значение или минимальное из неотрицательных, находящееся после последнего положительного. вот так :) немного не то, что требуется, а?
     
  16. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Держи
    Код (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";
    }
    Добавлено:
    Вот вот ;-) И я о том же ;-)))
     
  17. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    надо, по идее, если нет положительных элементов. не уверена, что инициализируется по дефолту 0, а параметр ф-ции надо обнулить...

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

    Добавлено: смотри вот:

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Она по ссылке передается :)))
     
  19. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    kol_pol++; - это работает для double? сомневалась, если честно, это ж вроде целочисленная арифметика...

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

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

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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    OKEN : Лен, ну я вообще использую std::numeric_limits<double>::max();
    Только тут подумал, что автора то путать ;-)
    Поймет ;-)) Если не поймет, то привет к целочисленному и тогда поймет ;-)
    Кстати этот момент я упустил kol_pol и та переменная с кол-вом отрицательных - конечно же должна быть целочисленная (int), а еще точнее size_t (unsigned int)
     
Загрузка...
Похожие Темы - Уважаемые форумчане Помогите
  1. sanch
    Ответов:
    6
    Просмотров:
    3.614
  2. alexas
    Ответов:
    1
    Просмотров:
    1.051

Поделиться этой страницей