Vi Điều Khiển

Chào mừng các bạn đến với thế giới của Vi điều khiển!

--welcome to the world of microcontrollers^^ --

Điện Tử Cơ Bản

nơi khởi đầu

Lập Trình

linh hồn của phần cứng

Thứ Năm, 28 tháng 6, 2012

[Học lập trình 8051] Bài 3: Ngôn Ngữ Lập Trình C [Keil C] Cơ Bản Cho 8051



Bài 3: Ngôn Ngữ Lập Trình C [Keil C] Cơ Bản Cho 8051

Nội dung trong bài này:

Ø  Giới thiệu ngôn ngữ lập trình C
Ø  Cấu trúc một chương trình cơ bản cho 8051
Ø  Các câu lệnh cơ bản

1.  Giới thiệu ngôn ngữ C

Trong kỹ thuật lập trình vi điều khiển nói chung, ngôn ngữ lập trình được sử dụng thường chia làm 2 loại: Ngôn ngữ bậc thấp và Ngôn ngữ bậc cao.
Ngôn ngữ bậc cao là các ngôn ngữ gần vơi ngôn ngữ con người hơn, do đó việc lập trình bằng các ngôn ngữ này trở nên dễ dàng và đơn giản hơn. Có thể kể đến một số ngôn ngữ lập trình bậc cao như C, Basic, Pascal… trong dó C là ngôn ngữ thông dụng hơn cả trong kỹ thuật vi điều khiển. Về bản chất, sử dụng các ngôn ngữ này thay cho ngôn ngữ bậc thấp là giảm tải cho lập trình viên trong việc nghiên cứu các tập lệnh và xây dựng các cấu trúc giải thuật. Chương trình viết bằng ngôn ngữ bậc cao cũng sẽ được một phần mềm trên máy tính gọi là trình biên dịch (Compiler) chuyển sang dạng hợp ngữ trước khi chuyển sang mã máy.
Khi sử dụng ngôn ngữ C người lập trình không cần hiểu sâu sắc về cấu trúc của bộ vi điều khiển. Có nghĩa là với một người chưa quen với một vi điểu khiển cho trước sẽ xây dựng được chương trình một cách nhanh chóng hơn, do không phải mất thời gian tìm hiểu kiến trúc của vi điều khiển đó. Và việc sử dụng lại các chương trình đã xây dựng trước đó cũng dễ dàng hơn, có thể sử dụng toàn bộ hoặc sửa chữa một phần.

[Tự học Lập trình C] Bài 14: Con Trỏ [Thực Hành]


Bài 14: Con trỏ [Thực Hành]

Mục tiêu:

Kết thúc bài học này, bạn có thể:

Ø  Sử dụng con trỏ
Ø  Sử dụng con trỏ với mảng.

Các bước trong bài học này được trình bày chi tiết, rõ ràng và cẩn thận. Điều này giúp ta hiểu rõ về công cụ lập trình. Thực hiện theo các bước sau thật cẩn thận.

Phần I – Trong thời gian 1 giờ 30 phút đầu:

14.1     Con trỏ

Các biến con trỏ trong C chứa địa chỉ của một biến có bất kỳ kiểu nào. Nghĩa là, các con trỏ có thể là kiểu dữ liệu số nguyên hoặc ký tự. Một biến con trỏ số nguyên sẽ chứa địa chỉ của một biến số nguyên. Một con trỏ ký tự sẽ chứa địa chỉ của một biến kiểu ký tự.

14.1.1  Đếm số nguyên âm trong một chuỗi sử dụng con trỏ

Các con trỏ có thể được sử dụng thay cho các chỉ số duyệt các phần tử trong một mảng. Ví dụ, một con trỏ kiểu chuỗi có thể được dùng để trỏ đến địa chỉ bắt đầu của một từ. Vì vậy một con trỏ được sử dụng để đọc các ký tự trong từ đó. Để minh họa điều này, chúng ta viết một chương trình C để đếm số nguyên âm trong một từ bằng cách sử dụng con trỏ. Các bước được liệt kê như sau:

1.    Khai báo một biến con trỏ kiểu ký tự. Mã lệnh như sau:

char *ptr;

2.    Khai báo một mảng ký tự và nhập vào cùng giá trị. Mã lệnh như sau:

char word[10];
printf(“\n Enter a word : “);
scanf(“%s”, word);

3.    Gán con trỏ ký tự tới chuỗi. Mã lệnh như sau:

ptr = &word[0];

Địa chỉ của ký tự đầu tiên của mảng ký tự, word, sẽ được lưu trong biến con trỏ, ptr. Nói cách khác, con trỏ ptr sẽ trỏ tới ký tự đầu tiên trong mảng ký tự word.

4.    Lần lượt duyệt các ký tự trong từ để xác định đó là nguyên âm hay không. Trong trường hợp một nguyên âm được tìm thấy, tăng giá trị biến đếm nguyên âm. Đoạn mã lệnh như sau:

int i, vowcnt;
for(i = 0; i < strlen(word); i++)
{
if((*ptr==‘a’)||(*ptr==‘e’)||(*ptr==‘i’)||(*ptr==‘o’)||(*ptr==‘u’)||(*ptr==‘A’)||(*ptr==‘E’)||(*ptr==‘I’)||(*ptr==‘O’)||(*ptr==‘U’))
           vowcnt++;
ptr++;
}

5.    Hiển thị từ và số lượng nguyên âm trong từ. Đoạn mã lệnh sẽ như sau:

printf(“\nThe word is:%s \nThe number of  vowels in the word is: %d “, word,vowcnt);

Dưới đây là chương trình hoàn chỉnh.

1.    Gọi trình soạn thảo chương trình C.
2.    Tạo tập tin mới.
3.    Đưa vào đoạn mã lệnh sau:

#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{
char *ptr;
char word[10];
int i, vowcnt=0;
printf("\nEnter a word: ");
scanf("%s", word);
ptr = &word[0];
for(i = 0; i < strlen(word); i++)
{
            if((*ptr=='a')||(*ptr=='e')||(*ptr=='i')||(*ptr=='o')||(*ptr=='u')||(*ptr=='A') || (*ptr=='E')||(*ptr=='I')||(*ptr=='O')||(*ptr=='U'))
                     vowcnt++;
                        ptr++;
}
printf("\nThe word is: %s \nThe number of  vowels in the word is: %d ", word, vowcnt);
getch();
}

3.    Biên dịch và thực thi chương trình.

Kết quả của chương trình:

Thứ Tư, 27 tháng 6, 2012

[Tự học Lập trình C] Bài 13: Con Trỏ [Lý Thuyết]


Bài 13: Con trỏ [Lý Thuyết]

Mục tiêu:

Kết thúc bài học này, bạn có thể:
        
Ø  Hiểu con trỏ là gì, và con trỏ được sử dụng ở đâu
Ø  Biết cách sử dụng biến con trỏ và các toán tử con trỏ
Ø  Gán giá trị cho con trỏ
Ø  Hiểu các phép toán số học con trỏ
Ø  Hiểu các phép toán so sánh con trỏ
Ø  Biết cách truyền tham số con trỏ cho hàm
Ø  Hiểu cách sử dụng con trỏ kết hợp với mảng một chiều
Ø  Hiểu cách sử dụng con trỏ kết hợp với mảng đa chiều
Ø  Hiểu cách cấp phát bộ nhớ được thực hiện như thế nào

Giới thiệu

Con trỏ cung cấp một cách thức truy xuất biến mà không tham chiếu trực tiếp đến biến. Nó cung cấp cách thức sử dụng địa chỉ. Bài này sẽ đề cập đến các khái niệm về con trỏ và cách sử dụng chúng trong C.

13.1  Con trỏ là gì?

Một con trỏ  là một biến, nó chứa địa chỉ vùng nhớ của một biến khác, chứ không lưu trữ giá trị của biến đó. Nếu một biến chứa địa chỉ của một biến khác, thì biến này được gọi là con trỏ đến biến thứ hai kia. Một con trỏ cung cấp phương thức gián tiếp để truy xuất giá trị của các phần tử dữ liệu. Xét hai biến var1 và var2, var1 có giá trị 500 và được lưu tại địa chỉ 1000 trong bộ nhớ. Nếu var2 được khai báo như là một con trỏ tới biến var1, sự biểu diễn sẽ như sau:

                              Vị trí                 Giá trị                Tên
                              Bộ nhớ            lưu trữ               biến
                              1000                   500                     var1
                              1001
                              1002
                              .
                              .
                              1108                   1000                   var2

Ở đây, var2 chứa giá trị 1000, đó là địa chỉ của biến var1.

Các con trỏ có thể trỏ đến các biến của các kiểu dữ liệu cơ sở như intchar, hay double hoặc dữ liệu có cấu trúc như mảng.

13.1.2 Tại sao con trỏ được dùng?

Con trỏ có thể được sử dụng trong một số trường hợp sau:

Ø  Để trả về nhiều hơn một giá trị từ một hàm
Ø  Thuận tiện hơn trong việc truyền các mảng và chuỗi từ một hàm đến một hàm khác
Ø  Sử dụng con trỏ để làm việc với các phần tử của mảng thay vì truy xuất trực tiếp vào các phần tử này
Ø  Để cấp phát bộ nhớ động và truy xuất vào vùng nhớ được cấp phát này (dynamic memory allocation)

13.2 Các biến con trỏ

Nếu một biến được sử dụng như một con trỏ, nó phải được khai báo trước. Câu lệnh khai báo con trỏ bao gồm một kiểu dữ liệu cơ bản, một dấu *, và một tên biến. Cú pháp tổng quát để khai báo một biến con trỏ như sau:

    type *name;

Ở đó type là một kiểu dữ liệu hợp lệ bất kỳ, và name là tên của biến con trỏ. Câu lệnh khai báo trên nói với trình biên dịch là name được sử dụng để lưu địa chỉ của một biến có kiểu dữ liệu type. Trong câu lệnh khai báo, * xác định rằng một biến con trỏ đang được khai báo.

Trong ví dụ của var1 và var2  trên, vì var2 là một con trỏ giữ địa chỉ của biến var1  kiểu int, nó sẽ được khai báo như sau:

         int *var2;

Bây giờ, var2 có thể được sử dụng trong một chương trình để trực tiếp truy xuất giá trị của var1. Nhớ rằng, var2 không phải có kiểu dữ liệu int nhưng nó là một con trỏ trỏ đến một biến có kiểu dữ liệu int.

Kiểu dữ liệu cơ sở của con trỏ xác định kiểu của biến mà con trỏ trỏ đến. Về mặt kỹ thuật, một con trỏ có kiểu bất kỳ có thể trỏ đến bất kỳ vị trí nào trong bộ nhớ. Tuy nhiên, tất cả các phép toán số học trên con trỏ đều có liên quan đến kiểu cơ sở của nó, vì vậy khai báo kiểu dữ liệu của con trỏ một cách rõ ràng là điều rất quan trọng.

13.3  Các toán tử con trỏ

Có hai toán tử đặc biệt được dùng với con trỏ: *  &. Toán tử &  là một toán tử một ngôi và nó trả về địa chỉ của toán hạng. Ví dụ:

    var2 = &var1;

lấy địa chỉ vùng nhớ của biến var1 gán cho var2. Địa chỉ này là vị trí ô nhớ bên trong máy tính của biến var1 và nó không làm gì với giá trị của var1. Toán tử & có thể hiểu là trả về “địa chỉ của”. Vì vậy, phép gán trên có nghĩa là “var2 nhận địa chỉ của var1”. Trở lại, giá trị của var1 là 500 và nó dùng vùng nhớ 1000 để lưu giá trị này. Sau phép gán trên, var2 sẽ có giá trị 1000.

Toán tử thứ hai, toán tử *, là phần bổ sung của toán tử &. Nó là một toán tử một ngôi và trả về giá trị chứa trong vùng nhớ được trỏ bởi giá trị của biến con trỏ.

Xem ví dụ trước, ở đó var1 có giá trị 500 và được lưu trong vùng nhớ 1000, sau câu lệnh

         var2 = &var1;

var2 chứa giá trị 1000, và sau lệnh gán:

         temp = *var2;

temp sẽ chứa 500, là giá trị của biến mà var2 trỏ đến. Toán tử * có thể được hiểu là: “giá trị của”.

Cả hai toán tử * và & có độ ưu tiên cao hơn tất cả các toán tử toán học ngoại trừ toán tử lấy giá trị âm. Chúng có cùng độ ưu tiên với toán tử lấy giá trị âm (-).

Chương trình dưới đây in ra giá trị của một biến kiểu số nguyên, địa chỉ của nó được lưu trong một biến con trỏ, và chương trình cũng in ra địa chỉ của biến con trỏ.

#include <stdio.h>
#include <conio.h>
main()
{
    int var = 500, *ptr_var;
    //var is declared as an integer and ptr_var as a pointer pointing to an integer
    ptr_var = &var; //stores address of var in ptr_var
    //Prints value of variable (var) and address where var is stored
    printf("The value %d is stored at address: %u", var, &var);
    //Prints value stored in ptr variable (ptr_var) and address where ptr_var is stored
    printf("\nThe value %u is stored at address: %u",ptr_var, &ptr_var);
    //Prints value of variable (var) and address where var is stored, using pointer to variable
    printf("\nThe value %d is stored at address: %u", *ptr_var,ptr_var);
    getch();
}

Kết quả của ví dụ trên như sau:

Thứ Hai, 25 tháng 6, 2012

[Tự học Lập trình C] Bài 12: Mảng [Thực Hành]


Bài 12: Mảng [Thực Hành]

Mục tiêu:

Kết thúc bài học này, bạn có thể:

Ø  Sử dụng mảng một chiều
Ø  Sử dụng mảng hai chiều.
                                                                                           
Các bước trong bài học này được trình bày chi tiết, rõ ràng và cẩn thận. Điều này giúp ta hiểu rõ về công cụ lập trình. Thực hiện theo các bước sau thật cẩn thận.

Phần I – Trong thời gian 1 giờ 30 phút đầu:

12.1     Mảng

Các mảng có thể được phân làm hai dạng dựa vào chiều của mảng: Mảng một chiều và mảng đa chiều. Trong bài này, chúng ta sẽ tập trung vào cách tạo và sử dụng các mảng.

12.1.1  Sự sắp xếp một mảng một chiều

Mảng một chiều có thể được sử dụng để lưu trữ một tập các giá trị có cùng kiểu dữ liệu. Xét một tập điểm của sinh viên trong một môn học. Chúng ta sẽ sắp xếp các điểm này theo thứ tự giảm dần.

Các bước sắp xếp mảng một chiều theo thứ tự giảm như sau:

1.      Nhập vào số lượng các điểm.

Để thực hiện điều này, một biến phải được khai báo và giá trị của biến phải được nhập. Mã lệnh như sau:

int n;
printf(“\n Enter the total number of marks to be  entered : ”);
scanf(“%d”, &n);

2.      Nhập vào tập các điểm.

Để nhập vào tập các giá trị cho một mảng, mảng phải được khai báo. Mã lệnh như sau,

int num[n];

Số phần tử của mảng được xác định bằng giá trị đã nhập vào biến n. n phần tử của mảng phải được khởi tạo giá trị. Để nhập n giá trị, sử dụng vòng lặp forMột biến nguyên cần được khai báo để sử dụng như là chỉ số của mảng. Biến này giúp truy xuất từng phần tử của mảng. Sau đó giá trị của các phần tử mảng được khởi tạo bằng cách nhận các giá trị nhập vào từ người dùng. Mã lệnh như sau:

int l;
for(l = 0; l < n; l++)
{
printf(“\n Enter the marks of student %d : ”, l + 1);
scanf(“%d”, &num[l]);
}

Vì các chỉ số của mảng luôn bắt đầu từ 0 nên chúng ta cần khởi tạo biến l là 0. Mỗi khi vòng lặp được thực thi, một giá trị nguyên được gán đến một phần tử của mảng.

3.      Tạo một bản sao của mảng.

Trước khi sắp xếp mảng, tốt hơn là nên giữ lại mảng gốc. Vì vậy một mảng khác được khai báo và các phần tử của mảng thứ nhất có thể được sao chép vào mảng mới này. Các dòng mã lệnh sau được sử dụng để thực hiện điều này:

int desnum[100], k;
for(k = 0; k < n; k++)
desnum[k] = num[k];

4.      Sắp xếp mảng theo thứ tự giảm dần.

Để sắp xếp một mảng, có rất nhiều thuật toán khác nhau như: Sắp xếp nổi bọt, sắp xếp chèn, sắp xếp chọn, sắp xếp trộn, sắp xếp vun đống, sắp xếp nhanh... mỗi thuận toán đều có ưu điểm riêng, trong đó thuật toán sắp xếp chọn là một phương pháp khá đơn giản, dễ hiểu, ta sẽ sử dụng thuật toán này để sắp xếp. Sắp xếp chọn - select sort (theo thứ tự giảm dần) là phương pháp sắp xếp bằng cách chọn phần tử lớn nhất xếp vào vị trí thứ nhất, tương tự với các phần tử lớn thứ hai, thứ ba, ...

Quan sát ví dụ một dãy số để hiểu được giải thuật. Hình 12.1 trình bày một mảng số nguyên cần được sắp xếp:



Hình 12.1: Mảng num với chỉ số i (5 phần tử)

Chủ Nhật, 24 tháng 6, 2012

[Tự học Lập trình C] Bài 11: Mảng [Lý Thuyết]


Bài 11: Mảng [Lý Thuyết]

Mục tiêu:

Kết thúc bài học này, bạn có thể:

Ø  Hiểu được các phần tử của mảng và các chỉ số mảng
Ø  Khai báo một mảng
Ø  Hiểu cách quản lý mảng trong C
Ø  Hiểu một mảng được khởi tạo như thế nào
Ø  Hiểu mảng chuỗi/ ký tự
Ø  Hiểu mảng hai chiều
Ø  Hiểu cách khởi tạo mảng nhiều chiều.

Giới thiệu:

Có thể bạn sẽ gặp khó khăn khi lưu trữ một tập hợp các phần tử dữ liệu giống nhau trong các biến khác nhau. Ví dụ, điểm cho tất cả 11 cầu thủ của một đội bóng đá phải được ghi nhận trong một trận đấu. Sự lưu trữ điểm của mỗi cầu thủ trong các biến có tên khác nhau thì chắc chắn phiền hà hơn dùng một biến chung cho chúng. Với mảng mọi việc sẽ được thực hiện đơn giản hơn. Một mảng là một tập hợp các phần tử dữ liệu có cùng kiểu. Mỗi phần tử được lưu trữ ở các vị trí kế tiếp nhau trong bộ nhớ chính. Những phần tử này được gọi là phần tử mảng.

11.1 Các phần tử mảng và các chỉ mục:

Mỗi phần tử của mảng được định danh bằng một chỉ mục hoặc chỉ số gán cho nó. Chiều của mảng được xác định bằng số chỉ số cần thiết để định danh duy nhất mỗi phần tử. Một chỉ số là một số nguyên dương được bao bằng dấu ngoặc vuông [ ] đặt ngay sau tên mảng, không có khoảng trắng ở giữa. Một chỉ số chứa các giá trị nguyên bắt đầu bằng 0. Vì vậy, một mảng player với 11 phần tử được biểu diễn như sau:

     player[0], player[1], player[2], ... , player[10].

Như đã thấy, phần tử mảng bắt đầu với player[0], và vì vậy phần tử cuối cùng là player[10] không phải là player[11]. Điều này là do bởi trong C, chỉ số mảng bắt đầu từ 0; do đó trong mảng N phần tử, phần tử cuối cùng có chỉ số là N-1. Phạm vi cho phép của các giá trị chỉ số được gọi là miền giới hạn của chỉ số mảng, giới hạn dưới và giới hạn trên. Một chỉ số mảng hợp lệ phải có một giá trị nguyên nằm trong niềm giới hạn. Thuật ngữ hợp lệ được sử dụng cho một nguyên nhân rất đặc trưng. Trong C, nếu người dùng cố gắng truy xuất một phần tử nằm ngoài dãy chỉ số hợp lệ (như player[11] trong ví dụ trên của mảng), trình biên dịch C sẽ không phát sinh ra lỗi. Tuy nhiên, có thể nó truy xuất một giá trị nào đó dẫn đến kết quả không đoán được. Cũng có nguy cơ viết chồng lên dữ liệu hoặc mã lệnh chương trình. Vì vậy, người lập trình phải đảm bảo rằng tất cả các chỉ số là nằm trong miền giới hạn hợp lệ.

Ø  Khai báo một mảng:

Một mảng có một vài đặc tính riêng biệt và phải được khai báo khi sử dụng chúng. Những đặc tính này bao gồm:
·        Lớp lưu trữ
·        Kiểu dữ liệu của các phần tử mảng.
·        Tên mảng – xác định vị trí phần tử đầu tiên của mảng.
·        Kích thước mảng - một hằng số có giá trị nguyên dương.

Một mảng được khai báo giống như cách khai báo một biến, ngoại trừ tên mảng được theo sau bởi một hoặc nhiều biểu thức, được đặt trong dấu ngoặc vuông [] xác định chiều dài của mảng. Cú pháp tổng quát khai báo một mảng như sau:

     lớp_lưu_trữ    kiểu_dữ_liệu   tên_mảng[biểu_thức_kích_thước]

Ở đây, biểu_thức_kích_thước là một biểu thức xác định số phần tử trong mảng và phải định ra một trị nguyên dương. Lớp_lưu_trữ là một tùy chọn. Mặc định lớp automatic được dùng cho mảng khai báo bên trong một hàm hoặc một khối lệnh, và lớp external được dùng cho mảng khai báo bên ngoài một hàm. Vì vậy mảng player được khai báo như sau:

     int player[11];

Nên nhớ rằng, trong khi khai báo mảng, kích thước của mảng sẽ là 11, tuy nhiên các chỉ số của từng phần tử bên trong mảng sẽ là từ 0 đến 10.

Các qui tắc đặt tên mảng là giống với qui tắc đặt tên biến. Một tên mảng và một tên biến không được giống nhau, nó dẫn đến sự nhập nhằng. Nếu một sự khai báo như vậy xuất hiện trong chương trình, trình biên dịch sẽ hiển thị thông báo lỗi.

Ø  Một vài qui tắc với mảng:
·        Tất cả các phần tử của một mảng có cùng kiểu. Điều này có nghĩa là, nếu một mảng được khai báo kiểu int, nó không thể chứa các phần tử có kiểu khác.
·        Mỗi phần tử của mảng có thể được sử dụng bất cứ nơi nào mà một biến được cho phép hay được yêu cầu.
·        Một phần tử của mảng có thể được tham chiếu đến bằng cách sử dụng một biến hoặc một biểu thức nguyên. Sau đây là các tham chiếu hợp lệ:

player[i]; /*Ở đó i là một biến, tuy nhiên cần phải chú ý rằng i nằm trong miền giới hạn của chỉ số đã được khai báo cho mảng player*/
player[3] = player[2] + 5;
player[0] += 2;
player[i / 2 + 1];

·        Kiểu dữ liệu của mảng có thể là intcharfloat, hoặc double.

11.2 Việc quản lý mảng trong C:

Một mảng được “đối xử” khác với một biến trong C. Thậm chí hai mảng có cùng kiểu và kích thước cũng không thể tương đương nhau. Hơn nữa, không thể gán một mảng trực tiếp cho một mảng khác. Thay vì thế, mỗi phần tử mảng phải được gán riêng lẻ tương ứng với từng phần tử của mảng khác. Các giá trị không thể được gán cho toàn bộ một mảng, ngoại trừ tại thời điểm khởi tạo. Tuy nhiên, từng phần tử không chỉ có thể được gán trị mà còn có thể được so sánh.

     int player1[11], player2[11];
     for (i = 0; i < 11; i++)
           player1[i] = player2[i];

Tương tự, cũng có thể có kết quả như vậy bằng việc sử dụng các lệnh gán riêng lẻ như sau:

     player1[0] = player2[0];
     player1[1] = player2[1];
     ...
     player1[10] = player2[10];

Cấu trúc for là cách lý tưởng để thao tác các mảng.

Ví dụ 11.1:

/* Program demonstrates a single dimensional array */
#include <stdio.h>
#include <conio.h>
main()
{   
     int num[5];
     int i;
     num[0] = 10;
     num[1] = 70;
     num[2] = 60;
     num[3] = 40;
     num[4] = 50;
     for (i = 0; i < 5; i++)
           printf("\n Number at [%d] is %d", i, num[i]);
     getch();
}

Kết quả của chương trình:

Thứ Bảy, 23 tháng 6, 2012

[Tự học Lập trình C] Bài 10: Vòng Lặp [Thực Hành]


Bài 10: Vòng lặp [Thực Hành]

Mục tiêu:

Kết thúc bài học này, bạn có thể:

Ø  Sử dụng cấu trúc vòng lặp
Ø  Viết một vài chương trình:
o   Sử dụng vòng lặp ‘for
o   Sử dụng vòng lặp ‘while
o   Sử dụng vòng lặp ‘do...while’.

Các bước trong bài học này được trình bày chi tiết, rõ ràng và cẩn thận. Điều này giúp ta hiểu rõ về công cụ lập trình. Thực hiện theo các bước sau thật cẩn thận.

Phần I - Trong thời gian 1 giờ 30 phút đầu:

10.1 Sử dụng vòng lặp ‘for’:

Trong phần này chúng ta sẽ viết một chương trình sử dụng vòng lặp ‘for’. Chương trình hiển thị các số chẳn từ 1 đến 30.

Trong chương trình, một biến ‘số nguyên’, num, được khai báo. Vòng lặp ‘for’ được sử dụng để hiển thị các số chẳn đến 30. Đối số đầu tiên của vòng lặp ‘for’, khởi tạo biến num là 2. Đối số thứ hai của vòng lặp ‘for’, kiểm tra giá trị của biến có nhỏ hơn hoặc bằng 30 không. Nếu điều kiện này thỏa, lệnh trong vòng lặp được thực hiện. Lệnh ‘printf()’ được sử dụng để hiển thị giá trị của biến num.

Trong đối số thứ ba, giá trị của biến num được tăng lên 2. Trong C, num +=2 giống như num = num + 2. Lệnh ‘printf’ được thực thi khi đối số thứ hai vẫn thỏa. Một khi giá trị của biến trở nên lớn hơn 30, điều kiện không thỏa nữa và vì vậy vòng lặp không được thực thi. Dấu ngoặc nhọn {} không cần thiết khi chỉ có một câu lệnh hiện diện trong vòng lặp, nhưng việc sử dụng cặp dấu ngoặc {} là một thói quen lập trình tốt.

1. Tạo một tập tin mới.
2. Nhập vào đoạn mã lệnh sau:

#include <stdio.h>
#include <conio.h>
main()
{   
     int  num;
     printf("The even Numbers from 1 to 30 are\n");
     for (num = 2; num <= 30; num +=2)
           printf("%d\n", num);
     getch();
}

3. Biên dịch và thực thi chương trình.

KẾT QUẢ:

Thứ Tư, 20 tháng 6, 2012

[Tự học Lập trình C] Bài 9: Vòng Lặp [Lý Thuyết]


Bài 9: Vòng lặp [Lý Thuyết]

Mục tiêu:

Kết thúc bài học này, bạn có thể:

Ø  Hiểu được vòng lặp ‘for’ trong C
Ø  Làm việc với toán tử ‘phẩy’
Ø  Hiểu các vòng lặp lồng nhau
Ø  Hiểu vòng lặp ‘while’ và vòng lặp ‘do-while’
Ø  Làm việc với lệnh ‘break’ và lệnh ‘continue’
Ø  Hiểu hàm ‘exit()’.

Giới thiệu:

Một trong những điểm mạnh lớn nhất của máy tính là khả năng thực hiện một chuỗi các lệnh lặp đi lặp lại. Điều đó có được là do sử dụng các cấu trúc lặp trong ngôn ngữ lập trình. Trong bài này bạn sẽ tìm hiểu các loại vòng lặp khác nhau trong C.

9.1 Vòng lặp:

Vòng lặp là một đoạn mã lệnh trong chương trình được thực hiện lặp đi lặp lại cho đến khi thỏa mãn một điều kiện nào đó. Vòng lặp là một khái niệm cơ bản trong lập trình cấu trúc.
Trong C có các loại vòng lặp sau:

         Vòng lặp for
         Vòng lặp while
         Vòng lặp do…while

Ta sử dụng các toán tử quan hệ  toán tử logic trong các biểu thức điều kiện để điều khiển sự thực hiện của vòng lặp.

9.2 Vòng lặp ‘for’:

Cú pháp tổng quát của vòng lặp for như sau:
    for( khởi tạo giá trị cho biến điều khiển;
           biểu thức điều kiện;
           biểu thức thay đổi giá trị của biến điều khiển)
    {
           Câu lệnh (các câu lệnh);
    }
Khởi tạo giá trị cho biến điều khiển là một câu lệnh gán giá trị ban đầu cho biến điều khiển trước khi thực hiện vòng lặp. Lệnh này chỉ được thực hiện duy nhất một lần. Biểu thức điều kiện là một biểu thức quan hệ, xác định điều kiện thoát cho vòng lặp. Biểu thức thay đổi giá trị của biến điều khiển  xác định biến điều khiển sẽ bị thay đổi như thế nào sau mỗi lần vòng lặp được lặp lại (thường là tăng hoặc giảm giá trị của biến điều khiển). Ba phần trên được phân cách bởi dấu chấm phẩy. Câu lệnh trong thân vòng lặp có thể là một lệnh duy nhất (lệnh đơn) hoặc lệnh phức (nhiều lệnh).
Vòng lặp for sẽ tiếp tục được thực hiện chừng nào mà biểu thức điều kiện còn đúng (true). Khi biểu thức điều kiện là sai (false), chương trình sẽ thoát ra khỏi vòng lặp for.
Xem ví dụ sau:

Ví dụ 9.1:
/* Đây là chương trình minh họa vòng lặp for trong chương trình C*/
#include <stdio.h>
#include <conio.h>
main()
{
     int count;
     printf("\t This is a \n");
     for (count = 1; count <= 6; count++)
           printf("\n \t \t nice");
     printf("\n\t\t world. \n");
     getch();
}

Kết quả của chương trình:

[Tự học Lập trình C] Bài 8: Điều Kiện [Thực Hành]


Bài 8: Điều kiện [Thực Hành]

Mục tiêu:


Kết thúc bài học này, bạn có thể:


Ø  Sử dụng:

§  Câu lệnh if

§  Câu lệnh if – else

§  Câu lệnh với nhiều if

§  Câu lệnh if lồng nhau

§  Câu lệnh switch.


Các bước trong bài học này được trình bày chi tiết, rõ ràng và cẩn thận. Điều này giúp ta hiểu rõ về công cụ lập trình. Thực hiện theo các bước sau thật cẩn thận.


Phần I - Trong thời gian 1 giờ 30 phút đầu:


8.1 Lệnh if:


Ví dụ 1:

Trong phần này chúng ta sẽ viết một chương trình để tính tiền hoa hồng phải trả cho người bán hàng dựa vào số lượng hàng họ bán được.
Bài toán:

Công ty SARA sẽ trả 10% tiền hoa hồng cho nhân viên bán hàng của công ty nếu doanh số bán hàng của nhân viên đạt $10,000 hoặc hơn. Tính tiền hoa hồng phải trả cuối mỗi thánng.

Bài toán khai báo hai biến kiểu ‘float’ là sales_amt  com. Chú ý, các biến được khai báo trong cùng một dòng trong chương trình thì sử dụng dấu phẩy (,) để phân cách giữa các biến.


Theo dõi đoạn mã lệnh dưới đây:


     printf(“Enter the Sales Amount: “);

     scanf(“%f”,&sales_amt);


Trong hàm printf(), chúng ta hiển thị thông điệp yêu cầu nhập doanh số bán hàng, và trong hàm scanf() sử dụng %f để nhận một giá trị từ người dùng. Giá trị nhập vào sẽ được gán cho biến sales_amt.


     if  (sales_amt >= 10000)

           com = sales_amt * 0.1;


Câu lệnh trên được dùng để kiểm tra giá trị của biến sales_amt có lớn hơn hoặc bằng 10000 không. >= là toán tử so sánh, sẽ trả về giá trị đúng hoặc sai. Trong trường hợp, nếu bạn nhập vào giá tri 15000, điều kiện (sales_amt >= 10000) có kết quả là đúng. Nếu đúng, nó sẽ thực thi câu lệnh com = sales_amt * 0.1. Bây giờ giá trị của biến com sẽ là 1500. Nếu điều kiện là sai, nó sẽ in ra giá trị tiền hoa hồng là 0. Ở đây chúng ta thấy, điều kiện if chỉ có một lệnh duy nhất. Nếu có nhiều hơn một lệnh cho điều kiện if, các lệnh phải được đặt trong cặp dấu ngoặc {}.

     printf(“\n Commission = %f”, com);


Câu lệnh trên được sử dụng để hiển thị giá trị tiền hoa hồng. ‘%f’ được sử dụng để hiển thị giá trị của một biến ‘float’ được đưa ra sau dấu phẩy ở cuối của hàm printf(). Vì vậy, printf() ở đây hiển thị tiền hoa hồng tính được.


8.1.1 Tính tiền hoa hồng:

1. Tạo một tập tin mới.

2. Nhập vào đoạn mã lệnh sau:

#include <stdio.h>

#include <conio.h>

main()

{    float com = 0, sales_amt;

     printf("Enter the Sales Amount: ");

     scanf("%f", &sales_amt);

     if (sales_amt >= 10000)

           com = sales_amt * 0.1;

     printf("\n Commission = %f", com);
     getch();

}

3. Biên dịch và thực thi chương trình.



Kết quả: