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

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

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

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

01.08.2011, 18:07. Просмотров 1814. Ответов 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
 Аватар для soft.creator
103 / 103 / 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> > и передавайте ссылку на него в функцию.
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 486
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> > и передавайте ссылку на него в функцию.
В моём случае размерность массива неизвестна,она должна вводится пользователем с клавиатуры.
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
01.08.2011, 19:09     Передача двумерного массива в функцию #4
Цитата Сообщение от maest Посмотреть сообщение
В моём случае размерность массива неизвестна,она должна вводится пользователем с клавиатуры.
Тогда так
C++
1
2
3
4
5
6
7
void func(float **m)
{
     // ...
}
 
 
func(m);
xAtom
 Аватар для xAtom
910 / 735 / 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;
}
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 486
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**`)
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
01.08.2011, 19:25     Передача двумерного массива в функцию #7
maest,
Цитата Сообщение от maest Посмотреть сообщение
Cannot convert `int**`to `float**`
не о чем не говорит?
C++
1
2
3
4
void func(int **m)
{
     // ...
}
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 486
01.08.2011, 19:34  [ТС]     Передача двумерного массива в функцию #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
maest,

не о чем не говорит?
C++
1
2
3
4
void func(int **m)
{
     // ...
}
Скомпилировалось,но вторая функция какой-то бред выводит
LosAngeles
Заблокирован
01.08.2011, 19:35     Передача двумерного массива в функцию #9
отладчик в помощь
maest
79 / 34 / 3
Регистрация: 11.11.2010
Сообщений: 486
01.08.2011, 20:15  [ТС]     Передача двумерного массива в функцию #10
Насколько я понял,она вместо элемента массива его адрес выдает.А как сделать,чтобы элемент выводила?
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
01.08.2011, 21:46     Передача двумерного массива в функцию #11
А по условию задачи можно использовать STL? Тогда попробуйте мой вариант с вектором векторов, он проще. А если нет, все выше написали
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 23:00     Передача двумерного массива в функцию
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Olga_
 Аватар для Olga_
840 / 182 / 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()).
Yandex
Объявления
01.08.2011, 23:00     Передача двумерного массива в функцию
Ответ Создать тему
Опции темы

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