30/09/2018, 16:27

Hỏi cách truyền tham trị cho mảng 2 chiều

#include <stdio.h>
#include <stdlib.h>

#define MAXARR 2001
#define fi "NKPALIN.INP"
#define fo "NKPALIN.OUT"

void input(char *s);
void output(int l[][], int i, int j);
int max(int a, int b);

int main()
{
    char s[MAXARR] = {};
    char kq[MAXARR] = {};
    int l[MAXARR][MAXARR] = {};
    int i,j,d;
    input(s);
    for (i = 0; i < sizeof (s) / sizeof (s[0]); i++ )
        for (j = 0; j< sizeof (s) / sizeof (s[0]); j++) {
            if (s[i] == s[j]) {
                l[i][j] = l[i-1][j-1] + 1;
            }
            else {
                l[i][j] = max(l[i-1][j], l[i][j-1]);
            }
        }
    i = sizeof (s) / sizeof (s[0]);
    j = sizeof (s) / sizeof (s[0]);
    output(l[][], i, j);
    return 0;
}

void input(char* s)
{
    FILE *f = fopen(fi,"rt");
    fscanf(f,"%s", s);
    fclose(f);
}

void output(int l[][], int i, int j)
{
    FILE *f = fopen(fo,"wt");
    int d;
    d = -1;
    while (i>0 && j>0) {
        if (s[i] == s[j]) {
            d++;
            kq[d] = s[i];
        }
        else {
            if (l[i][j] == l[i-1][j]) {
                i--;
            }
            else j--;
        }
    }
    fclose(f);
}

int max(int a, int b)
{
    if (a > b) return(a);
    else return(b);
}

Trong hàm output mình truyền mảng l[][] như thế bị báo lỗi, thế có cách nào truyền mảng 2 chiều không ?

Nguyễn Minh Dũng viết 18:40 ngày 30/09/2018

Truyền tham trị tức là chỉ truyền giá trị mà không thay đổi nội dung của mảng 2 chiều gốc đúng không?

Thế thì @Byn chỉ cần truyền const vào là được

Byn viết 18:37 ngày 30/09/2018

truyền const ? ý anh là truyền int l vào thôi ấy hả ?

Nguyễn Minh Dũng viết 18:35 ngày 30/09/2018

oh no, sorry anh nhìn không kỹ. Đối với mảng 2 chiều, em bắt buộc phải truyền vào kích thước của chiều thứ nhất. Tức là thay vì truyền l[][], em hải truyền vào l[3][] nếu mảng thứ nhất độ dài là 3.

Byn viết 18:42 ngày 30/09/2018

À rồi em cảm ơn

Byn viết 18:31 ngày 30/09/2018

Hình như phải truyền vào l[độ dài][độ dài] chứ nhỉ, em thử truyền 1 cái nhưng nó vẫn báo lỗi, truyền 2 cái thì được ?

Nguyễn Minh Dũng viết 18:36 ngày 30/09/2018

Lúc em định nghĩa cái hàm thì chỉ cần truyền cái đầu tiên thôi.

Byn viết 18:28 ngày 30/09/2018

Em mới vừa xóa nhưng nó báo lỗi ?

D:\C\SPOJ\NKPALIN\main.c|9|error: array type has incomplete element type|
Nguyễn Minh Dũng viết 18:37 ngày 30/09/2018

Cho anh xem toàn bộ code lại xem nào?

Byn viết 18:40 ngày 30/09/2018

Đây ạ

#include <stdio.h>
#include <stdlib.h>

#define MAXARR 2001
#define fi "NKPALIN.INP"
#define fo "NKPALIN.OUT"

void input(char *s);
void output(int l[MAXARR][MAXARR], int i, int j, char s[MAXARR]);
int max(int a, int b);

int main()
{
    char s[MAXARR] = {};
    int l[MAXARR][MAXARR] = {};
    int i,j;
    input(s);
    for (i = 0; i < sizeof (s) / sizeof (s[0]); i++ )
        for (j = 0; j< sizeof (s) / sizeof (s[0]); j++) {
            if (s[i] == s[j]) {
                l[i][j] = l[i-1][j-1] + 1;
            }
            else {
                l[i][j] = max(l[i-1][j], l[i][j-1]);
            }
        }
    i = sizeof (s) / sizeof (s[0]);
    j = sizeof (s) / sizeof (s[0]);
    output(l[MAXARR][MAXARR], i, j, s[MAXARR]);
    return 0;
}

void input(char* s)
{
    FILE *f = fopen(fi,"rt");
    fscanf(f,"%s", s);
    fclose(f);
}

void output(int l[MAXARR][MAXARR], int i, int j, char s[MAXARR])
{
    FILE *f = fopen(fo,"wt");
    while (i>0 && j>0) {
        if (s[i] == s[j]) {
            fprintf(f,"%c",s[i]);
        }
        else {
            if (l[i][j] == l[i-1][j]) {
                i--;
            }
            else j--;
        }
    }
    fclose(f);
}

int max(int a, int b)
{
    if (a > b) return(a);
    else return(b);
}
Nguyễn Minh Dũng viết 18:38 ngày 30/09/2018

Ai chà, anh già rồi, nhầm lẫn. Em không cần phải truyền tham số đầu, nhưng phải truyền cái sau. Anh sửa lại

#include <stdio.h>
#include <stdlib.h>

#define MAXARR 2001
#define fi "NKPALIN.INP"
#define fo "NKPALIN.OUT"

void input(char *s);
void output(int l[][MAXARR], int i, int j, char s[MAXARR]);
int max(int a, int b);

int main()
{
    char s[MAXARR] = {};
    int l[MAXARR][MAXARR] = {};
    int i,j;
    input(s);
    for (i = 0; i < sizeof (s) / sizeof (s[0]); i++ )
        for (j = 0; j< sizeof (s) / sizeof (s[0]); j++) {
            if (s[i] == s[j]) {
                l[i][j] = l[i-1][j-1] + 1;
            }
            else {
                l[i][j] = max(l[i-1][j], l[i][j-1]);
            }
        }
    i = sizeof (s) / sizeof (s[0]);
    j = sizeof (s) / sizeof (s[0]);
    output(l, i, j, s);
    return 0;
}

void input(char* s)
{
    FILE *f = fopen(fi,"rt");
    fscanf(f,"%s", s);
    fclose(f);
}

void output(int l[][MAXARR], int i, int j, char s[MAXARR])
{
    FILE *f = fopen(fo,"wt");
    while (i>0 && j>0) {
        if (s[i] == s[j]) {
            fprintf(f,"%c",s[i]);
        }
        else {
            if (l[i][j] == l[i-1][j]) {
                i--;
            }
            else j--;
        }
    }
    fclose(f);
}

int max(int a, int b)
{
    if (a > b) return(a);
    else return(b);
}

Em chú ý cách truyền vào như thế này là sai nhé

output(l[MAXARR][MAXARR], i, j, s[MAXARR]);

Chỉ cần truyền tên mảng thôi

output(l, i, j, s);

Và quan trọng hơn hết là đừng đặt biến một ký tự nữa

Nguyễn Minh Dũng viết 18:28 ngày 30/09/2018

I moved 5 posts to a new topic: Cách truyền mảng 3 chiều vào hàm

Byn viết 18:42 ngày 30/09/2018

Cho em hỏi luôn, cách lấy độ dài của dãy s thế đã đúng chưa ?

Nguyễn Minh Dũng viết 18:39 ngày 30/09/2018

Đoạn lấy độ dài nào vậy @Byn? Ý anh là dòng code nào

X viết 18:30 ngày 30/09/2018

chắc là đúng rồi :)) thay vì s[0], dùng sizeof(char) cũng dc

Byn viết 18:33 ngày 30/09/2018

Ý em là nhập vào một mảng char s[] nhưng không biết độ dài bao nhiêu, lấy độ dài bằng dòng này được không ?

sizeof (s) / sizeof (s[0])
Quân viết 18:33 ngày 30/09/2018

Bạn chạy thử sẽ biết ngay.
nếu s = “Byn”
Thì kế quả trả về là 4.
Tại sao lại là 4? VÌ mỗi chuỗi đều có thêm 1 ký tự kết thúc ‘\n’ mà ta không nhìn thấy.

Nguyễn Minh Dũng viết 18:32 ngày 30/09/2018

Nếu là mảng thì em dùng hàm strlen ấy.

/* strlen example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char szInput[256];
  printf ("Enter a sentence: ");
  gets (szInput);
  printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
  return 0;
}
Byn viết 18:40 ngày 30/09/2018

@ltd vì sao phải ép kiểu (unsigned)strlen(szInput)

Chương trình của em thế này vì sao nó không chạy được, khi built chương trình thì nó hiện ra màn hình console rồi hiện ra cửa sổ chương trình has stop working :’(

#include <stdio.h>
#include <stdlib.h>

#define MAXARR 2001
#define fi "NKPALIN.INP"
#define fo "NKPALIN.OUT"

void input(char *s);
void output(int l[][MAXARR], int i, int j, char s[MAXARR]);
int max(int a, int b);

int main()
{
    char s[MAXARR] = {};
    int l[MAXARR][MAXARR] = {};
    int i,j;
    input(s);
    for (i = 0; i < sizeof (s) / sizeof (s[0]); i++ )
        for (j = 0; j< sizeof (s) / sizeof (s[0]); j++) {
            if (s[i] == s[j]) {
                l[i][j] = l[i-1][j-1] + 1;
            }
            else {
                l[i][j] = max(l[i-1][j], l[i][j-1]);
            }
        }
    i = sizeof (s) / sizeof (s[0]);
    j = sizeof (s) / sizeof (s[0]);
    //output(l, i, j, s);
    return 0;
}

void input(char* s)
{
    FILE *f = fopen(fi,"rt");
    fscanf(f,"%s", s);
    fclose(f);
}

void output(int l[][MAXARR], int i, int j, char s[MAXARR])
{
    FILE *f = fopen(fo,"wt");
    while (i>0 && j>0) {
        if (s[i] == s[j]) {
            fprintf(f,"%c",s[i]);
        }
        else {
            if (l[i][j] == l[i-1][j]) {
                i--;
            }
            else j--;
        }
    }
    fclose(f);
}

int max(int a, int b)
{
    if (a > b) return(a);
    else return(b);
}
Nguyễn Minh Dũng viết 18:28 ngày 30/09/2018

@ltd vì sao phải ép kiểu (unsigned)strlen(szInput)

Anh copy từ trang [cplusplus][1] thôi. Thực tế không cần ép kiểu. strlen trả về size_t, tương đương với unsigned rồi.

size_t
Unsigned integral type

Chương trình của em thế này vì sao nó không chạy được, khi built chương trình thì nó hiện ra màn hình console rồi hiện ra cửa sổ chương trình has stop working

Kiêm tra lại mấy cái chỗ mở file, coi thử có mở file được hay không rồi mới xử lý tiếp.

FILE *f = fopen(fi,"rt");

Mấy cái lỗi dạng này là do truy xuất vùng nhớ tầm bậy.
[1]: http://www.cplusplus.com/reference/cstring/strlen/

Byn viết 18:33 ngày 30/09/2018

Không thể debug được, thế làm sao để kiểm tra lỗi vậy ?

Bài liên quan
0