Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: nhân 2 ma trận (sử dụng con trỏ )

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    9

    Mặc định nhân 2 ma trận (sử dụng con trỏ )

    các pro C giúp mình vấn đề này với, mình mới nhập môn C và mình đang làm nhân 2 ma trận đơn giản, mình làm code theo 2 hướng: khai báo mảng hoặc khai báo con trỏ. Nhưng chương trình của mình chạy sai hoài ... mình tìm không ra lỗi, mong các bro góp ý dùm

    Khai báo mảng
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. main()
    4. {
    5. clrscr();
    6. int m,n,k,i,j,x;
    7. float matrix1[10][10];
    8. float matrix2[10][10];
    9. float matrix3[10][10];
    10. float y,z,a,b;
    11. printf("nhap kich thuoc 2 ma tran mxn va nxk\n");
    12. printf("\nm=");
    13. scanf("%d",&m);
    14. printf("\nn=");
    15. scanf("%d",&n);
    16. printf("\nk=");
    17. scanf("%d",&k);
    18. if(m>10||n>10||k>10)
    19.  {
    20.  printf("error!\n");
    21.  printf("chuong trinh nhan 2 ma tran co kick thuoc <= (10x10)\nVui long nhap vao cac so nguyen <=10\n");
    22.  getch();
    23.  return(0);
    24.  }
    25. else
    26.  {
    27.  printf("nhap cac so hang cua ma tran 1\n");
    28.  for(i=0;i<m;i++)
    29.   {
    30.   for(j=0;j<n;j++)
    31.    {
    32.    printf("\na%d%d=",i+1,j+1);
    33.    scanf("%f",&matrix1[i][j]);
    34.    }
    35.   }
    36.  printf("\nnhap cac so hang cua ma tran 2\n");
    37.  for(i=0;i<n;i++)
    38.   {
    39.   for(j=0;j<k;j++)
    40.    {
    41.    printf("\nb%d%d=",i+1,j+1);
    42.    scanf("%f",&matrix2[i][j]);
    43.    }
    44.   }
    45.  /*ERROR FROM HERE,But I don't know where exactly*/
    46.  for(i=0;i<m;i++)
    47.   {
    48.   for(j=0;j<k;j++)
    49.    {
    50.    z=0;
    51.    for(x=0;x<n;x++);
    52.     {
    53.     /*        y=matrix1[i][x]*matrix2[x][j]      */
    54.     a=matrix1[i][x];
    55.     b=matrix2[x][j];
    56.     y=a*b;
    57.     printf("\ny=%f",y);          /*      test    */
    58.     z+=y;
    59.     }
    60.    matrix3[i][j]=z;
    61.    }
    62.   }
    63.  printf("\nket qua:\n");
    64.  for(i=0;i<m;i++)
    65.   {
    66.   for(j=0;j<k;j++)
    67.    {
    68.    printf("c%d%d=%f   ",i+1,j+1,matrix3[i][j]);
    69.    }
    70.   }
    71.  getch();
    72.  return(0);
    73.  }
    74. }


    khai báo con trỏ
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<malloc.h>
    4. #include<math.h>
    5. main()
    6. {
    7. clrscr();
    8. int m,n,k;
    9. printf("nhap kich thuoc ma tran\n");
    10. printf("m=");
    11. scanf("%d",&m);
    12. printf("\nn=");
    13. scanf("%d",&n);
    14. printf("\nk=");
    15. scanf("%d",&k);
    16. printf("\nnhap cac so hang cua ma tran1\n");
    17. int i,j;
    18. float *ary1,*ary2;
    19. ary1=(float*)malloc(m*n*sizeof(float));
    20. ary2=(float*)malloc(k*n*sizeof(float));
    21. for(i=0;i<m;i++)
    22.  {
    23.  for(j=0;j<n;j++)
    24.   {
    25.   printf("\na%d%d=",i+1,j+1);
    26.   scanf("%f",ary1+(i*m+j));
    27.   }
    28.  }
    29. printf("\nnhap cac so hang cua ma tran 2");
    30. for(i=0;i<n;i++)
    31.  {
    32.  for(j=0;j<k;j++)
    33.   {
    34.   printf("\nb%d%d=",i+1,j+1);
    35.   scanf("%f",ary2+(i*n+j));
    36.   }
    37.  }
    38. printf("\nmultiplying two matrices ....");
    39. float *ary3;
    40. ary3=(float*)malloc(m*k*sizeof(float));
    41. int x;
    42. float a,b,y,z;
    43. for(i=0;i<m;i++)
    44.  {
    45.  for(j=0;j<k;j++)
    46.   {
    47.   z=0;
    48.   for(x=0;x<n;x++)
    49.    {
    50.    a=*(ary1+(i*m+x));
    51.    b=*(ary2+(x*m+j));
    52.    y=a*b;
    53.    z+=y;
    54.    }
    55.   *(ary3+(i*m+j))=z;
    56.   }
    57.  }
    58. for(i=0;i<m;i++)
    59.  {
    60.  for(j=0;j<k;j++)
    61.   {
    62.   printf("\nc%d%d=%f",i+1,j+1,*(ary3+(i*m+j)));
    63.   }
    64.  }
    65. free(ary1);
    66. free(ary2);
    67. free(ary3);
    68. getch();
    69. return(0);
    70. }

  2. #2
    Ngày gia nhập
    03 2009
    Bài viết
    9

    tình hình là cái đoạn code nhân 2 ma trận dùng con trỏ của mình ... mình đã tìm ra lỗi sai và sửa chạy tốt, nhưng qua đó mình cũng thấy có 1 vấn đề ... mình đang thắc mắc.
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<malloc.h>
    4. #include<math.h>
    5. main()
    6. {
    7. clrscr();
    8. int m,n;
    9. printf("\nEnter the dimension of matrices\n");
    10. printf("m=");
    11. scanf("%d",&m);
    12. printf("\nn=");
    13. scanf("%d",&n);
    14. printf("\nEnter elements of matrix 1\n");
    15. int i,j;
    16. float *ary1,*ary2;
    17. ary1=(float*)malloc((m+1)*(n+1)*sizeof(float));
    18. ary2=(float*)malloc((m+1)*(n+1)*sizeof(float));
    19. for(i=0;i<m;i++)
    20.  {
    21.  for(j=0;j<n;j++)
    22.   {
    23.   printf("a%d%d=",i+1,j+1);
    24.   scanf("%f",ary1+(i*m+j));
    25.   }
    26.  }
    27. printf("\nEnter elements of matrix 2\n");
    28. for(i=0;i<m;i++)
    29.  {
    30.  for(j=0;j<n;j++)
    31.   {
    32.   printf("b%d%d=",i+1,j+1);
    33.   scanf("%f",ary2+(i*m+j));
    34.   }
    35.  }
    36. printf("loading...\nResult\n");
    37. for(i=0;i<m;i++)
    38.  {
    39.  for(j=0;j<n;j++)
    40.   {
    41.   printf("c%d%d=%f\t",i+1,j+1,*(ary1+(i*m+j))+*(ary2+(i*m+j)));
    42.   }
    43.  }
    44. getch();
    45. return(0);
    46. }
    đoạn code trên mình thử ... thay thế ở chỗ dòng malloc , kích thước là m*n thì kết quả phép cộng có sai ở số hạng cuối cùng. Nhưng nếu để (m+1)*(n+1) thì lại bình thường. Phép nhân thì lại không bị ảnh hưởng? Tại sao vậy, có ai hỉu hem chỉ mình? việc cấp phát bộ nhớ cho con trỏ có quy tắc gì seo?

Các đề tài tương tự

  1. Trao đổi liên kết, trao doi logo, Text Link với các webforumblog (free)
    Gửi bởi nguyenlam14990 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 31
    Bài viết cuối: 13-03-2012, 11:53 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn