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

Đề tài: Thuật toán Prim viết bằng C++ của mình gặp lỗi, Mong mọi người sửa giúp với!

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    1

    Mặc định Thuật toán Prim viết bằng C++ của mình gặp lỗi, Mong mọi người sửa giúp với!

    Xin chào các bác, em đang làm bài tập về thuật toán Prim , em đã làm xong nhưng mỗi lần chạy lại bị bao lỗi:

    Unhandled exception at 0x7784e42e (msvcr100d.dll) in Prim.exe: 0xC0000005: Access violation writing location 0xcccccccc.
    Mong các bác giúp em với. Em chỉnh sửa trong 2 ngay rồi mà vẫn không khắc phục lỗi được.

    Đây là đề bài:
    Code:
    Bài tập thực hành 3: Thuật toán Prim (Hạn nộp: thứ 4, 07/09/2011)
    
    * Yêu cầu:
    
    +Nhập: Đọc dữ liệu đơn đồ thị từ tập tin văn bản "DOTHI.txt"
    
      - Dòng đầu cho biết số đỉnh của đồ thị
    
      - Các dòng tiếp theo cho biết ma trận TRỌNG SỐ của đồ thị
    
    + Xuất: Xuất cây khung ngắn nhất của đồ thị dưới dạng liệt kê cạnh vào tập tin văn bản <MSSV>.txt
    
    * Ví dụ:
    + Nhập: "DOTHI.txt"
    
    3
    
    0  1  2
    
    1  0  3
    
    2  3  0
    
    + Xuất: <MSSV>.txt
    
    0 - 1, 0 - 2
    Còn đây là code C++ của em:

    Code:
    // 1185065.cpp : Defines the entry point for the console application.
    //
    
    
    #include <iostream>
    #include <stdio.h>
    #define MAX 100
    
    using namespace std;
    struct DOTHI {
    	int soDinh;
    	int mtTrongSo[MAX][MAX];
    };
    
    struct CANH{
    	int v;			//Dinh dau
    	int w;			//Dinh cuoi
    };
    
    
    CANH T[MAX];			  //Canh cua cay khung ngan nhat
    int nT;					  //So canh cua cay khung T
    int lblVertex[MAX];
    int nLbl;
    
    void DocDoThi();
    void PrimAlg();
    void XuatKQLenFile();
    
    void DocDoThi(DOTHI &g,char *input )
    {
    	FILE *f = fopen("input.txt","rt");
    	if (f==NULL)
    	{
    		printf("Khong doc duoc file\n");
    		fclose(f);
    		return;
    	}
    	fscanf(f,"%d",g.soDinh);
    	for(int v=0 ; v < g.soDinh ; v++)
    		for (int w =0 ; w < g.soDinh ; w++)
    		fscanf(f, "%d", &g.mtTrongSo[v][w]);
    	
    	fclose(f);
    }
    
    void PrimAlg(DOTHI g)
    {
    	//gan so canh cua cay khung nT ban dau la 0
    	nT=0;
    	
    	//Khoi tao nhan cua cac dinh la chua xet(0)
    	for (int i = 0; i < g.soDinh ; i++)
             lblVertex[i] = 0;
        //Gan nhan da xet(1) cho dinh 0
        lblVertex[0] = 1;
        
        while (nT < g.soDinh - 1)  //So Canh toi da cua cay khung
        {
        	CANH canhMin ;
        	int nMinWeight = -1; //Chua co canh min
        	//Duyet cac dinh cuoi thoa dk chua xet
    		for(int i = 1 ; i < g.soDinh ; i++)
        	if(lblVertex[i] ==0)
        		{
    				for(int j=0 ; j < g.soDinh ; j++)
    	    		if(lblVertex[j] == 1 && g.mtTrongSo[j][i] > 0)
    	    			{
    		    			if (nMinWeight < 0 || g.mtTrongSo[j][i] < nMinWeight)
    		    			{
    		    				canhMin.v = j;
    		    				canhMin.w = i;
    		    	 			nMinWeight=g.mtTrongSo[i][j];
    		    			}
    		    		}
    	    	}
    
    		//Them canh CanhMin vao cay khung
    		T[nT] = canhMin;
    		nT++;
    		//Gan nhan da xet cho dinh cuoi
    		lblVertex[canhMin.w]=1;
        }
    	cout << nT << endl;
    }
    
    void XuatKQLenFile( CANH T[],int nT, char *output)
    {
    	FILE *f = 
    	f = fopen("output.txt","rt"); //Mo file output.txt
    	//Kiem tra co mo duoc hay khong
    	if (f==NULL)
    	{
    		printf("Khong doc duoc file\n");
    		fclose(f);
    		return;
    	}
    	for(int i=0;i<nT;i++)
    	{
    		fprintf(f, "%d, %d\t" , T[i].v, T[i].w );
    	}
    	//Dong tap tin
    	fclose(f);
    
    }
    
    void main(){
    	DOTHI g;
    	DocDoThi(g, "input.txt");
    	PrimAlg(g);
    	XuatKQLenFile(T, nT, "output.txt");
    }

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Ngó qua code thì thấy vài vấn đề, không biết đã phát hiện hết chưa:
    1. Vài lỗi trong đoạn ghi file output. FILE *f = f = fopen... (thừa 1 cái f =). Open mode cũng sai, phải là w chứ không phải copy - paste nguyên mode "r" từ đoạn đọc file xuống
    2. fscanf(f,"%d", g.soDinh) thiếu dấu &
    3. Cái này có coi là lỗi hay không thì còn tuỳ thuộc điều kiện đề bài, nhưng nếu đồ thị không liên thông thì sẽ sinh lỗi runtime (canhMin không được gán giá trị nào cả)
    4. Code nửa C nửa C++. Đã dùng C++ thì đọc/ghi file bằng ifstream/ofstream cho nó đồng bộ và đơn giản. Cái này là minor issue thôi, bình thường thì dùng vậy cũng không sao lắm, nhưng trường hợp này thì nó liên hệ đến lỗi số 1. Khai báo main là void cũng là kiểu C. Ngoài ra dùng đối số kiểu char* để truyền string literal ("input.txt", "output.txt") cũng là sai trên C++ (nhiều compiler C++ chỉ báo warning cho trường hợp này mà không báo error, để có thể tương thích với thói quen viết C đời đầu của nhiều người. Đây là thói quen sai, đúng ra phải là const char *). Chưa kể đến tên file là đối số của hàm nhập/xuất nhưng lại không xài

    Lỗi 1, 2 đều có thể gây ra báo lỗi như bạn nói. Yếu tố bất ổn 3, trong trường hợp dữ liệu test là đồ thị không liên thông cũng có thể sinh báo lỗi trên

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

  1. Bài tập C++ có ai giúp e thuật toán prim ko???
    Gửi bởi upload trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 18-11-2012, 10:35 AM
  2. THuật toán prim của mình không chạy! Nhờ các bác sửa giúp em!!!!
    Gửi bởi longthanbt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 03-03-2011, 10:11 PM
  3. Lập trình C Tìm đường đi ngắn nhất trong giải thuật Prim viết bằng C
    Gửi bởi ba_duong trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 26-02-2011, 11:16 AM
  4. Lập trình C++ Tìm đường đi ngắn nhất viết bằng giải thuật prim trong lập trình C++?
    Gửi bởi minhtoan991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 25-02-2011, 05:49 PM
  5. chạy tay thuật toán Prim. Giúp em
    Gửi bởi chuong01 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 19-04-2010, 06:12 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