Chưa nói gì đến OOP. Bạn hãy chữa lại code để một thuật toán chỉ code một lần thôi. Mình thấy trong code của bạn, cùng một thuật toán sắp xếp mà bạn code đến những 4 lần.
mình mới tự học từ C lên c++ nên trình và kinh nghiệm để viết class là chưa có gì ! còn nhiều băn khoăn. mình muốn từ bài tập này để vỡ thêm được nhiều điều :
sau đây là bài đầu tiên mình viết class : chắc nó còn nhiều chỗ sai : mọng các bác biết nhiều về OOP chỉ giúp :
đề bài:
Người ta quan tâm đến việc sắp xếp 1 mảng các số thực n gồm n phần tử a[0],a[1]..., a[n-1] theo các yêu cầu sau:
-Sắp theo thứ tự tăng dần
-Sắp theo thứ tự giảm dần
-Sắp theo trị tuyệt đối tăng dần
-Sắp xếp để các số không âm về đầu mảng và tăng dần, còn các số âm thì về cuối mảng và giảm dần.
Bằng cách tận dụng khả năng dùng lại mã nguồn của ngôn ngũ lập trình hướng đối tượng, ta có thể giải quyết ngắn gọn bài toán trên. Hãy:
Đề nghị giải pháp thiết kế và cài đặt các lớp để giải quyết tất cả các bài toán theo loại nói trên.
lời giải của mình như sau ! nhưng chưa hoàn thiện mong các bác góp ý sao đúng cú pháp opp nhé !
không biết mình có phải xây dựng hàm truyền giá trị cho các phần tử của mảng không nhỉ ! nêu không thì làm sao mà có thể cập nhật các phần tử vào mảng được !Code:#include<iostream.h> #include<conio.h> #include<stdio.h> #include<math.h> class mang { private : int n;//n phan tu khi ta khoi tao ; int a[100]; public : mang (int so) { n= so; } void hoanvi(int&b,int&c) { int tg; tg = b; b= c; c= tg; } void tang(int*a ,int n);// a sẽ là địa chỉ của mảng còn n là số phần tử trong mảng void giam(int*a ,int n); void tuyetdoi(int*a ,int n); void dieukien(int*a ,int n); }; ////////////////////////////////////////////////////////////////// void mang::tang(int*a,int n) { int i,j,tg; i=0; for (i=0;i<n;i++) { for(j=i;j<n;j++) if(a[j]<a[i]) mang::hoanvi(a[i],a[j]); } } void mang::giam(int *a,int n) { mang::tang(a, n); for(int i = 0; i<n/2 ; i++) mang::hoanvi(a[i],a[n-i]); } void mang::tuyetdoi(int *a,int n) { int i,j; i=0; for (i=0;i<n;i++) { for(j=i;j<n;j++) if(fabs(a[j])<fabs(a[i])) mang::hoanvi(a[i],a[j]); } } void mang::dieukien(int *a,int n) { int i,j,k=0,h=0; int b[100],c[100]; for(i=0;i<n;i++) { if(a[i]>=0) { b[k]= a[i]; k++; } c[h]= a[i]; h++; } mang::tang(b,k); mang::giam(c,h); for(i=0;i<=k;i++) a[i]=b[i]; for(i=k;i<=h+k;i++) { a[i]=c[j]; j++; } }
Đã được chỉnh sửa lần cuối bởi calme1202 : 31-05-2008 lúc 06:24 PM.
Chưa nói gì đến OOP. Bạn hãy chữa lại code để một thuật toán chỉ code một lần thôi. Mình thấy trong code của bạn, cùng một thuật toán sắp xếp mà bạn code đến những 4 lần.
mình thấy là nó không hoàn toàn giống nhau ! mình đã sửa những chỗ lặp lại !
mình muốn hỏi thêm về bài này đã đúng cú pháp OOP chưa nhỉ ! và nếu xây dựng chương trình sử dụng cái class này thì mình có phải thêm phương thức tạo các phần tử của mảng cho nó không vậy
Đã được chỉnh sửa lần cuối bởi calme1202 : 31-05-2008 lúc 06:36 PM.
Bạn vẫn chỉ nghĩ tới 4 kiểu sắp xếp cụ thể của đề bài hiện tại thì chưa được. Mục đích của đề bài là dùng lại mã nguồn (còn OOP chỉ là phương tiện), nên hãy nghĩ tới một đề bài tương lai. Mã nguồn của bạn có thể dùng lại được không, dùng lại ở mức nào nếu trong tương lai, sẽ cần phải sắp xếp theo vài thứ tự khác?
Bài của bạn chỉ có một thuật toán sắp xếp. Có 4 kiểu sắp xếp vì thuật toán ấy áp dụng lên những thứ tự so sánh khác nhau. Nên việc cần phải giải quyết trước tiên là làm sao tách rời phép so sánh ra khỏi thuật toán.
Việc tách rời này sẽ còn có ích nếu yêu cầu tương lai đi theo một hướng khác: vẫn chỉ 4 thứ tự so sánh đó, nhưng phải cài đặt một hay vài thuật toán sắp xếp khác có tính năng và hiệu quả cần thiết.
Cú pháp chỉ là hình thức. Nội dung mới là quan trọng.
thực ra mình đang học cái hình thức mà ! hihi có để ý nhiều vào nội dung đâu ! nhưng nếu bạn nói vậy thì mình sẽ sửa code vậy ! mà sửa cũng không dễ nhỉ !
mình làm một demo về OOP cho bạn nhé
cái này là OOP nhưng not well-formed and well-designed
bạn dựa vào đây để tạo và cải tiến ^^!
C++ Code:
#define bool int #define MAX_ELEMENTS 100 class ArraySort { private: int current_max; // number of elements available in array, smaller than MAX_ELEMENTS int array[MAX_ELEMENTS]; // allocate max space to use enum SortType {NATURAL, ABSOLUTE}; // type of sorting, indicate whether NATURAL value or ABSOLUTE value enum SortOrder {INCREASE, DECREASE}; // order of sorting, indicate whether INCREASE or DECREASE public: /** * CONSTRUCTORS */ ArraySort(); ArraySort(int max_current); ArraySort(int* array_init, int max_current); ArraySort(int* array_init, int max_current, SortType type, SortOrder order); /** * PROPERTIES */ void setMaxElements(int max); int getMaxElements(); void setSortType(SortType sortType); void setSortOrder(SortOrder sortOrder); int* getArray(); /** * METHODS */ void init(int max_current); void init(int* array_init, int max_current); void init(int value); void init(int index, int value); bool sort(); bool sort(SortType type); bool sort(SortOrder order); bool sort(SortType type, SortOrder order); bool isSorted(); }
None!
Một số góp ý vì X cố tình viết dối T_T :
- Các method không có chú thích thì khó mà hiểu được nội dung, overloading dù interface cũng nên có 1 ít instruction.
- Thiếu tính const rất nhiều cho các phương thức .
- "Macro is stupid substitution text with no scope and no rule". ( Sorry không phải ám chỉ X ) Nên tránh dùng marco, dùng const static để thay thế các hằng số ). Còn thực sự cần 1 đoạn thay thế nào đó thì viết hẳn lại bằng template.
- Semicolon at the end of }; T_T !