Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 494
#1

Передача двумерного массива в функцию - C++

01.08.2011, 18:07. Просмотров 1871. Ответов 11
Метки нет (Все метки)

Даны две квадратные матрицы nxn. Напечатать ту из них, которая имеет минимальный “след”
(т.е. сумму элементов главной диагонали). При решении создать функцию для нахождения
следа матрицы и функцию печати матрицы.

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
float Sled(float *massiv1, int number1, float *massiv2, int number2)
{
 float s1=0,s2=0,min;
 int i,j;
 
 for(i=0;i<number1;i++)
  for(j=0;i<number1;i++)
  {
   s1=s1+massiv1[i*number1+j];break;
  }
 
 for(i=0;i<number2;i++)
  for(j=0;i<number2;i++)
  {
   s2=s2+massiv2[i*number2+j];break;
  }
 
  return min=(s1>s2)?2:1;
}
 
void Pech(float *massiv, int number1)
{
 int i,j;
 cout<<"massiv[number1][number1]\n";
 for(i=0;i<number1;i++)
 {cout<<"\n"; for(j=0;j<number1;j++) cout<<' '<<massiv[i*number1+j];}
}
 
int main(int argc, char* argv[])
 
//...Ввод массивов
 
float min=Sled(mas1[][], n, mas2[][], n); 
 
Pech(a[][], 5);
Pech(b[][], 5);


В последних трёх строках появляются ошибки E2188 Expression syntax
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2011, 18:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача двумерного массива в функцию (C++):

Передача двумерного массива в функцию - C++
Возможно это уже и естьна форуме, но как передать из одной функции в другую двумерный массив? (статическое распределение адресов)

Передача двумерного массива в функцию - C++
Всем доброго времени суток! В Си, при объявлении двумерного массива, можно было сразу проинициализировать его значения: char...

Передача двумерного массива в функцию - C++
Неожиданно для себя столкнулся с такой вот проблемой . Есть две функции : void print_matrix(double ** A, int n) { for (int i = 0;...

Передача двумерного массива в функцию - C++
Здравствуйте! Написала код для передачи двумерного массива в функцию: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include...

Передача двумерного массива в функцию. - C++
Требуется написать функцию которая бы слагала и умножала матрицы. Для этого Я завел двумерный динамический массив, а вот с передачей его в...

Передача в функцию двумерного массива - C++
Вводится две квадратные матрицы разного размера, посчитать сумму модулей отрицательных элементов каждой матрицы, и среднее значение 2-х...

11
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
01.08.2011, 19:00 #2
Правильно так:
C++
1
2
3
4
5
6
7
8
9
10
const SIZE = 3;
 
void func(float m[][SIZE])
{
     // ...
}
 
float m[SIZE][SIZE];
 
func(m);
Как вариант, используйте std::vector<std::vector<float> > и передавайте ссылку на него в функцию.
0
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 494
01.08.2011, 19:07  [ТС] #3
Цитата Сообщение от soft.creator Посмотреть сообщение
Правильно так:
C++
1
2
3
4
5
6
7
8
9
10
const SIZE = 3;
 
void func(float m[][SIZE])
{
     // ...
}
 
float m[SIZE][SIZE];
 
func(m);
Как вариант, используйте std::vector<std::vector<float> > и передавайте ссылку на него в функцию.
В моём случае размерность массива неизвестна,она должна вводится пользователем с клавиатуры.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
01.08.2011, 19:09 #4
Цитата Сообщение от maest Посмотреть сообщение
В моём случае размерность массива неизвестна,она должна вводится пользователем с клавиатуры.
Тогда так
C++
1
2
3
4
5
6
7
void func(float **m)
{
     // ...
}
 
 
func(m);
0
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
01.08.2011, 19:20 #5
вот посмотри, ввод сам сделаешь.
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
#include <math.h>
#include <iostream>
using namespace std;
 
 
const float*  min_trace(const float* arr1, size_t size1, const float* arr2, size_t size2) {
    float  sum1 = 0.0f,
            sum2 = 0.0f;
    size_t  r, N;
 
    N = (size_t)sqrt((double)size1);
    for(r = 0u; r < N; r++)
        sum1 += *((arr1) + (r * N + r));
 
    N = (size_t)sqrt((double)size2);
    for(r = 0u; r < N; r++)
        sum2 += *((arr2) + (r * N + r));
 
    if(sum1 > sum2)
        return arr2;
 
    return arr1;
}
 
 
void min_print(const float* arr, size_t size) {
    size_t N = (size_t)sqrt((double)size);
    for(size_t r = 0u; r < N; r++) {
        for(size_t c = 0u; c < N; c++)
                cout << *((arr) + (c * N + r)) << '\t';
        cout.put('\n');
    }
}
 
 
 
int main(void) {
 
  const size_t N = 25u;
 
  float arr1[N] = {
      10.0f, 20.0f, 30.0f, 40.0f, 45.0f, 10.0f, 10.0f, 30.0f, 40.0f, 45.0f, 10.0f, 20.0f,
      10.0f, 20.0f, 10.0f, 40.0f, 45.0f, 10.0f, 20.0f, 30.0f, 10.0f, 45.0f, 30.0f, 40.0f, 15.0f
  };
 
  float arr2[N] = {
      5.0f,  20.0f, 30.0f, 40.0f, 45.0f, 10.0f, 5.0f,  30.0f, 40.0f, 45.0f, 10.0f, 20.0f,
      10.0f, 20.0f, 5.0f,  40.0f, 45.0f, 10.0f, 20.0f, 30.0f, 5.0f,  45.0f, 30.0f, 40.0f, 95.0f
  };
 
  const float* ptr = min_trace(arr1, N, arr2, N);
 
   if(ptr == arr1)
      min_print(arr1, N);
   else
      min_print(arr2, N);
 
  cin.get();
  return 0;
}
0
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 494
01.08.2011, 19:22  [ТС] #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
Тогда так
C++
1
2
3
4
5
6
7
void func(float **m)
{
     // ...
}
 
 
func(m);
Появляются ошибки вида:

E2034 Cannot convert `int**`to `float**`
E2342 Type mismatch in parameter `massiv1`(wanted `float**`,go `int**`)
E2342 Type mismatch in parameter `massiv2`(wanted `float**`,go `int**`)
E2342 Type mismatch in parameter `massiv`(wanted `float**`,go `int**`)
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
01.08.2011, 19:25 #7
maest,
Цитата Сообщение от maest Посмотреть сообщение
Cannot convert `int**`to `float**`
не о чем не говорит?
C++
1
2
3
4
void func(int **m)
{
     // ...
}
0
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 494
01.08.2011, 19:34  [ТС] #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
maest,

не о чем не говорит?
C++
1
2
3
4
void func(int **m)
{
     // ...
}
Скомпилировалось,но вторая функция какой-то бред выводит
0
LosAngeles
Заблокирован
01.08.2011, 19:35 #9
отладчик в помощь
0
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 494
01.08.2011, 20:15  [ТС] #10
Насколько я понял,она вместо элемента массива его адрес выдает.А как сделать,чтобы элемент выводила?
0
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
01.08.2011, 21:46 #11
А по условию задачи можно использовать STL? Тогда попробуйте мой вариант с вектором векторов, он проще. А если нет, все выше написали
0
Olga_
842 / 184 / 16
Регистрация: 01.08.2011
Сообщений: 502
01.08.2011, 23:00 #12
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
#include<stdio.h>
#include<stdlib.h>
 
/* Удаление матрицы a */
void Dispose(double **a, int m)
{
   int i;
   for (i = 0; i < m; i++)
      if (a[i] != NULL)
         free(a[i]);
   free(a);
}
 
/* выделение памяти для матрицы a */
double **Allocate(int m, int n)
{
   double **a;
   int i;
   int flag;   /* ëîãè÷åñêГ*Гї ïåðåìåГ*Г*Г*Гї */
   a = (double **)calloc(m, sizeof(double *));
   if (a != NULL)
   {
      i = 0;
      flag = 1;
      while (i < m && flag)
      {
         a[i] = (double *)calloc(n, sizeof(double));
         if (a[i] == NULL)
            flag = 0;
         else i++;
      }
      if (!flag)
      {
         Dispose(a, m);
         a = NULL;
      }
   }
   return a;
}
 
/* инициализация матрицы (ну, чтобы не вводить с клавиатуры) */
void InitArray(double **a, int m, int n)
{
   int i, j;
   for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
         a[i][j] = rand()%10;
}
 
/* Вывод на экран */
void PrintArray(double **a, int m, int n)
{
   int i, j;
   for (i = 0; i < m; i++)
   {
      for (j = 0; j < n; j++)
         printf("%.1f ", a[i][j]);
      printf("\n");
   }
}
 
/* вычисление следа матрицы */
int Track(int **a, int n)
{
    int i, sum = 0;
    for (i = 0; i < n; i++)
       sum += a[i][i];
    return sum;
}
 
int main( )
{
   double **a, **b;
   int n;
   scanf("%d", &n);
   a = Allocate(n, n);
   b = Allocate(n, n);
   if (a && b)
   {
      InitArray(a, n, n);
      InitArray(b, n, n);
      if (Track(a, n) < Track(b, n))
         PrintArray(a, n, n);
      else
         PrintArray(b, n, n);
      Dispose(a, n);
      Dispose(b, n);
      a = b = NULL;
   }
   return 0;
}
Добавлено через 6 минут
Да, и лучше все double заменить на int. Но и так работает, просто программа универсальная для прямоугольных (в общем случае) матриц (если убрать функцию Track()).
0
01.08.2011, 23:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 23:00
Привет! Вот еще темы с ответами:

Передача двумерного массива в функцию - C++
в функцию set_ships передаю массив human, появляется ошибка cannot convert `int (*)' to `int**' for argument `1' to `void set_ships(int**)'...

Передача двумерного массива в функцию - C++
Доброго времени суток, форумчане. Столкнулся с проблемой передачи двумерного массива (матрицы) по указателю в функцию. Подскажите?...

Передача двумерного массива в функцию - C++
Здравствуйте, появился новый вопрос на тему указателей: как передать двумерный массив в функцию ну и для проверки модифицировать его. ...

Передача двумерного массива в функцию - C++
Не могу передать массив в фунцию int min(int Array) { int min = 0; min = Array; for(int i=0;i&lt;3;i++){ for(int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.