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

Đề tài: Bài In Hoán Vị, gặp vấn đề khi ghi ra file

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    HCM
    Bài viết
    46

    Mặc định Bài In Hoán Vị, gặp vấn đề khi ghi ra file

    Mình làm bài In ra tất cả hoán vị của n số (n<=5), khi cho xuất ra màn hình thì kết quả cho đúng, nhưng khi xuât ra file thì kết quả ko như mong muốn.
    Các bạn nên xem từ chỗ mở file để ghi kết quả là được rồi, nếu thay chỗ mở file đó bằng đoạn code in ra màn hình rất đúng.
    Bài này mình dùng mảng 1 chiều c cấp phát động để chứa kết quả, số phần tử của mảng c bằng n!
    Ah, các số ban đầu nhập vào giả sử đều khác nhau nhé, mình làm với các số khác nhau trước rồi sau đó sẽ giải quyết có các số trùng nhau sau.

    Mình đinh upload file .cpp lên mà báo lỗi hoài nên paste code vào luôn, các bạn cho chạy thử sẽ thấy kết quả sai. Các bạn xem giúp coi nó sai chỗ nào chỉ mình với:((
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    void nhap(int *a, int &n)
    {	do
    	{	printf("\nNhap n (0<n<6): ");
    		scanf("%d",&n);
    	}
    	while(n<0 || n>5);
    	for(int i=0; i<n; i++)
    	{	printf("Nhap a[%d]=", i);
    		scanf("%d",&a[i]);
    	}
    }
    int GiaiThua( int n)
    {	if(n==1 || n==0)
    		return 1;
    	return n*GiaiThua(n-1);
    }
    void HoanVi( int *a, int *b, int *&c, int n, int j, int &m)
    {	int i,z,tmp;
    	for(i=0; i<n; i++)
    	{	tmp=0;
    		for(z=0; z<j; z++)//neu co 1 so cua mang b giong voi a[i] thi ko gan a[i] vao mang b nua
    			if(b[z]==a[i])
    				tmp=1;
    		if(tmp==0)
    		{	b[j]=a[i];
    			if(j==n-1)
    				for(z=0; z<n; z++)
    					c[m++]=b[z];
    			else
    				HoanVi(a,b,c,n,j+1,m);
    		}
    	}
    }
    void main()
    {	int a[10];//chua cac phan tu nhap ban dau
    	int b[10];//chua cac phan tu da duoc hoan vi
    	int *c;//mang chua ket qua
    	int n;//so phan tu cua mang a,b
    	int m=0;//so phan tu cua mang c
    	int j=0;//bien phu, the hien chi so phan tu cua mang b
    	nhap(a,n);
    	c=(int*)malloc(GiaiThua(n)*sizeof(int));//mang a co n phan tu thi mang c co n! phan tu
    	HoanVi(a,b,c,n,j,m);
    	//mo file ghi ket qua
    	char *filename;
    	fflush(stdin);
    	printf("\nNhap ten file: "); 
    	gets(filename);
    	FILE *f=fopen(filename,"wt");
    	if(!f)
    	{	printf("Khong the mo %s",filename);
    		getch();
    		return;
    	}	  
    	for(j=0; j<m; j++)
    	{	if(j%n==0)
    			fprintf(f,"\n");
    		fprintf(f,"%5d",c[j]);
    	}
    	fclose(f);
    	printf("\nDa ghi ket qua vao file");
    	getch();
    }
    Đã được chỉnh sửa lần cuối bởi halohcm : 17-01-2008 lúc 09:36 PM.

  2. #2
    Ngày gia nhập
    12 2007
    Bài viết
    28

    Hình như bạn chưa cấp phát cho chuỗi filename thì phải? Mình test thử trong VS 2005 thấy báo lỗi Unhandled ngay chỗ đó.

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mình thử sửa lại chương trình thế này nhập thử 1 , 2 vào mảng a và thấy trên màn hình như sau :

    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    void nhap(int *a, int &n)
    {	do
    	{	printf("\nNhap n (0<n<6): ");
    		scanf("%d",&n);
    	}
    	while(n<0 || n>5);
    	for(int i=0; i<n; i++)
    	{	printf("Nhap a[%d]=", i);
    		scanf("%d",&a[i]);
    	}
    }
    int GiaiThua( int n)
    {	if(n==1 || n==0)
    		return 1;
    	return n*GiaiThua(n-1);
    }
    void HoanVi( int *a, int *b, int *c, int n, int j, int &m)
    {	int i,z,tmp;
    	for(i=0; i<n; i++)
    	{	tmp=0;
    		for(z=0; z<j; z++)//neu co 1 so cua mang b giong voi a[i] thi ko gan a[i] vao mang b nua
    			if(b[z]==a[i])
    				tmp=1;
    		if(tmp==0)
    		{	b[j]=a[i];
    			if(j==n-1)
    				for(z=0; z<n; z++)
    					c[m++]=b[z];
    			else
    				HoanVi(a,b,c,n,j+1,m);
    		}
    	}
    }
    void main()
    {
    
            clrscr();
    	int a[10];//chua cac phan tu nhap ban dau
    	int b[10];//chua cac phan tu da duoc hoan vi
    	int *c;//mang chua ket qua
    	int n;//so phan tu cua mang a,b
    	int m=0;//so phan tu cua mang c
    	int j=0;//bien phu, the hien chi so phan tu cua mang b
    	nhap(a,n);
    	c=(int*)malloc(GiaiThua(n)*sizeof(int));//mang a co n phan tu thi mang b co n! phan tu
    	HoanVi(a,b,c,n,j,m);
    	//mo file ghi ket qua
    
    			for(j=0; j<m; j++)
    	{
    	 if(!(j%n)) printf("\n");
    	 printf("%5d",c[j]);
    	}
    
            printf("\n");
    
    			for(j=0; j<m; j++)
    	{
    	 if(!(j%n)) printf("\n");
    	 printf("%5d",c[j]);
    	}
    
    	printf("\n");
    
    			for(j=0; j<m; j++)
    	{
    	 if(!(j%n)) printf("\n");
    	 printf("%5d",c[j]);
    	}
    
    	FILE *f=fopen("C:\\uuu.txt","w");
    
    	for(j=0; j<m; j++)
    	{
    	 if(!(j%n)) fprintf(f,"\n");
    	 fprintf(f,"%5d",c[j]);
    	}
    	fclose(f);
    
    	 printf("\n");
    			for(j=0; j<m; j++)
    	{
    	 if(!(j%n)) printf("\n");
    	 printf("%5d",c[j]);
    	}
    
            getch();
    }
    Màn hình
    Code:
    1 2
    2 1
    
    1 2
    2 1
    
    1 2
    2 1
    
    1 2
    
    517 1924
    Trên tệp thì thấy
    Code:
    1 2
    
    517 1924
    Chứng tỏ trong khi thao tác trên file thì con trỏ c đã bị cái gì đó đó rồi ... Mà cũng ko hiểu nổi nữa . MÌnh chỉ góp ý thế chứ chưa tìm ra lỗi . Bạn thông cảm nhé .
    Việc cấp phát tên tệp thì ko thành vấn đề đâu , mình đã sửa lại chỗ đó mà vẫn bị vậy đó . cái cốt lõi ở đây là cái con trỏ c kìa .

  4. #4
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Sửa lại từ char *filename thành char filename[255] = { 0 }; Con trỏ filename chưa được cấp phát, chứa giá trị rác, gets ghi đè bậy bạ lên memory của các local vars.

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    HCM
    Bài viết
    46

    Cám ơn các bạn mình sửa lại được rồi

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

  1. Cách add file thư viện dll vào file exe để tạo một file chạy duy nhất C#
    Gửi bởi nthung2112 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 20
    Bài viết cuối: 01-09-2012, 10:01 AM
  2. File backup .bak có dung lương lớn hơn file .mdb và file log
    Gửi bởi MYNAM trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 4
    Bài viết cuối: 27-07-2012, 12:59 PM
  3. Giới thiệu cách chuyển File Ảnh thành file Video trong download proshow gold
    Gửi bởi thuhu0900x trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 3
    Bài viết cuối: 03-07-2012, 03:54 AM
  4. Đọc dữ liệu file midi dạng số HEX và lấy lời nhạc trong file ra file text
    Gửi bởi kimngockhtn_2007 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 29-06-2011, 04:40 PM
  5. Trả lời: 17
    Bài viết cuối: 23-05-2011, 11:47 AM

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