Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Cho em hỏi về cách viết tối ưu lại đoạn code sau

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

    Mặc định Cho em hỏi về cách viết tối ưu lại đoạn code sau

    Em có một bài tâp như sau:

    Nhập vào 2 mảng tăng dần, trộn 2 mảng thành 1 và sắp xếp thành mảng tăng dần rồi in kết quả ra màn hình!

    E làm như sau :

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3.  
    4.  
    5. void main()
    6. {
    7.     float mang1[50],mang2[50],mang3[100];
    8.     int i,j,k,n,m;
    9.     float x,y;
    10.     printf("Nhap so phan tu mang thu 1:");
    11.     scanf("%d",&n);
    12.     printf("Nhap so phan tu mang thu 2:");
    13.     scanf("%d",&m);
    14.     //nhap cac phan tu mang 1
    15.     printf("\nNhap mang tang dan thu 1.");
    16.     printf("\nNhap phan tu thu 1:");
    17.     scanf("%f",&mang1[0]);
    18.     for(i=1;i<n;i++)
    19.     {
    20.         do
    21.         {
    22.             printf("\nNhap phan tu thu %d:",i+1);
    23.             scanf("%f",&mang1[i]);
    24.         }while(mang1[i]<=mang1[i-1]);//Ktra điều kiện mạng tăng dần
    25.     }
    26.     //nhap cac phan tu mang thu 2
    27.     printf("\nNhap mang tang dan thu 2.");
    28.     printf("\nNhap phan tu thu 1:");
    29.     scanf("%f",&mang2[0]);
    30.     for(i=1;i<m;i++)
    31.     {
    32.         do
    33.         {
    34.             printf("\nNhap phan tu thu %d:",i+1);
    35.             scanf("%f",&mang2[i]);
    36.         }while(mang2[i]<=mang2[i-1]); //kiem tra dieu kien xem co phai nhap tĂng dần hay không!
    37.     }
    38.  
    39.     //tron 2 mảng vừa nhập thành 1 mảng
    40.     for(i=0;i<n;i++)
    41.     mang3[i]=mang1[i];
    42.     for(i=0;i<m;i++)
    43.     mang3[i+n]=mang2[i];
    44.     //Sap xep mang sau khi tron thanh mang tang dan
    45.     for(i=0;i<n+m;i++)
    46.      for(j=i+1;j<n+m;j++)
    47.       if(mang3[i]>mang3[j])
    48.        {
    49.            x=mang3[i];
    50.            mang3[i]=mang3[j];
    51.            mang3[j]=x;
    52.        }
    53.     //in ra mang sau khi tron
    54.     printf("\nKet qua sau khi tron 2 mang tren thanh mot mang tang dan moi:\n");
    55.     for(i=0;i<n+m;i++)
    56.     printf("/t%.2f",mang3[i]);
    57.     getch();
    58.  
    59. }

    em mún hỏi là nếu muốn viết lại bài kia gọn gàng hơn bằng cách sử dụng hàm có được không ạ?
    hoặc là có cách nào khác giúp cái mã nguồn nhìn nó sáng sủa dễ hiểu hơn thì anh chị chỉ giáo em với ạ!

    Em xin chân thành cảm ơn!

  2. #2
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Đầu tiên hết, bạn nên sử đề tài lại, coi chừng vướng lỗi "đề tải chung chung..."

    Trả lời:

    Vấn Đề: viết lại bài kia gọn gàng hơn bằng cách sử dụng hàm có được không

    Được, và đó là điều nên làm, nhất là phần nhập hai mảng, gọi hàm nhập mảng 2 lần để nhập 2 mảng khác nhau
    Viết hàm trộn mảng và hàm xuất mảng cũng được nhưng chỉ làm cho code dễ đọc thôi chứ không tối ưu

    Vấn Đề: mã nguồn nhìn nó sáng sủa dễ hiểu hơn

    Sửa đoạn code này

    C Code:
    1.     printf("\nNhap phan tu thu 1:");
    2.     scanf("%f",&mang1[0]);
    3.     for(i=1;i<n;i++)
    4.     {
    5.         do
    6.         {
    7.             printf("\nNhap phan tu thu %d:",i+1);
    8.             scanf("%f",&mang1[i]);
    9.         }while(mang1[i]<=mang1[i-1]);//Ktra điều kiện mạng tăng dần
    10.     }
    thành

    C Code:
    1.     for(i=0;i<n;i++)
    2.     {
    3.         do
    4.         {
    5.             printf("\nNhap phan tu thu %d:",i+1);
    6.             scanf("%f",&mang1[i]);
    7.         }while(i==0 || mang1[i]<=mang1[i-1]);// Ktra điều kiện mạng tăng dần
    8.     }

    Vấn Đề: tối ưu hóa

    Bài này muốn thật sự tối ưu hóa thì phải dùng con trỏ. Tuy nhiên cần lưu ý là con trỏ chỉ dễ đọc và dễ hiểu đối với người đã quen dùng con trỏ.

  3. #3
    Ngày gia nhập
    03 2010
    Bài viết
    8

    Em cảm ơn anh!

    Về vấn đề tiêu đề thì e cũng k biết nên đặt tên như nào ạ!

    A cho em hỏi luôn nếu viết hàm nhập vào mảng thì return lại cái gì ạ.
    em tưởng chỉ trả về 1 giá trị cho hàm thôi chứ làm sao để trả lại nguyên cả một mảng giá trị cho hàm đc ạ

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

    Nhập mảng bạn có nhiều cách.
    Return về contro của mảng, return số phần tử nhập vào. Không cần return chỉ là thủ tục thôi.
    C Code:
    1. void nhap(c_type **a, int *n_size);
    2. int nhap(c_type **a);
    3. c_type *nhap(int *n);//Cách này không thấy tốt lắm

  5. #5
    Ngày gia nhập
    01 2012
    Nơi ở
    localhost
    Bài viết
    140

    Vì 2 mảng đã có thứ tự tăng dần nên việc trộn lại cũng đỡ mất thời gian hơn.
    Ví dụ:
    mảng 1: 1 7 9 10 19
    mảng 2: 1 6 7 8 9 12 17
    bây giờ bạn chỉ việc chèn các phần tử của mảng 2 vào đúng vị trí của nó trong mảng 3:
    => mảng 3 = mảng 1 = 1 7 9 10 19
    Các lần chèn ta được:
    mảng 3: 1 1 7 9 10 19
    mảng 3: 1 1 6 7 9 10 19
    mảng 3: 1 1 6 7 7 9 10 19
    mảng 3: 1 1 6 7 7 8 9 10 19
    mảng 3: 1 1 6 7 7 8 9 9 10 19
    mảng 3: 1 1 6 7 7 8 9 9 10 12 19
    mảng 3: 1 1 6 7 7 8 9 9 10 12 17 19
    Nếu bạn không có điều kiện dùng list thì bạn swap các phần tử của mảng ra phía sau cũng khá hiệu quả.

    Ngoài ra bạn còn có thể tối ưu thêm bằng cách mỗi lần truyền vào một mảng con của mảng 2, như vậy hiệu quả hơn do ít swap.
    Rẹt rẹt..

  6. #6
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Mặc định Cho em hỏi về cách viết tối ưu lại đoạn code sau

    Trích dẫn Nguyên bản được gửi bởi sim Xem bài viết
    Vì 2 mảng đã có thứ tự tăng dần nên việc trộn lại cũng đỡ mất thời gian hơn.
    Ví dụ:
    mảng 1: 1 7 9 10 19
    mảng 2: 1 6 7 8 9 12 17
    bây giờ bạn chỉ việc chèn các phần tử của mảng 2 vào đúng vị trí của nó trong mảng 3:
    => mảng 3 = mảng 1 = 1 7 9 10 19
    Các lần chèn ta được:
    mảng 3: 1 1 7 9 10 19
    mảng 3: 1 1 6 7 9 10 19
    mảng 3: 1 1 6 7 7 9 10 19
    mảng 3: 1 1 6 7 7 8 9 10 19
    mảng 3: 1 1 6 7 7 8 9 9 10 19
    mảng 3: 1 1 6 7 7 8 9 9 10 12 19
    mảng 3: 1 1 6 7 7 8 9 9 10 12 17 19
    Nếu bạn không có điều kiện dùng list thì bạn swap các phần tử của mảng ra phía sau cũng khá hiệu quả.

    Ngoài ra bạn còn có thể tối ưu thêm bằng cách mỗi lần truyền vào một mảng con của mảng 2, như vậy hiệu quả hơn do ít swap.
    Mới thấy thuật toán này lần đâu.
    Cách trộn 2 mảng tăng dần đã bàn nhiều trong diễn đàn. Chịu khó tìm mấy bài cũ sẽ thấy.

  7. #7
    Ngày gia nhập
    10 2011
    Bài viết
    552

    @ sim : Giải thuật đấy ko hay vì nó chả khác gì cách chèn 1 số vào vị trí thích hợp của mảng tăng dần.
    Cái này phải dùng tới "cuộn" các phần tử lùi về sau để dành chỗ trống mà chèn vào.
    Mà việc cuộn đấy tiêu tốn khá nhiều "năng lượng".
    Lại là chèn nhiều số, cho nên việc cuộn phải làm nhiều lần --> cực bỏ cha

    Dùng tư tưởng của Merge Sort trong cái này là hay hơn. Nam châm hút hút, thằng nào nhẹ là bị hút vào
    Tham khảo cái này http://diendan.congdongcviet.com/showthread.php?t=80567
    Đã được chỉnh sửa lần cuối bởi clchicken : 18-01-2012 lúc 12:26 AM.
    Um Mani Padme Hum...!!

  8. #8
    Ngày gia nhập
    01 2012
    Nơi ở
    localhost
    Bài viết
    140

    A quên. Nếu 2 mảng sắp xếp rồi thì số lần so sánh tối đa sẽ là tổng số phần tử của 2 mảng.
    mảng 1: 1 7 9 10 19
    mảng 2: 1 6 7 8 9 12 17
    mảng 3: (ko có gì)

    lần lượt so sánh các phần tử đầu của 2 mảng cái nào nhỏ hơn thì pop ra cho vào mảng thứ 3, làm vậy đến hết.

    PS:
    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Mới thấy thuật toán này lần đâu.
    Bể học mênh mông mà bạn
    Đã được chỉnh sửa lần cuối bởi sim : 18-01-2012 lúc 03:48 PM. Lý do: Ngưỡng mộ khả năng của anh ấy :P
    Rẹt rẹt..

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

    . may quá. Ban đầu e cũng nghĩ đến việc so sánh từng phần tử của 2 mảng với nhau để sắp xếp vào mảng cuối, nhưng mà e mới học, nghĩ ca cách nhưng chưa biết viết thế nào, mà thầy thì giục nộp bài nên em viết đại thế kia

    May quá h có topic kia ngộ ra nhiều rồi. Thank cả nhà nhiều!
    có gì em lại lên hỏi tiếp

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

  1. muốn viết code cho 1 button nằm trong girdview thì viết ở đâu
    Gửi bởi thuan trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 14-09-2011, 01:08 PM
  2. Code các hàm sắp xếp sử dụng template con trỏ hàm viết bằng C++. Giúp mình kiểm tra code
    Gửi bởi satthuvotinh trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 16-05-2011, 12:32 PM
  3. Algorithm Viết code thời khóa biểu viết trên Window Form C# như thế nào?
    Gửi bởi hocphp_1998 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 10
    Bài viết cuối: 12-04-2011, 11:10 PM
  4. Viết code trên Form và viết code trong class có gì khác nhau.
    Gửi bởi hocCsharp trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 21
    Bài viết cuối: 21-01-2011, 10:37 PM
  5. Bài con mã đi tuần -Em viết code rồi nhưng ko in ra màn hình, giúp em sửa code với-
    Gửi bởi freb trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 26-09-2008, 09:14 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