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

Исправить функцию - C++

Восстановить пароль Регистрация
 
BabyGluk
26 / 26 / 4
Регистрация: 10.04.2013
Сообщений: 167
24.04.2013, 12:16     Исправить функцию #1
Насамом деле все очень просто и стыдно задавать вопросс такой, но увы.
Вобщем нужно что бы 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
#include<iostream>
using namespace std;
int **arr; int **brr;
void new_mas(int **a,int n,int m){
 
    a = new int*[n];
    for (int i=0; i<n; i++)
        a[i] = new int[m];
    for (int i=0; i<n; i++)
        for (int j=0; j< m; j++)
            a[i][j] = rand() % 100;
    
}
void out_mas(int **a,int n,int m){
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
           cout<<a[i][j]<<" ";
    
    }
   
}
void main(){
    int n,m;
    cin>>n>>m;
    new_mas(arr,n,m);// тут и на выводе что бы я мог подставить любой масив и оно создавало)
    out_mas(arr,n,m);//
    delete[]arr;
    system("pause >> void");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.04.2013, 12:45     Исправить функцию #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
#include <iostream>
#include <iomanip>
using namespace std;
void new_mas(int **&a,int n,int m){
    a = new int*[n];
    for (int i=0; i<n; i++)
        a[i] = new int[m];
    for (int i=0; i<n; i++)
        for (int j=0; j< m; j++)
            a[i][j] = rand() % 100;
    
}
void out_mas(int **a,int n,int m){
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
           cout<< setw(4) << a[i][j]<<" ";
        cout << endl;
    }
}
 
void del_mas(int **&a,int n){
    for(int i = 0; i < n; i++)
    {
           delete [] a[i];
    }
    delete [] a;
    a = NULL;
}
 
void main(){
    int **arr;
    int n,m;
    cin>>n>>m;
    new_mas(arr,n,m);
    out_mas(arr,n,m);
    del_mas(arr,n);
    system("pause >> void");
}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
24.04.2013, 13:03     Исправить функцию #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
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <iomanip>
 
template <class T>
T **newMatrix(size_t height, size_t width) {
  T **result = new T*[height];
  for (size_t i = 0; i < height; ++i) {
    result[i] = new T[width];
  }
  return result;
};
 
template <class T>
void deleteMatrix(T **matrix, size_t height) {
  for (size_t i = 0; i < height; ++i) {
    delete [] matrix[i];
  }
  delete [] matrix;
}
 
template <class T>
void printMatrix(T **matrix, size_t height, size_t width) {
  for (size_t i = 0; i < height; ++i) {
    for (size_t j = 0; j < width; ++j) {
      std::cout << std::setw(4) << matrix[i][j];
    }
    std::cout << std::endl;
  }
}
 
// не очень универсально
template <class T>
void fillRandomMatrix(T **matrix, size_t height, size_t width) {
  for (size_t i = 0; i < height; ++i) {
    for (size_t j = 0; j < width; ++j) {
      matrix[i][j] = rand() % 100;
    }
  }
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
  
  size_t h = 2 + rand() % 15, w = 2 + rand() % 15;
  int **matrix = newMatrix<int>(h, w);
  
  fillRandomMatrix(matrix, h, w);
  printMatrix(matrix, h, w);
  
  deleteMatrix(matrix, h);
  return 0;
}
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
24.04.2013, 14:18     Исправить функцию #4
Это generic c вариант.

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
#include <stdio.h>
#include <stdlib.h>
#include <string>
 
#define ARRAY_SIZE 3
 
typedef int size_type;
 
void** get_offset(void** ptr, int offset)
  {
  return (void**)((char**)ptr + offset);
  }
 
void* get_offset(void* ptr, size_type obj_size, int offset)
  {
  return (char*)ptr + obj_size * offset;
  }
 
void read_int(void* item)
  {
  scanf("%d", (int*)item);
  }
 
void write_int(void* item)
  {
  printf("%d", *(int*)item);
  }
 
void read_2d_array(void** array, size_type obj_size, int n, int m, void(*read_func)(void*))
  {
  for (int i = 0; i < n; ++i)
    {
    void** i_offset = get_offset(array, i);
 
    for (int j = 0; j < m; ++j)
      {
      void* j_offset = get_offset(*(char**)i_offset, obj_size, j);
 
      read_func(j_offset);
      }
    }
  }
 
void write_2d_array(void** array, size_type obj_size, int row_max, int col_max, void(*write_func)(void*))
  {
  for (int row = 0; row < row_max; ++row)
    {
    int last = col_max - 1;
    void** i_offset = get_offset(array, row);
    void*  j_offset = 0;
    
    for (int col = 0; col < last; ++col)
      {
      j_offset = get_offset(*(char**)i_offset, obj_size, col);
 
      write_func(j_offset);
      printf(" ");
      }
 
    j_offset = get_offset(*(char**)i_offset, obj_size, last);
    write_func(j_offset);
    printf("\n");
    }
  }
 
int main()
  {
  int** array = (int**)malloc(ARRAY_SIZE * sizeof(int*));
  for (int col = 0; col < ARRAY_SIZE; ++col)
    {
    array[col] = (int*)malloc(ARRAY_SIZE * sizeof(int));
    memset(array[col], 0, ARRAY_SIZE * sizeof(int));
    }
 
  read_2d_array((void**)array, sizeof(int), ARRAY_SIZE, ARRAY_SIZE, read_int);
  write_2d_array((void**)array, sizeof(int), ARRAY_SIZE, ARRAY_SIZE, write_int);
 
  getchar();
  getchar();
 
  return 0;
  }
-=ЮрА=-
Заблокирован
Автор FAQ
24.04.2013, 14:36     Исправить функцию #5
Цитата Сообщение от BabyGluk Посмотреть сообщение
Насамом деле все очень просто и стыдно задавать вопросс такой, но увы. Вобщем нужно что бы 2 функции вывода и ввода двухмерного масива были универсальны, для любого масива)
- как я понимаю под словом любой подразумевается для массива с любым типом данных. Чтож у плюсов есть очень удачный механизм для этого - а имменно использование функций шаблонов. Суть шаблона сосотоит в задании некоего правила по которому будут обрабатыватсья данные различных типов, т.е достаточно написать всего 1 функцию а передать в неё можно будет любой из известных и даже пользовательских типов данных
Код ниже
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
#include <iostream>
using namespace std;
 
template <class T>
T** get_mas(T **a,int m,int n);
template <class T>
void out_mas(T **a,int m,int n);
 
int main()
{
    int    **iArr = 0;
    double **dArr = 0;
    iArr = get_mas(iArr, 5, 6);
    dArr = get_mas(dArr, 4, 3);
    cout<<"int arrray : "<<endl;
    out_mas(iArr, 5, 6);
    cout<<"double arrray : "<<endl;
    out_mas(dArr, 4, 3);
    cin.get();
    return 0;
}
 
template <class T>
T** get_mas(T **a,int m,int n)
{
    int i, j;
    a = new T * [m];
    for(i = 0; i < m; i++)
    {
        a[i]  = new T[n];
        for(j = 0; j < n; j++)
            a[i][j] = rand() % 100;
    }
    return a;
}
 
template <class T>
void out_mas(T **a,int m,int n)
{
    int i, j;
    for(i = 0; i < m; i++)
    {
        for(j = 0;j < n; j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
}
Миниатюры
Исправить функцию  
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
24.04.2013, 15:10     Исправить функцию #6
Если речь уже пошла про шаблоны и c++.

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
#include <iostream>
 
template<typename T>
class Matrix2D
  {
    struct Proxy
      {
      Proxy(T* data_1d)
        : _data_1d(data_1d) {}
 
      T& operator[] (size_t index)
        {
        return _data_1d[index];
        }
 
       const T& operator[] (size_t index) const
        {
        return _data_1d[index];
        }
 
      T* const _data_1d;
      };
 
  public:
    Matrix2D(size_t rows, size_t cols)
      : _data_2d(0), _rows(rows), _cols(cols)
      {
      _data_2d = new T*[rows];
      for (size_t row = 0; row < rows; ++row)
        _data_2d[row] = new T[cols]();
      }
 
    Proxy operator[] (size_t index)
      {
      return Proxy(_data_2d[index]);
      }
 
    const Proxy operator[] (size_t index) const
      {
      return Proxy(_data_2d[index]);
      }
 
    size_t cols() const { return _cols; }
    size_t rows() const { return _rows; }
 
  private:
    T** _data_2d;
 
    size_t _rows;
    size_t _cols;
    
    template <typename U>
    friend std::istream& operator>> (std::istream&, Matrix2D<U>&);
  };
 
template <typename T>
std::istream& operator>> (std::istream& in, Matrix2D<T>& matrix)
  {
  for (size_t i = 0; i < matrix._rows; ++i)
    for (size_t j = 0; j < matrix._cols; ++j)
      in >> matrix._data_2d[i][j];
 
  return in;
  }
 
template <typename T>
std::ostream& operator<< (std::ostream& out, const Matrix2D<T>& matrix)
  {
  for (size_t i = 0; i < matrix.rows(); ++i)
    {
    size_t last = matrix.cols() - 1;
    for (size_t j = 0; j < last; ++j)
      out << matrix[i][j] << " ";
    out << matrix[i][last] << std::endl;
    }
 
  return out;
  }
 
int main()
  {
  Matrix2D<int> matrix(3, 3);
 
  std::cout << "Enter matrix[3][3]: " << std::endl;
  std::cin >> matrix;
 
  std::cout << "Your matrix is: " << std::endl;
  std::cout << matrix << std::endl;
 
  std::cin.get();
  std::cin.get();
 
  return 0;
  }
Yandex
Объявления
24.04.2013, 15:10     Исправить функцию
Ответ Создать тему
Опции темы

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