Giúp em với,C+ bài tập về mảng 2 chiều

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

  1. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    do biết đến lập trình chưa được bao lâu, nên có anh nào giải thích giùm em hai dòng này được không, em không hiểu ::(

     
  2. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    dòng 1 thì hiểu rồi, còn dòng 2 tại sao phải del a trước getch :(
     
  3. maivietdung

    maivietdung Youtube Master Race

    Tham gia ngày:
    4/12/06
    Bài viết:
    9
    int *a=new int[n] tức là xin cấp phát một mảng động kiểu số nguyên có n phần tử. Còn đelete(a) trước là để xóa mảng a đi trả ô nhớ về cho bộ nhớ.

    câu 3 trong phần thuật toán mình đưa ra ở trang 4 thì j=j-1 chứ ko phải '+', mình gõ lộn, mấy bạn thông cảm
     
  4. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342

    mình nghĩ bạn nên viết code rõ ràng để hiện thực cho bài toán. Với lại bài toán nào cũng có cái hay của nó, bạn nên suy nghĩ cách giải tốt nhất mà mình có thể làm để tối ưu. Đó cũng là cách để rèn luyện khả năng lập trình của bản thân. Về bài 3 mình hiểu cách của bạn, nhưng mình nghĩ có 1 cách tốt hơn, nếu bạn làm thì post code lên để mọi người cùng xem.
    Đây là code cho bài 2
    PHP:
    void max_min(int a[],int n)
    {
        
    int min=a[0],max=a[0];
        for (
    int i=1;i<n;i++)
        {
            if (
    a[i]>maxmax=a[i];
            if (
    a[i]<minmin=a[i];
        }
        
    printf("\n - Phan tu lon nhat trong mang la: %d",max);
        
    printf("\n - Phan tu nho nhat trong mang la: %d",min);
    }
     
  5. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    code là sao vậy, sao up cái code lên được ::)
     
  6. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    có vấn đề rồi hình như nó nằm ở đây nè



    nếu vậy thì trong mảng không có số nào nhỏ hơn 0 thì sao :-/

    Nó sẽ cho ra min=0, theo em thì đổi min=a[1] đúng hơn ::)
     
  7. maivietdung

    maivietdung Youtube Master Race

    Tham gia ngày:
    4/12/06
    Bài viết:
    9
    Code của bài 3 đây

    PHP:
    void Out(int *a,int n)
    {    for (
    int i=0;i<n;i++)
            
    printf("%3d",a[i]);
    }

    void Swap(int &a,int &b)
    {    
    int tam=a;
        
    a=b;
        
    b=tam;
    }

    void ChangePos(int *a,int n)
    {    
    int i=0,j=n-1;
        do{
        
    Swap(a[i],a[j]);
        
    i+=1;
        
    j-=1;}
        while (
    i<j);
        
    Out(a,n);
    }
    @huunhon: Cách của bạn ra sao, đưa lên cho mình xem với. Mình thấy cách này là đơn giản và dễ viết nhất thôi
    @chan__doi: trong cái khung ở trên chính là code đấy
     
  8. maivietdung

    maivietdung Youtube Master Race

    Tham gia ngày:
    4/12/06
    Bài viết:
    9


    Đâu có vấn đề gì ở đây đâu. Đây là ta giả sử a[0](phần tử đầu tiên của mảng) là min của mảng, rồi duyệt từ đầu tới cuối mảng, thằng nào nhỏ hơn min thì gán lại cho nó bằng min thôi:D. Mình đâu có gán min =0 đâu.
     
  9. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    không được, mới vô nó gán a[0]=0 kìa (>.<)
     
  10. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Bạn làm bài trên C++ rồi post lên đây bằng cách chèn vào thẻ php.
    Mà bạn là người yêu cầu bài tập sao không thấy bạn viết vậy? Viết đúng viết sai cũng không quan trọng mà, tập viết cho quen :).
    Đây là code bài 3 của mình, tối ưu hơn vì chỉ duyệt 1/2 mảng thôi.
    PHP:
    void reverse(int a[],int n)
    {
        
    int temp;
        for (
    int i=0;i<n/2;i++)
        {
            
    temp=a[i];
            
    a[i]=a[n-1-i];
            
    a[n-1-i]=temp;
        }
    }
    Tối nay mình sẽ suy nghĩ vài bài khác để các bạn làm tiếp :)
     
  11. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    Mã:
    #include <conio.h>
    #include <stdio.h>
    #include <math.h>
    
        void in(int a[100],int n)
          {
    	int i;
    	for (i=1;i<=n;i++) {printf("\na[%d]=",i);scanf("%d",&a[i]);}
          }
    
        void out(int a[100],int n)
          {
    	int i;
    	for (i=1;i<=n;i++) printf("\na[%d]=%d",i,a[i]);
          }
    
        void maxmin(int a[100],int n)
          {
    	int max,min,i;
    	min=a[1];max=a[0];
    	for (i=1;i<=n;i++)
    	  if (a[i]>max) max=a[i];
    	    else if (a[i]<min) min=a[i];
    	printf("\n%d la max %d la min",max,min);
          }
    
        void doicho(int a[100],int n)
          {
    	int tam,i,j;
    	for (i=1;i<=n/2;i++)
    	  { tam=a[i];a[i]=a[n-i+1];a[n-i+1]=tam;}
          }
    
    main()
    {
         int a[100],n;
         clrscr();scanf("%d",&n);
         in(a,n);
         out(a,n);
         maxmin(a,n);
         doicho(a,n);out(a,n);
         getch();
         return 0;
    }
    bài mình đó, cái vụ a[0]=0 là đúng hay sai vậy
     
  12. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    mình đọc code của bạn rồi, mình sẽ giải thích phần mảng mà bạn thắc mắc.
    Vì trong C++ mảng được bắt đầu = 0 chứ không phải = 1. nếu khai báo 1 mảng là a[5] thì mảng sẽ gồm các phần tử a[0],a[1],a[2],a[3],a[4]. Và trong code của mình thì làm theo nguyên tắc này. Bạn nên tập làm quen với cách đếm này vì hầu như các ngôn ngữ lập trình đều đếm theo kiểu này cả.
    Bạn nên xem cách tạo mảng như bạn maivietdung, việc tạo 1 mảng 100 phần tử như bạn ko được tốt lắm :).
     
  13. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    không ý mình không phải vậy, mình chỉ hỏi a[0]=0 hay a[0]=random. Khi tạo một mảng thì máy tính sẽ cho vị trí đó bằng 0 hay bằng random số :-/

    vì bài của các bạn gán min=a[0] , mình chạy nó kô ra (>.<).

    test thử mới biết vi trí a[0] được máy tính gán bằng 0, vậy những vị trí khác có vậy không :( a[[1], a[2], a[3]....a[n]

    hay là chỉ có a[0] thôi


    ừh, thì mình có hỏi ở bài trên rồi đó, cái này sẽ khắc phục ::)
     
  14. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Không phải là vị trí a[0] máy tính gán =0 đâu bạn :).
    Vì cách nhập của bạn là nhập từ phần tử a[1] trở đi, chứ không phải từ a[0] cho nên bạn chạy các hàm của mình không ra kết quả đúng được. Bạn kiểm tra lại từ hàm nhập mảng của bạn xem.
    Giải thuật max min của mình như thế này. giả sử mình có mảng 5 phần tử
    a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5
    Đầu tiên mình sẽ cho max và min cùng bằng a[0] nghĩa là max=min=1
    sau đó xét từ a[1]->a[4] nếu phần tử nào nhỏ hơn min thì gán min= phần tử đó, phần tử nào lớn hơn max thì gán max=phần tử đó.
     
  15. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    à mình hiểu rồi, cám ơn nhiều nha ::)

    tại mình mới biết lập trình C cách đây có nữa tháng hà, bạn có bài tâp thêm thì mình cám ơn trước nha ::)

    à cho mình hỏi cái này tại sao phải delete(a) sau phần getch() kô del có sao kô
     
  16. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    khi bạn tạo 1 con trỏ thì máy tính sẽ cấp phát vùng nhớ cho con trỏ , nên khi sử dụng xong thường người ta sẽ thực hiện lệnh xoá để giải phóng vùng nhớ đó. Còn việc nên delete hay không thì nên, vì bây giờ bạn viết chương trình nhỏ, bộ nhớ máy tính lại nhiều nên bạn không cảm thấy có chuyện gì xảy ra. Nhưng sau này khi viết chương trình lớn thì việc đó là bắt buộc, nên tốt nhất là tập thói quen từ bây giờ :)).
    Bài tập về mảng tiếp tục đây:
    Nhập vào một mảng n số nguyên
    1) Kiểm tra xem mảng có sắp thứ tự không, nếu có thì cho biết thứ tự tăng hay giảm.
    2) Tìm vị trí của phần tử dương nhỏ nhất trong mảng.
    3) Tình trung bình cộng các số dương lẻ trong mảng.

    Vd: mảng a: -5 -3 0 1 2 3 9
    Kết quả:
    Mảng tăng dần.
    Vị trí phần tử dương nhỏ nhất là 1
    Trung bình cộng các số dương lẻ trong mảng là 4.3
     
  17. chan__doi

    chan__doi Mr & Ms Pac-Man

    Tham gia ngày:
    30/10/06
    Bài viết:
    159
    Nơi ở:
    Vương quốc ăn ngủ
    Mã:
    void check1(int *a,int n)
          {
    	int i,d,j;
    	d=1;
    	for (i=1;i<=n-1;i++)
    	   for (j=i+1;j<=n;j++)
    	      if (a[i]<a[j]) { d=0;break; }
    	if (d==1) printf("\nDay giam dan.");
    	 else if (d==0)
    	  {
    	     d=1;
    	     for (i=1;i<=n-1;i++)
    	       for (j=i+1;j<=n;j++)
    		 if (a[i]>a[j]) { d=0;break; }
    	     if (d==0) printf("\nDay binh thuong.");
    	       else printf("\nDay tang dan.");
    	  }
    bài 1, coi giùm mình coi có gì góp ý không ::)


    Mã:
    int max(int *a,int n)
          {
    	int i,m;m=a[1];
    	for (i=2;i<=n;i++)
    	  if (a[i]>m) m=a[i];
    	return m;
          }
    
        void check2(int *a,int n)
          {
    	int i,m,j;m=max(a,n);
    	for (i=1;i<=n;i++)
    	  {
    	    if (a[i]<m&&a[i]>0) m=a[i];
    	  }
    	printf("\n%d la phan tu duong nho nhat.",m);
          }
    bai 2 nè ::)

    muốn làm có màu cho dễ nhìn làm sao vậy chỉ mình với :-/
     
  18. huunhon

    huunhon Donkey Kong

    Tham gia ngày:
    15/8/05
    Bài viết:
    342
    Vài ý kiến nhé :)
    1. Bạn nên cho mảng bắt đầu từ phần tử 0, làm từ từ sẽ quen. Mình ví dụ 1 trường hợp sai khi bắt đầu từ 1. Giả sử kích thước tối đa của mảng mà bạn cho là 5, người dùng lại nhập vào mảng 5 phần tử, máy tính sẽ cho 5 phần tử từ 0->4 như vậy a[5] đâu có tồn tại. Nếu bạn bắt đầu từ 1 sẽ là 1->5 => lỗi phát sinh.

    2. về bài 1 thì giải thuật của bạn sẽ chạy đúng nhưng có chỗ ko hay. Ví dụ mảng là 1 2 3 4, đầu tiên bạn cho 2 so sánh với 1, rồi 3 so sánh với 1, 4 so sánh với 1. Việc làm này đâu cần thiết? chỉ cần 2 với 1, 3 với 2, 4 với 3 cũng đủ để xác định được kết quả rồi mà.

    3. về bài 2 thì bạn chạy thử trường hợp này rồi tự khắc phục lổi nhé :). Bạn cho mảng gồm 5 phần tử -7 -6 -5 -4 -3, bạn xem kết quả rồi khắc phục là được. Với lại có nhất thiết m phải là max của mảng ko? Đó là 2 lỗi của bài toán của bạn :).

    4. Bạn nghĩ cách để duyệt mảng 1 lần thôi và ra kết quả cho bài 1 và bài 2.

    @: bạn đưa vào thẻ PHP sẽ có màu mà
     
  19. maivietdung

    maivietdung Youtube Master Race

    Tham gia ngày:
    4/12/06
    Bài viết:
    9
    Đây là code của câu 2 và 3:

    PHP:
    void Search(int *a,int n)
    {  
    int min,pos;
        for (
    int i=0;i<n;i++)
            if (
    a[i]>0min=a[i];
        for (
    int j=0;j<n;j++)
            if ((
    a[j]>0)&&(a[j]<min))
            {    
    min=a[j];
                
    pos=j;
            }
        
    printf("\n - Vi tri cua phan tu duong ho nhat trong mang la: %3d",pos);
    }

    void Ave(int *a,int n)
    {  
    int sum=0,time=0;
        for (
    int i=0;i<n;i++)
            if (
    a[i]>0)
            {    
    sum+=a[i];
                
    time+=1;
            }
        
    float ave=sum/time;

        
    printf("\n - Trung binh cong cac so duong trong mang bang: %3f",ave);
    }
     
  20. maivietdung

    maivietdung Youtube Master Race

    Tham gia ngày:
    4/12/06
    Bài viết:
    9
    ý quên, trung binh cong làm lộn rồi xin lỗi trước nha
     

Chia sẻ trang này