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

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

Восстановить пароль Регистрация
 
Decart
1 / 1 / 1
Регистрация: 19.12.2011
Сообщений: 19
19.03.2012, 00:09     Передача динамических массивов в функции #1
Требования:Программа должна демонстрировать два варианта доступа к элементам массивов во вспомогательной функции: с помощью приведенного индекса и с использованием двух индексов для матриц.Необходимый объем памяти под массив указателей и элементы матрицы выделять динамически.Главная функция должна осуществлять несколько вызовов вспомогательной функции (которая выполняет основной алгоритм) с передачей массивов с разным количеством элементов. Заполнение массивов и отображения результатов выполняет главная функция.

Дана прямоугольная матрица вещественных чисел порядка m*n . Установить, имеется ли в данной матрице хотя бы одна строка, в которой расположены подряд не менее К элементов, равных заданному числу Х. Вывести исходную матрицу и индекс найденной строки с комментарием.

Помогите,пожалуйста,с задачкой. Алгоритм понятен (ниже), но не понятно,как использовать двойные указатели и одинарные. и как работать с ними во вспомогательных функциях.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int count; 
int x=5;
int k=3;
bool yes = false; 
for (int i=0; i<n; i++){    
count = 0; 
for (int j=0; j<m; j++){ 
if (a[i][j] == x){ 
count++; 
if (count == k) { 
yes = true; 
break;} 
 } 
  else count = 0; 
  } 
  if (yes) break;
} 
if (yes) cout << i << " - Найденная строка"; 
     else cout << endl << " Не имеется."; 
getch(); 
getch(); 
return 0; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2012, 00:09     Передача динамических массивов в функции
Посмотрите здесь:

C++ Использование динамических массивов
C++ Динамических массивов
Передача массивов и параметров с одной функции в другую C++
C++ Передача массивов указателей в качестве параметров функции
Передача массивов в функции C++
Передача динамических массивов в функции. А точнее отдельных частей C++
Передача функции с двумерным массивов в качестве параметра C++
Передача в функции массивов типа char - ошибка C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.03.2012, 01:08     Передача динамических массивов в функции #2
Подойдет?
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
bool rowHasNOfK(int *array, int size, int n, int k) {
  for (int i = 0; i < size; ++i) {
    if (array[i] == k) {
      int counter = 0;
      for (; i < size && array[i] == k; ++i)
        ++counter;
      if (counter >= n) return true;
    }
  }
  return false;
}
 
int matrixHasNOfK(int **matrix, int height, int width, int n, int k) {
  for (int i = 0; i < height; ++i)
    if (rowHasNOfK(matrix[i], width, n, k))
      return i;
  return -1;
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
 
  int N = rand() % 2 + 2;
  int K = rand() % 5;
  
  int width = 25 + rand() % 5;
  int height = 10 + rand() % 5;  
  int **matrix = new int*[height];
 
  for (int i = 0; i < height; ++i) {
    matrix[i] = new int[width];
    for (int j = 0; j < width; ++j)
      std::cout << (matrix[i][j] = rand() % 5) << " ";
    // debug:
    if (rowHasNOfK(matrix[i], width, N, K)) std::cout << "| has at least " << N << " of " << K;
    std::cout << std::endl;
  }
  
  int i = matrixHasNOfK(matrix, height, width, N, K);
  std::cout << "Matrix " << ((i > -1) ? "has "
    : "don't have ") << N << " of " << K << " at index " << i << "." << std::endl;  
 
  for (int i = 0; i < height; ++i)
    delete [] matrix[i];
   delete [] matrix;
  return 0;
}
Decart
1 / 1 / 1
Регистрация: 19.12.2011
Сообщений: 19
23.03.2012, 02:27  [ТС]     Передача динамических массивов в функции #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
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
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <iomanip> 
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
using namespace std;
 
void action(double**,int, int, int, int);
void action(double*,int, int, int, int);
 
void main(void) {
    _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    int n, m, i, j, x;
    int k=3;
    // Ввод размерности матрицы
    cout << "Введите размер матрицы(n*m),где (n>=3):"<<endl;
    cin >> n;
    cin >> m;
    
    cout<<"Введите Х:"<<endl;
    cin>>x;
 
    // Инициализация и ввод матрицы
    double **A = new double*[n];                
    for (i=0; i<n; i++) 
        A[i] = new double[m];               
    double *B = (double*) new double[n*m];
 
    cout <<"Введите матрицу "<<n<<"*"<<m<<":"<<endl;
    for(i=0;i<n;i++)
      for(j=0;j<m;j++) 
          cin>>A[i][j];
 
    for(i=0; i<n; i++)
        for(j=0; j<m; j++)
            B[i*m+j]=A[i][j];
 
    // Вывод матрицы и результатов
    system("cls");
    cout <<"Исходная матрица:"<<endl;
    for (i=0; i<n; i++)
    {
      for (j=0; j<m; j++) 
          cout << setiosflags(ios::left) << setw(6) << setprecision(2) << A[i][j];
      cout << endl;
    }
    system("pause");
    
    action(A,n,m,x,k);
    action(B,n,m,x,k);
    
    // Удаление
    //for (i=0; i<N; i++) delete A[i];
    delete[] A;
    delete[] B;
}
 
void action(double **A, int N, int M, int x, int k) {
    int length;
    int count=0;
     cout<<"**A"<<endl;
    for (int i=0; i<N; i++) 
    {
        length=0; 
        for (int j=0; j<M; j++) 
        {
            if (A[i][j]==x)
            { 
                 length++; 
                 while((A[i][j+1]==x) && (j+1<M))
                 {
                     j++; 
                     length++;
                 }
                 if(length>=k)
                 {   
                     count++; 
                     cout<< "Индекс найденной строки=" << i << " длина серии="<< length <<endl;
                     length=0;
                 }
            }
         }
    }
    cout<<"Количество серий="<<count<<endl;
}
 
 
void action(double *A, int N, int M, int x,int k){
    int length;
    int count=0;
    cout<<"*В"<<endl;
    for (int i=0; i<N; i++) 
    {
        length=0; 
        for (int j=0; j<M; j++) 
        {
            if (A[i*M+j]==x)
            { 
                 length++; 
                 while((A[i*M+j+1]==x) && (j+1<M))
                 {
                     j++; 
                     length++;
                 }
                 if(length>=k)
                 {   
                     count++; 
                     cout<< "Индекс найденной строки=" << i << " длина серии="<< length <<endl;
                     length=0;
                 }
            }
         }
    }
    cout<<"Количество серий="<<count<<endl;
}
Yandex
Объявления
23.03.2012, 02:27     Передача динамических массивов в функции
Ответ Создать тему
Опции темы

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