mình có bài về cộng hoặc nhân 2 ma trận, dùng con trỏ để làm mà mình vẫn chưa bít nhiều bạn nào có thể gợi ý cho minh được không? về mảng thì dễ nhưng con trỏ mắc wa...Chỉ giúp mình nha!!!
mình có bài về cộng hoặc nhân 2 ma trận, dùng con trỏ để làm mà mình vẫn chưa bít nhiều bạn nào có thể gợi ý cho minh được không? về mảng thì dễ nhưng con trỏ mắc wa...Chỉ giúp mình nha!!!
Vấn đề sử dụng con trỏ thế nào là một vấn đề tương đối khó.
Mình code qua bài trên của bạn, bạn xem qua để tham khảo nhé, có chỗ nào không hiểu bạn cứ hỏi :
Code:#include <stdio.h> #include <conio.h> #include <malloc.h> const int M = 2; const int N = 3; typedef int MYTYPE; typedef MYTYPE MYARR[N]; void inputMatrix(MYARR *a, char ch) { int i,j; for(i = 0; i < N;i++) { for(j = 0; j < M; j++) { printf("%c[%d][%d] = ",ch,i,j); scanf("%d",&a[i][j]); } } } void printOutMatrix(MYARR *a) { int i,j; for(i = 0;i < N; i++) { for(j = 0; j < M;j++) printf("%5d",a[i][j]); printf("\n"); } } void addTowMatrix(MYARR *a, MYARR *b, MYARR *c) { int i,j; for(i = 0; i < N; i++) { for(j = 0; j < M;j++) c[i][j] = a[i][j] + b[i][j]; } } void main() { MYARR *a = (MYARR *)malloc(M * sizeof (MYARR)); MYARR *b = (MYARR *)malloc(M * sizeof (MYARR)); MYARR *c = (MYARR *)malloc(M * sizeof (MYARR)); inputMatrix(a,'A'); inputMatrix(b,'B'); addTowMatrix(a,b,c); printf("The result for adding tow matrix\n"); printOutMatrix(c); getch(); }
[=========> Bổ sung bài viết <=========]
À quên lúc nãy code vội chưa free cho nó, bạn nhớ là các hàm cấp phát phải luôn đi kèm với các hàm giải phóng bộ nhớ nhé, bọn chúng không thể thiếu nhau được đâu :
free(a);
free(b);
free(c);
Được sửa bởi VuongChieuQuan lúc 18:31 ngày 17-04-2008 Reason: Bổ sung bài viết
bạn có thể giải thích cho mình hiểu thư viện #include <maloc.h>
đc không? mình không rõ lắm.
cả đoạn này nữa nha, cách thực hiện như nào?MYARR *a = (MYARR *)malloc(M * sizeof (MYARR));
MYARR *b = (MYARR *)malloc(M * sizeof (MYARR));
MYARR *c = (MYARR *)malloc(M * sizeof (MYARR));
những hàm giải phóng free(a) ... đặt ở đâu mình chưa làm như này bao giờ nên không hiểu. bạn giải thích giúp mình nha!
Cảm ơn Vương Chiêu Quân nhìu!
xin chào. mình ko thuộc dân cntt nhưng mà trên lớp có cái đồ án tin học extract file AVI thành các frame riêng biệt(ngôn ngữ C), mình có tìm hiểu nhưng chưa có j` nhiều, cho mình hỏi về cái thư viện vfw32.lib đi. cảm ơn nhiều lắm.
Con trỏ là một vấn đề quan trọng cần lắm vững. Bạn lên tìm hiểu sâu về nó, bao giờ bạn giải thích được những câu hỏi sau thì hãy bắt tay vào lập trình với con trỏ:
1. Con trỏ là gì ? Một biến kiểu trỏ khác gì so với một biến tĩnh ?
2. Tại sao phải dùng con trỏ ?
3. Mô hình bộ nhớ một chương trình ?
Có thể nói rõ hơn về con trỏ giúp mình với,câu hỏi số 2,3 của VCQ mình không hiểu lắm.Trả lời giúp mình nha. Cám ơn nhiu.
may bai nay cung ko kho lam dau ,nhung minh biet giai
Trả lời cho bạn:
1. Đầu tiên, cái thư viện <malloc.h> là một thư viện hàm, trong đó có chứa hàm malloc hay calloc. Ở trên, anh vuongchieuquan dùng chương trình Visual C++ 6.0 trong bộ Visual studio 6.0 để viết chương trình này, nên ảnh dùng thư viện <malloc.h>. Nhưng nếu bạn dùng Borland C++ hay Turbo C++ để viết chương trình thì phải khai báo là <alloc.h>. Nếu không, có lỗi thì ráng chịu ^^. Cái này do sự khác nhau giữa các môi trường lập trình mà thôi. Còn muốn không sợ lộn, thì dùng luôn <stdlib.h> cũng được. Nó chứa luôn hai hàm malloc và calloc luôn.
@duonghoccmk: hôm trước em đã nói qua vê cái cấu trúc của lệnh malloc cho chị rồi, mà chị vẫn không nhớ à? Em nói lại thế này hen:
Như vậy, hàm malloc sẽ tạo ra một vùng nhớ trong bộ nhớ heap (đại khái là bộ nhớ động đó) một vùng nhớ tính theo bye. ví dụ: malloc(100) sẽ tạo ra trong bộ nhớ động một vùng nhớ có kích thước 100 bytes. Lấy ví dụ của anh vuongchieuquan hen:Code:void *malloc( size_t size );
ảnh truyền cho hàm malloc một đối số là số byte kích thước của kiểu dữ liệu MYARR nhân với M (còn MYARR và M là gì, xin vui lòng đọc lại code của ảnh).Code:MYARR *a = (MYARR *)malloc(M * sizeof (MYARR));
Nhân đây, xin phân biệt luôn điểm khác nhau giữa hàm malloc và hàm calloc như saU: về kết quả trả về, thì hai hàm như nhau. Nhưng cú pháp của hàm calloc thì như sau:
hàm calloc khác với hàm malloc ở chỗ mình truyền cái gì cho nó. Hàm calloc thì mình phải truyền cho nó hai thứ: cái thứ nhất là kích thước của kiểu dữ liệu (size_t size tương ứng với cái sizeof(MYARR) ở trên), và số "mục" cần cấp phát (tương ứng với cái M ở trên). ví dụ calloc( 10, sizeof(int) ) sẽ cấp phát vùng nhớ 40 bytes (nếu mỗi số nguyên có kích thước 4bytes ^^.Code:void calloc( size_t n_items, size_t size );
còn cái chuyện phải dùng toán tử ép kiểu (MYARR *) (MYARR là một kiểu dữ liệu đã được anh vuongchieuquan định nghĩa rồi hen), thì nguyên do là thế này: chị có thấy cú pháp của hàm malloc và calloc không? cả hai đều trả về một con trỏ void. Nhưng mà con trở này thì không thể được dùng để "quản lý" vùng nhớ kiểu MYARR được. Nên phải "ép kiểu" nó sang kiểu MYARR để dùng...
ví dụ:
@hoasua_8x: anh hỏi câu khó quá. Không phải không trả lời được, mà là trả lời thì dài dòng lắm. Anh có hai cách để trả lời 2 câu hỏi trên là: hoặc là hỏi thầy, tìm tài liệu (tiếng anh mới có đủ), tìm trên mạng; hoặc là... học riết rồi rút ra kinh nghiệm. Ở đây, vì sự làm siêng... có hạn, em chỉ đưa ra được vài ý kiến nhỏ của mình mà thôi:Code:int *a; //khai báo con trỏ a kiểu int a = (int *)malloc( 100 * sizeof(int) ); //con trỏ a trỏ đến vùng nhớ đủ sức chứa 100 số nguyên. Tổng kích thước sẽ la 400 bytes (trong môi trường DOS thôi)
1. Câu hỏi số 2 là để "ôn" lại câu hỏi 1. Vì thực chất, thì chính sự khác nhau giữa biến tĩnh và biến động phần nào nói lên cách dùng của con trỏ.
2. Câu hỏi số 3 là để biết được câu trả lời cho câu hỏi số 2.
Nói chung, mục đích chính vẫn là cách dùng con trỏ.
Ở đây, em xin bỏ qua phần giới thiệu tác dụng của con trở. Chỉ xin đưa ra một số trường hợp cần và phải dùng đến con trỏ như sau:
1. Khi chương trình cần tiêu tốn quá nhiều bộ nhớ, thì hãy dùng bộ nhớ động, nếu không muốn gặp lỗi "tràn bộ nhớ" (không biết thuật ngữ có đúng không ta?). Với lại, đã cấp "thổ cư" được, thì khi cần, chính quyền (chương trình" cũng có thể thu hồi lại bằng lệnh free hay delete (trong C++), nên có thể linh hoạt sử dụng bộ nhớ, trong điều kiện ram chỉ có 2 hay 3mb thời cổ lỗ sĩ (giờ thì lập trình vô tư mà không sợ bị gì đâu).
2. Mở rộng ra, ta dùng con trỏ cho một số cấu trúc dữ liệu phức tạp, thường có kích thước lơn, như kiểu danh sách liên kết "cấu trúc"... hì hì...
3. Khi muốn thay đổi giá trị của biến khi hàm thực hiện xong. Măc định, khi truyền một biến cho hàm theo kiểu tham trị, trình biên dịch sẽ tạo ra bản sao cho biến đó, nên khi hàm làm xong công việc rồi, bản sao đó bị hủy, còn cái biến mình truyền thì chẳng bị... thằng nào đụng đến nên còn nguyên. Muốn làm thay đổi nó, phải dùng con trỏ, chỉ dích danh đến nhà nó, mới phá được (nghĩa là mới thực sự thay đổi được giá trị của nó). (chú ý, kiểu chuỗi, thực chất là con trỏ, do đó, khi hàm thực hiện xong, giá trị vẫn thay đổi, nên đừng thâc mắc là tui nói bậy hen). Trong C chuẩn, thì dùng con trỏ là cách duy nhất làm thay đổi giá trị của biến. Nhưng trong C++, còn chiêu độc hơn là truyền theo kiểu tham biến (truyền địa chỉ của biến đó mà).
4. Vâng vâng... mỏi tay rồi, nghỉ đã. Nếu có ý tưởng gì, em nói thêm.
Đó là ý kiến riêng của em thôi. Các anh chị hiểu biết hơn, thấy em gà quá thì đừng có cười hen. ^^
Được sửa bởi trhthong lúc 17:55 ngày 20-04-2008
Thật sự là có nhiều lúc tui vẫn không phân biệt được sự khác biệt giữa C++ và C. Tui cứ viết lẫn lộn hoài. Tui viết một chương trình mà trong đó phối hợp cả hai ngôn ngữ luôn thì có sao không?
^^
@kid1412: Thực ra, khi mới học C mà dùng mấy chương trình dịch For Dos như Turbo C++ hay Borland C++, chúng ta cũng đã "lẫn lộn" giữa C và C++ ở một đặc điểm rất nhỏ, là:
và:Code:void main() { int a; int b; int c; clrscr(); }
Cái trên, đúng là ngôn ngữ C chuẩn rồi. Còn cái dưới, thì hắn là C++ đấy . Trong C chuẩn, bắt buộc phải khai báo biến toàn cục trước. Còn trong C++, thì quy tắc này được xem nhẹ, nghĩa là có thể khai báo biến bất cứ khi nào cần. Như vậy mới có chuyện:Code:void main() { clrscr(); int a; int b; int c; }
Như vậy, chúng mình có thể dùng C và C++ lẫn lộn được. Nhưng phải tuân theo một số qui tắc rất đơn giản, ví dụ:Code:for( int i=0; i<n; i++){}
1. Phải lưu file source với đuôi .cpp, đừng có mà lưu với đuôi .c, rồi bảo ông thầy dạy sai hen (vì có khi, thầy cũng dùng lẫn lộn giữa C và C++ mà không biết).
2. Chú ý đến môi trường lập trình. Nghĩa là phải dùng môi trường lập trình C++ để lập trình C "lai". Vì khi đó, source của mình mới được compile mà không có lỗi. Đơn giản nhất là dùng cái Turbo C++ hay Borland C++.
3.....
Bookmarks