Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите пожалуйста


Автор: volnorez 13.3.2008, 21:06
Здравствуйте. Очень нужна помощь в решении задачи на двумерные массивы.
Вот условие:
Заменить элементы матрицы 0 , ели они больше среднего значения по строке.
Заранее спасибо за помощь.

Автор: susanin 13.3.2008, 21:41
что значит больше среднего??? больше среднего арифметического строки? или больше элемента который посередине?

Автор: Dmi3ev 13.3.2008, 21:46
вот так можно! по-моему, наглядно
Код

#include <iostream.h>

int main()
{
float a[5][5]={1, 1.25, 1, 50, 6,
      2, 3.45, 45, 1, 7,
      5, 6, 7, 8 ,9,
      0.25, 5, 4, 6, 7,
      2, 3, 6, 7, 8};
float sr;
int k;
for (int i=0; i<=4; i++)
 {
  for (int j=0; j<=4; j++)
    {
     sr+=a[i][j];
     k++;
    }
  sr=sr/k;
  for (j=0; j<=4; j++)
    {
     if (a[i][j]>sr)
      {
        a[i][j]=0;
      }
    }
    sr=k=0;
 }
 for (i=0; i<=4; i++)
  {
    for (int j=0; j<=4; j++)
     cout<<a[i][j]<<",";
    cout<<endl;
  }
}

попробуй, напиши!!!

Автор: susanin 13.3.2008, 21:53
Dmi3ev, одного взгляда достаточно чтобы понять что она не будет работать..=) а return 0; в конце кто писать будет?и массив как то непонятно объявлен...
вобщем после небольшой корректировки получается полностью работоспособная версия на VS2005
Код

#include <iostream>
using namespace std;

int main()
{
    double a[5][5]={{1, 1.25, 1, 50, 6},{2, 3.45, 45, 1, 7},{5, 6, 7, 8 ,9},{ 0.25, 5, 4, 6, 7},{2, 3, 6, 7, 8}};
double sr=0;
int k;
for (int i=0; i<=4; i++)
 {
  for (int j=0; j<=4; j++)
    {
     sr+=a[i][j];
     k++;
    }
  sr=sr/k;
  for (int j=0; j<=4; j++)
    {
     if (a[i][j]>sr)
      {
        a[i][j]=0;
      }
    }
    sr=k=0;
 }
 for (int i=0; i<=4; i++)
  {
    for (int j=0; j<=4; j++)
     cout<<a[i][j]<<",";
    cout<<endl;
  }
 return 0;
}

Автор: volnorez 13.3.2008, 22:04
Да надо обнулить если элементы больше среднего арифметического значения по строке. 

SUSANIN а можешь объяснить что ты там написал и можно ли вводить матрицу непосредственно с клавиатуры в самой проге а не статически в начале?

Автор: susanin 13.3.2008, 22:07
volnorez, конечно можно! нет ничего невозможного! а вот объяснять что я там ..вернее господин Dmi3ev написал могу только вобщем... хотите больше-читайте книги... вобщем происходит следующее... пробегаем двумерный массив по каждой строчке.. вычисляем для каждой строчки среднее арифметической... потом опять пробегаем эту строчку и сравниваем элементы со средним арифметическим..если элемент больше среднего арифметического, то мы обнуляем его... вот и все... так для всех строк...

Автор: Dmi3ev 13.3.2008, 22:27
susanin, не обязательно писать return 0! попробуй, получится! у меня работает и у тебя заработает!

Автор: susanin 13.3.2008, 22:30
Dmi3ev, не знаю что у вас за компилятор, но int main () требует чтобы функция возвращала целочисленное значение!!! поэтому эта ошибка еще на этапе компиляции вылетает! по крайней на VS 2005!! так же VS 2005 в циклах for() не объявлен тип переменной i ... это тоже ошибка... по крайней мере по стандарту с++... ведь до цикла то переменная i не объявлялась....а те переменный которые объявляются внутри цикла for() дейтсвуют только внутри этого цикла..

Автор: volnorez 13.3.2008, 22:38
А зачем мы везде вот в этом "for (int i=0; i<=4; i++)" пишем <=4  что это за счетчик такой почему именно 4?

Автор: susanin 13.3.2008, 22:42
volnorez , потому что массив наш [5][5] (пять на пять) но так как элементы начинаются с нулевого, то получается чтобы пройти по всем элементам надо с 0 до 4 ключительно...можно было в начале объявить размер массива например как const int size=5 а потом в циклах писать for(int i=0; i<size;i++)

Автор: Dmi3ev 13.3.2008, 22:47
оператор return нужен, если функция (которая по замыслу ничего возвращать не будет) завершается не естественным порядком (до достижения "}")! а так компилятор спокойно понимает что и как! конечно желательно это писать, но совсем не обязательно! а массив можно и так инициализировать!!! твоя запись, конечно, тоже правильная (это бесспорно), но и в моей ничего плохого нет!!! можно даже в строчку объявлять двумерный массив (только это не очень наглядно)!
так что,susanin, не суди меня, сделай скидку на то, что я писал сразу здесь и даже не компилировал! 

Автор: volnorez 13.3.2008, 22:48
А если мне надо задать массив 10 на 10 и я задаю методм случайных чисел тогда что?

#include<iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
int main()
{ clrscr;
  srand(unsigned(time(NULL)));
  const size = 10;
  int A[size][size]={0};
  for(int i=0;i<size;i++){
    for(int j=0;j<size;j++){
        A[i][j] = rand()%100;
    }
  }

  for(i=0;i<size;i++){
    for(int j=0;j<size;j++){
        cout<<setw(8)<<A[i][j];

Автор: susanin 13.3.2008, 22:51
Цитата(Dmi3ev @  13.3.2008,  22:47 Найти цитируемый пост)
оператор return нужен, если функция (которая по замыслу ничего возвращать не будет) завершается не естественным порядком (до достижения "}")! 

не совсем правда.... действительно, он может выполнять такую функцию, но если вы объявляете функцию как возвращающую целочисленное значение, то будьте добры и возвратить это значение посредством оператора return... не в обиду вам, 
Dmi3ev , но книги надо читать повнимательней..

Автор: Dmi3ev 13.3.2008, 22:55
кстати на счет переменных в циклах, если я объявляю их каждый раз он выдает "multiple declaration" и я убираю объявления, пока не перестает ругаться)))
я компилировал в BORLAND TURBO C++, все пучком))) ладно, susanin, не буду спорить, твои замечания справедливы. суть проблемы не в этом ведь, в самой задаче разногласий нет, так что не будем рассуждать на тему записи, экзешник один х..))) (извините) и вас и у меня работает))) 

Автор: susanin 13.3.2008, 22:56
volnorez,
практически правильный код.... немного поправьте скобки и все будет ок!

Автор: bsa 13.3.2008, 22:59
Код
#include <iostream>

enum {
   Rows = 5,
   Cols = 5
};

int main()
{
   double matrix[Cols][Rows];
   //чтение с консоли данных матрицы
   for(unsigned r = 0; r < Rows; ++r) {
       std::cout << "Input row #" << r << ": " << std::flush;
       for(unsigned c  = 0; c < Cols; ++c)
          std::cin >> matrix[c][r];
   }
   //расчет среднего и замена
   for(unsigned r = 0; r < Rows; ++r) {
       double m = 0;
       for(unsigned c = 0; c < Cols; ++c)
          m += matrix[c][r];
       m /= Cols;
       for(unsigned c = 0; c < Cols; ++c) {
           double &d = matrix[c][r];
           d = (d < m) ? 0.0 : d;
       }
   }
   //вывод матрицы на консоль
   for(unsigned r = 0; r < Rows; ++r) {
       for(unsigned c = 0; c < Cols; ++c) {
           std::cout << matrix[c][r] << ' ';
       }
       std::cout << '\n';
   }
   return 0;
}

Автор: susanin 13.3.2008, 22:59
Dmi3ev, согласен, споры не уместны..алгоритм у вас правильный совершенно.. объясню лишь почему у вас все работает и ошибки такие возникают в циклах.. все потому что компилятор 3,1 не соответствует новым стандартам с++... поэтому и  получается такая неразбериха... сам учился на 1 курсе..сам писал на таком же борланде... знаокмо все это.. smile  smile 

Автор: bsa 13.3.2008, 23:00
Цитата(Dmi3ev @ 13.3.2008,  22:55)
кстати на счет переменных в циклах, если я объявляю их каждый раз он выдает "multiple declaration" и я убираю объявления, пока не перестает ругаться)))
я компилировал в BORLAND TURBO C++, все пучком))) ладно, susanin, не буду спорить, твои замечания справедливы. суть проблемы не в этом ведь, в самой задаче разногласий нет, так что не будем рассуждать на тему записи, экзешник один х..))) (извините) и вас и у меня работает)))

Проблема в нестандартном компиляторе. Рекомендуется обновить на что-то более соответствующее стандарту.

Автор: Dmi3ev 13.3.2008, 23:06
если с клавиатуры
Код

float a[10][10];
for (int i=0; i<=9; i++)
 for (int j=0; j<=9; j++)
  {
    cout<<"A "<<"["<<i+1<<"]"<<"["<<j+1<<"]=";
    cin>>a[i][j];
    cout<<endl;
  }


Добавлено через 7 минут и 33 секунды
чтобы не открывать новую тему, какой компилятор соответствует стандартам, просто BILDER (например) не нравится открывать, чтобы написать консольное приложение!
очень симпотичен синий экран Досовского окошка smile как-то оно мне дорого чтоли smile 
 smile 

Автор: bsa 13.3.2008, 23:24
Dmi3ev, на сколько мне известно, comeau. Но, думаю, проще будет с gcc (mingw) работать.

Автор: Dmi3ev 13.3.2008, 23:27
bsa, спасибо! посмотрю!

Автор: susanin 13.3.2008, 23:31
Dmi3ev, от себя лично скажу, что мне нравится VS2005 и DevC++ ....второй бесплатный...

Автор: volnorez 14.3.2008, 00:03
всем спасибо за помощь!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)