Thứ Năm, 29 tháng 1, 2015

Ngày 2 - Nhập xuất dữ liệu

Input Output - Xuất nhập dữ liệu

Chúng ta tương tác với máy tính như thế nào ?

1. Sự tương tác giữa chúng ta và máy tính

Chúng ta phải tương tác với máy tính thông qua phần mềm phiên dịch, để ra lệnh cho chúng vì chúng chỉ hiểu được mã nhị phân 0 và 1. Dưới đây là hình ảnh một phần mềm dịch lệnh chúng ta đưa ra và hiển thị thông tin máy gửi, BIOS.
BIOS - Hệ thống xuất nhập cơ bản
Trong lập trình C cũng vậy, việc đưa và lấy dữ liệu phải thông qua thư viện stdio.h với 2 câu lệnh cơ bản là printf() và scanf() nằm trong thư viện stdio.h


1. printf()
Printf() là câu lệnh dùng để đưa ra màn hình dữ liệu chúng ta đặt trong dấu ngoặc đơn. Printf() là câu lệnh tổng quát để đưa ra màn hình tất cả các loại dữ liệu từ ký tự cho đến số.

Câu lệnh printf() tổng quát có dạng: 
printf("control string",đối số)
Control string có thể là mã định dạng, văn bản hoặc ký tự không in được

1 ví dụ nho nhỏ như sau
Như hình trên, việc xuất giá trị của biến được thực hiện qua câu lệnh printf(). Số nguyên, số thập phân, chuỗi ký tự tất cả đều dùng được câu lệnh printf(). Nhưng vì tính đa dạng của nó mà người ta phải thêm mã định dạng (%d %s hay \n) để đưa ra màn hình kết quả đúng theo nhu cầu. 

Vì những ký tự % \ " mang ý nghĩa đặc biệt trong câu lệnh printf(), người ta sẽ đặt một quy luật để in ra những ký tự đó nếu muốn:
- \\: In ra kí tự \
-\": In ra ký tự "
-%%: In ra ký tự %

2. scanf()
Đây là câu lệnh để máy tính nhận lấy dữ liệu chúng ta nhập vào. Khác với printf() sẽ được in ra ngay lập tức, câu lệnh scanf() trong đoạn mã sẽ khiến máy tính sẽ dừng lại ở trước đoạn scanf() và hiện ra con trỏ nhấp nháy chờ chúng ta nhập dữ liệu. 
 Ví dụ trên, máy tính đã nhận được 2 dữ liệu là 15 và 0.3 như người dùng đã đưa vào. Khi dùng scanf(), bất cứ biến số nào cũng phải thêm ký tự "&" . Ký tự đó liên quan đến con trỏ mang vị trí của biến sẽ viết ở các bài sau.

Comment: Nếu đưa vào một dữ liệu không đúng theo mã định dạng, đoạn mã sẽ diễn ra liên tục và cắt bỏ hoàn toàn các lệnh input tiếp theo, sau đó cho ra kết quả lên màn hình.  
3. Mã định dạng

 
Lệnh scanf() sử dụng liên tục các mã định dạng %d và %f để nhận các giá trị số nguyên và số thực. Vậy mã định dạng là gì ?
Mã định dạng là một yếu tố xác định kiểu dữ liệu được đưa vào và in ra của 2 câu lệnh printf() và scanf().

Ở ví dụ trên, câu lệnh printf() có thể có nhiều đối số và mã định dạng, nhưng vị trí sắp xếp phải đúng sao cho mã định dạng số ở vị trí tương đương với lệnh in số. Nếu sắp xếp sai, sẽ in lỗi. Ví dụ như input là chuỗi string " hello " mà output mang mã định dạng %d dành cho số nguyên, kết quả ra màn hình sẽ là một chuỗi số ASCII được chuyển từ "hello".

 Comment: Bài này sử dụng gets() thay cho scanf() vì scanf() sẽ không gán đầy đủ chuỗi có khoảng trắng cho biến. Ví dụ "trinh bach" gán cho biến name bằng scanf() thì chỉ có "trinh" được gán còn phần sau sẽ đưa vào bộ nhớ đệm. Phần gets() và puts() sẽ nói ở bài sau

Danh sách mã định dạng. Nguồn kkhsou.in

2. Kết luận

Trên đây là lệnh cơ bản để gửi dữ liệu tới máy tính và nhận dữ liệu đưa ra màn hình. printf() và scanf() mang những quy luật nhất định mà chúng ta phải tuân theo nếu không muốn xảy ra lỗi, do tính chất bao trùm của chúng.

Ngày 2 - Variables

Variables - Biến dữ liệu

1. Biến là gì ? 

Hồi cấp 3 học phương trình y = x + 2 thì ai cũng biết x là biến số và 2 là hằng số. Đơn giản, biến là yếu tố chúng ta có thể thay đổi tùy thích, muốn nó là số nào thì viết vào số đấy. Còn trong lập trình, biến được biết đến như là một vùng dữ liệu trống mà chúng ta có thể đặt tên và viết giá trị vào trong đó.
 Ví dụ :
int length = 13;
Trong đó int là kiểu giá trị của biến, length là tên biến, và 13 là giá trị hằng số. Câu lệnh trên là câu lệnh gán giá trị và kiểu dữ liệu cho biến.

2. Đặc điểm và ứng dụng của biến 

 Đặc điểm của biến là nó mang 1 trong các giá trị số, ký tự, chuỗi ký tự, ... vân vân. Nó chỉ chấp nhận kiểu dữ liệu mà nó được xác định từ trước như int hay là char.  Nếu cho 1 biến số mang giá trị ký tự "a", lỗi phần mềm sẽ xảy ra. 

Biến đã xác định kiểu dữ liệu sẽ chiếm 1 bộ nhớ nhất định, chẳng hạn như 1 byte hay 2 bytes. Dù dữ liệu chúng ta điền vào có đủ lớn để chiếm hết bộ nhớ đã được cấp hay không, biến đó sẽ không thể thêm được giá trị nào vào nữa, và nó chỉ mang giá trị xác định được người dùng/máy tính đưa vào.

Ứng dụng lớn nhất của biến là đơn giản hóa việc tính toán , ghi chép, tiện cho người lập trình. Ví dụ: Nếu chúng ta phải viết 100 lần số 9829581962622976817262, chỉ cần gán giá trị đó cho biến x. Quá đơn giản và tiết kiệm thời gian.

Ngoài ra, biến dùng để ghi nhớ và định danh. Ví dụ như biến sum có thể hiểu là tổng của phép tính, length là độ dài, etc ...

3. 1 số ví dụ làm quen




 Trong ví dụ trên, chúng ta có các biến là CenterX, CenterY, eyeRadius, pupils,AOE. Các biến này được gán giá trị bằng hằng số hoặc bằng một hàm chứa biến khác. Sau đó bất cứ câu lệnh nào cần đến giá trị được xác định trong biến, chỉ cần gọi tên biến ra đủ.

Ví dụ này, chúng ta thấy được việc sử dụng biến đa dạng như thế nào. Chúng ta đặt biến x và y là một tọa độ nhất định, sau đó những vị trí khác được biểu diễn theo biến x và y.

Điều chỉnh biến eyes và tooth để tạo ra một con "quái vật"

Thứ Tư, 28 tháng 1, 2015

Ngày 2 - Các kiểu dữ liệu


Data types – Các kiểu dữ liệu

Là một khái niệm không thể thiếu trong bất cứ ngôn ngữ lập trình nào, sự ra đời của từ khóa “data type” đã tiết kiệm cho người viết code một khoảng thời gian và bộ nhớ không nhỏ. Dù vậy, so với các ngôn ngữ khác, data type trong lập trình C mang theo một vài giới hạn nhất định về độ lớn và sự đa dạng.

I.                   Vì sao phải phân ra các kiểu dữ liệu

-          Nhằm mục đích tiết kiệm bộ nhớ và đơn giản hóa 1 số câu lệnh như lệnh xác nhận Nếu … Thì …, người ta phân loại các kiểu dữ liệu khác nhau.

Ví dụ: Nếu lưu số 52031 dưới dạng ký tự (char), máy tính sẽ phải bỏ ra 5 bytes cho từng ký tự số để lưu dữ liệu đó trong bộ nhớ. Nhưng nếu lưu dưới dạng số nguyên dương, máy tính chỉ cần bỏ ra 2 bytes dữ liệu (unsigned int). 
 Làm thế nào để tiết kiệm 1 byte ? nguồn www.jegsworks.com

II.                 Các kiểu dữ liệu trong lập trình C

Các kiểu dữ liệu là những tập hợp gồm có các giá trị tương đương nhau. Ví dụ tập hợp 256 số nguyên dương {0,1,2,.....255} được gọi là kiểu dữ liệu unsigned short int.
Trong lập trình C, người ta chia ra làm 5 kiểu dữ liệu chính :
1.       char - dùng cho các ký tự và chuỗi ký tự. VD:  “k”, “xin chao”, “sjs9825mga92&@%”
-          Sử dụng một byte cho mỗi ký tự trong biến. Mỗi byte có khả năng diễn đạt được 256 ký tự khác nhau bao gồm cả chữ và số.

2.       int - dùng cho các số nguyên. Ví dụ: 2512, -251262
-          Sử dụng 2 bytes cho mỗi biến. Mỗi 2 bytes có khả năng diễn đạt 2^16 = 65536 số nguyên khác nhau

3.       float- dùng cho các số thực
-          Sử dụng 4 bytes cho mỗi biến. Mỗi biến float có khả năng diễn đạt được 6 chữ số thập phân

4.       double- diễn tả chính xác hơn float với 10 chữ số thập phân
-          Sử dụng 8 bytes cho mỗi biến

5.       void – Là một tập hợp mang rỗng giá trị theo nghĩa đen của nó. Còn nó dùng để làm gì thì những bài sau xin phép trả lời

·         Sau này các ngôn ngữ C kiểu mới còn có thêm kiểu dữ liệu boolean ( giá trị đúng hoặc sai), complex (số phức ) và 1 số loại khác. Những biến mang giá trị kiểu này thường được code thủ công trong C cơ bản.

III.              Các loại bổ trợ - Modifiers

Mặc định trong C, 1 biến kiểu int biểu diễn được con số từ -32768 đến 32.767 (216 = 65536 số). Nhưng khi chúng ta có nhu cầu sử dụng con số lớn hơn, ví dụ như 70000, thì sự ra đời của modifiers là cần thiết.

Modifiers thường dùng để chỉnh sửa khoảng giá trị của 1 kiểu dữ liệu như int, float cho nhỏ xuống hay nhiều lên để phù hợp với nhu cầu người dùng. Ví dụ như kiểu int chỉ chứa 65536, thì long int chứa được 4 bytes, tương đương với 2 32 = 4294976296 số. 

Trong C có 4 loại bổ trợ cơ bản như sau:
1.       Signed : Bổ trợ mặc định cho các kiểu dữ liệu số. Thường dùng để thay đổi dữ liệu kiểu ký tự
2.       Unsigned: Bổ trợ mặc định cho kiểu dữ liệu ký tự. Bổ trợ này nếu dùng cho các kiểu dữ liệu số thì tăng gấp đôi lượng giá trị dương và loại bỏ giá trị âm. Ví dụ : unsigned int  chứa được các giá trị từ 0 đến 65536.
3.       Short: Giảm lượng bytes chứa giá trị xuống còn 1 nửa. Ví dụ: short int  chỉ cho 1 byte chứa từ -128 đến 127
4.       Long: Tăng gấp đôi lượng bytes chứa giá trị. Ví dụ: long int cho 4 bytes để chứa giá trị số nguyên.

·         Lưu ý: Để tiện dùng, long short được sử dụng mặc định cho long int, short int. Trong C chỉ dùng được 1 modifiers cho 1 biến. Ngôn ngữ C99 cho phép sử dụng long long int.

IV.             Một số bài tập làm quen

1. Write a program that accepts a number and 
square the number. To do this:
a. Accept the number.
b. Multiply the number with itself and display the square







 
 Kết quả:
Comment: Chúng ta có thể thấy biến square và num đã được định dạng float, qua đó khi hiển thị, cả 2 biến sẽ có thêm 6 số sau dấu phẩy mặc dù mình chỉ nhập số 15.










2. Write a C program that accepts the salary 
and age from the user and displays
 the same on the screen as output.







Kết quả: 
Comment: Vì số tuổi của phần lớn người bình thường không quá 120 nên việc chọn kiểu dữ liệu short sẽ tiết kiệm 1 byte bộ nhớ ( tính theo hiệu suất là giảm 50% đó )

Bên cạnh đó unsigned long int là lựa chọn hợp lý khi lương bình thường được tính theo số nguyên dương.

   V.    Kết luận
Sau bài viết này, mình kết luận được là data type luôn đi chung với biến. Sử dụng data type một cách nhuần nhuyễn sẽ tăng hiệu suất làm việc theo thời gian và bộ nhớ của máy tính, đặc biệt là với những bài tập tính toán khổng lồ sau này.

Thứ Ba, 27 tháng 1, 2015

Ngày 1 - Học bằng phương pháp FIipped Learning

Flipped Learning - Học ngược


Bài viết này sẽ tóm tắt về phương pháp học ngược hoàn toàn so với hình ảnh "thầy nói, trò chép" của dân Nam ta từ trước đến nay.  Một phương pháp mang nặng tính cá nhân, không thể áp dụng cho tất cả học sinh sinh viên, đặc biệt là đối tượng học để thi chứ không vì kiến thức.

I.                   Vì sao lại học “ngược” ?

Mình đã từng học thuộc lòng phần lớn các môn ở cấp 3 đến phát ngán, nhiều đêm hôm khuya khoắt mà cứ lẩm bẩm đến tận 2h rồi sáng dậy lại lẩm bẩm tiếp đến sát giờ thi. Đầu óc lảo đảo, ngủ gật như cơm bữa. Và kết quả thi cử không khá hơn là mấy, chưa kể thi xong thì coi như chưa từng động chạm đến bài học ấy.

Nguồn: Yahoo Group VietNamThiDan 

Nhưng có một môn không như thế. Mình học Toán theo ý thích, thấy phần nào kiểu lạ lạ thì tìm hiểu cái đấy, khi nào đến lớp thì hỏi thầy. Điểm Toán cao hơn hẳn các môn khác, và tư duy logic của mình cũng tiến bộ rõ rệt. Đến sau này mình mới biết phương pháp đấy nó gọi là “Flipped Learning”, mặc dù bản thân mình thực hiện nó không hoàn chỉnh cho lắm.

II.                 Flipped Learning

1.      Nó là cái gì ?

Dịch ra tiếng việt có nghĩa là “ Học đảo ngược”. Vì sao lại gọi thế ? Từ trước đến nay mình thấy hầu hết các lớp học hoạt động theo kiểu : 

Đến lớp => Nghe giảng => Chép => Về nhà làm bài tập được giao

Còn phương pháp Học đảo ngược có một trình tự hoàn toàn ngược lại: 

Ở nhà tìm hiểu => Tổng hợp kiến thức và liệt kê các vấn đề => Đến lớp trao đổi với nhau => Trao đổi với giáo viên => Hoàn tất việc tổng kết bài học và tự rèn luyện.

Mô hình lớp học ngược. Nguồn ctl.utexas.edu

2.      Đặc điểm của phương pháp học ngược

Ưu điểm của phương pháp này là sự tự do. Tự do tìm hiểu bài học, tự do lựa chọn bài học, tự do trao đổi kiến thức, tự do sai lầm … Qua đó sự tự lập của cá nhân cũng được rèn luyện theo. Đó là tiền đề để trở thành một con người có xu hướng thành công trong cuộc sống. Còn với cá nhân người viết thì tự do làm điều mình thích là hạnh phúc tại thời điểm này :D

Sự rèn luyện tự lập cũng có cái giá của nó. Người sử dụng phương pháp này nếu không cẩn thận sẽ lăn qua ranh giới của tự lập và lười biếng.  Nếu không có một động cơ học đủ mạnh để thúc đẩy bản thân, hay một kỷ luật cứng rắn, người học sẽ dễ bị những yếu tố bên ngoài lôi kéo và đánh mất thời gian quý giá để tìm tòi học hỏi.
Thừa thời gian mà !. Nguồn ego.com

Comment: Bản thân mình lười nhiều mình biết, 1 ví dụ đơn giản để lười là học Lịch chả có gì hay ho, chả thích thú gì, mình không quan tâm lắm đến việc Ngô Quyền đánh quân Nguyên như thế nào, thế là không có động lực gì để học hết.

3.      Hoạt động tại nhà

Quan trọng nhất là việc tự tìm hiểu kiến thức trước khi đến lớp và việc rèn luyện kỹ năng sau khi ra khỏi lớp. Đây là hoạt động mang lại 90% kiến thức cơ bản cho người học, 10% còn lại là sự trao đổi trên lớp để điều chỉnh bài học. Điều này yêu cầu người học phải có một động lực để học nghiêm chỉnh, qua đó gạt bỏ được những cám dỗ xung quanh.

Ngày xưa mình cũng như thế này :). Nguồn schools.nyc.gov

Hoạt động tại nhà bao gồm việc tự học kiến thức và rèn luyện, 2 việc để chúng ta có thể nắm vững kiến thức trong lòng bàn tay.

Phương thức học tại nhà của mình như sau:


1.       Đọc thông tin về bài học trên mạng và sách
2.       Thực hiện ví dụ, sau đó áp dụng vào các bài tập có độ khó tương tự
3.       Áp dụng kiến thức vào bài tập chung có nhắc đến kiến thức của bài học
4.       Nhìn nhận, đánh giá bài học

Qua 4 bước trên, mình hoàn toàn nắm được rõ ứng dụng giải bài tập và nội dung của bài học. Bước cuối cùng là tìm những vấn đề thực tiễn có thể áp dụng được bài học. Đó là cách rèn luyện tốt nhất của mình.



David A. Kolb, tác giả của cách học KOLB

III.              Kết luận

Phương pháp học tập nào cũng có điểm yếu của nó, không cái nào là hoàn hảo. Chỉ là điểm mạnh của bạn có che lấp được nhược điểm và kết hợp được ưu điểm của phương pháp đó hay không thôi. Với mình, đây là một phương pháp phù hợp với tính phóng khoáng tự do của mình, và nó thật sự mang đến những kết quả tích cực mình mong đợi.


Chủ Nhật, 25 tháng 1, 2015

Ngày 1 - Mã giả và lưu đồ

I.ĐỊNH NGHĨA

 1.MÃ GIẢ

- Mã giả ( pseudo-code) là cách chúng ta thể hiện lối suy nghĩ, phương thức, thuật toán giải quyết một vấn đề cho trước. Mã giã được viết đơn giản, chỉ đủ những từ khóa cần thiết.

Ví dụ :
Vấn đề cho trước: hãy viết mã giả thể hiện cách kiểm tra một số nguyên có phải là số chẵn hay không

Mã giả:
BEGIN 
INPUT num
r= num MOD 2
IF r = 0
    DISPLAY num is even
ELSE 
    DISPLAY num is odd
END

Trong ví dụ trên, chúng ta có thể thấy mã giả được tối giản. Thay vì viết cả câu như " Input a number num" hay "If r = 0 then display on the screen 'num is even' ", mã giả chỉ chứa đọng những thông tin cần thiết để chúng ta có thể hiểu được thuật toán.

2. Lưu đồ  

Có người thích đọc mã, có người thích nhìn hình. Chúng ta hoàn toàn có thể thể hiện cách giải quyết vấn để thông qua hình ảnh. Lưu đồ là một trong số những cách sử dụng hình ảnh để viết thuật toán tốt nhất.

Giống như mã giả, lưu đồ cũng chỉ giữ lại
 các từ khóa cần thiết.

Trong ví dụ trên, một lưu đồ thể hiện 
cách kiểm tra số nguyên được vẽ như sau













ảnh từ trang ankitcguru.blogspot.com

II.MỘT SỐ BÀI TẬP CƠ BẢN


1.Write a pseudo code and draw a flowchart to accept a value in degrees Celsius and to convert it into Fahrenheit. [Hint: C/5 = (F-32)/9]

Lời giải :

START
INPUT C
F = (9*C/5)+32
DISPLAY F
STOP












2.Write a pseudo code and flowchart to accept a student’s marks in Physics, Chemistry, and Biology. The total of these marks as well as the average should be displayed.

Lời giải:

START
INPUT P,C,B
T=P+C+B
A=T/3
DISPLAY T
DISPLAY A
STOP













Comment: 2 bài tập trên là 2 bài tập cơ bản để luyện cách viết mã giả và vẽ lưu đồ, không có gì quá khó khăn để nghĩ ra cách giải quyết vấn đề được đưa ra. 

Bài tập thứ 3 sẽ mang tính chất nâng cao hơn khi đề bài có nhiều phương hướng giải quyết và có nhiều trường hợp cần vẽ nhánh ( căn bản là vì thế giới chưa nghĩ ra quy luật thống nhất cho các số nguyên tố =.=)

3.Write flowchart to check a any number  (0-N), is it a prime?



Lưu đồ trên mình chỉ đưa ra cách thức cơ bản nhất để kiểm tra số nguyên tố. Chúng ta có thể dễ dàng tìm ra các phương pháp kiểm tra số nguyên tố khác, hợp nhất vào một lưu đồ, qua đó có thể giảm thiểu thời gian giải quyết vấn đề xuống còn ~ 20%.
1 số phương pháp nhận diện như:
- Số nguyên tố chỉ có đuôi 1 3 7 9 khi số đó lớn hơn 10
- Số nguyên tố có ước nhỏ hơn căn bậc 2 của nó
- Số nguyên tố chia 6 dư 1 hoặc 5
.vân vân ...

III.KẾT LUẬN


Qua bài viết này, chúng ta có thể biết thêm 2 cách để thể hiện những lối suy nghĩ, cách giải quyết vấn đề. Việc sử dụng từ khóa kết hợp hình ảnh là một phương thức giúp não bộ chúng ta tăng hiệu suất đọc, xử lý thông tin và tổng hợp hiệu quả rất nhiều về mặt thời gian và chất lượng.
Sơ đồ tư duy : Từ khóa và hình ảnh