Форум программистов, компьютерный форум CyberForum.ru

Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
NBYF
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 10
15.11.2011, 07:36     Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик #1
1)Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.
2)Проверить, все ли строки матрицы содержат хотя бы один положительный элемент. Если да, то изменить знаки всех элементов матрицы на обратные.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 07:36     Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик
Посмотрите здесь:

C++ Расположить столбцы матрицы в соответствии с ростом характеристик
C++ Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик
C++ Переставляя строки заданной матрицы, расположить их в соответствии с убыванием характеристик
C++ Переставляя строки заданной матрицы, расположить их соответствии с ростом характеристик.
C++ Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.11.2011, 08:26     Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик #2
По первой задаче:
1. Создать указатель (массив) указателей на столбцы.
1.5. Инициализировать/заполнить/вывести.
2. Создать функцию, которая принимает указатель на столбец и возвращает характеристику.
3. Используя любой подходящий метод сортировки, отсортировать указатели в первом пункте по возрастанию характеристики.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2011, 09:25     Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
По первой задаче, должно работать, но только при равентве размеров инта и указателя, является наглядным пособием, как делать не надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
void (int **Data, unsigned int n, unsigned int m)
{
 int **p1;
 int *p2;
 int **Start;
 Data=new (int*) [n*m+n];
 if (Data)
 {
  Start=Data+n;
  for (p1=Start-1; p>=Data; --p)
  {
   *p1=Data+(p-Data)*m+n;
  }
  for (p2=*Data+n*m-1; p>=Start; --p)
  {
   *p2=rnd()%100-50;
  }
 }
}
int Norm(int *Data, unsigned int n)
{
 int *End;
 int *p;
 int r;
 r=0;
 if (Data)
 {
  End=Data+m-1;
  for (p=Data; p<=End; p+=2)
  {
   if ((*p) <0)
   {
    r-=*p;
   }
  }
 }
 return r;
}
void Sort (int **Data, unsigned int n, unsigned int m)
{
 int **i;
 int **j;
 int n1;
 int n2;
 int *p1;
 int *p2;
 int t;
 if (Data)
 {
  for (i=Data+n-1; i>Data; --i)
  {
   for (j=i-1; j>=Data; --j)
   {
    n1=Norm(*i, m);
    n2=Norm(*j, m);
    if (n1<n2)
    {
     for (p1=*i+m-1, p2=*j+m-1; p1>=*i; --p1, --p2)
     {
      t=*p1;
      *p1=*p2;
      *p2=t;
     }
    }
   }
  }
 }
}
Добавлено через 18 минут
А вот так делать надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
void (int **Data, unsigned int n, unsigned int m)
{
 int **p1;
 int *p2;
 int **End;
 bool Flag;
 if (n*m>0)
 {
  Data=new int*[n];
  if (Data)
  {
   End=Data+n-1;
   Flag=false;
   for (p1=End; p>=Data; --p)
   {
    *p1=new int [m];
     if (p1)
     {
      for (p2=*p1+m-1; p2>=*p1; --m)
      {
       *p2=rnd()%100-50;
      }
     }
    else
    {
     Flag=true;
     break;
    }
   }
   if (Flag)
   {
    for (++p1; p1>=End; ++p1)
    {
     delete [] *p1;
    }
   delete [] Data;
   Data=NULL;
   }
  }
 }
 else
 {
  Data=NULL;
 }
}
int Norm(int *Data, unsigned int n)
{
 int *End;
 int *p;
 int r;
 r=0;
 if (Data)
 {
  End=Data+m-1;
  for (p=Data; p<=End; p+=2)
  {
   if ((*p) <0)
   {
    r-=*p;
   }
  }
 }
 return r;
}
void Sort (int **Data, unsigned int n, unsigned int m)
{
 int **i;
 int **j;
 int n1;
 int n2;
 int *p1;
 int *p2;
 int t;
 if (Data)
 {
  for (i=Data+n-1; i>Data; --i)
  {
   for (j=i-1; j>=Data; --j)
   {
    n1=Norm(*i, m);
    n2=Norm(*j, m);
    if (n1<n2)
    {
     for (p1=*i+m-1, p2=*j+m-1; p1>=*i; --p1, --p2)
     {
      t=*p1;
      *p1=*p2;
      *p2=t;
     }
    }
   }
  }
 }
}
void Free (int **Data, int n)
{
 int **p2;
 if (Data)
 {
  for (p=Data+n-1; p>=Data; --p1)
  {
   delete [] *p1;
  }
  delete [] Data;
 }
 Data=NULL:
}
Добавлено через 8 минут
В идеале всё надо спрятать в класс, функции - public, остальное - private, Init переписать в контруктор, Free - в дестурктор, размеры и **Data вынести из параметров в члены-данные, *Data чиать из **Data по индексу внутри функции Norm, добавить этот индекс в качетсве ещё одного параметра, соответственно поменять и синтаксис вызова Norm из Sort.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.11.2011, 11:37     Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Реализация первой задачи на С.

Не по теме:

Может быть сложно на первый взгляд.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
typedef int Value;
typedef Value *Column;
typedef Column *Matrix;
 
Value rowNegativeAbsoluteSum(Column column, size_t size) {
  Value result = 0;
  Value *i;
  for (i = column; i < column + size; ++i)
    if ((*i < 0) && (*i % 2)) result -= *i;
  return result;
}
 
void printCharacteristics(Matrix matrix, size_t height, size_t width,
  Value (*predicate)(Column, size_t)) {
  Value i;
  for (i = 0; i < width; ++i)
    printf("%5d", predicate(matrix[i], height));
  printf("\n\n");
}
 
void printMatrix(Matrix matrix, size_t height, size_t width) {
  size_t i, j;
  for (i = 0; i < height; ++i) {
    for (j = 0; j < width; ++j)
      printf("%5d", matrix[j][i]);
    printf("\n");
  }
}
 
void quickSortMatrixByPredicate(Matrix matrix, size_t height, size_t width,
  Value (*predicate)(Column, size_t), int low, int high) {
  int i = low;
  int j = high;
  Value middleValue = predicate(matrix[(low + (high-low)/2)], height);
  do {
    while (predicate(matrix[i], height) < middleValue) ++i;
    while (middleValue < predicate(matrix[j], height)) --j;
    if ( i <= j ) {
      if( i < j ) { 
        Column t = matrix[i];
        matrix[i] = matrix[j];
        matrix[j] = t;
      }
      ++i;
      --j;
    }    
  } while (i <= j);
  if (low < j)
    quickSortMatrixByPredicate(matrix, height, width, predicate, low, j);
  if (i < high)
    quickSortMatrixByPredicate(matrix, height, width, predicate, i, high);
}
 
void sortMatrixByPredicate(Matrix matrix, size_t height, size_t width,
  Value (*predicate)(Column, size_t)) {
  quickSortMatrixByPredicate(matrix, height, width, predicate, 0, width - 1);
}
 
int hasNegative(Column column, size_t height) {
  int i;
  for (i = 0; i < height; ++i)
    if (column[i] < 0) return 1;
  return 0;
}
 
Value sumWithAtLeastOneNegative(Column column, size_t height) {
  size_t i;
  if (!hasNegative(column, height))return 0;
  int result = 0;
  for (i = 0; i < height; ++i)
    result += column[i];
  return result;
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
  size_t width = 5 + rand() % 4;
  size_t height = 10 + rand() % 4;
  
  Matrix matrix = (Matrix)malloc(sizeof(Column) * width);
  size_t i, j;
  for (i = 0; i < width; ++i) {
    matrix[i] = (Column)malloc(sizeof(Value) * height);
    for (j = 0; j < height; ++j)
      matrix[i][j] = rand() % 11 - 5;
  }
  
  printMatrix(matrix, height, width);
  printf("Sums of negative odds: \n");
  printCharacteristics(matrix, height, width, rowNegativeAbsoluteSum);
 
  sortMatrixByPredicate(matrix, height, width, rowNegativeAbsoluteSum);
 
  printf("Sorted by sum of negative odds: \n");
  printMatrix(matrix, height, width);
  printf("Sums of negative odds: \n");
  printCharacteristics(matrix, height, width, rowNegativeAbsoluteSum);
 
  printf("Sums for columns (0 if no negatives): \n");
  printCharacteristics(matrix, height, width, sumWithAtLeastOneNegative);
  
  return 0;
}
NBYF
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 10
15.11.2011, 19:38  [ТС]     Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик #5
а можно попроще, а то препод не поверит.
Yandex
Объявления
15.11.2011, 19:38     Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик
Ответ Создать тему
Опции темы

Текущее время: 02:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru