Mẫu form
Trong này em copy code phần script chạy số và phần linear-gradient của nút Submit cô nhé :d
GC 1007 - Trịnh Bách
Thứ Năm, 2 tháng 4, 2015
Chủ Nhật, 29 tháng 3, 2015
Thứ Ba, 17 tháng 3, 2015
Thứ Năm, 5 tháng 2, 2015
Day 6 - Mảng và Tìm kiếm sắp xếp trong mảng - Phần 2 : Mảng kí tự và thuật toán sắp xếp, tìm kiếm.
V. Mảng ký tự
Mảng ký tự mang kiểu dữ liệu char.char str[10] = { 'c', 'h', 'a', 'o', '!' };
Trong mảng str trên thì mỗi ký tự nằm ở một thành phần. Kể cả khoảng trắng ' ' cũng được tính là 1 ký tự. Nếu dữ liệu không sử dụng đủ các index trong mảng thì các thành phần đó mang giá trị rỗng '\0'.
Đảo ngược vị trí các ký tự trong mảng.
Đếm số từ trong 1 câu.
Đếm số chữ số trong dãy kí tự.
VI. Tìm kiếm và sắp xếp
Tìm kiếm trong mảng là thuật toán so sánh giá trị nhập vào với từng giá trị trong mảng. Nếu trùng với giá trị trong mảng, hành động sẽ được thực hiện.
Tìm kiếm các ký tự - và thay bằng ký tự _
Sắp xếp trong mảng là thuật toán so sánh các giá trị trong mảng và đổi vị trí cho nhau tùy thuộc yêu cầu bài toán.
Thuật toán INSERT sử dụng bộ nhớ đệm để sắp xếp các số theo thứ tự giảm dần
Còn rất nhiều thuật toán khác như Merge, Quick, Bubble, ... để sắp xếp mảng một cách tối ưu nhất.
VII. Kết
Mảng là một khái niệm khá hữu ích, nó và vòng lặp là những công cụ hữu hiệu giúp cắt ngắn thời gian thực hiện các tác vụ so sánh, tính toán .
Day 6 - Mảng và Tìm kiếm sắp xếp dữ liệu trong mảng - Phần 1: Mảng
ARRAY - Mảng
I. Mảng là gì ?
Mảng là tập hợp của các dữ liệu có chung kiểu như int hay char. Mình sẽ nói về mảng 1 chiều ở bài này thôi, mảng đa chiều tính sau. Mảng với n thành phần luôn bắt đầu bằng thành phần 0 và kết thúc ở thành phần n-1. 0 và n-1 được gọi là giới hạn - bounds của mảng.
int num[10] = { 2, 25,37343, 232, 1265, 45543}
Với 1 mảng ví dụ như trên, mảng có 10 thành phần. "2" sẽ nằm ở thành phần 0, mảng đã xác định trước 6 thành phần. 4 thành phần còn lại còn trống, có thể được thêm sau này. Cần lưu ý rằng nếu index - số thứ tự thành phần vượt quá giới hạn, sẽ có những lỗi xảy ra tùy theo các compiler khác nhau.
- storage class: Lớp lưu trữ. Có 4 lớp trong C là automatic, register, static và external.
+external dùng để định nghĩa mảng ngoài hàm và automatic để định nghĩa mảng nằm trong hàm.
+Mặc định lớp automatic sẽ được sử dụng cho mảng ( và biến ).
+static sẽ khiến cho mảng tồn tại đến khi chương trình kết thúc, còn các lớp khác sẽ biến mất sau khi không được sử dụng nữa.
+register thì đặt biến ngay trong CPU, nhằm mục đích truy cập tốc độ siêu nhanh ( gấp nhiều lần bộ nhớ ). register chỉ sử dụng được với biến.
- Data type : Kiểu dữ liệu. Mảng chỉ có thể lưu được 1 kiểu dữ liệu duy nhất cho tất cả các thành phần của nó. int char double float là 4 kiểu dữ liệu được sử dụng trong mảng, không dùng void
- array name: Cái này tương tự như đặt tên biến, chả khác gì.
- array size: Độ lớn của mảng, đây là cái khác biệt nhất so với cả xác định 1 biến. Đây là tổng số thành phần mà mảng có thể lưu trữ được.
- num[0] , num[9-2] , num[18/3], num[i], ....
index trong mảng bắt buộc là số nguyên dương. Còn lại việc chúng ta xác định index thế nào thì thoải mái, miễn sao nó là số nguyên dương.
Khác với biến, chúng ta không thể trực tiếp so sánh và tương tác 2 mảng dù chúng có giống nhau đến mấy. Chúng ta chỉ có thể tương tác giữa những thành phần trong mảng: so sánh, gán giá trị, ....
int num[10] = { 2, 25,37343, 232, 1265, 45543}
Chèn thêm giá trị V vào bất kì vị trí nào trong mảng.
Với 1 mảng ví dụ như trên, mảng có 10 thành phần. "2" sẽ nằm ở thành phần 0, mảng đã xác định trước 6 thành phần. 4 thành phần còn lại còn trống, có thể được thêm sau này. Cần lưu ý rằng nếu index - số thứ tự thành phần vượt quá giới hạn, sẽ có những lỗi xảy ra tùy theo các compiler khác nhau.
1 mảng 2 chiều với i, j để xác định vị trí thành phần. nguồn bcdonline.net
II. Xác định 1 mảng
Để xác định 1 mảng, chúng ta cần xác định những tính chất sau của mảng:- storage class: Lớp lưu trữ. Có 4 lớp trong C là automatic, register, static và external.
+external dùng để định nghĩa mảng ngoài hàm và automatic để định nghĩa mảng nằm trong hàm.
+Mặc định lớp automatic sẽ được sử dụng cho mảng ( và biến ).
+static sẽ khiến cho mảng tồn tại đến khi chương trình kết thúc, còn các lớp khác sẽ biến mất sau khi không được sử dụng nữa.
+register thì đặt biến ngay trong CPU, nhằm mục đích truy cập tốc độ siêu nhanh ( gấp nhiều lần bộ nhớ ). register chỉ sử dụng được với biến.
- Data type : Kiểu dữ liệu. Mảng chỉ có thể lưu được 1 kiểu dữ liệu duy nhất cho tất cả các thành phần của nó. int char double float là 4 kiểu dữ liệu được sử dụng trong mảng, không dùng void
- array name: Cái này tương tự như đặt tên biến, chả khác gì.
- array size: Độ lớn của mảng, đây là cái khác biệt nhất so với cả xác định 1 biến. Đây là tổng số thành phần mà mảng có thể lưu trữ được.
III. Sử dụng mảng
Sau khi đã xác định mảng, chúng ta có thể gọi ra các thành phần trong mảng như sau:- num[0] , num[9-2] , num[18/3], num[i], ....
index trong mảng bắt buộc là số nguyên dương. Còn lại việc chúng ta xác định index thế nào thì thoải mái, miễn sao nó là số nguyên dương.
Index trong mảng luôn luôn là số dương.
Khác với biến, chúng ta không thể trực tiếp so sánh và tương tác 2 mảng dù chúng có giống nhau đến mấy. Chúng ta chỉ có thể tương tác giữa những thành phần trong mảng: so sánh, gán giá trị, ....
Sử dụng phép so sánh các giá trị trong mảng để tìm ra số lớn nhất.
Sử dụng phép so sánh các giá trị trong mảng để nhận xét tính tăng giảm của mảng.
Hợp nhất 2 mảng vào bằng cách gán từng giá trị cho mảng thứ 3.
Thuật toán sắp xếp thứ tự giảm dần trong mảng sử dụng 1 vòng lặp.
Phần sau sẽ viết về Mảng ký tự và các thuật toán sắp xếp tối ưu.
Thứ Ba, 3 tháng 2, 2015
Vòng lặp - FOR / WHILE / DO WHILE - Phần 3: Do while và các lệnh nhảy.
IV. DO WHILE
- Vòng lặp do while có khả năng khác biệt so với 2 vòng lặp kia, đó là việc thực hiện hành động trước khi kiểm tra biểu thức đánh giá ( gọi vui là Tiền trảm hậu tấu ^^ )Cấu trúc do while như sau:
do { hành động } while ( biểu thức đánh giá )
Sử dụng do while để hiển thị số chia hết cho 5.
Như trên hình ta thấy, do while bắt đầu bằng việc hành động trước, sau đó mới xuống kiểm tra biểu thức đánh giá trong while. Chính vì thế, nếu chúng ta muốn chuyển do while sang while hay for, ta cần tính toán tăng thêm 1 lần lặp trong vòng while.
Dãy số Fibonacci thể hiện dưới vòng lặp do while.
Tương tự vòng while, vòng lặp do while cũng được tự do trong câu lệnh hơn vòng for.
Tiếp theo sẽ là những lệnh nhảy sử dụng để thoát khỏi hành động đang diễn ra.
V. Lệnh nhảy
Đôi khi trong chương trình có những trường hợp đặc biệt mà khi gặp, ta sẽ bỏ qua, dừng vòng lặp, hay đơn giản là thoát khỏi chương trình. Có 5 lệnh nhảy : return, goto, break, continue, exit ().
return : Được sử dụng để trả giá trị về cho hàm. Phần này mình sẽ viết sau khi học xong hàm
go to: Sử dụng để đi đến bất kì identifier nào được gọi. Ví dụ:
int i;
LOOP:
for ( i=0;i<10;i++){
printf("%d",i); }for ( i=0;i<10;i++){
goto LOOP;
Trong đó LOOP là identifier, được gán vào lệnh for. Khi gọi LOOP bằng goto, chương trình sẽ quay lại việc thực hiện vòng lặp ngay lập tức.
Vì đặc tính di chuyển tự do, goto sẽ khiến logic và flowchart của chương trình trở nên phức tạp. Việc sử dụng goto cần phải suy xét kĩ trong những chương trình lớn.
continue: Sử dụng trong vòng lặp, khi hành động đến continue, vòng đó sẽ bị dừng lại và thực hiện 1 vòng lặp mới.
break: Sử dụng trong vòng lặp và switch. Khi hành động đến break, toàn bộ cấu trúc lặp hay switch đó sẽ kết thúc, chương trình chạy tiếp.
exit (): Khi gặp exit, chương trình sẽ kiểm tra đúng sai với biểu thức trong ngoặc. Nếu biểu thức trong ngoặc là ĐÚNG, chương trình sẽ kết thúc.
VI. Kết luận
Có thể nói vòng lặp là công cụ tiết kiệm thời gian hữu hiệu nhất của 1 lập trình viên. Các vòng lặp hoàn toàn giống nhau về mặt ý nghĩa, có thể chuyển kiểu vòng lặp này sang vòng lặp kia chỉ trong 1 phút.Tuy nhiên, việc phân loại vòng lặp giúp chúng ta lựa chọn sáng suốt hơn khi gặp các tình huống khác nhau: biết trước số vòng lặp thì dùng for, không biết thì dùng while, thực hiện trước khi kiểm tra thì dùng do while. Và để điều khiển chương trình dễ dàng hơn, những lệnh nhảy sẽ được thêm vào tùy ý để ngắt vòng lặp.
Vòng lặp - FOR / WHILE / DO WHILE - Phần 2: Vòng lặp WHILE
III. Vòng lặp WHILE
- Vòng lặp while có cấu trúc đơn giản như sau:while (biểu thức đánh giá) { hành động }
Thật đơn giản. Đây có thể coi là cấu trúc lặp gốc. Hoạt động của nó chỉ đơn giản là kiểm tra tính ĐÚNG của biểu thức, sau đó thực hiện hành động, rồi tiếp tục kiểm tra biểu thức cho đến khi giá trị biểu thức là SAI thì kết thúc.
Cấu trúc while sẽ kiểm tra biểu thức trong ngoặc đơn, sau đó thực hiện hành động trong ngoặc kép.
Như bài tập trên, chuyển thể từ cấu trúc for sang cấu trúc while rất đơn giản : Để biểu thức khởi đầu viết trước lệnh while, biểu thức cập nhật sẽ viết bên trong lệnh while.
Ví dụ:
Vòng lặp FOR || Vòng lặp WHILE
for ( i=0;i<10;i++){ || i=0; while (i<10) {
printf("%d",i); } || printf("%d",i); i++; }
Nếu như trong vòng for, biểu thức cập nhật luôn luôn là hành động cuối cùng thì trong vòng while, ta có thể để nó ở bất cứ đâu ta muốn bên trong ngoặc kép.
Vì đặc tính tự do này, vòng lặp while thường được sử dụng trong các trường hợp ta không biết trước số lần lặp khi viết code.
Đưa vào 1 số và tính giai thừa. Ta thực hiện vòng lặp phép nhân với số k tăng dần từng đơn vị.
Phần cuối sẽ nói về vòng lặp do while và lệnh nhảy.
Đăng ký:
Bài đăng (Atom)