Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 4 của 4
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Cần giúp đỡ truyền dữ liệu mảng vào trong hàm không dùng thêm tham số phụ.

    Trong mảng khi nhập vào hàm thì khai báo hàm có tham số phụ bên trong ví dụ: int input(a[10][10])
    bây giờ em muốn nhập mảng mà không cần dùng các chỉ số 10,10 mà cũng không dùng con trỏ thì có thể được không vậy?
    Em biết được cách lấy độ dài mảng sizeof(a)/sizeof(int) áp dụng cho cái này thì có thể là int input(a[sizeof(a)/sizeof(int),sizeof(a[10])/sizeof(int))
    Vì không khai báo cứng nên cũng không được, em thử định nghia #define size sizeof(a)/sizeof(int) cũng không được?
    Vậy có cách nào giải quyết được vấn đề này không, có thể viết header file được không? Mong các bác chỉ giáo thêm. [IMG]images/smilies/smile.png[/IMG]

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    C thì viết 1 cái struct bao lấy int[][] là xong. Nếu số dòng và số cột cố định thì khai báo hằng số:

    Mã:
    #define N_ROWS 10#define N_COLS 10typedef struct _Table_ {  int data[N_ROWS][N_COLS];} Table; void input(Table* pTable) //phải truyền bằng con trỏ{  int i, j;  for (i = 0; i < N_ROWS; ++i)    for (j = 0; j < N_COLS; ++j)      scanf("%d", &pTable->data[i][j]);}
    nếu số dòng ko cố định thì thêm 2 biến nRows, nCols; lưu ý là phải thêm vào hàm cấp phát và hàm giải phóng table:

    Mã:
    #include <stdio.h>#include <stdlib.h> typedef struct _Table_ {  int** data;  int nRows, nCols;} Table; Table constructTable(int rows, int cols){  Table table;  table.nRows = rows;  table.nCols = cols;  table.data = (int**)malloc(table.nRows*sizeof(int*));  int i;  for (i = 0; i < table.nRows; ++i)    table.data[i] = (int*)malloc(table.nCols*sizeof(int));  return table;} void freeTable(Table table) //ko nhất thiết phải truyền bằng con trỏ{  int i;  for (i = 0; i < table.nRows; ++i)    free(table.data[i]);  free(table.data);} void input(Table table) //ko nhất thiết phải truyền bằng con trỏ{  int i, j;  for (i = 0; i < table.nRows; ++i)    for (j = 0; j < table.nCols; ++j)      scanf("%d", &table.data[i][j]);} int main(){  Table table = constructTable(3, 4);  input(table);    int i, j;  for (i = 0; i < table.nRows; ++i)  {    for (j = 0; j < table.nCols; ++j)      printf("%d ", table.data[i][j]);    printf("
    ");  }   freeTable(table);  return 0;}



    C++ thì có std::vector.

    Mã:
    #include <vector> typedef std::vector<std::vector<int> > Table; void input(Table& table){  for (size_t i = 0; i < table.size(); ++i)    for (size_t j = 0; j < table[i].size(); ++j)      std::cin >> table[i][j];}

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    Table constructTable(int rows, int cols)
    {
      Table table;
      table.nRows = rows;
      table.nCols = cols;
      table.data = (int**)malloc(table.nRows*sizeof(int*));
      int i;
      for (i = 0; i < table.nRows; ++i)
        table.data[i] = (int*)malloc(table.nCols*sizeof(int));
      return table;
    }
    Có thể làm thế nào để không phải nhập nRows và nCols ở chỗ này không ạ. Mảng được khai báo sẵn nRows và nCols nhưng em không muốn nhập nó vào, muốn khi gọi hàm chỉ cần int vidu(a[][]) giống như ngôn ngữ bậc cao chẳng hạn.

    - - - Nội dung đã được cập nhật ngày 06-09-2014 lúc 08:31 AM - - -

    Mã:
    #include <stdio.h>
    #include <stdlib.h>
     int a[10][10];
    typedef struct _Table_ {
      int** data;
      int nRows, nCols;
    } Table;
     
    Table constructTable()
    {
      Table table;
      table.nRows = sizeof(a)/sizeof(int);
      table.nCols = sizeof(a[10])/sizeof(int);
      table.data = (int**)malloc(table.nRows*sizeof(int*));
      int i;
      for (i = 0; i < table.nRows; ++i)
        table.data[i] = (int*)malloc(table.nCols*sizeof(int));
      return table;
    }
     
    void inPut(Table table){
    	for(int i=0;i<table.nRows;i++) scanf("%d",&table.data[i]);
    	}
    	void outPut(Table table){
    	for(int i=0;i<table.nRows;i++) printf("%d\t",table.data[i]);
    	}
    void freeTable(Table table) 
    {
      int i;
      for (i = 0; i < table.nRows; ++i)
        free(table.data[i]);
      free(table.data);
    }
     
    void input(Table table)
    {
      int i, j;
      for (i = 0; i < table.nRows; ++i)
        for (j = 0; j < table.nCols; ++j)
          scanf("%d", &table.data[i][j]);
    }
     
    int main()
    {
    	int rows,cols;
      Table table = constructTable();
      input(table);
     
      int i, j;
      for (i = 0; i < table.nRows; ++i)
      {
        for (j = 0; j < table.nCols; ++j)
          printf("%d ", table.data[i][j]);
        printf("
    ");
      }
     inPut(table);
     outPut(table);
     freeTable(table);
      
      return 0;
    }
    em sửa lại như thế này nhưng hiện tại chưa nhập xuất mảng chuẩn được.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    khi cấp phát table thì vẫn cần cho biết là table có bao nhiêu dòng bao nhiêu cột chứ. Nếu là 10x10 thì constructTable(10, 10) là được.

    hoặc viết thêm hàm
    Mã:
    Table construct10x10Table() { return constructTable(10, 10); }
    muốn giống như ngôn ngữ bậc cao nào vd cho ta thấy coi để thử bắt chước @_@

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •