Trang 2 / 3 FirstFirst 123 LastLast
Hiển thị kết quả từ 11 đến 20 / 29

Chủ đề: Về con trỏ C

  1. #11
    Tham gia
    26-01-2008
    Bài viết
    36
    Like
    0
    Thanked 2 Times in 2 Posts

    xem dum minh code nay voi!!!

    mình làm bài này nó vẫn báo lỗi, khổ quá nhờ các bác giúp em .
    Code:
    #include <stdio.h>
    #include <conio.h>
    void vao_mt(float*a,int n, int m);
    void ra_mt(float*a,int n, int m);
    void cong_mt(float*a,float*b,float*c,int n, int m);
    void nhan_mt(float*a,float*b,float*d,int n, int m);
    //************************************************************************************************************************************************************************************************************************************************************************
    main()
    {
    float a[20][20],b[20][20],c[20][20],d[20][20];
    int m,n;
    vao_mt((float*)a,n,m);
    ra_mt((float*)a,n,m);
    cong_mt((float*)a,(float*)b,(float*)c,n,m);
    nhan_mt((float*)a,(float*)b,(float*)d,n,m);
    getch();
    return 0;
    }
    //************************************************************************************************************************************************************************************************************************************************************************
    void vao_mt(float*a,int n, int m)
    {
     int i,j;
       for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
        {
          printf("\nphan tu thu %d%d=",i,j);
          scanf("%f",a+i*n+j);
        }
    }
    void ra_mt(float*a,int n, int m)
    {
      int i,j;
       for (i=1;i<=m;i++)
       {
         printf("/n");
         for (j=1;j<=m;j++)
         printf("%8.2f",*(a+i*n+j));
        }
    }
    void cong_mt(float*a,float*b,float*c,int n,int m)
    {
      int i,j;
        for (i=1;i<=n;i++)
         for (j=1;j<=m;j++)
         *(c+i*n+j)=*(a+i*n+j)+ *(b+i*n+j);
    }
    void nhan_mt(float*a,float*b,float*d,int n,int m)
    {
      int i,j;
        for (i=1;i<=n;i++)
          for (j=1;j<=m;j++)
          { //*(c+i*n+j)=0;
    	for(k=1;k<=m;++k)
    	*(c+i*n+j)+=(*(a+i*n+k))*(*(b+k*n+j));
          }
    }

    [=========> Bổ sung bài viết <=========]

    mà trong con trỏ ta có đc phép cộng chung với nhau không như trong hàm cộng_mt của em đó. bác nào nói giùm!!!
    Được sửa bởi duonghocmk lúc 01:26 ngày 23-04-2008 Reason: Bổ sung bài viết

  2. #12
    Tham gia
    04-01-2008
    Bài viết
    23
    Like
    0
    Thanked 1 Time in 1 Post
    Trong main() chưa gán giá trị cho n,m

  3. #13
    Tham gia
    26-01-2008
    Bài viết
    359
    Like
    0
    Thanked 3 Times in 3 Posts
    Bài của bạn mình không đề cập đến vài lỗi như thiếu khai báo biến, sai tên biến (bạn complie sẽ nhìn thấy ngay).Cách làm này chỉ đúng với ma trận vuông, ma trận không vuông sai ngay.

    Mình ví dụ với : n = 2; m = 3 ; Ta chỉ xét hàm nhập ma trận :
    Trong hàm nhập ta tính giá trị :a + i*n + j
    (i = 1...2, j = 1...3) như vậy trong ma trận của bạn sẽ thế này :
    i = 1 : a+3;a+4;a+5
    i = 2 : a+5;a+6;a+7

    Như vậy nó sẽ luôn nhập sai cho ma trận, phần tử a[1][3] sẽ luôn luôn nhận giá trị của a[2][1].Khi bạn nhập 1 2 3 4 5 6 cho ma trận thì nó sẽ luôn in ra :
    1 2 4
    4 5 6

  4. #14
    Tham gia
    24-10-2007
    Location
    Bình Định
    Bài viết
    106
    Like
    0
    Thanked 1 Time in 1 Post
    @duonghocmk Chị viết chương trình như vậy, về cú pháp và giải thuật thì em không nói, nhưng mà theo yêu cầu bắt buộc dùng con trỏ thì đạt được điểm tối đa là... zero. Vì cái chị dùng, không phải là con trỏ và cấp phát động...

    Mong chị sớm làm quen được với con trỏ... Lần đầu, ai cũng gặp khó khăn. Nhưng tốt nhất là tự làm lấy. Mong mọi người đừng đưa ra thêm source code nữa, để chị ấy làm thử xem.
    Ở đây, em chỉ dám đưa ra cho chị một đoạn chương trình nhỏ, để mô tả cách khai báo và cấp phát động cho con trỏ, cùng với việc dùng con trỏ trong nhập xuất ma trận. Đoạn code khá đơn giản, và tất nhiên chưa thể nào đáp ứng được yêu cầu của vấn đề chị đưa ra:
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <stdio.h>
    
    //Declare funtion
    void input(int*, int, int);
    void output(int*, int, int);
    
    void main()
    {
    	int *ptr;
    	int row, col;
    
    	printf("So hang: ");
    	scanf("%d", &row);
    	printf("So cot: ");
    	scanf("%d", &col);
    
    	ptr = (int*) malloc( row*col*sizeof(int) );
    	if(ptr == NULL)
    	{
    		printf("Loi cap phat bo nho!");
    		getch();
    		return;
    	}
    
    	printf("Nhap vao cac phan tu cua ma tran:\n");
    	input(ptr,row,col);
    
    	printf("Ma tran vua nhap la:\n");
    	output(ptr,row,col);
            free(ptr);
    	getch();
    }
    
    void input(int* ptr, int row, int col)
    {
    	int i,j;
    	for(i=0; i < row; i++)
    		for(j=0; j<col; j++)
    		{
    			printf("PT[%d][%d] = ", i, j);
    			scanf("%d", ptr + row*i + j);
    		}
    }
    
    void output(int* ptr, int row, int col)
    {
    	int i, j;
    	for(i=0; i<row; i++)
    	{
    		for(j=0; j<col; j++)
    			printf("%d\t", *(ptr+(i*row)+j) );
    		printf("\n");
    	}
    }
    Được sửa bởi trhthong lúc 23:31 ngày 23-04-2008

  5. #15
    Tham gia
    09-02-2008
    Bài viết
    27
    Like
    0
    Thanked 0 Times in 0 Posts
    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...
    Trong C không có chuyện này, mọi con trỏ khi cast qua void* là implicit, sỡ dĩ phải ép kiểu là do ảnh hưởng của compiler C++, Strojub khi sáng lập ra C++ đã không cho phép kiểu gán này nữa. Dùng 1 số compiler đúng C thì không cần phải cast ( eg. "gcc" )

  6. #16
    Tham gia
    26-01-2008
    Bài viết
    359
    Like
    0
    Thanked 3 Times in 3 Posts
    @trhthong: Cách làm của bạn chưa đúng đâu. Mình đã nói làm kiểu này chỉ đúng cho ma trận vuông ở trên rồi. Dùng con trỏ hết sức cẩn thận.

  7. #17
    Tham gia
    06-03-2008
    Bài viết
    1
    Like
    0
    Thanked 0 Times in 0 Posts
    Mấy cái phần con trỏ sao mà mình đọc chả hiểu gì hết

  8. #18
    Tham gia
    24-10-2007
    Location
    Bình Định
    Bài viết
    106
    Like
    0
    Thanked 1 Time in 1 Post
    Đồng ý với cả bạn J_Schaak và vuongchieuquan. Nhưng bạn vuongchieuquan này, xin lỗi vì tớ chưa nói rõ mục đích viết cái code đó hen. Tớ viết để làm ví dụ cho bạn duongmk gì đó thôi. Chả là bạn í viết chương trình, dùng con trỏ mà không có khai báo gì gì hết. Tớ viết làm ví dụ chơi í mà

  9. #19
    Tham gia
    26-01-2008
    Bài viết
    359
    Like
    0
    Thanked 3 Times in 3 Posts
    Mình thấy rất nhiều bạn sử dụng mảng hai chiều (ma trận )sai. Để cấp phát cho ma trận NxM bạn có thể cấp phát động như sau :
    PHP Code:
    double **A;
         
    = (double**) mallocN*sizeof(double*)); 
         for (
    0;N;i++)  A***91;i***93; = (double*) mallocM*sizeof(double)); 
    Sau khi cấp phát thì ma trận A sẽ được cấp cho M*N*sizeof(double) byte trong bộ nhớ. Khi đó bạn có thể thao tác bình thường với ma trận A như :
    Nhập giá trị cho phần tử A[i][j]:
    PHP Code:
     scanf("%f", &A***91;i***93;***91;j***93;); 
    Hay in phần tử đó ra :
    PHP Code:
     printf("%f",A***91;i***93;***91;j***93;); 
    ........

  10. #20
    Tham gia
    18-11-2008
    Bài viết
    8
    Like
    0
    Thanked 0 Times in 0 Posts
    cho minh hoi : cai nay "double **b" la sao vay? sao lai co 2 dau " * "?

Trang 2 / 3 FirstFirst 123 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • 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
  •