bài tập hay về mảng^_^ pó tay!

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi runandaide, 18/11/06.

  1. tomorrowneverdies

    tomorrowneverdies Bạch Diện Thư Sinh

    Tham gia ngày:
    6/6/02
    Bài viết:
    4,306
    Nơi ở:
    The World Of Games
    Dĩ nhiên là code khó hơn Bubble sort rồi, dễ hơn chắc ai cũng áp dụng, thường trong pascal có phần Examples sẽ có code của Quicksort viết sẵn, paste ra sử dụng thôi ^^, những thuật toán cao yêu cầu tốc độ chạy nhanh thì những thuật toán nhỏ này phải làm cho tốt ^^.
    exchage radixsort với straight radixsort cũng rất nhanh, nhưng khá phức tạp, khó code, cái Quick sort là dễ code lắm rồi đó, chạy lại cực nhanh.
    Nếu ai xử lý trên file ngoài thì dùng thuật toán sắp xếp vun đống, sắp xếp ngoài merge sort, rất là tốt ^^.
    Thuật toán sắp xếp rất là nhiều, tìm kiếm cũng vậy, quan trọng là biết cách sử dụng và phát huy 1 cách hiệu quả các thuật toán đó thôi, dù gì đây cũng là những thuật toán nền, hầu như các bài toán đều sử dụng tới nó.
     
  2. jumper

    jumper Baldur's Gate Lão Làng GVN

    Tham gia ngày:
    5/6/03
    Bài viết:
    27,184
    mấy bài này dễ òm à
    chưa học c chưa biết
    chứ pascal có mấy dòng T_T
     
  3. red_strike

    red_strike C O N T R A

    Tham gia ngày:
    13/10/04
    Bài viết:
    1,722
    Nơi ở:
    Onikage Clone :)
    tomorrowneverdies - tên dài quá chẳng biết gọi tắt :D học những thứ này qua .... ???
    Có thể trợ giúp RS vài điều về lập trình ko !
     
  4. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    gọi tắt là tò mò =))
    mấy thứ này đh năm thứ nhất học về lập trình hoặc học chung về máy tính là có mà :\
     
  5. tomorrowneverdies

    tomorrowneverdies Bạch Diện Thư Sinh

    Tham gia ngày:
    6/6/02
    Bài viết:
    4,306
    Nơi ở:
    The World Of Games
    Em mới vào năm nhất học được mấy tuần "anh Xeno" :'>, cái này em học ở nhà á ^^. Thấy lập trình lên dạy thuật toán cơ bản là chính, còn chủ yếu mình ở nhà học nâng cao lên thôi, như vậy thấy hiệu quả hơn nhiều, học trên trường sao đủ thời gian tìm hiểu sâu +_+.
     
  6. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    thì cũng mới đh năm thứ nhất mấy tuần chứ đâu :'>
    căn bản mới vào học mà cố thể hiện khả năng là mấy bố cho điểm thấp tẹt vì k0 làm đúng theo chỉ dẫn ngay =))
    thế nên cứ phải ... dạy gì thì biết nấy thôi =))
     
  7. tomorrowneverdies

    tomorrowneverdies Bạch Diện Thư Sinh

    Tham gia ngày:
    6/6/02
    Bài viết:
    4,306
    Nơi ở:
    The World Of Games
    Chính xác, mới vào mà lộn xộn bon chen là tổ chức cho về với chúa ngay, mà thật ra mình đâu có biết gì nhỉ :'>, giờ nói thật quên hết thuật toán rồi, muốn làm lại phải coi lại chút mới làm được >"<.
     
  8. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    [​IMG]
    hình mô tả quicksort :)) nhìn dễ hiểu hơn giải thích
    chọn điểm bất kỳ, xếp tất cả các phần tử nhỏ hơn xuống mảng dưới, lớn hơn lên trên, tiếp tục làm đến khi nào mỗi mảng con chỉ có một phần tử thì thôi
    đúng k0 nhỉ :-?
     
  9. red_strike

    red_strike C O N T R A

    Tham gia ngày:
    13/10/04
    Bài viết:
    1,722
    Nơi ở:
    Onikage Clone :)
    Tấm ảnh GIF ở trên good thật ?
    Có thể mô tả bằng lời rõ hơn ko ? +_+ em dốt quá !
     
  10. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    theo tớ hiểu thì thế này:
    thuật toán quicksort nó sắp xếp các phần tử trong 1 mảng bằng cách chọn 1 phần tử ngẫu nhiên làm phần tử gốc (trong hình nó chọn phần tử cuối cùng của mảng), rồi sắp tất cả các phần tử nhỏ hơn phần tử này vào một mảng phía dưới, các phần tử lớn hơn vào một mảng trên
    rồi có 2 mảng rồi tiếp tục làm thế với từng mảng cho đến khi mỗi mảng chỉ còn một phần tử thì thôi
    cái ảnh gif nó diễn tả cái này bằng lời, cái xọc nằm ngang chính là giá trị của phần tử đc chọn trong mảng
    đang tìm hiểu mergesort ><
    vẫn chưa hiểu được thuật toán của nó
     
  11. red_strike

    red_strike C O N T R A

    Tham gia ngày:
    13/10/04
    Bài viết:
    1,722
    Nơi ở:
    Onikage Clone :)
    Bro ơi !
    Dùng bảng mã Unicode chuẩn đi chứ Unicode của huynh viết chữ ra dấu lộn xộn lắm !
    Có thể làm tấm ảnh này chậm lại 1 chút ko +_+ !
     
  12. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    [​IMG]
    hình chậm lại rồi đấy,
    để ý nhìn kỹ thì sẽ thấy thuật toán của nó
    còn cái vụ dấu thì ... quen dùng unicode tổ hợp đâm ra nó thế =)) để chỉnh lại
     
  13. Brianlam

    Brianlam T.E.T.Я.I.S

    Tham gia ngày:
    14/7/04
    Bài viết:
    526
    Nếu mà quick sort hay nói chung cái gì sort cũng được (bao gồm cả quần sort luôn :D ) thì tui nghĩ mấy bác cứ kiếm thử cái giáo trì CTDL 1 của trường đại học nào đó , đọc vào là ok ngay mà
     
  14. runandaide

    runandaide Mr & Ms Pac-Man

    Tham gia ngày:
    12/1/05
    Bài viết:
    103
    Code:
    chậc có toàn pro cho em bon chen zô kiếm ít kiến thức nha
    có 1 bài tap
    Mã:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    void main()
    {
    	int mang[10][10];
         	int i,j,n,m;
    	int max,min,tong,dem;
            char kitu;
         	
         //tao bang 2 chieu nhap so hang so cot
         
         do{
         clrscr();
         do{
         printf("\nmoi ban nhap so hang:");
         scanf("%d",&n);
         printf("moi ban nhap so cot:");
         scanf("%d",&m);
         }while(n>10||n<3||m>10||m<3);
    
         printf("cac phan tu ngau nhien trong mang:\n");
         for(i=0;i<n;i++)
           	for(j=0;j<m;j++)
           	{
    		mang[i][j]=random(100)+1;
    		printf("a[%d][%d]=%d\t",i,j,mang[i][j]);
                    
    			
    	}
         printf("\ncac gia tri co trong matrix:\n");
         for(i=0;i<n;i++)
           {for(j=0;j<m;j++)
    	
    		printf("%4d",mang[i][j]);
                    printf("\n") ;}
    	
    
            
         //tim phan tu lon nhat
         printf("\nphan tu lon nhat trong mang:");
    	int imax;
    	int jmax;
    	max=mang[0][0];
    	for( i=0;i<n;i++)
                    for( j=0;j<m;j++)
    		{
    			if(mang[i][j]>max)
    			{
    				max=mang[i][j];
    				imax=i;
    				jmax=j;
    			}
    		}
    	printf("a[%d][%d]=%d",imax,jmax,max);
                        
          //tim phan tu nho nhat
         printf("\nphan tu nho nhat trong mang:");
         int imin;
         int jmin;
         min=mang[0][0];
         for(i=0;i<n;i++)
    	for(j=0;j<m;j++)
    	{
    	       if(mang[i][j]<min)
    	       {	min=mang[i][j];
    	       		imin=i;
    			jmin=j;
    	       }
            }
    	
         printf("a[%d][%d]=%d",imin,jmin,min);
    
         //tong cac phan tu trong ma tran
         printf("\ntong cac phan tu trong matrix:");
         tong=0 ;
         for(i=0;i<n;i++)
    	for(j=0;j<m;j++)
    	{
    		tong+=mang[i][j];//tong=tong+mang[i][j]
    
    	}
         printf("=%d",tong);
    
         //in ra cac phan tu tren duong cheo cua matrix
    
         //in ra cac phan tu tren duong cheo trai>>phai tu tren xuong cua matrix
            int tongcheo=0;
    	printf("\n cac phan tu tren duong cheo trai cua matrix:");
    	for(i=0;i<n;i++)
    	{
    		printf("\na[%d][%d]=%d\t",i,i,mang[i][i]);
    	}
    	printf("tong cua chung=");
    
    	for(i=0;i<n;i++)
    	{       tongcheo+=mang[i][i];
    		
    	}
    	printf("=%d",tongcheo);
    
         //in ra cac phan tu tren duong cheo phai>>trai tu tren xuong cua matrix
    
            int tongcheo2=0;
    	printf("\n cac phan tu tren duong cheo phai cua matrix:");
    	for(i=0,j=m-1;i<n,j>=0;i++,j--)
    	{
    		printf("\na[%d][%d]=%d\t",i,j,mang[i][j]);
    	}
    	printf("tong cua chung=");
    
    	for(i=0,j=m-1;i<n,j>=0;i++,j--)
    	{       tongcheo2+=mang[i][j];
    		
    	}
    	printf("=%d",tongcheo2);
    
         //in cac phan tu chan
         printf("\ncac phan tu chan trong matrix:");
         
         	for(i=0;i<n;i++)
    		for(j=0;j<m;j++)
    	{
    		if(mang[i][j]%2==0)
                    
    		printf("%4d",mang[i][j]);
            }
    
          //in cac phan tu le
          printf("\n") ;
         printf("\ncac phan tu le trong matrix:");
         
         	for(i=0;i<n;i++)
    		for(j=0;j<m;j++)
    	{
    		if(mang[i][j]%2!=0)
                    
    		printf("%4d",mang[i][j]);
    	}
    
         //in cac giat tri xuat hien trong ma tran trong ma tran
    	int mangtam[100],t=0;
            int kiemtra=1;
    	
    	mangtam[0]=mang[0][0];
    	printf("\n") ;
    	printf("\ncac gia tri trong matrix:");
    	for(i=0;i<n;i++)
    		for(j=0;j<m;j++)
    		{
    			mangtam[t]=mang[i][j];
                            t++;
    		}
    	for(i=0;i<n;i++)
    		for(j=0;j<m;j++)
    		{    kiemtra=1;
    		     for(t=1;t<i*n+j;t++)
    			if(mang[i][j]==mangtam[t])
    			{	kiemtra=0;
    				break;
    			}
    			if(kiemtra==1)
                            	printf("%3d",mang[i][j]);
    
                     }
          //ban co muon thoat chuong trinh ko                 
          printf("\nban co muon lap lai truong trinh ko (y/n):");
    	kitu=getche();
    	if(kitu=='n'||kitu=='N')
    	exit(0);
    
    	}while(kitu=='y'||kitu=='Y');
    
    getch();
    }
    giải thich lai cho em đoạn này được kô bà cô có giải thích rồi mà kó hiểu qá giờ quên mất tiêu làm lai với 1 bài khác thì kô mỡ công thức kô được vì quên mất thuật toán

    Mã:
     //in cac giat tri xuat hien trong ma tran trong ma tran
    	int mangtam[100],t=0;
            int kiemtra=1;
    	
    	mangtam[0]=mang[0][0];
    	printf("\n") ;
    	printf("\ncac gia tri trong matrix:");
    	for(i=0;i<n;i++)
    		for(j=0;j<m;j++)
    		{
    			mangtam[t]=mang[i][j];
                            t++;
    		}
    	for(i=0;i<n;i++)
    		for(j=0;j<m;j++)
    		{    kiemtra=1;
    		     for(t=1;t<i*n+j;t++)
    			if(mang[i][j]==mangtam[t])
    			{	kiemtra=0;
    				break;
    			}
    			if(kiemtra==1)
                            	printf("%3d",mang[i][j]);
    
                     }
    và còn bài nữaynếu muốn cho gái trị k vào vi trí đầu của mảng (man[0]) ta phải làm sao (bày thuật toán thôi nha để em tự làm) giai thích thuật toán luôn nha
     
  15. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    sort với search quan trọng vì nó cần phải truy cập dữ liệu trong ổ cứng, mất thời gian nên càng dùng thuật toán có hiệu suất cao càng được lợi, dùng thuật toán dở hơi thì kể cả máy trâu bò chỉ cần sort 1 list có khoảng 1 triệu người thôi cũng mất cả năm vì thuật toán kém thường số lệnh nó tăng theo cấp số nhân, k0 cẩn thận thì bốc muối

    cái này là thuật toán dùng để in ra các phần tử trong mảng, kiểm tra các phần tử xem có trùng nhau không, tránh trường hợp in ra 2 giá trị giống nhau.
    có mảng mangtam để chứa các phần tử trong mang 2 chiều để sau đó so sánh
    nhưng mà cách này không cần thiết, nếu muốn thì so sánh một phần tử của mảng 2 chiều trực tiếp với các phần tử khác cũng được
    đoạn code này "t=1;t<i*n+j;t++" là để tiết kiệm lệnh, chứ nếu để "t=1;t<100;t++" thì chương trình vẫn chạy được.
    nếu muốn cho giá trị k vào đầu mảng thì 1 cách làm là dùng 1 loop để tăng tất cả các vị trí của phần tử lên 1 vd: phần tử [0] sẽ thành phần tử [1], phần tử [10] sẽ thành phần tử [11], sau đó gán giá trị k cho phần tử [0] lúc này đang rỗng
    thế là xong ::)
     
  16. red_strike

    red_strike C O N T R A

    Tham gia ngày:
    13/10/04
    Bài viết:
    1,722
    Nơi ở:
    Onikage Clone :)
    Nhưng mà RS thấy cái kiểm tra xem phần tử nào có giá trị nào trùng nhau ko để in ko bị trùng là ko cần thiết và cũng chẳng cần thiết !

    vì trên thực tế trong nhiều người chí ít cũng có 1 vài info giống nhau => trùng ko in ra sao :D
     
  17. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    có thể đấy là đầu bài bắt phải làm, cần thiết hay k0 đầu bài bảo cấm cãi =))
    với cả các giá trị trong ma trận toàn là số, trùng nhau in ra cũng thừa
     
  18. runandaide

    runandaide Mr & Ms Pac-Man

    Tham gia ngày:
    12/1/05
    Bài viết:
    103
    chậc! đề bài bão in ra các giá trị trong mang thì nếu trùng nhau thì in 1 làn thôi chứ nhỡ có 10 giá trị trùng nhau thì in raq cả 10 à vậy thì sẽ dài dòng qá
    ^_^
    còn chèn phần tử k nói thì hiểu nhưng mà chưa thử được ko bít phải thế này kô
    {
    a=a[i+1];
    k=a[0];
    }
    như thế này hả hay thêm vào biến đếm chưa thử à chỉ viết theo cảm nghĩ
     
  19. Xenogear

    Xenogear The Last of Us

    Tham gia ngày:
    16/6/03
    Bài viết:
    22,838
    Nơi ở:
    Sealeap Zack
    tất nhiên là phải có 1 vòng lặp ở bên ngoài
    và cái đoạn "k=a[0]" sai rồi
    cái đấy phải để ra ngoài vòng lặp, thực ra để trong cũng được nhưng mỗi lần nó chạy là lại gán giá trị của k một lần <<-- phí phạm
    với cả phải là a[0]=k chứ k0 phải k=a[0]
     
  20. runandaide

    runandaide Mr & Ms Pac-Man

    Tham gia ngày:
    12/1/05
    Bài viết:
    103
    ^_^ tk bác để em về thữ
    còn muốn trong ma phương vuông a[3][3] muốn sắp xếp số từ 1 dến 9 sao cho tong hàng ngang =15 hàng dọc=15 chéo =15 thì dieu kien của nó viết như thế nào cái bày cho em thêm ví dụ minh họa nha
     

Chia sẻ trang này