Announcement

Collapse
No announcement yet.

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

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

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

    Code:
    #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" ...
    Last edited by Guest; 29-08-2011, 23:53.

  • #2
    Đề 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á.

    Comment


    • #3
      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ò?

      Comment


      • #4
        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!
        Code:
        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!

        Comment


        • #5
          *Đề 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è.

          Comment


          • #6
            Code:
            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]);
            
            }

            Comment


            • #7
              đầ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!

              Comment


              • #8
                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!

                Comment


                • #9
                  Originally posted by Trần Quốc Chấn View Post
                  *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.

                  Comment


                  • #10
                    Originally posted by Anken View Post
                    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...

                    Comment


                    • #11
                      đầ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.
                      Woa !hóa ra hắn ở ni, thank bác !
                      CÒn cách nói chiện do sử dụng nhiều "câu đặt biệt" quên đi "câu cảm thán" khiến bác khó chịu...Really! sorRy you.

                      NÀO! CÙNG XÂY DỰNG FORUM TỐT ĐỆP HƠN

                      Comment


                      • #12
                        Mình nghĩ bạn nên dùng cấp phát động để làm quen với con trỏ vì sau này khi đụng đến mảng thì bao giờ cũng dùng con trỏ và cấp phát động còn dùng mảng như vậy thì dễ hiểu nhưng thuật toán sẽ không tối ưu được. Chúc học tốt!

                        Comment


                        • #13
                          Originally posted by 09520109 View Post
                          Code:
                          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));
                          }
                          COde của anh đưa vô vừa khít a Huy ơi, cam ơn nhiều nhá!

                          Comment


                          • #14
                            Mình nghĩ bạn nên dùng cấp phát động để làm quen với con trỏ vì sau này khi đụng đến mảng thì bao giờ cũng dùng con trỏ và cấp phát động còn dùng mảng như vậy thì dễ hiểu nhưng thuật toán sẽ không tối ưu được. Chúc học tốt!
                            Cứ từ từ...

                            Comment


                            • #15
                              không fai bao giờ cứ đụng tới mảng là dùng pointer đâu bạn.Còn tùy lúc đó người ta koi trọng bộ nhớ hay hiệu suất .

                              Comment

                              LHQC

                              Collapse
                              Working...
                              X