Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Bài tập C++, thuật toán tỉa mảng. giúp em với các anh chị ơi

  1. #1
    Ngày gia nhập
    08 2008
    Bài viết
    4

    Mặc định Bài tập C++, thuật toán tỉa mảng. giúp em với các anh chị ơi

    Đây là đề thi hôm nọ của trường em. Giúp em với nha
    Cho mảng A gồm n số nguyên ( n< 100 ). Một phép tỉa mảng với tham số m ( m< 5 ) là như sau: đếm tất cả các phần tử giống nhau trong mảng, nếu số phần tử giống nhau trong mảng <= m số thì giữ nguyên vị trí, nếu số phần tử giống nhau lớn hơn m thì cần loại bỏ các các số giống nhau ở cuối dãy để số phần tử giống nhau là m số.
    Dữ liệu nhập từ bàn phím
    - Hai số n,m
    - Nhập vào n số
    Kết quả được in ra như sau:
    - Dòng đầu chứa k là số phần tử của mảng sau khi tỉa
    - Dòng sau chứa k số của mảng cách nhau bởi dấu cách
    Ví dụ
    n=15
    n=2
    Cac phan tu cua mang
    4 6 7 1 4 8 6 4 9 6 4 10 1 12 19
    Kết quả:
    12
    4 6 7 1 4 8 6 9 10 1 12 19
    Em xin cảm ơn trước nhá.

  2. #2
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Có cần phải viết theo hướng đối tượng (OPP) không bạn? Hay viết cho chạy là được?
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  3. #3
    Ngày gia nhập
    08 2008
    Bài viết
    4

    Trích dẫn Nguyên bản được gửi bởi Loveanygirls Xem bài viết
    Có cần phải viết theo hướng đối tượng (OPP) không bạn? Hay viết cho chạy là được?
    Nếu cả 2 được thì tốt ( viết cho chạy được là chủ yếu anh à, nếu cả 2 đc thì tốt ( đừng nói em tham nhá) )

  4. #4
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Đợi nhé! Nếu viết được, mai Love sẽ post code, edit bài này lại. Mình hỏi vậy thôi chứ, nếu yêu cầu viết bằng OPP thì mình kiếu!
    nếu mảng là:
    n=14;
    3 2 3 2 3 2 3 2 3 2 3 2 3 2
    n=4
    thì "tỉa" số 2 hay số 3 hay "tỉa" hết đây?
    Đã được chỉnh sửa lần cuối bởi Loveanygirls : 09-05-2009 lúc 09:49 PM.
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  5. #5
    Ngày gia nhập
    03 2009
    Nơi ở
    Hà Nội
    Bài viết
    74

    bạn xem code của mình xem có được không.mình lười nên không viết hàm nhập cac giá trị mà lấy luôn các giá trị như bạn nêu ra.
    Code:
    #include <stdio.h>
    #include <conio.h>
    //bai tap tia mang.
    int array[]={4,6,7,1,4,8,6,4,9,6,4,10,1,12,19};
    int n=15,m=2;
    int array_tmp[12]={0,0,0,0,0,0,0,0,0,0,0,0};//mang xac dinh xem 1 phan tu da duoc dem chua. ban dau bag 0 neu da dc dem thi bang 1
    
    
    void xoa_array(int *array,int *n,int k){//ham xoa dj 1 phan tu thu k,va sau do so luong phan tu dc cap nhap laj la bot dj 1
        int i;
        for(i=k;i<*n;i++) array[i]=array[i+1];
        --*n;
    } 
    void tia_mang(int *array,int *n, int m){//ham tia mang sau do thi cap nhat luon so phan tu con lai
         int i,j,dem;
         for(i=0;i<*n;i++) if(array_tmp[i]==0){
                          dem=0;
                          for(j=i;j<*n;j++) if (array[j]==array[i]){
                                           dem ++;
                                           array_tmp[i]=1;
                                           if (dem>m) xoa_array(array,n,j);
                                           } 
                          }
                        
                         
         }
    
    int main(){
        int i;
        tia_mang(array,&n,m);
        printf("%d\n",n);
        for(i=0;i<n;i++) printf("%d ",array[i]);
        getch();
    }

    http://ebook.here.vn
    trang web cung cấp đề thi,tài liệu ôn thi đại học.

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Mặc định Bài tập C++, thuật toán tỉa mảng. giúp em với các anh chị ơi

    Đang làm! Nhưng còn lỗi, mai tớ sẽ post bài. minhgiang_hedspi nhanh chân thật!
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  7. #7
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Hì hục mãi, cũng code xong. Code mình ngu ở chỗ là phải dùng các biến toàn cục, nhiều hàm gần giống nhau. Mình đã cố gắng nhưng không thể không dùng biến toàn cục và mình không thể viết thành các hàm đa hình.
    Ai có thể edit code mình thì cứ tự nhiên, mình cám ơn.

    PHP Code:
    #include<stdio.h>  
    #include<conio.h>
    #include<math.h>
    #include<malloc.h>
    int n;//SO PHAN TU CUA MANG CHINH
    int sopt_mp=0;//SO PHAN TU CUA MANG PHU
    int m;//PHAN TU m CUA DE BAI
    int mang[30],mangphu[15];

    void Nhap();
    void Xuat();
    void  GanGiatrichomangphu();//GAN GIA TRI CHO MANG PHU
    int search_to_del();
    int Dem_soluong(int);//DEM SO LUONG PHAN TU CO GIA TRI LA a.
    int Tim_x_mangphu(int);//TIM PHAN TU CO GIA TRI x TRONG MANG PHU
    void Xoa1_pt_mangphu();//XOA PHAN TU DAU TIEN TRONG MANG PHU
    void Tiamang();

    void Xuatmangphu();
    void Delete();
    int main()
    {
        
        
    Nhap();
        
    printf("Mang ban dau la: \n");
        
    Xuat();
        
    GanGiatrichomangphu();
        
    Tiamang();
        
    printf("Ket qua: \n\n%d\n\n",n);
        
    Xuat();
        
    getch();
        return 
    0;
    }
    int search_to_del()//TIM KIEM PHAN TU, TRA VE VI TRI CUA NO TRONG MANG
    {
        for(
    int i=0;i<sopt_mp;i++)
            for(
    int j=n-1;j>=0;j--)
            {
                if(
    mangphu[i]==mang[j])
                    return 
    j;
            }
            
            return -
    1;
    }

    void Delete()//XOA PHAN TU TAI VI TRI pos TRONG MANG CHINH
    {
        
    int pos=0;
        
    pos=search_to_del();
        if(
    search_to_del()!=-1)
        {
            for(
    int i=pos;i<n;i++)
                
    mang[i]=mang[i+1];
            
    n--;
        }
    }
    void Xoa1_pt_mangphu()
    {
        for(
    int i=0;i<sopt_mp-1;i++)
                
    mangphu[i]=mangphu[i+1];
            
    sopt_mp--;
    }
    void Tiamang()
    {
        
    int bientam=sopt_mp;//BIEN NAY DE LUU SO LUONG PHAN TU TRONG MANG PHU BAN DAU
        
    for(int i=0;i<bientam;i++)
        {
            
    int counttemp=Dem_soluong(mangphu[i]);//BIEN NAY DE KIEM SOAT SO LUONG PHAN TU CO GIA TRI BANG NHAU TRONG MANG CHINH        .
            
    while(counttemp-->m)//DEM SO LUONG PHAN TU CO GIA TRI LA mangphu[i] TRONG MANG CHINH
            
    {
                
    Delete();
            }
           
    Xoa1_pt_mangphu();
        }    
        
    }
    void Nhap()
    {
        
    printf("Nhap so phan tu: ");
        
    scanf("%d",&n);
        for(
    int i=0;i<n;i++)
        {
            
    printf("Nhap vao phan tu thu %d: ",i+1);
            
    scanf("%d",&mang[i]);        
        }    
        
    }
    void Xuat()
    {
        for(
    int i=0;i<n;i++)
            
    printf("%d ",mang[i]);    
    }
    int Dem_soluong(int a)
    {
            
    int dem=0;//BIEN NAY DE DEM SO LUONG PHAN TU CO GIA TRI a.
            
    for(int i=0;i<n;i++)
            {
                if(
    mang[i]==a)
                    
    dem++;    
            }
        return 
    dem;
    }
    int Tim_x_mangphu(int x)
    {
        for(
    int i=0;i<sopt_mp;i++)
        {
            if(
    mangphu[i]==x)
                return 
    1;
        }
        return 
    0;
    }
    void  GanGiatrichomangphu()
    {
        
    printf("\nNhap vao gia tri m=");
        
    scanf("%d",&m);
        for(
    int i=n-1;i>=0;i--)
        {
            if((
    Dem_soluong(mang[i])>m)&&(Tim_x_mangphu(mang[i])==0))
            {
                
    mangphu[sopt_mp]=mang[i];
                
    sopt_mp++;
            }
        }
        

    Đã được chỉnh sửa lần cuối bởi Loveanygirls : 11-05-2009 lúc 11:35 AM.
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

  8. #8
    Ngày gia nhập
    03 2009
    Nơi ở
    Hà Nội
    Bài viết
    74

    code cùa Loveanygirls mình chưa chạy thử nhưng mình thấy nó có vẻ quá phức tạp. bạn có thể giải thích rõ thuật toán không.nhiều hàm bạn viết toàn dùng biến toàn cục thôi,sao bạn không dùng kiểu truyền tham số cho chuơng trình dễ hiểu hơn nhỉ???

    http://ebook.here.vn
    trang web cung cấp đề thi,tài liệu ôn thi đại học.

  9. #9
    Ngày gia nhập
    12 2008
    Bài viết
    235

    C++ Code:
    1. #include"iostream.h"
    2. #include"conio.h"
    3.  
    4. class Mang
    5.         {
    6.             private:
    7.                     int n;
    8.                     int m;
    9.                     int *mangVao;
    10.                     int *mangRa;
    11.                     int soPhanTuMangRa;
    12.  
    13.             public:
    14.                     void nhap();
    15.                     void tiaMang();
    16.                     void ketQua();
    17.         };
    18.  
    19. void Mang::nhap()
    20. {
    21.      cout<<"n=";
    22.      do
    23.      {
    24.         cin>>n;
    25.         if((n>=100)||(n<0))
    26.             cout<<"Nhap sai.Nhap lai n=";
    27.      }
    28.      while((n>=100)||(n<0));
    29.      mangVao=new int[n];
    30.  
    31.      cout<<"m=";
    32.      do
    33.      {
    34.         cin>>m;
    35.         if((m>=5)||(m<0))
    36.             cout<<"Nhap sai.Nhap lai.m=";
    37.      }
    38.      while((m>=5)||(m<0));
    39.  
    40.      cout<<"Nhap "<<n<<" phan tu cho mang"<<endl;
    41.      for(int dem=0;dem<n;dem++)
    42.      {
    43.         cout<<"  So thu "<<dem+1<<":";
    44.         cin>>mangVao[dem];
    45.      }
    46. }
    47.  
    48. void Mang::tiaMang()
    49. {
    50.     soPhanTuMangRa=0;
    51.     mangRa=new int[n];
    52.     for(int dem1=0;dem1<n;dem1++)
    53.     {
    54.         int daCo=1;
    55.         for(int dem2=0;dem2<dem1;dem2++)
    56.             if(mangVao[dem2]==mangVao[dem1]) daCo++;
    57.         if(daCo<=m)
    58.         {
    59.             mangRa[soPhanTuMangRa++]=mangVao[dem1];
    60.         }
    61.      }
    62. }
    63. void Mang::ketQua()
    64. {
    65.     cout<<soPhanTuMangRa<<endl;
    66.     for(int dem=0;dem<soPhanTuMangRa;dem++)
    67.         cout<<mangRa[dem]<<" ";
    68. }
    69.  
    70. void main()
    71. {
    72.     Mang test;
    73.     test.nhap();
    74.     test.tiaMang();
    75.     test.ketQua();
    76.     getch();
    77. }

  10. #10
    Ngày gia nhập
    11 2008
    Bài viết
    203

    Nếu mình biết dùng biến cục bộ thì mình đã không cần phải dùng biến toàn cục.
    Ý tưởng của mình là thế này:
    1) với mỗi phần tử trong mảng chính, đếm số lượng của nó. Nếu số lượng lớn hơn m thì lưu giá trị của nó vào mảng phụ.
    VD mảng chính: 1 1 1 1 2 2 2 2 3 3
    m=2 thì mảng phụ là: 2 1 (vì số lượng số 1 bằng 4, số lượng số 2 bằng 4 >2).
    2) a) Lấy giá trị phần tử đầu tiên trong mảng phụ ra, tìm vị trí của nó trên mảng chính (chạy từ cuối mảng đến đầu mảng). Nếu tìm gặp thì xoá phần tử đó, giảm n 1 đơn vị , xoá đến khi nào thoả điều kiện số lượng phần tử đó trong mảng chính=m thì thôi. Quay lại xoá bỏ phần tử đầu tiên của mảng phụ.
    b) Lặp lại a cho đến khi mảng phụ rỗng.

    @ducthiem90: Bạn sinh năm 90 à? Thế mà code bài này dễ dàng vậy, giỏi thật!
    Đã được chỉnh sửa lần cuối bởi Loveanygirls : 11-05-2009 lúc 11:46 AM.
    Tôi tin rằng: giải thuật thì có thể tìm trong hàng trăm GB ebook, hoặc Google nhưng code chạy thì chưa chắc! Hãy post code để chứng tỏ giải thuật của bạn là đúng!
    Giải thuật là bản thiết kế của ngôi nhà, code là phần xây dựng. Nếu chỉ xây nhà trên giấy thì ta sống chả khác nào người nguyên thủy.

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

  1. Giải thuật shaker sort. Giúp mình giải thuật với?
    Gửi bởi nguyenhai trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 29-01-2015, 10:53 PM
  2. Bài tập C Cần giải giúp 3 câu trong đề thi kĩ thuật lập trình C và Cấu trúc dữ liệu và giải thuật
    Gửi bởi nguyenthi0602 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 24-09-2012, 08:42 PM
  3. thuật toán cộng hai số lớn. các bạn giúp mình
    Gửi bởi ngonchanloi89 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 02-04-2011, 10:35 AM
  4. lưu đồ giải thuật bài mã đi tuần thuật toán quay lui vét cạn. Giúp mình với?
    Gửi bởi katemat000 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 05-01-2010, 10:53 PM
  5. thuật toán in ra tất cả các tổng có thể. Giúp mình với?
    Gửi bởi xiu_coi trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 10-10-2009, 08:59 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