Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
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 về Hàm và mảng

  1. #1
    Ngày gia nhập
    11 2006
    Bài viết
    8

    Mặc định Bài tập C về Hàm và mảng

    Mình có mấy bài tập về hàm và mảng xin mọi người giúp đỡ,đối với những người mới học Lập trình C như mình thì đây không phải là những bài đơn giản:
    1.Viết hàm xóa phần tử ở vị trí chẵn trong mảng.
    2.Cho mảng A có n phần tử. Nhập vào số nguyên k (k>=0),dịch phải xoay vòng mảng A k lần.
    Ví dụ: Mảng A: 5 7 2 3 1 9
    Nhập k = 2
    Dịch phải xoay vòng mảng A: 1 9 5 7 2 3
    3.Viết hàm xóa tất cả những phần tử trùng nhau trong dãy chỉ giữ lại một phần tử trong đó.
    Ví dụ: 1 6 2 3 2 4 2 6 5 chuyển thành 1 6 2 3 4 5

    Các bạn hãy cùng thảo luận và giúp mình nhé! Cảm ơn mọi người nhiều!
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    No Avatar
    Nhuan_Trang_Only_Love Khách

    Trích dẫn Nguyên bản được gửi bởi basduy Xem bài viết
    1.Viết hàm xóa phần tử ở vị trí chẵn trong mảng.
    Bài này dùng hai biến chạy song song là ok
    2.Cho mảng A có n phần tử. Nhập vào số nguyên k (k>=0),dịch phải xoay vòng mảng A k lần.
    Ví dụ: Mảng A: 5 7 2 3 1 9
    Nhập k = 2
    Dịch phải xoay vòng mảng A: 1 9 5 7 2 3
    2.Cho mảng A có n phần tử. Nhập vào số nguyên k (k>=0),dịch phải xoay vòng mảng A k lần.
    Ví dụ: Mảng A: 5 7 2 3 1 9
    Nhập k = 2
    Dịch phải xoay vòng mảng A: 1 9 5 7 2 3
    Bài này chỉ dịch phải, nên bạn thiết lập một biến temp save lại giá trị A[n](cuối cùng ý)
    Sau đó cứ dịch phải liên tiếp tử trái qua(giống bài bác huynguyen mới post, về "chèn thêm vào mảng ấy") ok;
    Rồi vòng lặp sau thì chỉ việc gán A[0]=temp và tiếp tục thôi , ok
    3.Viết hàm xóa tất cả những phần tử trùng nhau trong dãy chỉ giữ lại một phần tử trong đó.
    Ví dụ: 1 6 2 3 2 4 2 6 5 chuyển thành 1 6 2 3 4 5
    Bài này gần giống bài gần đây, là in ra các phần tử chỉ xuất hiện một lần
    Bài này thì thêm chỗ là nếu giống nhau thì in ra một lần.Hãy tìm bài viết của bác huynguyen ý , ok
    bạn có thể "tham khảo" bài 3 (MỘT PHẦN TRƯỚC ĐÂY TÔI ĐÃ LÀM VÀ NÓ CÓ LIÊN QUAN ĐẾN CÁC PHẦN KHÁC NỮA, BẠN HÃY THAM KHẢO NHÉ)
    C Code:
    1.     //Dua cac phan tu khac nhau cua day ra man hinh
    2.     void cau_h(float A[],int gh)
    3.     {
    4.     cout<<"\n__________________________PHAN H__________________________";
    5.      int i,j,dem,dem_tong=0;
    6.      cout<<"\nCac phan tu khac nhau la";
    7.       for(i=0;i<gh-1;i++)
    8.          {
    9.           dem=0;
    10.             for(j=i+1;j<gh;j++)
    11.                   if(A[i]==A[j]) dem++;
    12.                      if(dem==0)
    13.                       {
    14.                          cout<<"   "<<A[i];
    15.                          dem_tong++;
    16.                       }
    17.           }
    18.         if(dem_tong==0) cout<<"\nKhong co so nao ca";
    19.         else cout<<"   "<<A[i];//vi i khong chay den cuoi cung nen ta phai in ra phan tu cuoi cung
    20.         cout<<"\n__________________________________________________________";
    21.         return;
    22.     }
    Đã được chỉnh sửa lần cuối bởi Nhuan_Trang_Only_Love : 04-02-2007 lúc 09:21 PM.

  3. #3
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Viết hàm xóa phần tử ở vị trí chẵn trong mảng.
    Cái này nếu ko cẩn thận có thể làm cho mảng chỉ còn 1 phần tử, vì khi del phàn tử thứ 2 thì phần tử thứ 3 bị đôn lên sẽ trở thành phần tử thứ 2 và có thể bị quét lại. Cách an toàn là lập 1 mảng b, chuyển các phần tử vị trí lẻ bên mảng a sang mảng b rồi xuất mảng b ra.
    2.Cho mảng A có n phần tử. Nhập vào số nguyên k (k>=0),dịch phải xoay vòng mảng A k lần.
    Ví dụ: Mảng A: 5 7 2 3 1 9
    Nhập k = 2
    Dịch phải xoay vòng mảng A: 1 9 5 7 2 3
    Bài này khá đơn giản:
    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3. #include <cstdlib>
    4. #define maxx 25
    5. using namespace std;
    6. int main(){
    7.     srand(time(0));
    8.     int a[maxx],n = 10;
    9.     for (int i = 0;i < n;++i) a[i] = rand()%100;
    10.     cout <<"Day duoc tao ngau nhien:\n";
    11.     for (int i = 0;i < n;++i) cout <<setw(5) <<a[i];
    12.     cout <<endl;
    13.     int k;
    14.     do{ cout <<"Nhap k (k >= 0): "; cin >>k; } while (k < 0);
    15.     for (int i = 0;i < k;++i){
    16.         for (int j = n;j > 0;--j) a[j] = a[j-1];
    17.         a[0] = a[n];
    18.     }
    19.     cout <<"Day sau khi dich sang phai " <<k <<" lan:\n";
    20.     for (int i = 0;i < n;++i) cout <<setw(5) <<a[i];
    21.     cout <<endl;
    22.     system("pause"); return 0;
    23. }

    3.Viết hàm xóa tất cả những phần tử trùng nhau trong dãy chỉ giữ lại một phần tử trong đó.
    Ví dụ: 1 6 2 3 2 4 2 6 5 chuyển thành 1 6 2 3 4 5
    Bài này hơi rắc rối 1 chút

    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3. #define maxx 25
    4. using namespace std;
    5. int main(){
    6.     int a[maxx],n = 10;
    7.     for (int i = 0;i < n;++i){
    8.         cout <<"Nhap a[" <<i <<"]: "; cin >>a[i];
    9.     }
    10.     cout <<"Day duoc tao:\n";
    11.     for (int i = 0;i < n;++i) cout <<setw(5) <<a[i];
    12.     cout <<endl;
    13.     int b[maxx],m = 0,j;
    14.     for (int i = 0;i < n;++i){
    15.         j = 0;
    16.         while ((j < m)&&(b[j] != a[i])) ++j;
    17.         if (j >= m){
    18.            b[m] = a[i];
    19.            ++m;
    20.         }
    21.     }
    22.     cout <<"Day sau khi xoa cac phan tu trung:\n";
    23.     for (int i = 0;i < m;++i) cout <<setw(5) <<b[i];
    24.     cout <<endl;
    25.     system("pause"); return 0;
    26. }

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    3.Viết hàm xóa tất cả những phần tử trùng nhau trong dãy chỉ giữ lại một phần tử trong đó.
    Ví dụ: 1 6 2 3 2 4 2 6 5 chuyển thành 1 6 2 3 4 5
    bài này mình có 1 cách thấy đơn giản hơn 1 tí ! Không biết có giúp ích gì cho bạn không !
    C++ Code:
    1. #include<iostream>
    2. #include<iomanip>
    3.  
    4. const int size = 10;
    5.  
    6. int main()
    7. {
    8.       int a[size];
    9.      
    10.      
    11.   cout << " nhap so phan tu cua mang" << endl;
    12.   for ( int i = 0; i < size; i++ )
    13.   {
    14.      cout << "so phan tu thu   a[" << i << "] : =" ;
    15.      cin >> a[i];
    16.   }
    17.  
    18.   cout << " Mang dc tao ra la`:" << endl ;
    19.   for ( int j = 0; j < size; j++ )
    20.   {
    21.      
    22.       cout << a[j] << endl;
    23.   }
    24.  
    25.   cout << " Sau khi loai tru nhung phan tu tru`ng, mang mo'i la`: " << endl;
    26.  
    27.  
    28.   bool check;
    29.  
    30.   for ( int k = 0; k < size; k++ )
    31.   {
    32.       check = false;
    33.       for ( int l = k-1; l >= 0; l-- )
    34.       {
    35.           if ( a[l] == a[k] )
    36.           {
    37.               check = true;
    38.               break;
    39.           }
    40.       }
    41.       if ( check == false )
    42.         cout << a[k] << setw(5) ;
    43.   }
    44.  
    45. int x;
    46. cin >> x;
    47. }

  5. #5
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Hay lắm, ý tưởng như vậy là tốt lắm, dùng hàm bool để check.

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

    Mặc định Bài tập C về Hàm và mảng

    Đây là hàm của bài 3 theo 2 cách của bác Huynguyen và rox rook:
    C1:
    C Code:
    1. void in_so(int a[100],int &n)
    2. {
    3. for (int k=0;k<n;k++)
    4.   {
    5.      int check=0;
    6.       for (int l=k-1;l>=0;l--)
    7.       {
    8.           if(a[l]==a[k])
    9.           {
    10.               check = 1;
    11.               break;
    12.           }
    13.       }
    14.       if(check== 0)
    15.       printf("%d\t",a[k]);
    16.   }
    17. }

    C2:
    C Code:
    1. void in_so(int a[100],int &n)
    2. {
    3.     int m = 0,j,i,b[100];
    4.     for(i=0;i<n;i++)
    5.     b[i]=a[i];
    6.     for (i=0;i<n;i++)
    7.         {
    8.         j = 0;
    9.         while ((j < m)&&(b[j] != a[i]))
    10.         j++;
    11.         if (j >= m)
    12.             {
    13.                  b[m] = a[i];
    14.                  m++;
    15.             }
    16.         }
    17.         printf("\nDay sau khi xoa cac phan tu chung:\n");
    18.         for (i=0;i<m;i++)
    19.         printf("%d\t",b[i]);
    Nhưng mình vẫn chưa hiểu về vòng lặp dùng trong hàm,mọi người có thể giải thích cho mình được không?
    Còn bài 2 thì vẫn chưa ra!

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

    Còn bài 2 thì vẫn chưa ra!
    Mình đã giải giúp bạn rồi còn gì:
    C++ Code:
    1. #include <iostream>
    2. #include <iomanip>
    3. #include <cstdlib>
    4. #define maxx 25
    5. using namespace std;
    6. int main(){
    7.     srand(time(0));
    8.     int a[maxx],n = 10;
    9.     for (int i = 0;i < n;++i) a[i] = rand()%100;
    10.     cout <<"Day duoc tao ngau nhien:\n";
    11.     for (int i = 0;i < n;++i) cout <<setw(5) <<a[i];
    12.     cout <<endl;
    13.     int k;
    14.     do{ cout <<"Nhap k (k >= 0): "; cin >>k; } while (k < 0);
    15.     for (int i = 0;i < k;++i){
    16.         for (int j = n;j > 0;--j) a[j] = a[j-1];
    17.         a[0] = a[n];
    18.     }
    19.     cout <<"Day sau khi dich sang phai " <<k <<" lan:\n";
    20.     for (int i = 0;i < n;++i) cout <<setw(5) <<a[i];
    21.     cout <<endl;
    22.     system("pause"); return 0;
    23. }
    Còn 2 cái code của mình và rox đều có 1 ý tưởng chung là xét từng phần tử a[i] và so sánh lại với các phần tử trước đó, tức là so sánh với các phần tử từ a[0] đến a[i-1]. Mình thì chuyển sang 1 cái mảng mới, tốn dữ liệu, rox thì check lại để xuất ra, tiết kiệm dữ liệu.

    C2 là cách của tui phải ko? Bạn chế thêm dòng b[i] = a[i] làm gì vậy?
    Đã được chỉnh sửa lần cuối bởi huynguyen : 05-02-2007 lúc 02:42 PM.

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    2.Cho mảng A có n phần tử. Nhập vào số nguyên k (k>=0),dịch phải xoay vòng mảng A k lần.
    Ví dụ: Mảng A: 5 7 2 3 1 9
    Nhập k = 2
    Dịch phải xoay vòng mảng A: 1 9 5 7 2 3
    Bài này có mình có 1 cách tổng quát hơn, dịch phải thì + mà dich trái thì - và có thể khởi tạo size của array, tuy hơi dài nhưng hi vọng giúp ích cho bạn :
    C++ Code:
    1. #include<iostream>
    2. #include<conio.h>
    3. #include<iomanip>
    4.  
    5. int size;
    6. int* a, * b;
    7. int k;
    8.  
    9. void initialization()
    10. {
    11.     cout << "Your shifted array's size: " << endl;
    12.     cin >> size;
    13.  
    14.     a = new int[size];
    15.     cout << "Please enter the shifted array's value : " << endl;
    16.     for (int i = 0; i < size; i++)
    17.     {
    18.         cout << "The " << i + 1 << "th element : ";
    19.         cin >> a[i];
    20.     }
    21.  
    22.     cout << "Input array is: " << endl;
    23.     for ( i = 0; i < size; i++)
    24.         cout << setw(4) << a[i];   
    25.  
    26.     cout << endl << "Please enter shifting-value ( (-)num to shift right _ (+) num to shift left : ";
    27.     cin >> k;
    28.    
    29.     cout << "======================================" << endl;
    30. }
    31. void do_shift()
    32. {
    33.     int new_position;
    34.    
    35.     // tu 0 den size - k - 1 cua b -> tu k den size - 1 cua a.
    36.         // tu size - k den size - 1 cua b -> tu 0 den k-1 cua a
    37.     b = new int[size];
    38.     for (int i = 0; i < size; i ++)
    39.     {
    40.         new_position = (i+k+size) % size;
    41.         b[i] = a[new_position];
    42.     }
    43. }
    44.  
    45. void print()
    46. {
    47.     cout << "Result array after shifting will be : " << endl;
    48.     for (int i = 0; i < size; i++)
    49.     {
    50.         //cout <<  "b[" << i << "] = " ;
    51.         cout << setw(4) << b[i] << " ";
    52.     }
    53.     cout << flush;
    54. }
    55.  
    56. void main()
    57. {
    58.     initialization();
    59.     do_shift();
    60.     print();
    61.     getch();
    62. }
    Ps: cái này mình viết bằng visual C++ !
    Đã được chỉnh sửa lần cuối bởi rox_rook : 07-02-2007 lúc 01:42 PM.

  9. #9
    Ngày gia nhập
    11 2006
    Bài viết
    8

    hi hi
    Cảm ơn hai cậu! Tớ đang tiếp tục suy nghĩ, vì với tớ mói học C thì bài này ko đơn giản đâu, ma tớ lại lập trình trên C, các cậu lại toàn làm trên C++ và viúal C++, nên tớ tiếp thu được ít lắm

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

    Nếu học theo trường lớp thì ko trách bạn được nhưng nếu tự học thì lời khuyên là học C++, C# chứ đừng có cắm đầu vào C, nhảy ngay vào OOP, bỏ qua cái lập trình thủ tục đi.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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