Qui định về quản lý SPAM, vui lòng đọc kĩ trước khi post bài

Mọi thắc mắc về công tác sinh viên, học vụ (lịch thi, điểm thi, đăng ký môn, tổ chức lớp, thông tin liên lạc lớp trưởng/giảng viên v.v...) sinh viên sử dụng tài khoản là MSSV để trao đổi tại các box phù hợp trong Mục CỘNG ĐỒNG UIT


Thông tin và cách reset password các tài khoản do trường cấp


+ Trả lời bài viết
Trang 1/2 1 2 CuốiCuối
Hiện kết quả từ 1 tới 10 của 15

Chủ đề: [Help] Tinh chỉnh Code đếm tần số xuất hiện các phần tử trong mảng 2 chiều

  1. #1
    Trần Quốc Chấn
    Guest

    Post [Help] Tinh chỉnh Code đếm tần số xuất hiện các phần tử trong mảng 2 chiều

    Mã:
    #include "stdafx.h"
    #include "stdio.h"
    #include "conio.h"
    #include "time.h"
    #include "stdlib.h"
    #include "windows.h"
    #include "math.h"
    #define  max 100
    void nhap(int a[][max], int &n )
    {
    	do{
    	printf("\n Nhap ma tran cap n (n>=2n&&<=50)n=");
    	scanf_s("%d",&n);
    	  }
    	while (n<2&&n>50);
    	srand((unsigned)time(NULL));
    	for (int i=0;i<n;i++)
    	{
    		for (int j=0;j<n;j++)
    			a[i][j]=rand()%100;
    	}
    }
    void xuat (int a[][max], int n)
    {
    	printf("\n");
    	printf("\n\t");
    	for (int i=0;i<n;i++)
    	{
    		for (int j=0;j<n;j++)
    			printf("%4d",a[i][j]);
    			printf("\n\t");
    	}
    }
    void tansuat(int a[][max], int n)
    {
    	printf("Tan so xuat hien cac phan tu trong ma tran");
    	int i,j;
    	int ts[max][max];
    	for(int i=0; i<n; i++)
           for(int j=0; j<n; j++)        
                ts[i][j] = 1; // Khoi tao tan suat = 0      
    	for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
    		{
    			for(int x=0; x<i; x++)
                    for(int y=0; y<j; y++)
                        if(a[i][j] == a[x][y]) break;
    					else
                        {
    						for(int c=i;c<n; c++)
    							for(int d=j+1;d<n; d++)
    								if(a[i][j] == a[c][d])
    									ts[i][j]++;                        
                        }
    		}
    
        for (i=0; i<n; i++)
            for(j=0; j<n; j++)
                if(ts[i][j] > 0)
                    printf(" \n\t| %3d   ....%3d| lan\n",a[i][j],ts[i][j]);
    
    }
    void chonthaotac()
    {	
    	printf("\n*-1:  Xoa man hinh");
    	printf("\n* 0:	Thoat	    ");
    	printf("\n* 1:	Nhap");
    	printf("\n* 2:	Xuat");
    	printf("\n* 3:	Tan suat	\n	");
    }
    void main()
    {
    	int a[max][max],n,thaotac;
    	do {
    		printf("\n CHON THAO TAC ");		
    		chonthaotac();
    		scanf("%d",&thaotac);
    		if (thaotac==0) exit(0);
    		else switch(thaotac)
    		{
    				case -1:
    					system("cls");
    				case 1:
    					nhap(a,n);
    					break;
    				case 2:
    					xuat(a,n);
    					break;
    				case 3:
    					
    						printf("\n Tan suat xuat hien cua phan tu trong mang");
    						tansuat(a,n);
    						break;
    		}
    		}
    	while (1);
    	_getch();
    }
    Phiền bà con sửa giúp hàm "tansuat" ...
    Lần sửa cuối bởi Trần Quốc Chấn; 29-08-2011 lúc 22:53

  2. #2
    Phạm Nguyễn Trường An Avatar của 07520004
    Tham gia ngày
    May 2011
    Khoa
    Cử nhân tài năng
    Bài gửi
    2.136
    Post Thanks / Like
    Mentioned
    0 Post(s)
    Đề bài cụ thể?
    Thông báo lỗi của trình biên dịch?
    Chí ít cũng phải bỏ code vào tag [code ] [ /code] cho dễ đọc chứ.

    Nếu là bài tập thì bạn nên tự làm, khi nào bí rồi lên đây trình bày những gì bạn đã làm được để nhận trợ giúp. Thảy cái code lên thế này thì cộc lốc quá.

  3. #3
    Nguyễn Đăng Khoa Avatar của 09520540
    Tham gia ngày
    May 2011
    Khoa
    Cử nhân tài năng
    Bài gửi
    340
    Post Thanks / Like
    Mentioned
    0 Post(s)
    Cho xin cái thuật toán hay tệ lắm là cái ý tưởng. Chứ bỏ 1 đống code đó ai đâu mà ngồi mò?

  4. #4
    Nguyễn Hoàng Huy Avatar của 09520109
    Tham gia ngày
    May 2011
    Khoa
    Khoa học máy tính
    Bài gửi
    573
    Post Thanks / Like
    Mentioned
    0 Post(s)
    Bài của bạn đọc hoa cả mắt nên mình làm mấy hàm bạn tham khảo ha, code còn sơ xài có gì sửa giúp ha!
    Mã:
    int tansuat(int a[][100],int x,int n) //tần suất một số trong mảng
    {
    	int ts=0;
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			if(a[i][j]==x) ts++;
    	return ts;
    }
    int timtrung(int a[][100],int n,int x,int y) //kiểm tra phần tử trùng trong mảng
    {
    	int b[100],k=0;
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			b[k++]=a[i][j];
    	for(int i=0;i<(x*n+y);i++)
    		if(a[x][y]==b[i])
    			return  x;
    	return 0;
    }
    void tansuatptu(int a[][100],int n) //đưa ra màn hình tần suất từng phần tử mảng
    {
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			if(timtrung(a,n,i,j)==0)
    			printf("\n%d suat hien %d lan!",a[i][j],tansuat(a,a[i][j],n));
    }
    Chúc học tôt!
    Hãy là chính mình!

  5. #5
    Trần Quốc Chấn
    Guest
    *Đề bài:
    Đếm số lần xuất hiện các phần tử trong mảng 2 chiều
    *chạy được nhưng kết quả sai
    *xó ri
    *Tự làm rồi đấy chứ nhưng code không ổn (Code ở trên đó) nên hỏi mấy anh nè.

  6. #6
    Trần Quốc Chấn
    Guest
    Mã:
    void tansuat(int a[][max], int n)
    {
    	printf("Tan so xuat hien cac phan tu trong ma tran");
    	int i,j;
    	int ts[max][max];
    	for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)        
                ts[i][j] = 1;                                                            // Khoi tao tan suat = 0      
    	for(int i=0; i<n; i++)
                  for(int j=0; j<n; j++)        //xét từng phần tử trong mảng                                   
    		{
    			for(int x=0; x<i; x++)
                    for(int y=0; y<j; y++)          //so sánh phần tử đang xét với các phần tử từ 
                                                           //đầu mảng -->phần tử đứng liền trước
                       if a[i][j] == a[x][y]) break;//đếm rồi thì không đếm nữa
    			else
                        {
    			    for(int c=i;c<n; c++)            // so sánh phần tử đang xét với
    			       for(int d=j+1;d<n; d++)     // các phần tử bắt đầu từ phần tử
    					if(a[i][j] == a[c][d])// liến sau đến hết mảng
    					    ts[i][j]++;                        
                        }
    		}
    
        for (i=0; i<n; i++)
            for(j=0; j<n; j++)
                if(ts[i][j] > 0)
                    printf(" \n\t| %3d   ....%3d| lan\n",a[i][j],ts[i][j]);
    
    }

  7. #7
    Nguyễn Hoàng Huy Avatar của 09520109
    Tham gia ngày
    May 2011
    Khoa
    Khoa học máy tính
    Bài gửi
    573
    Post Thanks / Like
    Mentioned
    0 Post(s)
    đầu bạn khởi tạo tần suất ts[i][j] đều là 1, điều kiện in ra của bạn là ts[i][j]>0 nên nó không lọc được phần tử trùng lặp khi in ra vì thế mình làm hàm timtrung(a,n,x,y), bạn nên xem lại giải thuật.
    góp ý chút :forum mình không biết bạn hơn tuổi được bao nhiêu anh chị ở đây, nhưng cách nói chuyện trống không của bạn hy vọng sẽ không lặp lại
    Hãy là chính mình!

  8. #8
    Anken
    Guest
    em chưa rành về code C lắm nên chỉ có thể nói sơ qua về thuật toán tí! ^^

    tạo 1 tập hợp TH rỗng.
    chạy vòng lặp for thứ I từ vị trí [1,1] đến [n,n]
    trong vòng lặp, nếu phần tử thứ [i,j] có trong TH thì ta bỏ qua, nếu chưa có ta thực hiện: thêm phần tử đó vào tập hợp, gán biến ts = 1, chạy 1 vòng lặp for thứ II từ vị trí phần tử [i,j] đến hết mảng, nếu có phần tử nào có giá trị = phần tử thứ [i,j] thì ts++, sau khi kết thúc vòng lặp II thì printf ngay tần số của phần tử đó. sau đó lại tiếp tục vòng lặp I......

    Hy vọng nó giúp được cho anh!

  9. #9
    Phạm Nguyễn Trường An Avatar của 07520004
    Tham gia ngày
    May 2011
    Khoa
    Cử nhân tài năng
    Bài gửi
    2.136
    Post Thanks / Like
    Mentioned
    0 Post(s)
    Quote Nguyên văn bởi Trần Quốc Chấn Xem bài viết
    *Tự làm rồi đấy chứ nhưng code không ổn (Code ở trên đó) nên hỏi mấy anh nè.
    Bạn nêu luôn {thuật toán|hướng giải quyết|cách làm|cách giải} bạn chọn áp dụng cho cái code đó để mọi người tiện tìm lỗi sai cho bạn. Bài tập này trăm nghìn cách giải, chưa chắc cách mọi người trên đây chọn là giống của bạn và nhìn một cái code sai thì khó mà đoán được bạn làm cách nào lắm.

  10. #10
    Trần Quốc Chấn
    Guest
    Quote Nguyên văn bởi Anken Xem bài viết
    tạo 1 tập hợp TH rỗng.
    chạy vòng lặp for thứ I từ vị trí [1,1] đến [n,n]
    trong vòng lặp, nếu phần tử thứ [i,j] có trong TH thì ta bỏ qua, nếu chưa có ta thực hiện: thêm phần tử đó vào tập hợp, gán biến ts = 1, chạy 1 vòng lặp for thứ II từ vị trí phần tử [i,j] đến hết mảng, nếu có phần tử nào có giá trị = phần tử thứ [i,j] thì ts++, sau khi kết thúc vòng lặp II thì printf ngay tần số của phần tử đó. sau đó lại tiếp tục vòng lặp I......
    Anh hiểu ý em rồi, hay đấy nhỉ cảm ơn tân sinh viên ha...

+ Trả lời bài viết

Đánh dấu

Quyền viết bài

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể gửi trả lời
  • 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