[ Video ] Lập trình mobile trên Google Android

03:52 |
Google Android là một nền tảng mã mở trên Java được thiết kế cho thiết bị di động, đang thu hút được nhiều hãng mobile lớn sản xuất thiết bị trên nền tảng này, cùng một cộng động các nhà phát triển đông đảo trên toàn thế giới cùng xây dựng các ứng dụng trên đó. Với mục đích mang lại kiến thức về nền tảng đang rất được quan tâm này, Hôm nay mình xin giới thiệu đến các bạn khóa học Lập TrìnhTrên Google Android của Anh Đinh Chí Thành.Không chỉ những nhà lập trình chuyên nghiệp mới biết đến Google! Đã từ lâu, cái tên Google trở nên quen thuộc với bất kỳ ai trên thế giới với các dịch vụ, sản phẩm nổi tiếng của mình như Google Search, Gmail, GDocs…Với những người yêu thích công nghệ di động thì Google Android, 1 nền tảng lập trình ứng dụng cho các thiết bị di động mới ra mắt của Google, là một trong những nền tảng thu hút nhất. Với sự ra đời liên tiếp các dòng điện thoại di động thông minh (smart phone) trên nền tảng Android từ các hãng sản xuất điện thoại danh tiếng nhất thế giới như Nokia, HTC, Samsung, LG, Sony Ericssons, Motorola…, Google Android ngày càng đóng một vai trò quan trọng hơn trong lĩnh vực thiết bị di động.
Google Android, được phát triển bởi Google, dựa trên nền tảng Java, là một nền tảng mã mở và thiết kế cho thiết bị di động, đến nay đã thu hút được không những rất nhiều hãng công nghệ lớn trong việc tạo ra các thiết bị chạy trên nền tảng này, mà còn tạo được một cộng đồng các nhà phát triển đông đảo trên toàn thế giới cùng nhau xây dựng các ứng dụng trên đó.

Bài 1 – Giới thiệu về lập trình trên Mobile và lập trình trên Android: Giới thiệu về các dòng thiết bị di động và các nền tảng phần mền hiện có, đặc thù của ứng dụng mobile, sự ra đời của Google Android

Bài 2 – Lập trình với Android SDK(Phần I/GUI/ Active – Intent): C
ách sử dụng môi trường phát triển cho Google Android (Eclipse + ADT). Giới thiệu về cấu trúc một chương trình trên Android

Bài 3 – Lập trình với Android SDK (Phần I/GUI/ Layout – Views): 
Làm việc với các lớp GUI như Layout, View, Dialog, Toast. Xử lý tương tác người dùng

Bài 4 – Lập trình với Android SDK (Phần I/GUI/ Graphic 2D – 3D): Giới thiệu các thư viên đồ họa, cách lập trình 2D, 3D, tương tác đồ họa với người dùng
Bài 5 – Lập trình với Android SDK (Phần II/Data/ Sqlite – saveconfig): Lưu trữ dữ liệu trên thiết bị di động bằng Android

Bài 6 – Lập trình với Android SDK (Phần III/Net/ http – https – tcp/ip): 
Lập trình ứng dụng Internet trên Android


Bài 7 – Lập trình với Android SDK (Phần III/System/ service – content provider): 
Lập trình hệ thống trên Android


Bài 8
 - Lập trình với Android SDK(Phần III/System/ Thread – Handle)Làm việc với Thread trên Android
 


Xem video tại đây: http://kenhdaihoc.com/forum/showthread.php?t=5047

Code demo của chương trình đào tạo online Lập Trình Trên Android.

03:08 |

Gửi các bạn bộ code demo của chương trình đào tạo online Lập Trình Trên Android.
Chỉ có code của chương 1,4,5,6,7,8 thôi chương 2 và 3 mình không có tìm thấy code.
Code Demo Android Full (163)
Xem video tại đây: http://kenhdaihoc.com/forum/showthread.php?t=5047
Bài 1: http://www.mediafire.com/?0t9s49avhowc126
Bài 4: http://www.mediafire.com/?h4d29p4b3mp7kka
Bài 5: http://www.mediafire.com/?76f5quxkmq9rz1h
Bài 6: http://www.mediafire.com/?sj6zid1l7bq5h8j
Bài 7: http://www.mediafire.com/?m916qomctbsadas
Bài 8: http://www.mediafire.com/?o6w11rd3s3z3iks
[PASSWORD] wWw.kenhdaihoc.com

Làm thế nào để thiết kế Powerpoint thuyết trình cho hiệu quả

03:03 |



SQL online trích từ Giáo trình SQL[ chuẩn ]

07:24 |
CHƯƠNG 1 : TỔNG QUAN VỀ SQL
SQL là ngôn ngữ cơ sở dữ liệu quan hệ
Vai trò của SQL
Tổng quan về cơ sở dữ liệu quan hệ
Mô hình dữ liệu quan hệ
Bảng (Table)
Khoá của bảng
Mối quan hệ và khoá ngoài
Sơ lược về SQL
Câu lệnh SQL
Qui tắc sử dụng tên trong SQL
Kiểu dữ liệu
Giá trị NULL
Kết chương 
CHƯƠNG 2 : NGÔN NGỮ THAO TÁC DỮ LIỆU
Truy xuất dữ liệu với câu lệnh SELECT
Mệnh đề FROM
Danh sách chọn trong câu lệnh SELECT
Chỉ định điều kiện truy vấn dữ liệu
Tạo mới bảng dữ liệu từ kết quả của câu lệnh SELECT
Sắp xếp kết quả truy vấn
Phép hợp
Phép nối
Sử dụng phép nối
Các loại phép nối
Sử dụng phép nối trong SQL
Thống kê dữ liệu với GROUP BY
Thống kê dữ liệu với COMPUTE
Truy vấn con (Subquery)
Bổ sung, cập nhật và xoá dữ liệu
Bổ sung dữ liệu
Cập nhật dữ liệu
Xoá dữ liệu
Bài tập chương 

CHƯƠNG 3: NGÔN NGỮ ĐỊNH NGHĨA DỮ LIỆU
Tạo bảng dữ liệu
Ràng buộc CHECK
Ràng buộc PRIMARY KEY
Ràng buộc UNIQUE
Ràng buộc FOREIGN KEY
Sửa đổi định nghĩa bảng 
Xoá bảng 
Khung nhìn
Tạo khung nhìn
Cập nhật, bổ sung và xoá dữ liệu thông qua khung nhìn
Sửa đổi khung nhìn
Xoá khung nhìn
Bài tập chương 

CHƯƠNG 4 : BẢO MẬT TRONG SQL
Các khái niệm 
Cấp phát quyền
Cấp phát quyền cho người dùng trên các đối tượng cơ sở dữ liệu
Cấp phát quyền thực thi các câu lệnh
Thu hồi quyền
Thu hồi quyền trên đối tượng cơ sở dữ liệu:
Thu hồi quyền thực thi các câu lênh:

CHƯƠNG 5: THỦ TỤC LƯU TRỮ, HÀM VÀ TRIGGER
Thủ tục lưu trữ (stored procedure)
Các khái niệm
Tạo thủ tục lưu trữ
Lời gọi thủ tục lưu trữ
Sử dụng biến trong thủ tục
Giá trị trả về của tham số trong thủ tục lưu trữ
Tham số với giá trị mặc định
Sửa đổi thủ tục
Hàm do người dùng định nghĩa
Định nghĩa và sử dụng hàm
Hàm với giá trị trả về là “dữ liệu kiểu bảng”
Trigger 
Định nghĩa trigger
Sử dụng mệnh đề IF UPDATE trong trigger
ROLLBACK TRANSACTION và trigger
Sử dụng trigger trong trường hợp câu lệnh INSERT, UPDATE và DELETE có tác động đến nhiều dòng dữ liệu
Sử dụng truy vấn con
Sử dụng biến con trỏ
Bài tập chương 

CHƯƠNG 6: GIAO TÁC SQL
Giao tác và các tính chất của giao tác 
Mô hình giao tác trong SQL 
Giao tác lồng nhau 


PHỤ LỤC
A Cơ sở dữ liệu mẫu sử dụng trong giáo trình 
B Một số hàm thường sử dụng
B1. Các hàm trên dữ liệu kiểu chuỗi
B2. Các hàm trên dữ liệu kiểu ngày giờ
B3. Hàm chuyển đổi kiểu

Bài toán quản lý nhân viên - Cấu trúc dữ liệu và giải thuật

07:05 |
Phát biểu bài toán

Xem chi tiết tại đây http://kenhdaihoc.com/forum/showthread.php?t=4516 

Giả sử có một quy tắc tổ chức quản lý nhân viên của một công ty như sau :

Thông ti n về một nhân viên bao gồm lý lịch và bảng chấm công

+ Lý lịch nhân viên :
- Mã nhân viên : chuỗi 8 kí tự
- Họ, tên nhân viên : chuỗi 30 kí tự
- Tình trạng gia đình : 1 kí tự ( m=married , s= single)
- Số con : Số nguyên ≤ 20
- Trình độ văn hóa : chuỗi 2 kí tự (C1,C2,C3,DH,CH )
- Lương căn bản : số thực ≤ 1 triệu

+ Chấm công nhân viên
- Số ngày nghỉ có phép trong tháng : số ≤ 28
- Số ngày nghỉ không phép trong tháng : số ≤ 28
- Số ngày làm thêm trong tháng : số ≤ 28
- Kết quả công việc : chuỗi 2 kí tự (TO=tốt,BT=đạt,KE=kém)
- Lương thực lĩnh trong tháng : số ≤ 2 triệu

Quy tắc lĩnh lương
Trong đó nếu : lương thực lĩnh = lương căn bản + phụ trội

- Số con > 2 : phụ trội = +5 % lương căn bản
- Trình độ văn hóa = CH : phụ trội = +10% lương căn bản
- Làm thêm : phụ trội = +4% lương căn bản/ngày
- Nghỉ không phép : phụ trội = -5% lương căn bản/ngày

Y
êu cầu
Xây dự ng chương trình quản lý nhân viên c ủa công ty bằng ngôn ngữ C (sử dụng danh sách liên kết đơ n để tổ chức dữ liệu cho danh sách cán bộ) . C hương trình bao gồm
các chức năng sau :
- Nhập dữ liệu
- Tính lương thực lĩnh của các nhân viên
- Sắp xếp danh sách theo mã nhân viên
- Thêm một nhân viên mới
- Xóa một nhân viên ( Thông qua mã nhân viên)
- Sửa đổi thông tin về một nhân viên
- Xem thông ti n về một nhân viên
- Xem bảng lương c ủa toàn thể nhân viên ( chỉ xem họ tên và lương )
- Thoát

I. Xác định bài toán

a. Input của bài toán :
- Thông tin của các nhân viên
- Thông tin của nhân viên cần được xử lý ( tìm kiếm, sửa đổi, xóa bỏ,hiển thị )

b. Output cuả bài toán
- Lương thực lĩnh của từng nhân viên nhập vào
- Danh sách mới sau khi được xử lý ( tìm kiếm, sửa đổi, xóa bỏ các nhân viên )
- Bảng lương của toàn thế nhân viên


II. Tìm cấu trúc dữ liệu bài toán

Sử dụng danh sách liên kết đơ n với cấu trúc như sau :

[CODE]struct data{
         char mnv[9]; // mã nhân viên
         char hoten[31]; // họ và tên
         char tt;            //tình trạng gia đình
         char socon; //số con
         char vanhoa[3]; //trình trạng văn hóa
         char nphep; //số ngày nghỉ phép
         char nkophep;            //số ngày không nghỉ phép
         char nlamthem; //số ngày làm thêm
         char ketqua[3]; //kết quả công việc
         float luongcb; //lương cơ bản
         float luongtl; //lương thực lĩnh
};
struct node     // nút liên kết
{
    data info;
    node *next;
};
struct list     //cấu trúc dữ liệu của danh sách
{
    node *head;
    node *tail;
};

[/CODE]

III. Tìm thuật toán
A. Khởi tạo và nhập danh sách
1Ý tưởng : lặp đi lặp lại quá trình thêm nhân viên vào danh sách
2Thuật toán :
Bước 1 : Gọi hàm thêm nhân viên
Bước 2 : Hỏi có nhập tiếp ko : có thì về bước 1 , không thì thoát khỏi việc nhập



3. Cài đặt
[CODE]void nhap(list &ds){
    do
    {
        themnv(ds);
        printf("Ban co nhap tiep khong (Y/N) ? \n");
    }
    while (toupper(getch())=='Y');
}


[/CODE]

4. Đánh giá độ p hức tạp của giải thuật


==> Vậy độ phức tạp của giải thuật là O(n)

B. Nhập nút
1. Ý tưởng, thuật toán : Nhập lần lượt các thông tin của một nhân viên
2. Cài đặt:

[CODE]void nhapnut(node *p,int cachthuc)
{
if (cachthuc==1)
    {
        printf("Ma nhan vien      (max08char): ");
        fflush(stdin);gets(p->info.mnv);
        printf("Ho va ten           max30char: ");
        fflush(stdin);gets(p->info.hoten);
    }
        printf("Tinh trang hon nhan       M/S: ");  scanf("%c",&p->info.tt);
        printf("So con                    <21: ");       scanf("%d",&p->info.socon);
        printf("Van hoa              Cx/DH/CH: ");    scanf("%s",&p->info.vanhoa);
        printf("So ngay nghi phep         <28: ");   scanf("%d",&p->info.nphep);
        printf("So ngay nghi ko phep      <28: "); scanf("%d",&p->info.nphep);
        printf("So ngay lam them           <5: ");    scanf("%d",&p->info.nphep);
        printf("Ket qua cong viec    TO/BT/KE: ");
        fflush(stdin);gets(p->info.ketqua);
        printf("Luong can ban             <1M: ");
        float temp; scanf("%f",&temp); p->info.luongcb=temp;
        tinhluongtl(p);                p->next=NULL
}[/CODE]

3. Đánh giá độ p hức tạp giải thuật: giải thuật trên có độ p hức tạp hằng số : O(1)

C. Chèn sau

1. Ý tưởng : Nếu danh sách rỗng thì cho Head và Tail trỏ vào phần tử mới.
Không thì thực hiện như sau :
Ban đầu :

2. Thuật toán :
Bước 1 : Nếu danh sách rỗng sang bước 2 không thì sang bước 3
Bước 2 : Gán Head và Tail trỏ đến phần tử mới, kết thúc
Bước 3 :
- cho Tail next trỏ đến phần tử mới
- cho Tail trỏ đến phần tử mới


3. Cài đặt
[CODE]
void chensau(list &ds,node *p)
{
    if  (ds.head==NULL)
    {
        ds.head=p;          ds.tail=p;
    }
    else
    {
        ds.tail->next=p;   ds.tail=p;
    }
}


[/CODE]


4. Đánh giá độ p hức tạp của giải thuật

=> Vậy độ phức tạp của giải thuật là O(1)

D. Thêm một nhân viên mới
1. Ý tưởng : Tạo 1 node mới và chèn vào sau danh sách
2. Thuật toán
Bước 1 : khai báo 1 con trỏ p kiểu node
Bước 2 : Cấp phát cho p 1 vùng nhớ mới, kiểm tra nếu
Bước 3 : Kiểm tra nếu (p==NULL) thì kết thúc , ko thì sang bước 4
Bước 4 : Nhập các thông tin vào p ( gọi hàm nhập nút )
Bước 5 : Chèn p vào danh sách ( gọi hàm chèn sau )


3. Cài đặt





[CODE]void themnv(list &ds)
{
    node *p;
    p=(node *)malloc(sizeof(node));
    if (p==NULL) return;
    nhapnut(p,1);
    chensau(ds,p);
}[/CODE]

4. Đánh giá độ phức tạp : Giải thuật trên có độ p hức tạp hằng số O(1)

E. Hiển thị danh sách
1. Ý tưởng: duyệt từ đầu danh sách đến cuối danh sách, hiển thị thông tin của nhân viên đó ra
2. Thuật toán:
Bước 1 : Khai báo 1 con trỏ p;
Bước 2 : p=head;
Bước 3 : Nếu( p==NULL) sang bước 6 ko thì sáng bước 4
Bước 4 : Hiển thị các thông tin nằm trong con trỏ p
Bước 5 : p=p next; về bước 3
Bước 6 : Kết thúc

3. Cài đặt

[CODE]void hienthids(list &ds)
{
    node *p;
    p=ds.head;
    printf("\nMa nhan vien       Ho va ten               Luong thuc linh");
    while(p!=NULL)
    {
        printf("\n%   -12s       %-25s %-10.0f ",p->info.mnv,p->info.hoten,p->info.luongtl);
        p=p->next;
    }
}[/CODE]

4. Đánh giá độ phức tạp giải thuật


==> Vậy độ phức tạp của giải thuật là O(n)

F. Sắp xếp danh sách

1. Ý tưởng : Ta sử dụng tư tưởng của thuật toán đổi chỗ trực tiếp (interchange
sort) để xắp xếp danh sách
2. Thuật toán
Bước 1 : khai báo con trỏ p,q có kiểu node *
Bước 2 : cho p trỏ vào đầu danh sách : p=head
Bước 3 : Nếu (p!=NULL và p→next !=NULL) sang bước 4 ko thì kết thúc
Bước 4 : Cho q=p → next
Bước 5 : Nếu q!= NULL thì sang bước 5 không thì sang bước 8
Bước 6 : Nếu thông tin cần so sánh của p<q thì hoán vị (p và q)
Bước 7 : Cho q=q→next rồi về bước 5
Bước 8 : Cho p=p→next rồi về bước 3







3. Cài đặt
[CODE]void sapxep(list &ds) //interchange sort
{
    node *p,*q;
    p=ds.head;
    while (p!=NULL&&p->next!=NULL)
    {
        q=p->next;
        while (q!=NULL)
        {
            if (strcmp(q->info.mnv,p->info.mnv)== 1) hoanvi(p,q);
            q=q->next;
        }
            p=p->next;
    }
}[/CODE]


4. Đánh giá độ p hức tạp
+ Số lượng các phép so sánh (câu lệnh if ) ko phụ thuộc vào tình trạng dãy
số ban đầu (đã xắp xếp hoặc chưa ) luôn luôn là 

+ Số lương hoán vị p hụ thuộc vào kết quả của phép so sánh
+ Việc hoán vị trên 2 con trỏ ta chỉ thay đổi giá trị nằm trong con trỏ ( tức là
thay đổi địa chỉ vùng nhớ mà nó trỏ vào ) nên mất O(1)=i thời gian
+ Nếu phép so sánh cho kết quả đúng thì câu lệnh if mất 2*i thời gian, không
thì sẽ mất i thời gian

==> Vậy độ phức tạp của giải thuật là O(n2)

G. Xóa một nhân viên
1. Ý tưởng : Để xóa bỏ 1 thành phần trong danh sách liên kết đơn ta cần biết thành phần trước nó. Vậy ta sẽ duyệt từ đầu danh sách đến cuối danh sách, trong quá trình duyệt ta sẽ lưu lại địa chỉ của
nút trước nút đang duyệt để sau khi tìm thấy tiến hành thay đổi các móc nối
Ứng với mỗi mã nhân viên chỉ có 1 nhân viên tương ứng nên sau khi tìm thấy và xóa đi ta sẽ dừng việc duyệt lại.
Nếu có tìm thấy ( để xóa ) thì có các trường hợp xảy ra :
Nhân viên cần xóa ở đầu danh sách o nếu danh sách có 1 nút thì ta cho Head và Tail trỏ đến NULL,
sau đó giải phóng bộ nhớ

Nhân viên cần xóa nằm ở giữa danh sách có nhiều nút thì ta cho next
của thằng trước đó trỏ vào nút đằng sau của nút cần xóa sau đó giải
phóng bộ nhớ

2. Thuật toán
Bước 1 : Khai báo con trỏ p,q kiểu node * và cho cả 2 trỏ vào đầu danh sách
Bước 2 : Nếu p!=NULL thì sang bước 3 không thì kết thúc
Bước 3 : Nếu p là nút cần xóa thì sang bước 5 ko thì sang bước 4
Bước 4 : q=p sau đó p=p→next // như thế ta sẽ có q là nút đứng trước p
Bước 5 : Nếu p là đầu danh sách thì sang bước 6 ko thì sang bước 9
Bước 6 : Nếu danh sách có 1 nút thì sang bước 7 ko thì sang bước 8
Bước 7 : head=tail=NULL, sang bước 12
Bước 8 : head=head→next, sang bước 12
Bước 9 : Nếu p là tail thì sang bước 10 ko thì sang bước 11
Bước 10: tail=q, tail→next=NULL ,sang bước 12
Bước 11: q→next=p→next , sang bước 12
Bước 12: free(p) sau đó return //return sẽ dẫn đến kết thúc thuật toán


3. Cài đặt

[CODE]void xoanut(list &ds,char *mcx)
{
    node *p,*q;
    q=p=ds.head;
    while (p!=NULL)
    {
        if (stricmp(p->info.mnv,mcx)==0)
        {
            if (p==ds.head)
                if (p->next==NULL)
                    ds.head=ds.tail=NULL;
                else
                    ds.head=ds.head->next;
            else
                if (p->next==NULL)
                {
                    ds.tail=q;
                    ds.tail->next=NULL;
                }
                else
                    q->next=p->next;
            return;
        }
        q=p;
        p=p->next;
    }
}[/CODE]

4. Đánh giá độ p hức tạp
+ Câu lệnh if trong vòng lặp có độ p hức tạp O(logn)
+ Chi phí cho vòng lặp

==> Vậy độ p hức tạp của giải thuật là O(n.logn)


H. Tính lương thực lĩnh của các nhân viên
1. Cài đặt

[CODE]void tinhluongtl(node *p)
{
    int pt;
    pt=(p->info.socon>2)?0:5;
    pt+=(strcmp(p->info.vanhoa,"CH")==0)?0:10;
    pt+=p->info.nlamthem*4;
    pt-=p->info.nkophep*5;
    p->info.luongtl=p->info.luongcb*(1+pt/100.0);
}[/CODE]

2. Đánh giá độ p hức tạp : Hàm này có độ p hức tạp hằng số O(1)
I. Tìm nhân viên dựa vào mã nhân viên hoặc họ tên
1. Ý tưởng : (tìm kiếm tuyến tính)
Duyệt danh sách từ đầu đến cuối nếu chuỗi tìm kiếm trùng với họ tên
hoặc mã nhân viên thì trả về địa chỉ của nút đó
2. Thuật toán
Bước 1 : Khai báo 1 con trỏ p;
Bước 2 : p=head;
Bước 3 : Nếu( p!=NULL) sang bước 4 ko kết thúc
Bước 4 : Nếu p là nv cần tìm thì return p không thì sang bước 5
Bước 5 : p=p next; về bước 3


3. Cài đặt

[CODE]node* timkiem(list ds,char *xau)
{
    node *p;
    p=ds.head;
    while (p!=NULL)
    {
        if (strcmp(xau,p->info.mnv)==0 || strcmp(xau,p->info.hoten)==0) return p;
        p=p->next;
    }
    return NULL;
}
[/CODE]

4. Đánh giá độ phức tạp :

==> Vậy độ p hức tạp của giải thuật là O(n)


J. Sửa thông tin 1 nhân viên
1. Ý tưởng :
Đầu tiên ta khai báo 1 con trỏ p , sau đó tìm kiếm trên danh sách phần tử có
mã nhân viên hoặc họ tên như đối tượng ta muốn sửa đổi. Sau đó nếu tìm
thấy ta sẽ tiến hành sửa đổi
2. Thuật toán
Bước 1 : Khai báo 1 con trỏ p kiểu node
Bước 2 : p=timkiem(ds,xau)
Bước 3 : Nếu p!=NULL thì sang bước 4 không thì kết thúc thuật toán
Bước 4 : Nhập lại thông tin vào con trỏ p ( gọi hàm nhập nút )


3. Cài đặt
[CODE]void suanut(list ds,char *xau)
{
    node *p=timkiem(ds,xau);
    if (p!=NULL)
    {
        printf("\nNhap lai thong tin cho nhan vien do : ");
        nhapnut(p,2);
    }
}[/CODE]

4. Đánh giá độ p hức tạp
+ Việc tìm kiếm sẽ chi phí O(n) thời gian
+ Việc nhập nút sẽ chi phí O(1) thời gian
Theo quy tắc tổng thì hàm sẽ có độ p hức tạp O(max(O(n),O(1))) = O(n)
==> Vậy độ p hức tạp của giải thuật là O(n)

K. Xem thông tin 1 nhân viên
1. Ý tưởng :
Đầu tiên ta khai báo 1 con trỏ p , sau đó tìm kiếm trên danh sách phần tử có
mã nhân viên hoặc họ tên như đối tượng ta muốn xem
Sau đó nếu có thì ta hiển thị thông tin của nút đó lên
2. Thuật toán
Bước 1 : Khai báo 1 con trỏ p kiểu node
Bước 2 : p=timkiem(ds,xau)
Bước 3 : Nếu p!=NULL thì sang bước 4 không thì kết thúc thuật toán
Bước 4 : Hiển thị thông tin con trỏ trong p




3. Cài đặt


[CODE]void hienthinv(list ds)
{
    char *xau;
    printf("\nNhap vao ho ten hoac ma nhan vien muon xem : ");
    fflush(stdin);
    gets(xau);
    node *p=timkiem(ds,xau);
    if (p!=NULL)
    {
        printf("\nMa nhan vien       Ho va ten               Luong thuc linh");
        printf("\n% -12s       %-25s %-10.0f ",p->info.mnv,p->info.hoten,p->info.luongtl);
        printf("\nTinh trang hon nhan     : %c",p->info.tt);
        printf("\nSo con                          : %d",p->info.socon);
        printf("\nVan hoa                        : %s",p->info.vanhoa);
        printf("\nSo ngay nghi phep       : %d",p->info.nphep);
        printf("\nSo ngay nghi ko phep : %d",p->info.nphep);
        printf("\nSo ngay lam them        : %d",p->info.nphep);
        printf("\nKet qua cong viec        : %s",p->info.ketqua);
        printf("\nLuong can ban             : %f",p->info.luongcb);
        printf("\nLuong thuc linh             : %f",p->info.luongtl);
    }
}[/CODE]

4. Đánh giá giải thuật
+ Việc tìm kiếm sẽ chi phí O(n) thời gian
+ Việc hiển thị nút sẽ chi phí O(1) thời gian
Theo quy tắc tổng thì hàm sẽ có độ p hức tạp O(max(O(n),O(1))) = O(n)
==> Vậy độ p hức tạp của giải thuật là O(n)

L. Xóa danh sách

1. Ý tưởng :
Sau khi chương trình kết thúc , việc bộ nhớ xin cấp phát có được tự giải
phóng hay ko thì tùy thuộc vào cài đặt của trình biên dịch và hệ điều hành.
Chúng ta có 2 khả năng

-Khả năng 1 : trong phần khởi động (trước khi vào function main() ), program xin một khối memory cuả system gọi là XXXX và mỗi lần malloc được gọi thì cấp pháp một phần memory cuả XXXX cho malloc.
Do đó, khi program exit thì trả XXXX về cho system là xong. Trong trường hợp này không bị mất memory
-Khả năng 2 : mỗi lần malloc được gọi thì xin memory từ system .
Trường hợp này có thể memory không trả về cho system. Lúc này chương trình sẽ bị gọi là có memory
leak.Như vậy sau vài lần chạy sẽ ko còn memory để cấp phát nữa
( Theo chuẩn C99 thì malloc luôn phải có free)
Vì vậy ta sẽ giải phóng toàn bộ bộ nhớ đã cấp phát cho danh sách
Ta sẽ dùng ý tưởng xóa nút đầu tiên trong danh sách để xóa danh sách :
Trong khi head khác rỗng thì xóa head

2. Thuật toán
Bước 1 : Khai báo con trỏ p kiểu node và cho p trỏ vào đầu danh sách
Bước 2 : Nếu p!=NULL thì sang bước 3, ko thì kết thúc thuật toán
Bước 3 : Cho head trỏ vào nút liền sau head hiện tại
Bước 4 : giải phóng bộ nhớ cho con trỏ p ( đang trỏ vào head cũ )
Bước 5 : gán p=head hiện tại rồi về bước 2.





3. Cài đặt

[CODE]
void xoads(list &ds)
{
   node *p=ds.head;
   while (p!=NULL)
   {
       ds.head=ds.head->next;
       free(p);
       p=ds.head;
   }
}


[/CODE]


4. Đánh giá độ p hức tạp của giải thuật
==> Vậy độ phức tạp của giải thuật là O(n)

IV. Lập trình
Check file CTDLdemo.cpp.
Sơ bộ hàm main:

[CODE]void main(void)     // đây chỉ là bản demo
{
do
{
        clrscr();
        printf("*------------Menu------------*\n");
        printf("1. Nhap du lieu\n");
        printf("2. Hien thi danh sach\n");
        printf("3. Sap xep danh sach\n");
        printf("4. Them mot nhan vien moi\n");
        printf("5. Xoa mot nhan vien\n");
        printf("6. Sua thong tin mot nhan vien\n");
        printf("7. Xem thong tin ve mot nhan vien\n");
        printf("8. Xem bang luong cua toan the nhan vien\n");
        printf("9. Thoat");
        printf("\nDanh sach hien tai ");hienthids(triduc);
        printf("\n\nNhap vao lua chon cua ban : \n");
        switch(getch())
        {
                  case '1' : nhap(triduc);break;
                  case '2' : hienthids(triduc);break;
                  case '3' : sapxep(triduc);break;
                  case '4' : themnv(triduc);break;
                  case '5' : xoanut(triduc);break;
                  case '6' : suanut(triduc);break;
                  case '7' : hienthinv(triduc);break;
                  case '8' : hienthids(triduc);break;
                  case '9' : xoads(triduc);exit(0);
        }
}
while(1);
}[/CODE]

Định hướng phát triển

I. Đánh giá chương trình
Sơ bộ :
Chương trình đã giải quyết tương đối với yêu cầu , mục đích đề ra của bài toán ( một bài tập cấu trúc dữ liệu lớn
về danh sách liên kết ).
Ưu điểm : 
- Tin cậy : Cấu trúc dữ liệu đã đạt đúng tiêu chuẩn (phản ánh đúng thực tế, phù hợp với thao tác xử lý, tiết kiệm tài nghuyên hệ thống ). Chương trình chạy đúng , mô tả đúng giải thuật, đúng với yêu cầu đề ra của bài toán ( tính tin cậy )
- Trong sáng : Các module trong chương trình đều đạt được đến độ phức tạp thấp nhất giúp cộng thêm code conversion hợp lý giúp cho code dễ đọc, dễ hiểu và nắm bắt ý tưởng
- Uyển chuyển : chương trình được tách ra làm nhiều module nhỏ(nhưng đều có tác dụng hữu ích cụ thể ), các module đều có độ phức tạp thấp, nên việc debug hoặc thay đổi là tương đối đơn giản
- Hữu hiệu : Xét về khía cạnh bài tập thì chương trình đạt đến độ hữu hiệu tương đối ( nhưng xét về góc độ ứng dụng thì....)
- Bộ nhớ : So với kĩ năng sử dụng mảng thì sử dụng dach sách liên kết có phần linh động hơn. Trong mảng thì yêu cầu tất cả các phần tử phải liên tiếp nhưng với danh sách liên kết thì các phần tử là rời rạc nhau dẫn đến ít khả năng ko cấp phát được hơn và ta sử dụng đến đâu cấp phát đến đấy sẽ ko lãng phí bộ nhớ
Nhược điểm :
Chương trình còn đơn giản với những nhược điểm sau đây :

Nhập : tất cả việc nhập đều dùng các hàm chuẩn của C vì thế có
thể sinh lỗi trong quá trình nhập nếu người nhập nhập sai kiểu dữ
liệu. Vẫn có thể nhập tên trùng, mã nhân viên trùng nhau
 Lưu trữ : Sau khi kết thúc chương trình thì toàn bộ danh sách đã
nhập sẽ mất. Nhược điểm này sẽ làm giảm bớt tính hữu dụng của
chương trình
 Ngôn ngữ : Vấn đề về ngôn ngữ là 1 vấn đề khá lớn với việc phát
triển phần mềm tại việt nam. Bộ font Unicode ra đời đã thay đổi
tình hình của vấn đề. Tuy nhiên tất cả các IDE C lại ko hỗ trợ vấn
đề về ngôn ngữ
 Tính mềm dẻo( hay còn được coi là độ dễ tính ) : tức là mức độ
của cách thức xử lý của trương trình trước những tình huống ngoài
dự tính (AI-Artificial Intelligence). Chương trình xử lý được những
tình huống ngoài dự tính 1 cách thông minh và hiệu quả thì được
coi là dễ tính, chương trình càng dễ tính thì càng thân thiện với
người sử dụng. Chương trình trên lại hoàn toàn ko có điều này

 Tổ chức bộ nhớ: Bộ nhớ vừa là ưu điểm vừa là nhược điểm của
chương trình. Chương trình C nằm gọn trong 1 segment có độ lớn
max là 64KB (code + data + heap + stack nằm gọn trong 1
segment). Như thế cái lợi là khi call function thì c hỉ cần dùng call
near, c hỉ cần offset thôi, không cần đổi giá trị của segment nên
chạy nhanh. Cái hại là chuơng trình không thể lớn.
 Chương trình được viết bằng ngôn ngữ C (đơn nhiệm , tuần tự ),
được biên dịch bằng compiler của hãng borland :Turbo C hoặc
Borland C nên chương trình chạy trên nền NTVDM.exe ( NT
Virtual DOS Machine ). Bản thân NTVDM là chương trình tạo máy
ảo 16 bit trên Windows 32 bit, nó được xem như là 1 tiến trình hệ
thống nên tuy nó tốn ít tài nguyên ram nhưng lại chiếm dụng tài
nguyên hệ thống lớn 1 cách vô ích : 95% với CPU đơn nhiệm, 50%
với CPU dual core và core 2 duo, 25% với CPU core quad. Vì vậy
tuy là 1 chương trình nhỏ nhưng nó ko hề nhẹ tí gì. Điều này sẽ
hạn chế k hả năng chương có thể đi từ góc độ bài tập sang thực tế
ứng dụng
 Giao diện của chương trình DOS ko thân thiện ( một trong những
yếu tố quan trọng quyết định sự thành bại của chương trình )

II. Final version
Trước những vấn đề đặt ra, ưu điểm thì ít nhưng nhược điểm thì quá nhiều, vì vậy final
ver đã ra đời với các update sau :
Sửa lỗi việc nhập, giúp cho việc nhập hoàn thiện hơn đúng đắn hơn :
- Chuẩn hóa việc nhập số nguyên: không bị bất kì bug nào khi nhập
số nguyên như gõ nhầm chữ cái, nhầm số thực........., không vượt
quá các mốc cho phép nhập,....
- Chuẩn hóa việc nhập xâu kí tự : Không nhập vượt quá được xâu kí
tự, tình trạng gia đình chỉ có thể nhập S hoặc M, tên ko có số và kí
tự đặc biệt,kết quả công việc ko nhập sai được.......
- Nhập xong sẽ được chuẩn hóa tên
- Và nhiều nâng cấp có hữu ích khác trong việc nhập
Có tạo được cơ sở dữ liệu riêng nhằm lưu lại danh sách sau khi thoát, tuy
nhiên còn rất sơ giản và chưa thực sự hiệu quả
Có sự nâng cấp về ngôn ngữ : nhập, xuất tiếng việt
Có sự nâng cấp về giao diện giúp tăng tính thân thiện giữa người và máy
Có thêm 1 số hotkey
Kiểm tra file CTDLfinal.cpp để biết thêm chi tiết

III. Định hướng phát triển
Việc tin học hoá tổ c hức quản lý nhân sự mang lại nhiều lợi ích hơn so với quản
lý thủ công. Quản lý thông tin về cán bộ, công nhân viên là một bài toán quan
trọng và có nhiều ứng dụng trong việc quản lý nguồn nhân lực, chính sách cán
bộ... nhằm đưa ra các quyết định trong lĩnh vực xây dựng đội ngũ lao động đủ
khả năng và trình độ đáp ứng các nhu cầu trong giai đoạn mới.
Trên thị trường phần mềm việt nam hiện nay có rất nhiều phần mềm q uản lý
nhân sự, nhưng lại chưa có sảm phẩm nào chiếm được sự thông dụng và nổi
trội. Một số sảm phẩm được giải thưởng và được đề cao nhưng đang chỉ dừng
lại ở mức giải thưởng . Thêm vào đó mỗi công ty lại có những đặc tính công việc
khác nhau nên việc quản lý nhân sự cũng có nhiều thay đổi so với mỗi công ty.
Vì vậy cơ hội đang là chia đều cho mọi người.
Quản lý nhân sự - phần mềm việt dành cho người việt. Một phần mềm của
người việt và được phục vụ rỗng rãi tại việt nam.

Để đến được cái đích đó cần có nhiều thay đổi, nâng cấp cực kì lớn về góc độ
lập trình và góc độ người sử dụng như
1. Chương trình sẽ được viết lại bằng ngôn ngữ cấp cao hơn, có hộ trỡ lập
trình GUI, có hỗ trợ unicode và sảm phẩm cuối cùng là 1 chương trình 32
bit hoặc 64 bit
2. Tìm kiểu cấu trúc dữ liệu thật sự hợp lý, có thể lưu trữ hàng nghìn đến
chục nghìn nhân viên có nhiều thông tin chi tiết hơn nhưng các thao tác
với nó có chi phí thấp nhất. Tuy danh sách liên kết rất hay nhưng nó lại
xin bộ nhớ trực tiếp từ RAM, như thế sẽ làm giảm hiệu quả của ct vì chi
phí hệ thống quá cao.
3. Chương trình cần hệ thống cơ sở dữ liệu tốt hơn, an toàn hơn hộ trợ
nhiều truy vấn (ví dụ các nhân viên có thể xem tình hình, trạng thái, kết
quả làm việc hàng tháng )
4. Và rất nhiều thay đổi khác nhằm mang chương đến với thực tế và đến với
người sử dụng
Và nó cũng rất cần những yếu tố tiềm ẩn mang đến thành công sau :

1. Đột phá ý tưởng : năm 1994 yahoo được sáng lập, và tuy là sinh sau đẻ
muộn so với window messenger ( ngày nay là window live messenger)
vốn dĩ có rất nhiều ưu thế của Microsoft ( lợi thế đặc biệt nhất chính là 1
sảm phẩm gắn chặt với dòng sảm phẩm nổi tiếng microsoft window) .
Ngày nay , Theo Alexa Internet và Netcraft (hai công ty chuyên về thống
kê lưu lượng Web) Yahoo! là website được nhiều người coi thứ hai hiện
giờ ( sau Google). Sự thành công của yahoo mang lại từ ý tưởng.
2. Tính hiệu quả của chương trình : thể hiện ở độ “thông minh” của
chương trình và quan trọng nhất là kết quả của chương trình mang lại.
Năm 1996, google ra đời trong bối cảnh chỉ là “đàn em” so với dịch vụ tìm
kiếm của Yahoo và MSN... Sự thành công của Google mang lại nhờ 2 yếu
tố đó là đơn giản và hiệu quả.
3. Sự đơn giản trong cách sử dụng : đó là sự đơn giản trong cách sử
dụng. Điều này đã mang đến sự thành công cho google và cả microsoft (1
trong những điều khiến người sử dụng yêu thích window hơn linux chính
là vì sự đơn giản trong cách sử dụng) .
4. Giao diện thân thiện, đẹp mắt : điều này đã mang lại thành công bất
ngờ cho window xp ra đời năm 2001
........................................
Hãy đón xem ý tưởng này sẽ trở thành như thế nào trong tương lai ko xa!
Nguồn: wWw.kenhdaihoc.com - Trích: Bài toán quản lý nhân viên – Bùi Tấn Quang – Cn1k7d1

Những điểm cần lưu ý khi học một ngôn ngữ lập trình

02:06 |
Nếu bạn đang thích thú muốn học lập trình, thì bạn hãy suy nghĩ 5 câu hỏi sau để trả lời và đó sẽ là hành trang theo bạn, giúp bạn lựa chọn ngôn ngữ lập trình thích hợp cho mình:
Tại sao tôi học lập trình?
Nếu mục tiêu của bạn là học để lập trình, hãy tìm những ngôn ngữ dạy các nguyên tắc cơ bản như Lisp (hay Scheme), Ruby hay Smalltalk. Bạn sẽ bỏ qua hầu hết các ngôn ngữ phát triển chính để học một trong các ngôn ngữ mang tính giáo dục hơn, đồng thời tìm một người có thể làm gia sư cho mình.
Nếu bạn đang thử trở thành một lập trình viên giỏi, một ngôn ngữ giáo dục sẽ rất có ích cho bạn. Bên cạnh đó, bạn có thể thử một loại khác, đặc biệt nếu nó có sự biến hóa riêng không giống như cái bạn đang sử dụng.

Nếu bạn đang tạo lập sự nghiệp, bạn phải dựa vào quyết định của mình trong cơ chế thị trường. Hãy nhìn những bản tin tìm việc và yêu cầu của nó (loại hình làm viẹc, địa điểm, lương, kinh nghiệm,….). Bạn nên tìm hiểu kỹ tính năng và rèn luyện kỹ năng cho từng loại ngôn ngữ khác nhau. Nếu bạn nghĩ mình sẽ rất cực khổ thì hãy xác định lại mục tiêu của sự nghiệp. Nếu bạn chỉ muốn vui vẻ hay làm các ứng dụng cá nhân, thì hãy học bất cứ cái gì bạn muốn….


Kế hoạch học tập của tôi như thế nào?


Kế hoạch tìm hiểu và phong cách học sẽ ảnh hưởng đến ngôn ngữ mà bạn chọn. Nhiều ngôn ngữ không chính thức có rất ít sách để học. Dù thế nào thì bạn vẫn muốn được cảm giác thoải mái trong cộng đồng trực tuyến của ngôn ngữ, nhưng cũng có vài rắc rối như cách họ chào đón người mới như thế nào, có nhiều câu hỏi không được giải đáp không….. Một ngôn ngữ lập trình có tài liệu nghèo nàn và cộng đồng không hữu ích có thể làm bạn chìm xuống nhanh chóng.


Những bộ công cụ, thư viện và framework nào hỗ trợ cho ngôn ngữ lập trình?


Nhiều người thích làm việc với IDE, số khác cảm thấy thích thú với basic text editor. Dù phong cách của bạn thế nào, thì phải chắc rằng có đủ công cụ để hỗ trợ, bảo đảm các thư viện và framework hỗ trợ cho ứng dụng của bạn. Lấy ví dụ bạn muốn viết một ứng dụng khoa học, việc kiểm tra sự tồn tại các thư viện về toán học sẽ giúp bạn không mất thời gian với các hàm cơ bản.


Tôi đã có kế hoạch chưa?


Nếu bạn đã có ý tưởng sẵn trong đầu, nó sẽ ảnh hưởng đến loại ngôn ngữ lập trình mà bạn chọn, có loại ngôn ngữ sử dụng cho ứng dụng này sẽ tốt hơn những loại khác. Hãy nhìn các ứng dụng gần giống với cái của bạn, và thử tìm ngôn ngữ mà người viết sử dụng cũng như lý do tại sao mà họ lại chọn nó. Từ đó bạn sẽ tự tìm được ngôn ngữ cho mình.


Tôi có sẵn sàng để bắt đầu trên một con đường mà ít người biết đến?


Bạn có thể sử dụng một ngôn ngữ lập trình hoàn toàn mới mẻ. Đối với sự phát triển của cá nhân, đó không là vấn đề, nhưng nhiều môi trường phát triển xem nó là một nguy cơ; đặc biệt trong một những ngôn ngữ này có thể hạn chế lựa chọn nghề nghiệp của bạn sau này, hoặc chủ của bạn không đồng ý để bạn làm việc với các ngôn ngữ này. Ở một mặt khác, mỗi ngôn ngữ bạn học sẽ dạy cho bạn nhiều thứ mới về lập trình, cho dù bạn không sử dụng thường xuyên.


Kết luận


Việc học một ngôn ngữ lập trình mới có thể mang lại phần thưởng là kinh nghiệm, nhưng quan trọng là không lãng phí thời gian của bạn. Việc lựa chọn ngôn ngữ lập trình không phải lúc nào cũng dễ dàng, và có vài thứ mà bạn không thích về nó.Với những lưu ý trên, bạn hãy quyết định đúng đắn ngôn ngữ lập trình nào thích hợp với mục tiêu và yêu cầu của mình.
CTV UITnetwork

Các đơn vị đo dung lượng lưu trữ thông tin trên máy tính

21:26 |
Ngành khoa học máy tính phát triển ngày càng mạnh mẽ với tốc độ chóng mặt, công nghệ thông tin đang dần len lỏi vào từng ngóc ngách của đời sống xã hội, nhu cầu lưu trữ thông tin của con người càng gia tăng. Theo đó thì dung lượng lưu trữ của những chiếc đĩa cứng ngày càng tăng dần và xuất hiện nhiều đơn vị đo dung lượng lưu trữ thông tin hơn. Dưới đây là một số đơn vị đo dung lượng lưu trữ thông tin.

MỘT SỐ ĐƠN VỊ ĐO DUNG LƯỢNG LƯU TRỮ CỦA MÁY TÍNH
CÁC BỘI SỐ CỦA BYTE
Tên gọi
(Theo chuẩn SI)
Kí hiệuBiểu diễn dạng thập phân
(Theo chuẩn SI)
Biểu diễn dạng nhị phân
(Theo chuẩn phần mềm)
KilobyteKB103210
MegabyteMB106220
GigabyteGB109230
TerabyteTB1012240
PetabytePB1015250
ExabyteEB1018260
ZettabyteZB1021270
YottabyteYB1024280
XonabyteXB1027290
WekabyteWB10302100
VundabyteVB10332110
UdabyteUB10362120
TredabyteTDB10392130
Sortabyte
10422140
Rintabyte
10452150
Quexabyte
10482160
Peptabyte
10512170
Ochabyte
10542180
Nenabyte
10572190
Mingabyte
10602200
Lumabyte
10632210

Byte là một đơn vị lưu trữ dữ liệu cho máy tính, gồm 1 dãy số liền nhau của một số bit cố định. Trong đại đa số các máy tính hiện đại, 1 byte có 8 bit.Kilobyte (xuất phát từ kilo-, có nghĩa là 1.000) là một đơn vị thông tin hoặc lưu trữ máy tính bằng với hoặc là 1.000 byte hoặc 1.024 byte (210), tùy vào ngữ cảnh.

  • 1 KB=1000 byte (103): Định nghĩa này gắn liền với tiền tố SI, và được khuyến khích sử dụng bởi tất cả các tổ chức tiêu chuẩn quốc tế như IEC, IEEE, và ISO.
  • 1 KB=1024 byte (210): Định nghĩa này luôn luôn được dùng để chỉ dung lượng chip bộ nhớ, và những lượng số khác dựa trên lũy thừa 2. Phần lớn phần mềm sử dụng nó để chỉ dung lượng lưu trữ. Định nghĩa này đã bị cấm tuyệt đối theo tiêu chuẩn SI, và từ năm 1998, phần lớn các tổ chức tiêu chuẩn đề nghị sử dụng thuật ngữ thay thế kibibyte (KiB). Mặc dù từ “kibibyte” ít khi nhìn thấy trong thực tế, nó đang bắt đầu được dùng bởi vài phần mềm, như BitTorrent hay Linux kernel.
Dung lượng của thiết bị lưu trữ máy tính được quảng cáo, từ trước đến nay luôn sử dụng giá trị tiêu chuẩn SI. Do đó khi mua các thiết bị lưu trữ về, kiểm tra dung lượng bằng phần mềm ta thấy luôn bị hao hụt so với quảng cáo của nhà sản xuất.
(Sưu tầm và tổng hợp)