Entradas populares

Menu và MenuItem trong XAML

Tìm hiểu tổng quan nào!                                                                                                                         Menu
Control Menu được kế thừa từ lớp HeaderedItemsControl, chứa các item theo chiều ngang và có background mặc định là màu xám. Thuộc tính để Menu trở thành menu chính là IsMainMenu. Có một điểm khá thú vị đối với Menu, hãy khám phá nó bằng cách mở một cửa sổ lên (ví dụ như Word) và nhấn phím F10 hoặc ALT nhé!
MenuItem
MenuItem cũng được kế thừa từ lớp HeaderedItemsControl. Thuộc tính Header của nó dùng để biểu diễn phụ đề của Menu. Những item của MenuItem chính là những menu con. Thuộc tính Icon góp phần diễn tả nội dung của item, được đặt bên trái của phụ đề.

Khám phá bên trong thôi!                                                                                                                      
Khám phá 1
Tạo Menu như sau

Dưới đây là ví dụ tạo menu File và Edit.

      a.      Hãy tạo các menu còn lại (View, Window, Help).
      b.      Nếu bỏ dòng tạo Menu ra (tức bỏ dòng 1 và 4 trong code trên) thì chuyện gì sẽ xảy ra?
      Khám phá 2

Vẫn tiếp tục với Khám phá 1, dưới đây là ví dụ tạo MenuItem Cut.


Sau khi debug và test chương trình, tôi tin chắc rằng các bạn sẽ thắc mắc một vài câu hỏi, để làm sáng tỏ hãy thực hiện những yêu cầu sau để nắm chắc kiến thức hơn nhé.
a.      Hãy thay đổi Command bằng nội dung bất kỳ (ví dụ Command = “xaml”) thì chuyện gì sẽ xảy ra?
b.      Qua file *.xaml.cs và gõ ApplicationCommands.Cut, hãy liệt kê một vài command khác trong lớp ApplicationCommands?

Lớp ApplicationCommands cung cấp các command có sẵn, khá quen thuộc với chúng ta như New, Open, Cut, Copy, Paste..., khi gán Command của MenuItem thì tên command đó phải có trong lớp dựng sẵn, khi thực thi nó sẽ tạo nhãn dán hotkey tương ứng. Ví dụ như Cut thì là Ctrl+X. Tuy nhiên, khi chạy code trên, chương trình không cho phép chọn MenuItem Cut. Để có thể thực thi ta cần tạo các handle tương ứng là CanExecute và Executed. Hãy xem ví dụ dưới đây.
File *.xaml

File *.xaml.cs

Lưu ý: hàm Cut_Excecuted chỉ được thực hiện khi giá trị CanExecute = true thôi.
Code trong 2 hàm trên chỉ ở dạng đơn giản, sau này khi viết ứng dụng nào đó, các bạn sẽ viết cụ thể hơn chắc năng của nó.

Hãy test thử khi click vào Cut và khi nhấn Ctrl+X, xem thử kết quả nhận được có giống nhau không nhé. Và cũng đừng quên tạo các MenuItem còn lại!
Khám phá 3
Để cho phép người dùng tick vào một item nào đó, ta truy cập đến thuộc tính IsCheckable của MenuItem và gán giá trị bằng True.
Để tạo Separators, chỉ cần thêm lệnh đơn giản <Separotor/>.

Dưới đây là ví dụ tạo New với Checkable + Separator + Open trong Menu File.

      a.      Hãy thêm thuộc tính Checkable = “True” vào MenuItem New và xem kết quả.
      b. Tạo các MenuItem còn lại như hình.
      
     Nguồn tham khảo:  www.wpftutorial.net www.wpf-tutorial.com

Đề ACM




Kết quả hình ảnh cho cuộc thi acm/icpc
Bài A: Nghỉ trưa
Giới hạn thời gian mỗi test: 2 seconds

         Sau cuộc thi, các chú thỏ quyết định ăn trưa. Các chú thỏ có k đơn vị thời gian cho việc
ăn trưa.
         Các chú thỏ có 1 danh sách n nhà hàng để ăn trưa: nhà hàng thứ i được mô tả bằng 2 số
nguyên fi và ti. Trong đó ti là thời gian để các chú thỏ ăn trưa ở nhà hàng i. Nếu ti vượt
quá k thì thời gian ăn mừng là fi - (ti – k). Ngược lại, thời gian ăn mừng sẽ là fi.
Nhiệm vụ của bạn là tìm giá trị thời gian ăn mừng lớn nhất có thể. Các chú thỏ phải chọn
1 nhà hàng để ăn. Lưu ý, kết quả không cần thiết phải là số dương.
Kết quả hình ảnh cho hinh tho hoat hinh

Input
Dòng đầu tiên là t - số test (1 <= t <= 25)
Trong mỗi test, dòng đầu là số n (1 <= n <= 10^4) và số k (1 <= k <= 10^9). Mỗi dòng trong số n dòng tiếp theo chứa 2 số nguyên fi và ti (1 <= fi <= 10^9, 1 <= ti <= 10^9).
Output
Với mỗi test, in ra 1 số nguyên duy nhất trên một dòng - thời gian ăn mừng lớn nhất có thể của chú thỏ.
Sample test(s)
Input
1
2 5
3 5
4 5
Output
4


Bài B: Trò chơi
Giới hạn thời gian mỗi test: 2 seconds
             Bạn tham gia 1 trò chơi với Alice và Bob. Đầu tiên Alice và Bob mỗi người viết 1 chuỗi 
chỉ chứa kí tự “0” và “1”. Gọi 2 chuỗi đó là a và b tương ứng. Sau đó bạn cố gắng biến 
đổi a thành b sử dụng 2 phép biến đổi sau:
Kết quả hình ảnh cho day nhi phan
  •  Viết parity của a vào cuối a. Ví dụ 1010 → 10100
  •  Bỏ kí tự đầu tiên của a. Ví dụ 1001 → 001. Bạn không thể thực hiện phép biến đổi này nếu a rỗng.

             Bạn có thể dùng không giới hạn số lượng phép biến đổi. Yêu cầu là có thể biến đổi a 
thành b không? Biết parity của chuỗi a là 1 nếu số lượng kí tự “1” trong chuỗi a là lẻ, 
ngược lại là 0.

Input
Dòng đầu tiên là số test (1 <= t <= 25).
Mỗi test có 2 dòng. Dòng đầu tiên chứa chuỗi không rỗng a và dòng tiếp theo chứa chuỗi b. Độ dài của 2 chuỗi này không quá 1000. Cả 2 chuỗi chỉ chứa kí tự "0" và "1".
Output
Xuất "YES" nếu kết quả là có thể biến đổi a thành b và "NO" nếu ngược lại.
Sample test(s)
Input
2
01011
0110
0011
1110
Output
YES
NO
Giải thích
Trong test đầu tiên, các bước biến đổi: 01011 -> 1011 -> 011 -> 0110



Bài E: Số 5
Giới hạn thời gian mỗi test: 2 second
             Có 1 chuỗi B có n chữ số. Nguyên muốn xóa m chữ số (0≤ m<n) để tạo thành 1 số ma 
thuật, là số chia hết cho 5. Lưu ý, kết quả có thể là số bắt đầu bằng số 0.
Nguyên muốn đếm số cách thực hiện điều đó và mod 1000000007.
2 cách thực hiện là khác nhau nếu tập các vị trí xóa là khác nhau.

Kết quả hình ảnh cho hinh so 5
Input
Dòng đầu tiên là t - số test (1 <= t <= 20).
Tiếp theo là t test. Mỗi test gồm: dòng đầy là chuỗi a không rỗng có độ dài không quá 100000, chỉ chứa chữ số, dòng tiếp theo là số nguyên dương k (1 <= k <= 10^9). Chuỗi b gồm k chuỗi a ghép lại.
Output
In ra kết quả, mỗi test 1 dòng.
Sample test(s)
Input
2
1256
1
13990
2
Output
4
528 
Giải thích
Trong test đầu tiên, có 4 cách tạo ra số ma thuật là: 5, 15, 25, 125.
Trong test tiếp theo, chuỗi b là: 1399013990.

Cây nhị phân tìm kiếm cân bằng (AVL)

Cây AVL là cây nhị phân tìm kiếm sao cho tại mỗi node, chiều cao của nhánh phải và nhánh trái chênh lệch nhau không quá 1.
Chỉ số cân bằng bf = Chiều cao nhánh trái  - Chiều cao nhánh phải
=> bf = { 0; 1; -1}
Vì tính chất như vậy nên mỗi khi chèn node vào ta phải chỉnh sửa lại chỉ số cân bằng của các node, và nếu như tại node nào đó chỉ số bf không thỏa (cây bị lệch sang 1 bên) thì ta tiến hành xoay cây về bên còn lại.
Ta sẽ có lệch trái và lệch phải, tương ứng với xoay phải, xoay trái.
- Lệch trái gồm 3 trường hợp: lệch trái - trái, lệch trái - phải, lệch trái - cân  bằng.
- Lệch phải gồm 3 trường hợp: lệch phải - phải, lệch phải - trái, lệch phải - cân bằng.
Ta xét các ví dụ về lệch phải:
- Lệch phải - phải: p->bf = -2  &&  q->bf = -1
















- Lệch phải - trái: p->bf = -2 && q->bf = 1















- Lệch phải - cân bằng: p->bf = -2 && q->bf = 0


Ta xét thêm 2 ví dụ nữa:





























Cài đặt cây AVL
          1. Định nghĩa lại node:
struct Node
{
int Info, bf;
Node *pLeft, *pRight;
};
          2. Các hàm xoay trái và phải:
              Để hiểu được code, ta cần xem kĩ lại những ví dụ ở trên.
void RotateLeft(Tree &p)
{
Tree q = p->pRight;
Tree r = q;
if(q->bf == 1)
{
r = q->pLeft;
q->pLeft = r->pRight;
r->pRight = q;
}
p->pRight = r->pLeft;
r->pLeft = p;
p = r;
if(r == q)
p->pLeft->bf = p->pRight->bf = 0;
else
{
switch(p->bf)
{
case 0:
p->pLeft->bf = p->pRight->bf = 0;
break;
case 1:
p->pLeft->bf = 0;
p->pRight->bf = -1;
break;
case -1:
p->pLeft->bf = 1;
p->pRight->bf = 0;
break;
}
}
p->bf = 0;
}

void RotateRight(Tree &p)
{
Tree q = p->pLeft;
Tree r = q;
if(q->bf == -1)
{
r = q->pRight;
q->pRight = r->pLeft;
r->pLeft = q;
}
p->pLeft = r->pRight;
r->pRight = p;
p = r;
if(r == q)
p->pLeft->bf = p->pRight->bf = 0;
else
{
switch(p->bf)
{
case 0:
p->pLeft->bf = p->pRight->bf = 0;
break;
case 1: 
p->pLeft->bf = 0;
p->pRight->bf = -1;
break;
case -1:
p->pLeft->bf = 1;
p->pRight->bf = 0;
break;
}
}
p->bf = 0;
}
             Dù là lệch bên nào thì sau khi xoay xong: p->bf = 0;

          3. Chèn node:

int InsertNode(Tree &tree, int x)
{
int k;
if(tree)
{
if(x == tree->Info)
return -1;
if(x < tree->Info)
{
k = InsertNode(tree->pLeft, x);
if(k == 1)
{
switch(tree->bf)
{
case 0: tree->bf = 1; return 1;
case -1: tree->bf = 0; return 0;
case 1: RotateRight(tree); return 0;
}
}
}
else
{
k = InsertNode(tree->pRight, x);
if(k == 1)
{
switch(tree->bf)
{
case 0: tree->bf = -1; return 1;
case 1: tree->bf = 0; return 0;
case -1: RotateLeft(tree); return 0;
}
}
}
}
else
{
tree = GetNode(x);
if(tree == NULL)
return -1;
return 1;
}
}

Buscar

 

About

Something in IT Copyright © 2011 | Tema diseñado por: compartidisimo | Con la tecnología de: Blogger