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 ?

1 Like

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

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

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.

À rồi em cảm ơn :smile:

1 Like

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 ?

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

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|

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

Đâ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);
}

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 :frowning:

Nhìn code em anh hại não quá, i, j đã đủ lại thêm l với f, sao nó có 1 nét thẳng thẳng không vại trời =))

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

ôn lại một tý về cách gọi hàm nhé

Trong code em đã khai báo một hàm void với tên output, nhận vào các tham số là mảng 2 chiều l, 2 biến interger i, j, một mảng char[] (hay gọi là string).

Trong lý thuyết cách gọi hàm, ta không gọi cả dòng họ gia phả nhà biến ra, vì nếu như đã là biến cục bộ hay biến toàn cục thì nó chỉ có duy nhất 1 tên (i , j chẳng hạn), vì thế khi ta gọi hàm thì ta chỉ cần gọi tên của nó ra thôi

 output(l, i, j, s);

Nhớ lưu ý rằng gọi hàm và truyền tham số khác với khai báo hàm và khai báo tham số. Em đang nhầm lẫn giữa 2 cái này :smile:

1 Like

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

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

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

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

1 Like

Ý 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])

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.

1 Like

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;
}

@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);
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?