Announcement

Collapse
No announcement yet.

giúp em bài C++ này với???

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • giúp em bài C++ này với???

    em không biết sao mà nó không cho nhập hệ số. Khi nhập thì báo lỗi: Unhandled exception at 0x00f91641 in giải hệ phương trình.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.
    // giải hệ phương trình.cpp

    Code:
    #include "stdafx.h"
    #include "malloc.h"
    #include "math.h"
    #include "iostream"
    using namespace std;
    float** heso;
    float x,y,z,t,d,dx,dy,dz,dt;
    void nhap( float** heso, int dem, int so_an);
    float dinhthuccap2(float** heso, int x, int y);
    float dinhthuccap3(float** heso, int x, int y, int z);
    float dinhthuccap4(float** heso, int x, int y, int z, int t);
    void tinhdinhthuc(float** heso, int dem, int so_an);
    void xuatnghiem(int dem, int so_an);
    void main()
    {
        int so_an,dem;
        char k='y';
        cout<<"\n\n Giai he phuong trinh \n\n";
        do
        {
        cout<<" Giai he 2 an: 2\n Giai he 3 an: 3\n Giai he 4 an: 4\n";
        cin>>so_an;
        switch(so_an)
        {
        case 2: dem=3; heso=(float**)malloc(6*sizeof(float*)); break;
        case 3: dem=4; heso=(float**)malloc(12*sizeof(float*));  break;
        case 4: dem=5; heso=(float**)malloc(20*sizeof(float*));  break;
        }
        nhap(heso,dem,so_an);
        tinhdinhthuc(heso,dem,so_an);
        xuatnghiem(dem,so_an);
        cout<<"Tiep tuc thuc hien chuong trinh?  (Y/N)";
        cin>>k;
        }
        while (k=='y'||k=='Y');
    }
    void nhap( float** heso, int dem, int so_an)
    {
        for (int i=0;i<dem;i++)
            for (int j=0;j<so_an;j++)
            {
                cout<<"nhap he so A["<<i+1<<"]["<<j+1<<"]   ";
                cin>>heso[i][j];
            }
    }
    float dinhthuccap2(float** heso, int a, int b)
    {
        return (heso[a][a]*heso[b][b]-heso[b][a]*heso[a][b]);
    }
    float dinhthuccap3(float** heso, int a, int b, int c)
    {
        return ((heso[a][a]*heso[b][b]*heso[c][c]+heso[a][b]*heso[b][c]*heso[c][a]+heso[b][a]*heso[c][b]*heso[a][c])-(heso[c][a]*heso[b][b]*heso[a][c]+heso[a][b]*heso[b][c]*heso[c][c]+heso[b][c]*heso[c][b]*heso[a][a]));
    }
    float dinhthuccap4(float** heso, int a, int b, int c, int d)
    {
        return pow((float)(-1),(float)(a+a))*(heso[a][a])*dinhthuccap3(heso,b,c,d)+pow((float)(-1),(float)(a+b))*(heso[a][b])*dinhthuccap3(heso,a,c,d)+pow((float)(-1),(float)(a+c))*(heso[a][c])*dinhthuccap3(heso,a,b,d)+pow((float)(-1),(float)(a+d))*(heso[a][d])*dinhthuccap3(heso,a,b,c);
    }
    
    void tinhdinhthuc(float** heso,int dem, int so_an)
    {
         float d,dx,dy,dz,dt;
        switch(so_an)
        {
        case 2: d=dinhthuccap2(heso,1,2); 
            dx=dinhthuccap2(heso,2,3); 
            dy=dinhthuccap2(heso,1,3); break;
        case 3: d=dinhthuccap3(heso,1,2,3); 
            dx=dinhthuccap3(heso,2,3,4); 
            dy=dinhthuccap3(heso,1,3,4); 
            dz=dinhthuccap3(heso,1,2,4); break;
        case 4: d=dinhthuccap4(heso,1,2,3,4); 
            dx=dinhthuccap4(heso,2,3,4,5); 
            dy=dinhthuccap4(heso,1,3,4,5); 
            dz=dinhthuccap4(heso,1,2,4,5); 
            dt=dinhthuccap4(heso,1,2,3,5); break;
        }
    }
    void xuatnghiem( int dem, int so_an)
    {
        if (d==0)
        {
            switch(so_an)
            {
            case 2: if (dx!=0||dy!=0) cout<<" phuong trinh vo nghiem"; else cout<<" phuong trinh vo so nghiem";break;
            case 3: if (dx!=0||dy!=0||dz!=0) cout<<" phuong trinh vo nghiem"; else cout<<" phuong trinh vo so nghiem";break;
            case 4: if (dx!=0||dy!=0||dz!=0||dt!=0) cout<<" phuong trinh vo nghiem"; else cout<<" phuong trinh vo so nghiem"; break;
            }
        }
        else 
            switch (so_an)
        {
            case 2: x= dx/d; y= dy/d;
                cout<<"x= "<<x<<"\ny=  "<<y<<endl; break;
            case 3: x= dx/d; y= dy/d; z=dz/d;
                cout<<"x= "<<x<<"\ny=  "<<y<<"z=  "<<z<<endl; break;
            case 4: x= dx/d; y= dy/d; z=dz/d; t= dt/d;
                cout<<"x= "<<x<<"\ny=  "<<y<<"\nz=  "<<z<<"\nt=  "<<t<<endl; break;
        }
    }
    Last edited by BiThuDoan; 14-01-2012, 00:57.

  • #2
    Hic, bạn post code kiểu đó người ta nhìn vào hết muốn đọc luôn. Bỏ code vào thẻ PHP đi bạn.

    Comment


    • #3
      1. Xin cho biết chương trình này để làm gì.
      2. Vui lòng trình bày giải thuật.
      3. Như trên.
      4. Debug step by step đi. Nó chạy tới đâu thì báo lỗi?
      5. Chọn tiêu đề khác đi.

      Comment


      • #4
        Cấp phát và sử dụng mảng động 2 chiều

        Originally posted by 11520360 View Post
        em không biết sao mà nó không cho nhập hệ số. Khi nhập thì báo lỗi: Unhandled exception at 0x00f91641 in giải hệ phương trình.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.
        Lỗi này xảy ra do chương trình có đoạn code truy cập đến vùng nhớ không tồn tại hoặc chưa được cấp phát ( giải pháp là phải cấp phát trước khi sử dụng)

        Trong đoạn chương trình:
        PHP Code:
            switch(so_an)
            {
            case 
        2dem=3heso=(float**)malloc(6*sizeof(float*)); break;
            case 
        3dem=4heso=(float**)malloc(12*sizeof(float*));  break;
            case 
        4dem=5heso=(float**)malloc(20*sizeof(float*));  break;
            }
            
        nhap(heso,dem,so_an); 
        Lỗi xảy ra do mảng động heso cấp phát không đúng cách(tuy nhiên không có lỗi cú pháp). Khi cấp phát như trên đơn thuần nó chỉ tạo ra một mảng động một chiều chứa các con trỏ kiểu (float*) thôi.

        Để giải quyết vấn đề này bạn hãy thêm vào hàm CapPhat_MaTran() như sau:
        PHP Code:
        float** CapPhat_MaTranint so_an)
        {
            
        float** MT;
            
        // Cap phat mang dong mot chieu luu dia chi so_an dong cua ma tran
            
        MT = (float**)malloc(so_an*sizeof(float*));
            
        // Cap phat cho moi dong so_an+1 cot de luu cac he so cua moi dong
            
        for(int i=0iso_an i++)
                
        MT[i] = (float*)calloc((so_an+1),sizeof(float));
            return 
        MT;

        Trong ham main()
        PHP Code:
               heso CapPhat_MaTran(so_an);
               
        nhap(heso,dem,so_an); 
        Là OK!

        Thêm một chỗ nữa cũng gây ra lỗi
        Originally posted by 11520360 View Post
        Unhandled exception at 0x00f91641 in giải hệ phương trình.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.
        PHP Code:
        float dinhthuccap2(float** hesoint aint b)
        {
            return (
        heso[a][a]*heso[b][b]-heso[b][a]*heso[a][b]);
        }
        float dinhthuccap3(float** hesoint aint bint c)
        {
            return ((
        heso[a][a]*heso[b][b]*heso[c][c]+heso[a][b]*heso[b][c]*heso[c][a]+heso[b][a]*heso[c][b]*heso[a][c])-(heso[c][a]*heso[b][b]*heso[a][c]+heso[a][b]*heso[b][c]*heso[c][c]+heso[b][c]*heso[c][b]*heso[a][a]));
        }
        float dinhthuccap4(float** hesoint aint bint cint d)
        {
            return 
        pow((float)(-1),(float)(a+a))*(heso[a][a])*dinhthuccap3(heso,b,c,d)+pow((float)(-1),(float)(a+b))*(heso[a][b])*dinhthuccap3(heso,a,c,d)+pow((float)(-1),(float)(a+c))*(heso[a][c])*dinhthuccap3(heso,a,b,d)+pow((float)(-1),(float)(a+d))*(heso[a][d])*dinhthuccap3(heso,a,b,c);
        }
        void tinhdinhthuc(float** heso,int demint so_an)
        {
                
        float d,dx,dy,dz,dt;
                switch(
        so_an)
                {
                case 
        2d=dinhthuccap2(heso,1,2);
                    
        dx=dinhthuccap2(heso,2,3);
                    
        dy=dinhthuccap2(heso,1,3); break;
                case 
        3d=dinhthuccap3(heso,1,2,3);
                    
        dx=dinhthuccap3(heso,2,3,4);
                    
        dy=dinhthuccap3(heso,1,3,4);
                    
        dz=dinhthuccap3(heso,1,2,4); break;
                case 
        4d=dinhthuccap4(heso,1,2,3,4);
                    
        dx=dinhthuccap4(heso,2,3,4,5);
                    
        dy=dinhthuccap4(heso,1,3,4,5);
                    
        dz=dinhthuccap4(heso,1,2,4,5);
                    
        dt=dinhthuccap4(heso,1,2,3,5); break;
                }

        Nguyên nhân do truy cập vùng nhớ trái phép mảng heso[b][b] với b=2 khi gọi case 2: d=dinhthuccap2(heso,1,2);
        trong khi heso kích thức [2x3] chỉ số chỉ chạy từ [0..1][0..2] và ở các dòng tiếp theo cũng tương tự.
        Last edited by 10520567; 13-01-2012, 17:42.

        Comment


        • #5
          Originally posted by 08520348 View Post
          Hic, bạn post code kiểu đó người ta nhìn vào hết muốn đọc luôn. Bỏ code vào thẻ PHP đi bạn.
          cái đó làm như thế nào vậy? Giúp em cho trót luôn đi

          Comment


          • #6
            Originally posted by 09520243 View Post
            1. Xin cho biết chương trình này để làm gì.
            2. Vui lòng trình bày giải thuật.
            3. Như trên.
            4. Debug step by step đi. Nó chạy tới đâu thì báo lỗi?
            5. Chọn tiêu đề khác đi.
            chương trình giải hệ phương trình.số ẩn tùy ý từ 2 tới 4. debug rồi.tới khi nhập hệ số thì báo lỗi anh ơi.

            Comment


            • #7
              Originally posted by 11520360 View Post
              cái đó làm như thế nào vậy? Giúp em cho trót luôn đi
              Bạn để đoạn code của bạn trong thể PHP (bắt đầu bằng [(PHP)], kết thúc bằng [/(PHP)]), (lưu ý bỏ dấu ngoặc tròn đi).

              Originally posted by 11520360 View Post
              chương trình giải hệ phương trình.số ẩn tùy ý từ 2 tới 4. debug rồi.tới khi nhập hệ số thì báo lỗi anh ơi.
              Bạn Lê Ngọc Anh đã giải thích khá rõ ràng rồi, bạn đọc lại và nghiền ngẫm nha, còn anh ơi gì nữa
              Chúc bạn học tốt và 1 năm mới đầy niềm vui, hạnh phúc !
              https://fbcdn-photos-a.akamaihd.net/...08264688_a.jpg

              Comment

              LHQC

              Collapse
              Working...
              X