Mục tiêu môn học: Cung cấp cho sinh viên các kỹ năng cơ bản để lập trình giải quyết các vấn đề, bài toán. Các chương trình được thể hiện bằng NNLT C. Riêng về ngôn ngữ lập trình C, các sinh viên được cung cấp các kỹ năng:Đọc và viết được chương trình đơn giảnHiểu cấu trúc ngôn ngữSử dụng thành thạo các thư viện chuẩnNhận biết và sửa chữa các lỗi thường gặp khi lập trìnhCác môn học tiên quyết: Nhập môn tin học.include intmain(void){inta, b;printf(“Nhap 2 so ngguyen: );scanf(%i %i, a, b);printf(%i %i = %i, a, b, a b);return 0;
Trang 1NHẬP MÔN LẬP TRÌNH
Dành cho các l p ớ
Dành cho các l p ớ
Cao Đ ng Công Ngh Thông Tin ẳ ệ
Cao Đ ng Công Ngh Thông Tin ẳ ệ
Trang 2Đề cương bài giảng
Thời lượng: 45 tiết
Mục tiêu môn học: Cung cấp cho sinh viên các kỹ năng cơ
bản để lập trình giải quyết các vấn đề, bài toán Các chương trình được thể hiện bằng NNLT C Riêng về ngôn ngữ lập trình C, các sinh viên được cung cấp các kỹ năng:
Đọc và viết được chương trình đơn giản
Hiểu cấu trúc ngôn ngữ
Sử dụng thành thạo các thư viện chuẩn
Nhận biết và sửa chữa các lỗi thường gặp khi lập trình
Các môn học tiên quyết: Nhập môn tin học
Nội dung bài giảng:
Trang 3Nội dung môn học
Trang 4Tổng quan
Khái niệm chương trình – lập trình
Cấu trúc một chương trình đơn giản
Khái niệm Thuật toán – biểu diễn thuật toán
Khái niệm NNLT, sơ lược lịch sử phát triển NNLT
Ngôn ngữ lập trình C
Trang 5Các thành phần của
chương trình C
Trang 6Ví dụ chương trình C
/*VIDU.CPP*/
#include <stdio.h>
int main() {
printf(“Nhap mon lap trinh\n"); printf(“Vi du don gian\n");
printf(“Nhap mon lap trinh\n"); printf(“Vi du don gian\n");
Trang 7Một số lưu ý từ ví dụ
Phần ghi chú được trình biên dịch bỏ qua
Phân biệt chữ in hoa và chữ in thường
Câu lệnh luôn được kết thúc bằng dấu ;
Chuỗi ký tự phải ghi giữa cặp nháy kép “
In xuống dòng dùng ký tự \n
Chương trình nên thông báo kết quả thực hiện với hệ
thống: Tốt – 0, có lỗi – 1, 2, 3 …
Chương trình có một hàm main
Trang 8Ví dụ 2
#include <stdio.h>
int main(void) {
Trang 9Biến – Variable
int a , b ;
Chứa dữ liệu có thể thay đổi được trong chương trình
Muốn sử dụng phải khai báo
Tên: gồm chữ cái, ký số, dấu nối (_), không được bắt
đầu bằng ký số
Biến khai báo trong khối được gọi là biến cục bộ,
không thuộc khối nào được gọi là biến toàn cục
Có tác dụng trong toàn khối kể từ lúc được khai báo
Trang 10Lệnh xuất - printf
Xuất dữ liệu ra màn hình:
printf ( " %d - %d = %d \n" , a , b , a - b );
Các ký tự hằng được in nguyên văn
Các ký tự định dạng được thay bằng giá trị của biểu
thức tương ứng:
%d: ký tự định dạng số nguyên kiểu int
Các ký tự điều khiển: \n – xuống dòng; \t – dấu tab;
\\ – dấu \; \“– dấu “ …
Thư viện: stdio.hThư viện:
Trang 11 Dữ liệu phải được nhập vào các biến.
Trước tên biến phải ghi dấu &Trước tên biến phải ghi dấu & - toán tử địa chỉ Nếu
không có toán tử địa chỉ, giá trị của biến sẽ không được cập nhật
Thư viện: stdio.hThư viện:
Trang 12Kiểu dữ liệu cơ sở
trong C
Trang 13Các kiểu dữ liệucủa C
C hỗ trợ khá nhiều kiểu
Trang 14Hằng – Constant
const int days_in_week int days_in_week = 7;
Chứa dữ liệu không thể thay đổi được trong chương trình
Muốn sử dụng phải khai báo.
Phải có kiểu (tương tự như biến)
Hằng số có chứa “.” hoặc “e” có kiểu double (3.5, 1e-7, -1.29e15)
Hằng số kiểu float kết thúc bởi “F” (3.5F, 1e-7F)
Hằng số kiểu long double kết thúc bởi “L” (-1.29e15L, 1e-7L)
Hằng số không có “.”, “e” hoặc “F” có kiểu int. Ví dụ: 10000, -35
(Một vài trình biên dịch tự động chuyển thành long int nếu giá trị hằng tràn kiểu int)
Khai báo hằng long int phải thêm vào cuối “L” (9000000L)
Trang 15Ví dụ về hằng
Các hằng pi, days_in_week, sunday được tạo với từ khóa const
#include <stdio.h>
int main(void) {
Trang 16int day = SUNDAY;
long flag = USE_API;
#include <stdio.h>
#define DAYS_IN_WEEK 7
int day = SUNDAY;
long flag = USE_API;
Tìm từ “PI”, thay bằng 3.1415
Không thay thế “PI”
Lưu ý: không
có “=” và “;”
Trang 17Toán tử trong C
Trang 18 Toán tử sizeofToán tử sizeof
Biểu thức điều kiện
Trang 19 “/” cho kết quả phụ thuộc vào kiểu của các toán hạng
“%” không thực hiện được với các số thực
Trang 20Ví dụ về toán tử chia “/”
Trình biên dịch dựa vào kiểu của các toán hạng để quyết định phép chia tương ứng
int main(void) {
int i = 5, j = 4, k; double f = 5.0, g = 4.0, h;
int i = 5, j = 4, k; double f = 5.0, g = 4.0, h;
“i”, “j” kiểu int, “/” là
phép chia lấy nguyên
Trang 21Ép kiểu
Ép kiểu làm thay đổi tạm thời Ép kiểu làm thay đổi tạm thời kiểu của một biến trong một
biểu thức
int main(void) {
Trang 23Trước hay sau ?
Thứ tự thực hiện các toán tử ++ và phụ thuộc vào vị trí của chúng (trước hay sau) so với biến:
i=6, j=6 i=5, j=6
Trang 24Kiểu luận lý trong C
Trong C không có kiểu dữ liệu luận lý (thể hiện các
giá trị ĐÚNG – SAI), thay vào đó các biểu thức so sánh sẽ cho kết quả là SỐ
Giá trị 0 (0.0) ứng với kết quả SAI (FALSE)
Các giá trị khác như 1, -3.5, -7, 10.4, … (khác không)Các giá trị khác như 1, -3.5, -7, 10.4, … (khác không)
đều được xem là ĐÚNG (TRUE)
Trang 27Toán tử luận lý
Lưu ý khi sử dụng các toán tử luận lý:
Nếu không có các dấu (), các phép toán được thực hiện từ trái sang phải
if(i < 10 && a[i] > 0)
Trang 28Toán tử trên bit
Các toán tử trên bit chỉ có tác dụng trên các kiểu số nguyên:
Trang 29Phép gán
Có thể sử dụng liên tiếp nhiều phép gán
Giá trị được gán sẽ sẵn sàng cho lệnh kế tiếp
n đều nhận giá trị 22.
“j” được gán 93, giá trị 93 sẽ được in ra màn hình
Trang 30Lưu ý:
Vế trái phép gán luôn phải là biếnVế trái phép gán luôn phải là biến
Không được nhầm lẫn giữa so sánh bằng “==” và gán “=”
#include <stdio.h>
int main(void) {
Trang 32printf("\"big\" is %u bytes\n", sizeof(big));
printf("a short is %u bytes\n", sizeof(short));
printf("a double is %u bytes\n", sizeof (double));
printf("\"big\" is %u bytes\n", sizeof(big));
printf("a short is %u bytes\n", sizeof(short));
printf("a double is %u bytes\n", sizeof (double));
Trang 33Biểu thức chọn theo điều kiện
(
(điều kiện điều kiện ) ? BT1 ) ? BT1 : BT2 : BT2
Biểu thức nhận giá trị BT1Biểu thức nhận giá trị BT1 nếu điều kiện khác 0 (ĐÚNG),
Trang 36Cấu trúc điều khiển
Trang 37Cấu trúc điều khiển
Lệnh rẽ nhánh: if – else
Lệnh rẽ nhiều nhánh: switch
Vòng lặp: while, do while, for
Các từ khóa: break và continue
Trang 38Lệnh rẽ nhánh if
Cú pháp:
if (điều kiện ( điều kiện )
S ;
Điều kiện: biểu thức cho kết quả SỐ: biểu thức cho kết quả SỐ; phải
được đặt giữa cặp ngoặc đơn ()
S phải là 1 câu lệnh, nếu nhiều hơn 1 lệnh, các
lệnh phải được đặt giữa cặp ngoặc nhọn {} –
printf(“So lon la: %ds\n“, max);
scanf("%d %d", &a, &b);
0
≠0
Trang 39Lưu ý
Nếu đặt dấu chấm phẩy (;) ở ngay sau biểu thức điều kiện thì lệnh S của if xem như “
thì lệnh S của if xem như “KHÔNG LÀM GÌKHÔNG LÀM GÌ”
printf(“Nhap mot so nguyen: ");
Trang 40 Phần lệnh else có thể thêm vào trong câu lệnh
if để chỉ thị các lệnh thực hiện khi điều kiện
printf(“So lon la: %d\n“, max);
scanf("%d %d", &a, &b);
0
≠0 S e
Trang 41printf("i chap nhan duoc\n");
i chap nhan duoc
printf("i la so am\n");
i la so am
Trang 42Cấu trúc nhiều chọn lựa – switch
Cú pháp:
switch (biểu thức ( biểu thức )
{
case gt 1 : S : S 1 ; [break ; [ break ;]
case gt 2 : S : S 2 ; [break ; [ break ;]
Trang 43Ví dụ lệnh switch
switch(c) {
case 'a': case 'A':
printf(“Dien tich = %.2f\n", r * r * pi); break;
case 'a': case 'A':
printf(“Dien tich = %.2f\n", r * r * pi);
break ; case 'c': case 'C':
printf(“Chu vi = %.2f\n", 2 * r * pi);
break ; case 'q':
printf(“Thoat\n");
break ; default :
printf(“Chon khong hop le\n");
}
Trang 44Một số lưu ý – switch
Nếu không có giá trị nào khớp, các lệnh trong phần
default sẽ được thực thi; và nếu không có defaultcũng không xảy ra lỗi
Lệnh breakLệnh break rất quan trọng
i = 3;
switch(i) { case 3: printf("i = 3\n"); case 2: printf("i = 2\n"); case 1: printf("i = 1\n"); }
i = 3;
switch(i) { case 3: printf("i = 3\n"); case 2: printf("i = 2\n"); case 1: printf("i = 1\n"); }
Trang 45biểu thức
S 1 ; break;
gt1
…
S 2 ; break;
Trang 46Ví dụ khác – switch
//Doan chuong trinh doc so 0 9 switch(so) {
case 0: printf(“khong\n"); case 1: printf(“mot\n"); case 2: printf(“hai\n"); case 3: printf(“ba");
Trang 47Lệnh lặp while
Cú pháp: while (điều kiện ( điều kiện )
S ;
Điều kiện: biểu thức cho kết quả SỐ: biểu thức cho kết quả SỐ;
phải được đặt giữa cặp ngoặc đơn ()
S phải là 1 câu lệnh, nếu nhiều hơn 1
lệnh, các lệnh phải được đặt giữa cặp
S
S
Đ
Trang 48Lưu ý dấu chấm phẩy
Lưu ý dấu chấm phẩy ; ;
Dấu ‘;’ đặt ngay sau biểu thức điều kiện đồng nghĩa với lệnh
Đôi khi người lập trình cố ý sử dụng lệnh rỗngĐôi khi người lập trình cố ý sử dụng lệnh rỗng
Trang 49Lệnh lặp do while
Cú pháp:
do
S ;
while (điều kiện ( điều kiện );
Điều kiện: biểu thức cho kết quả SỐ: biểu thức cho kết quả SỐ; phải
được đặt giữa cặp ngoặc đơn ()
S phải là 1 câu lệnh, nếu nhiều hơn 1 lệnh,
các lệnh phải được đặt giữa cặp ngoặc
nhọn {} –
nhọn {} – khối lệnhkhối lệnh.
điều kiện
S
S
Đ
Trang 51j = -10 stop
Trang 53Bài tập 2
Viết chương trình yêu cầu người dùng nhập vào một ký tự bất kỳ Sau khi nhập, chương trình sẽ hỏi người dùng có muốn nhập tiếp ký tự khác hay không ( Y/N)?
Nếu trả lời ‘n’ hoặc ‘N’, chương trình kết thúc
Nếu trả lời ‘y’ hoặc ‘Y’ , sẽ cho phép người dùng nhập liên tục các ký tự cho đến khi người dùng nhập vào
ký tự ‘e’ hoặc ‘E’ Lúc này, chương trình sẽ hỏi lại người dùng có muốn nhập ký tự tiếp không? Và lặp lại các bước thực hiện như trên
Trang 55for(j = 5; j > 0; j ) {
printf("j = %d ", j);
printf("%s\n", ((j%2)==0)?“chan":“le"); }
Trang 56Bước lặp trong for
C không giới hạn độ lớn của bước lặp trong for
Trang 57Nói thêm về for
Phần lệnh khởi động và lệnh điều khiển có thể gồm nhiều lệnh đơn giản, các lệnh này cách nhau bởi dấu phẩy (,)
Dùng while sẽ hợp
lý hơn Vòng lặp không kết thúc
Trang 58printf(“j = %d\n", j); nhap mot so nguyen : int
khong hop le, nhap lai nhap mot so nguyen: 16
j = 16
nhap mot so nguyen : int
khong hop le, nhap lai nhap mot so nguyen: 16
j = 16
Nếu scanf trả về 1, chương trình thoát khỏi vòng lặp for
Trang 59thì bỏ qua lệnh in j
Trang 61Cấu trúc điều khiển
Trang 62Cấu trúc điều khiển
Lệnh rẽ nhánh: if – else
Lệnh rẽ nhiều nhánh: switch
Vòng lặp: while, do while, for
Các từ khóa: break và continue
Trang 63Lệnh rẽ nhánh if
Cú pháp:
if (điều kiện ( điều kiện )
S ;
Điều kiện: biểu thức cho kết quả SỐ: biểu thức cho kết quả SỐ; phải
được đặt giữa cặp ngoặc đơn ()
S phải là 1 câu lệnh, nếu nhiều hơn 1 lệnh, các
lệnh phải được đặt giữa cặp ngoặc nhọn {} –
printf(“So lon la: %ds\n“, max);
scanf("%d %d", &a, &b);
0
≠0
Trang 64Lưu ý
Nếu đặt dấu chấm phẩy (;) ở ngay sau biểu thức điều kiện thì lệnh S của if xem như “
thì lệnh S của if xem như “KHÔNG LÀM GÌKHÔNG LÀM GÌ”
printf(“Nhap mot so nguyen: ");
Trang 65 Phần lệnh else có thể thêm vào trong câu lệnh
if để chỉ thị các lệnh thực hiện khi điều kiện
printf(“So lon la: %d\n“, max);
scanf("%d %d", &a, &b);
0
≠0 S e
Trang 66printf("i chap nhan duoc\n");
i chap nhan duoc
printf("i la so am\n");
i la so am
Trang 67Cấu trúc nhiều chọn lựa – switch
Cú pháp:
switch (biểu thức ( biểu thức )
{
case gt 1 : S : S 1 ; [break ; [ break ;]
case gt 2 : S : S 2 ; [break ; [ break ;]
Trang 68Ví dụ lệnh switch
switch(c) {
case 'a': case 'A':
printf(“Dien tich = %.2f\n", r * r * pi); break;
case 'a': case 'A':
printf(“Dien tich = %.2f\n", r * r * pi);
break ; case 'c': case 'C':
printf(“Chu vi = %.2f\n", 2 * r * pi);
break ; case 'q':
printf(“Thoat\n");
break ; default :
printf(“Chon khong hop le\n");
}
Trang 69Một số lưu ý – switch
Nếu không có giá trị nào khớp, các lệnh trong phần
default sẽ được thực thi; và nếu không có defaultcũng không xảy ra lỗi
Lệnh breakLệnh break rất quan trọng
i = 3;
switch(i) { case 3: printf("i = 3\n"); case 2: printf("i = 2\n"); case 1: printf("i = 1\n"); }
i = 3;
switch(i) { case 3: printf("i = 3\n"); case 2: printf("i = 2\n"); case 1: printf("i = 1\n"); }
Trang 70biểu thức
S 1 ; break;
gt1
…
S 2 ; break;
Trang 71Ví dụ khác – switch
//Doan chuong trinh doc so 0 9 switch(so) {
case 0: printf(“khong\n"); case 1: printf(“mot\n"); case 2: printf(“hai\n"); case 3: printf(“ba");
Trang 72Lệnh lặp while
Cú pháp: while (điều kiện ( điều kiện )
S ;
Điều kiện: biểu thức cho kết quả SỐ: biểu thức cho kết quả SỐ;
phải được đặt giữa cặp ngoặc đơn ()
S phải là 1 câu lệnh, nếu nhiều hơn 1
lệnh, các lệnh phải được đặt giữa cặp
S
S
Đ
Trang 73Lưu ý dấu chấm phẩy
Lưu ý dấu chấm phẩy ; ;
Dấu ‘;’ đặt ngay sau biểu thức điều kiện đồng nghĩa với lệnh
Đôi khi người lập trình cố ý sử dụng lệnh rỗngĐôi khi người lập trình cố ý sử dụng lệnh rỗng
Trang 74Lệnh lặp do while
Cú pháp:
do
S ;
while (điều kiện ( điều kiện );
Điều kiện: biểu thức cho kết quả SỐ: biểu thức cho kết quả SỐ; phải
được đặt giữa cặp ngoặc đơn ()
S phải là 1 câu lệnh, nếu nhiều hơn 1 lệnh,
các lệnh phải được đặt giữa cặp ngoặc
nhọn {} –
nhọn {} – khối lệnhkhối lệnh.
điều kiện
S
S
Đ
Trang 76j = -10 stop
Trang 78Bài tập 2
Viết chương trình yêu cầu người dùng nhập vào một ký tự bất kỳ Sau khi nhập, chương trình sẽ hỏi người dùng có muốn nhập tiếp ký tự khác hay không ( Y/N)?
Nếu trả lời ‘n’ hoặc ‘N’, chương trình kết thúc
Nếu trả lời ‘y’ hoặc ‘Y’ , sẽ cho phép người dùng nhập liên tục các ký tự cho đến khi người dùng nhập vào
ký tự ‘e’ hoặc ‘E’ Lúc này, chương trình sẽ hỏi lại người dùng có muốn nhập ký tự tiếp không? Và lặp lại các bước thực hiện như trên
Trang 80for(j = 5; j > 0; j ) {
printf("j = %d ", j);
printf("%s\n", ((j%2)==0)?“chan":“le"); }
Trang 81Bước lặp trong for
C không giới hạn độ lớn của bước lặp trong for
Trang 82Nói thêm về for
Phần lệnh khởi động và lệnh điều khiển có thể gồm nhiều lệnh đơn giản, các lệnh này cách nhau bởi dấu phẩy (,)
Dùng while sẽ hợp
lý hơn Vòng lặp không kết thúc
Trang 83printf(“j = %d\n", j); nhap mot so nguyen : int
khong hop le, nhap lai nhap mot so nguyen: 16
j = 16
nhap mot so nguyen : int
khong hop le, nhap lai nhap mot so nguyen: 16
j = 16
Nếu scanf trả về 1, chương trình thoát khỏi vòng lặp for
Trang 84thì bỏ qua lệnh in j
Trang 86Hàm - Function
Trang 87Hàm - Function
Một số nguyên tắc
Cách khai báo và gọi thực hiện
Prototype của hàm
Truyền tham số cho hàm
Biến toàn cục, biến cục bộ, biến static, biến thanh ghi,
…
Cách thức C thực hiện các lời gọi hàm – stack
Trang 88Một số nguyên tắc
Các hàm trong NNLT C đều ngang cấp với nhau:
Hàm không được khai báo lồng nhau
Thứ tự khai báo không quan trọng
Hàm có thể nhận và xử lý nhiều tham số hoặc không có tham số nào
Hàm có thể trả về một giá trị hoặc không
Biến khai báo trong hàm F chỉ có giá trị trong F, không sử dụng được biến này trong các hàm khác được
Trang 89nhận vào 2 tham số khi được gọi
kiểu của giá trị trả
về
giá trị được trả về qua lệnh return
Trang 90Ví dụ: gọi thực hiện hàm Power
Trang 92 Dòng khai báo
double Power(double, int);
được hiểu là khai báo prototype của hàm Power
Được dùng khi chương trình sử dụng một hàm trước khi khai báo
Khai báo prototype thông báo cho trình biên dịch biết kiểu của giá trị trả về và mô tả chi tiết về các tham số của hàm
Các hàm thư viện chuẩn được khai báo prototype trong các tập tin header (stdio.h, conio.h, …)
Các hàm do lập trình viên tự xây dựng phải tự khai báo prototype
Trang 94float g=6.5;
void main() {
int i = 5, j, k = 2;
float f = 2.8F ;
d = 3.7;
} void F(int v) {
int i = 5, j, k = 2;
float f = 2.8F ;
d = 3.7;
} void F(int v) {
Biến Biến toàn toàn cục: cục:
Không thuộc khối
“f” của hàm F, không
phải của main