IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Формирование вектора
18192123
сообщение 5.06.2007 17:24
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Дана матрица А(55). Определить массив Х из 5 элементов, каждый из которых равен сумме элементов того столбца, в котором находится первый положительный элемент соответствующей строки, и нулю, если все элементы строки неположительны.

Объясните пожалуйста, каким способом решать задачу...не могу составить конкретного алгоритма....
(есть такое предположение : записать в один массив суммы элементов каждого столбца, в другой - номер столбца, где находится первый положительный элемент строки, а после сравнивнить: равны ли очерёдный элемент второго массива и индекса 1-го массива)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2007 17:32
Сообщение #2


Гость






А просто пробегать по строке в поисках первого положительного ее элемента, и если он найден - то считать сумму столбца - никак нельзя? (изначально сумме присвоить значение 0, так что если положительных нет, тот же ноль и останется...)
 К началу страницы 
+ Ответить 
klem4
сообщение 5.06.2007 17:49
Сообщение #3


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


# include <stdlib.h>
# include <stdio.h>

int ColumnSum(int **mx, int col, int n) {
  int s = 0;
  for (int i = 0; i < n; i++) { s += mx[i][col]; }
  return s;
}

void CreateVector(int **mx, int *arr, int n) {
  for (int i = 0; i < n; i++) {
	int j = 0;
	while ((j < n) && (mx[i][j] <= 0)) j++;
	arr[i] = (j < n) ? ColumnSum(mx, j, n) : 0;
  }
}

int n, *x, **m;

int main (void) {
  n = 5;

  x = (int*)malloc(n * sizeof(int));
  m = (int**)malloc(n * sizeof(int*));

  for (int i = 0; i < n; i++)
   m[i] = (int*)malloc(n * sizeof(int));

  srand(time(NULL));

  for (i = 0; i < n; i++) {
	printf("\n");
	for (int j = 0; j < n; j++) {
	  m[i][j] = rand() % 10 - 5;
	  printf("%4d", m[i][j]);
	}
  }

  CreateVector(m, x, n);

  printf("\n\n");

  for (i = 0; i < n; i++) printf("%5d", x[i]);

  free(x);
  for (i = 0; i < n; i++) free(m[i]);
  free(m);

  return 0;
}


упс, опоздал smile.gif

Сообщение отредактировано: klem4 - 5.06.2007 17:49


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 5.06.2007 22:33
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(klem4 @ 5.06.2007 18:49) *

упс, опоздал smile.gif

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


int *mas_x (int (*a)[n], int *x)
{
 int i,j;
 for (j = 0; j < n; j++)
 {
  int sum = 0;
   for (i = 0; i < n; i++)
    sum+=a[i][j];
   x[j] = sum;
 }

 for (i=0; i < n; i++)
 {

   j = 0;
   while ((j < n)&&(a[i][j] <=0)) j++;

    x[i] = (j < n) ? x[j] : 0;
 }
 return x;
}

//одно НО! у меня выходной массив х получается из одинаковых элементов, т.к. в строчке
//x[i] = (j < n) ? x[j] : 0;
//не могу предусмотреть изменение x[j]. в таком варианте это вообще выполнимо? 





Сообщение отредактировано: 18192123 - 5.06.2007 22:34
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2007 23:41
Сообщение #5


Гость






Цитата
в таком варианте это вообще выполнимо?
Только с использованием дополнительного локального буфера (в него заносишь суммы столбцов, а потом заполняешь этими суммами вектор X).
 К началу страницы 
+ Ответить 
klem4
сообщение 6.06.2007 6:11
Сообщение #6


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


18192123, Я так понял ты хочешь сначала посчитать все суммы для столбцов ? Зачем ? А если матрица размером 1000 * 1000 ? Представляешь сколько ты лишнего времени потратишь...

Сообщение отредактировано: klem4 - 6.06.2007 6:12


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 6.06.2007 20:59
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Почему такой вариант не правильно рабатает?


int *mas_x (int (*a)[n], int *x)
{
 int i,j, sum, j_pol;

 for (i = 0; i < n; i++)
  {
   sum = 0; j_pol=-1;
   for (j = 0; j < n; j++)
    if (a[i][j] > 0)
    {
     j_pol = j;
    
     for (j = j_pol; j < j_pol + 1; j++)
      {
       for (i = 0; i< n; i++)
	{
	 sum+=a[i][j];
	 x[j] = sum;

	} break;
      }
    }
  }

 return x;
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.06.2007 21:19
Сообщение #8


Гость






Цитата
Почему такой вариант не правильно рабатает?
Может быть потому, что ты меняешь j внутри цикла по j?

   for (j = 0; j < n; j++) // Цикл по какой переменной?
    if (a[i][j] > 0)
    {
     j_pol = j;
    
     for (j = j_pol; j < j_pol + 1; j++) // <--- Все, значение j безнадежно испорчено ...
 К началу страницы 
+ Ответить 
18192123
сообщение 6.06.2007 21:37
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 6.06.2007 22:19) *

Может быть потому, что ты меняешь j внутри цикла по j?


а, точно...
я попробывала ввести ещё одну переменную - и снова в чём-то ошибка!


int *mas_x (int (*a)[n], int *x)
{
 int i,j, sum, j_pol,k;

 for (i = 0; i < n; i++)
  {
   sum = 0; j_pol=-1;
   for (j = 0; j < n; j++)
    if (a[i][j] > 0)
    {
     j_pol = j;

     for (k = j_pol; k < j_pol + 1; k++)
      { sum = 0;
       for (i = 0; i< n; i++)
	{
	 sum+=a[i][k];
	 x[i] = sum;

	} break;
      }
    }
  }

 return x;
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 17.07.2025 19:55
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"