1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Cơ sở lập trình - ĐH Phạm Văn Đồng

157 11 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 157
Dung lượng 1,8 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Cơ sở lập trình là học phần giúp cho sinh viên nắm được kiến thức cơ bản để cài đặt thành công một thuật toán thành chương trình bằng ngôn ngữ lập trình C. Qua đó, trang bị cho sinh viên kiến thức nền để tiếp cận và học tập tốt các ngôn ngữ lập trình khác trong các học kỳ tiếp theo.

Trang 1

TRƯỜNG ĐẠI HỌC PHẠM VĂN ĐỒNG KHOA CÔNG NGHỆ THÔNG TIN

TRẦN TẤN TỪ

BÀI GIẢNG

(Dùng cho sinh viên các lớp đại học Công nghệ

thông tin, đại học Sư phạm tin học)

- Tài liệu lưu hành nội bộ -

Trang 2

LỜI NÓI ĐẦU

Cơ sở lập trình là học phần giúp cho sinh viên nắm được kiến thức cơ bản để cài đặt thành công một thuật toán thành chương trình bằng ngôn ngữ lập trình C Qua đó, trang bị cho sinh viên kiến thức nền để tiếp cận và học tập tốt các ngôn ngữ lập trình khác trong các học kỳ tiếp theo

Bài giảng được biên soạn và giảng dạy cho sinh viên năm thứ nhất, bậc đại học ngành Công nghệ thông tin và ngành Sư phạm tin học kể từ năm 2008, theo hình thức đào tạo niên chế Hiện nay chương trình đào tạo tại Trường Đại học Phạm Văn Đồng được chuyển đổi sang đào tạo theo học chế tín chỉ Chính vì vậy, bài giảng được chỉnh sửa, bổ sung cho phù hợp với hình thức đào tạo theo học chế tín chỉ

Cũng nhân đây tôi xin chân thành cám ơn hội đồng chuyên môn khoa Công nghệ thông tin, Th.S Huỳnh Triệu Vỹ và Th.S Võ Đức Lân đã dành thời gian đọc và đóng góp nhiều ý kiến quý báu để bài giảng được hoàn chỉnh hơn, đáp ứng nhu cầu học tập của sinh viên Khoa Công nghệ thông tin - Trường Đại học Phạm Văn Đồng

Bài giảng không sao tránh khỏi những thiếu sót, mong các bạn đồng nghiệp đóng góp ý kiến để bài giảng hoàn thiện hơn trong các lần chỉnh sửa sau

Xin chân thành cám ơn quý thầy cô, các bạn đồng nghiệp !

Quảng Ngãi, ngày 25/12/2013

TRẦN TẤN TỪ

Trang 3

Bài giảng Cơ sở lập trình -1-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

CHƯƠNG 1: CÁC THÀNH PHẦN CƠ BẢN

M ục tiêu

Kết thúc chương, sinh viên có thể:

Nắm được các thành phần cơ bản của ngôn ngữ lập trình C: bộ ký hiệu, từ

khóa, tên và cách đặt tên, cách ghi lời chú thích

Nắm được cấu trúc chung của một chương trình C

Hiểu và vận dụng được các phép toán, các hàm đã được xây dựng cho các

kiểu dữ liệu cơ sở: kiểu số nguyên, kiểu số thực, kiểu ký tự, kiểu boolean

1.1 Bộ ký hiệu và từ khóa

1.1.1 Bộ ký hiệu

- 26 chữ cái la tinh hoa: A, B, …, Z

- 26 chữ cái la tinh thường: a, b, …, z

- Không thể định nghĩa lại từ khóa

- Các từ khóa trong C được viết dưới dạng chữ thường

M ột số từ khóa thông dụng hay dùng trong ngôn ngữ lập trình C

short sizeof static struct switch typedef

union usnigned void volatile while asm …

1.1.3 Tên và cách đặt tên

Trong chương trình, người lập trình có thể dùng rất nhiều tên: tên chương trình, tên biến, tên hằng, tên hàm,… Mọi tên đều phải khai báo trước khi sử dụng Qui tắc đặt tên:

- Tên bao gồm dãy các ký tự liền nhau như các chữ cái a,…,z, A,… Z, các chữ

số 0, …, 9 và dấu gạch nối dưới

Trang 4

Bài giảng Cơ sở lập trình -2-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

- Tên không được bắt đầu bằng chữ số

- Tên không được chứa các ký tự đặc biệt như dấu cách, dấu chấm câu,… Số

ký tự tối đa trong tên của Turbo C là 32

- Tên không được trùng với từ khóa

- C là ngôn ngữ lập trình phân biệt chữ hoa và chữ thường, vì vậy tên NGHIEM sẽ khác với các tên: Nghiem, nghiem,…

- Không được đặt tên bằng tiếng Việt (C xem cách làm đó là sai cú pháp)

- Các ví dụ về đặt tên:

+ Một số tên đặt đúng: Gia_tri, _DX, pi, …

+ Một số tên đặt sai: 3X, PI$, Bien 1,

1.1.4 Chú thích

Khi viết chương trình bạn nên thêm vào các lời chú thích để cho chương trình sáng sủa và dễ hiểu Trình biên dịch sẽ không biên dịch các chú thích để tạo ra

mã chương trình mà nó có tác dụng thuyết minh thêm cho dễ hiểu

Phần văn bản nằm giữa cặp ký hiệu mở /* và đóng */ chính là phần chú thích Phần chú thích có thể nằm trên nhiều dòng, miễn là nằm trong cặp dấu mở và đóng nêu trên

L ưu ý: Trong C++ lời chú thích nằm sau cặp dấu // và viết trên một dòng

1.2 Cấu trúc chung của một chương trình C

Cấu trúc tổng thể của một chương trình C thường có các khối thông dụng sau:

……… Khai báo các biến ngoài

………

<Kiểu dữ liệu trả về> main() /* chương trình C bắt buộc phải có hàm main */

return <Kết quả trả về>

}

Trang 5

Bài giảng Cơ sở lập trình -3-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

……… Function prototype /* định nghĩa nội dung tường minh của hàm */

{

Khai báo các biến, hằng của hàm

Các câu lệnh thực hiện của hàm

}

……… Như vậy, một chương trình C thường bao gồm các thành phần: các chỉ tiền

xử lý, các định nghĩa: kiểu, hằng, khai báo biến ngoài, các hàm tự tạo, hàm main Trong đó:

+ #include <…> /* để gọi các tập tin tiền xử lý */

Ví dụ 1.1: #include <stdio.h>

+ #define <Tên hằng số> <Giá trị hằng> /* định nghĩa các hằng số */

Ví dụ 1.2: #define MAX 100

+ typedef <tên kiểu cũ> <tên kiểu mới> /* định nghĩa kiểu dữ liệu */

Ví dụ 1.3: typedef int Songuyen;

+ Function prototype /* khai báo nguyên mẫu hàm gồm tên và tham số */

Trong phần khai báo nguyên mẫu hàm, bạn chỉ ra kiểu giá trị trả về của hàm, tên hàm, tham số hình thức của hàm

Ví dụ 1.4: Khai báo nguyên mẫu hàm tính diện tích hình tròn

float Tinh_dien_tich(float radius);

+ Khai báo các biến ngoài (biến toàn cục): Là nơi khai báo các biến có tầm tác dụng trong cả chương trình

+ /* định nghĩa nội dung tường minh của hàm */

Ví dụ 1.6: Định nghĩa nội dung hàm tính diện tích hình tròn với tham số là radius (bán kính của hình tròn)

float Tinh_dien_tich(float radius)

Trang 6

Bài giảng Cơ sở lập trình -4-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

printf(“Chao cac ban\n”);

printf(“Hen gap lai\n”);

Hàm printf là hàm cho in ra màn hình nội dung nằm trong cặp dấu “ ”

Ký tự \n là ký tự điều khiển xuống dòng mới

Phần thân của chương trình bao gồm đoạn chương trình:

main() {

} getch(); Khi chương trình viết ra màn hình 2 câu “Chao cac ban” và

“Hen gap lai” thì dừng lại cho người sử dụng xem Nếu không có lệnh này thì chương trình trở về màn hình văn bản chương trình, người sử dụng sẽ không xem được kết quả, lúc đó phải bấm tổ hợp phím Alt + F5 mới xem được kết quả

Ví dụ 1.8: Chương trình tính diện tích hình tròn

Gi ải

Trang 7

Bài giảng Cơ sở lập trình -5-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

float R, Dien_tich; Khai báo biến R và Dien_tich có kiểu số thực

printf(“Nhap ban kinh R = “); in ra màn hình dòng: Nhap ban kinh R =

scanf(“%f”,&R); Hàm đọc giá trị từ bàn phím vào cho biến R %f là mã định dạng để qui định đọc giá trị vào cho biến R có kiểu số thực, &R được hiểu là đọc giá trị vào cho ô nhớ của biến R

Dòng lệnh printf(“Dien tich hinh tron co ban kinh %f là

%f”,R,Dien_tich); In ra giá trị của biến R và biến Dien_tich với qui cách in là số thực

Ví dụ 1.9: Chương trình tính diện tích hình tròn có sử dụng chương trình con

Trang 8

Bài giảng Cơ sở lập trình -6-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Việc tính diện tích được thực hiện bằng hàm Tinh_dien_tich với tham số

là radius Nguyên mẫu hàm Tinh_dien_tich được khai náo trước hàm main() và định nghĩa tường minh nội dung của hàm ở sau hàm main

1.3 Kiểu dữ liệu cơ sở

1.3.1 Kiểu dữ liệu

Dữ liệu là dạng biểu diễn vật lý của thông tin Những dạng dữ liệu cơ bản được xử lý trong máy tính điện tử gồm: Các ký tự, hình ảnh, âm thanh, tri thức, sự kiện, luật dẫn Theo nghĩa rộng, dữ liệu thô là các số, ký tự, hình ảnh hay các kết quả khác của các thiết bị chuyển đổi các lượng vật lý thành các ký hiệu Các dữ liệu loại này thường được xử lý tiếp bởi con người hoặc đưa vào máy tính Trong máy tính, dữ liệu được lưu trữ và xử lý tại đó hoặc chuyển cho một người hay một máy tính khác Dữ liệu thô là một thuật ngữ tương đối, bởi vì dữ liệu đã được xử lý tại bước này có thể là dữ liệu thô ở bước tiếp theo Trong máy tính điện tử, dữ liệu được biểu diễn bằng chuỗi các ký hiệu của một bảng chữ cái nào đó, mà phổ biến nhất là bảng chữ cái nhị phân (gồm 2 ký hiệu “0” và “1”) Một chương trình máy tính là một tập hợp dữ liệu được hiểu là các lệnh

Kiểu dữ liệu là một tập hợp các giá trị mà một biến thuộc kiểu đó có thể nhận được và trên đó xác định một số phép toán Các kiểu dữ liệu này thường được quy định bởi ngôn ngữ lập trình, hay nói cách khác mỗi ngôn ngữ lập trình có một tập các kiểu dữ liệu khác nhau Trong các ngôn ngữ lập trình, mỗi kiểu dữ liệu chỉ biểu diễn được một miền giá trị xác định nào đó, sự giới hạn này là do phụ thuộc vào kích thước của vùng nhớ biểu diễn số đó Vì vậy, các thông tin đặc trưng của một kiểu dữ liệu bao gồm:

+ Tên kiểu dữ liệu

+ Kích thước vùng nhớ biểu diễn nó (tức miền giá trị)

+ Các phép toán sử dụng trên kiểu dữ liệu đó

1.3.2 Kiểu số nguyên

Là tập hợp các số nguyên có thể biểu diễn được trong máy tính và được định nghĩa với một số từ khóa Mỗi từ khóa tương ứng với một kiểu số nguyên có dải biểu diễn giá trị trong phạm vi nhất định Nhưng kiểu số nguyên cơ bản trong ngôn

Trang 9

Bài giảng Cơ sở lập trình -7-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

ngữ lập trình C là kiểu số nguyên có dấu, được định nghĩa với từ khóa int chiếm 2 byte

Bảng các từ khóa số nguyên và phạm vi biểu diễn

+2147483647

L ưu ý: Kiểu char thực chất là kiểu ký tự, song C cho phép dùng các ký tự

như là số nguyên Vì vậy, khi tính toán trong biểu thưc số học thì kiểu char được sử dụng như là số nguyên (chỉ mã ASCII tương ứng của ký tự đó) nhưng khi tính toán trong biểu thức ký tự thì nó được hiểu là ký tự Đây chính là sự mềm dẻo của ngôn ngữ lập trình C

Có nhiều phép tính được định nghĩa cho số nguyên: phép tính số học, phép tính quan hệ, phép tính logic số học

Bảng liệt kê các phép tính số học đối với kiểu số nguyên

Về nguyên tắc phép chia 2 số nguyên cho kết quả là số nguyên Muốn nhận được kết quả là số thực, bạn phái viết (float) a / b

Ví dụ 1.10: a = 15; b = 2; Vậy kết quả a/b sẽ là 15/2 = 7 Bạn muốn nhận kết quả của phép chia là số thực phải viết: (float) a/b; Lúc đó 15/2 = 7.5

Để khởi tạo một biến có kiểu nguyên ta viết:

int i; i = 10; Hoặc viết int i = 10;

Trang 10

Bài giảng Cơ sở lập trình -8-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Hằng số nguyên có định kiểu trước: Để ghi hằng số nguyên với kiểu định trước bạn ghi thêm một ký tự vào cuối dãy số: L cho kiểu long, U cho kiểu Unsigned Integer, UL cho kiểu Unsigned Long

Ví dụ 1.11: 20000U là hằng số nguyên theo kiểu Unsigned Integer;

* Cách biểu diễn số nguyên dưới dạng số Hecxa:

+ Ngoài cách viết theo dạng số thập phân, C còn quy ước cho phép viết số nguyên dưới dạng số Hecxa, ký tự bắt đầu 0x hoặc 0X Chẳng hạn số 65 trong hệ thập phân được viết dưới dạng số Hecxa là 0X41

+ Nếu viết số nguyên dưới dạng số ở hệ cơ số 8 thì ký tự bắt đầu 0 Chẳng hạn số 65 trong hệ thập phân được viết dưới dạng số ở hệ cơ số 8 là: 0101

Hai cách viết trên rất thuận lợi cho những người lập trình hệ thống Lúc đó, một byte có thể biểu diễn hai chữ số Hecxa vì một số Hecxa được biểu diễn bằng một cụm số nhị phân 4 bít Chẳng hạn: số 255 trong hệ thập phân, biểu diễn trong

Trang 11

Bài giảng Cơ sở lập trình -9-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Bảng các từ khóa của số thực và phạm vi biểu diễn

độ chính xác 19 chữ số

Cách viết hằng số thực:

+ Không cần phần lẻ sau dấu chấm: 7

+ Không cần dấu chấm ở phần định trị nếu có phần mũ: 2E-8

+ Viết dạng bình thường: 5.6

+ Không cần số 0 đầu tiên: 1512

+ Chấp nhận dùng chữ e: 0.07e-3

Các phép tính số học đối với kiểu thực: Cộng, trừ, nhân, chia Khác với kiểu

số nguyên, phép chia (/) cho kết quả là số thực và không tồn tại phép toán % cho kiểu số thực

Khởi tạo biến số thực ta viết: float x; x = 7.43; Hoặc viết float x = 7.43;

Hằng số thực định trước kiểu: Ta có thể viết hằng số thực với kiểu được định trước bằng cách ghi thêm ký tự vào cuối dãy số (F cho kiểu float, L cho kiểu Long)

Ví dụ 1.13: 0.1234567E-33L là hằng số thực kiểu long

Các hàm số học dùng cho kiểu số nguyên và số thực

Các hàm số học dùng cho kiểu số nguyên và kiểu số thực được định nghĩa

trong tập tin tiền xử lý math.h và được sử dụng với các đối số là số nguyên hoặc số thực Nếu ký hiệu i là tham số nguyên, f là tham số thực Ta có bảng biểu diễn như

sau:

Trang 12

Bài giảng Cơ sở lập trình -10-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

giá trị trả về

L ưu ý: Các hàm số học chứa trong tập tin tiền xử lý math.h và bạn phải khai

báo ở đầu chương trình theo cú pháp: #include <math.h>

Ví dụ 1.14:

floor(3.146) = 3 floor(3.746) = 3 ceil(56.678) = 57 ceil(-56,678) = -57

1.3.4 Kiểu ký tự

Được định nghĩa với từ khóa char, bao gồm tất cả các ký tự thường dùng:

+ Chữ cái a, b, c

+ Chữ số 0,…,9

+ Các dấu chấm phân đoạn câu: , ! …

Một hằng ký tự được viết trong cặp dấu nháy đơn Chẳng hạn: ‘a’; ‘0’; và mỗi hằng ký tự được lưu trữ trong một byte ô nhớ

Một giá trị kiểu ký tự là 1 phần tử của một tập hữu hạn các ký tự được sắp xếp có thứ tự Có nhiều cách sắp xếp bộ chữ khác nhau (không tồn tại 1 bộ chữ chuẩn cho tất cả các máy tính) Tuy vậy, bộ mã các ký tự được dùng rộng rãi và phổ biến để trao đổi thông tin giữa các máy vi tính là bộ mã ASCII (American Standard Code for Information Interchange) Ở đây ta quan tâm tới 128 ký tự đầu của bảng

mã ASCII (phần chuẩn để xây dựng bộ ký tự cho các ngôn ngữ lập trình)

Khi thực hiện chương trình, một số ký tự không nhìn thấy được trên màn hình, cụ thể được trình bày trong bảng sau:

Trang 13

Bài giảng Cơ sở lập trình -11-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Bảng mã hóa các ký tự không nhìn thấy được

Ngoài ra bạn cũng có thể sử dụng cách viết dưới dạng hệ cơ số 16 hay hệ cơ

số 8 Chẳng hạn ký tự ‘A’ có thể được viết \x41 hay \101 Cách viết này thường được áp dụng cho nữa sau của bảng mã ASCII (vì nữa sau của bảng mã ASCII có hình dạng và vị trí khó nhớ)

Khởi tạo giá trị cho biến ký tự: const char RC = ‘\r’; LF = ‘\n’; ESC =

‘0x1B’;

Các hàm xử lý ký tự nằm trong tập tin tiền xử lý ctype.h

Một số hàm xử lý ký tự

chứa trong biến ký tự c

tự chứa trong biến ký tự c

chứa trong biến ký tự c

Ví dụ 1.16: Chương trình đọc từ bàn phím một ký tự thường, chuyển thành

ký tự hoa và in ra màn hình

Gi ải:

Trang 14

Bài giảng Cơ sở lập trình -12-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

1.3.5 Kiểu dữ liệu Boolean

Trong thực tế ta thường gặp loại đại lượng chỉ nhận một trong hai giá trị: đúng (TRUE) hoặc sai (FALSE) Nhưng trong C kiểu dữ liệu boolean không được định nghĩa một cách tường minh, nó ẩn núp dưới dạng số nguyên Trong C, những kết quả tính toán và trả về là số nguyên giá trị bằng 0 sẽ được hiểu là giá trị FALSE, còn kết quả trả về khác 0 (thông thường là 1) được hiểu là TRUE

Các phép toán của kiểu boolean

Bảng chân trị của các phép toán logic

Ví dụ 1.17: Kết quả của câu lệnh printf(“%d”,0&&3); là 0 trên màn hình

1.4 Câu hỏi và bài tập chương 1

1 Tên dùng để làm gì ? Quy tắc đặt tên trong ngôn ngữ lập trình C ?

2 Chương trình nguồn là gì ? Có mấy loại chương trình dịch ?

3 Kiểu dữ liệu là gì ? Các thông tin đặc trưng của kiểu dữ liệu ?

4 Trình bày các kiểu dữ liệu cơ sở trong ngôn ngữ lập tình C Với mỗi kiểu

nêu khái niệm, từ khóa, số byte biểu diễn, phạm vi biểu diễn ?

Trang 15

Bài gi ảng Cơ sở lập trình -13-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

CHƯƠNG 2: TIỀN XỬ LÝ - HẰNG - BIẾN - TOÁN TỬ

BIỂU THỨC - CÂU LỆNH

M ục tiêu

Kết thúc chương, sinh viên có thể:

Hiểu được ý nghĩa và cách sử dụng của các tập tin tiền xử lý thông dụng Nắm được các khái niệm: hằng, biến, toán tử, biểu thức, câu lệnh và cách sử

d ụng

2.1 Tiền xử lý

Để thực hiện một chương trình trong C, chương trình nguồn của bạn cần được dịch sang ngôn ngữ máy bằng chương trình dịch (compiler), nhưng trước tiên phải trải qua một bước liên kết với các đối tượng cần thiết khác, công việc này được thực hiện bởi bộ tiền xử lý Thật vậy, khi viết một chương trình C, bạn sẽ không viết tất

cả mà chỉ viết những gì liên quan trực tiếp đến các công việc của bạn, phần còn lại thường là rắc rối thì C đã viết sẵn và bạn chỉ sử dụng nó như là tài nguyên Bộ tiền

xử lý giúp bạn tìm và liên kết chương trình nguồn với các tài nguyên này Lúc biên dịch thành công, bạn sẽ thấy trên đĩa ngoài tập nguồn do bạn viết, bạn thấy có vài tập tin khác cùng tên nhưng có đuôi obj, exe

Các lệnh C mà bạn sẽ dùng là rất nhiều, vì vậy để thuận lợi cho quá trình viết chương trình, các nhà phát triển ngôn ngữ C đã viết các lệnh này vào trong các tập tin tiền xử lý theo một tiêu chí phục vụ nào đó Chẳng hạn, bộ các lệnh nhập, bộ các lệnh xuất, bộ các hàm toán học, bộ các lệnh xử lý chuỗi ký tự, bộ các lệnh tương tác màn hình, bộ các lệnh máy in, bộ các lệnh cho các thuật toán kinh điển,…

Tuy nhiên, khi viết chương trình, không phải lúc nào bạn cũng sử dụng tất cả các bộ lệnh này mà bạn dùng bộ lệnh nào thì chỉ cần chỉ ra tập tin chứa bộ lệnh đó theo cú pháp:

#include <Tên tập tin cần liên kết> hoặc là #include “Tên tập tin cần liên kết” Hai cách viết này chỉ khác nhau ở cách tìm kiếm bộ tiền xử lý: Cách viết đầu tìm kiếm rộng hơn, trong cả thư mục C; Cách viết thứ nhì chỉ thực hiện tìm kiếm trong thư mục làm việc của C, khi tập tin tìm kiếm không có ở đó, chương trình sẽ báo lỗi

Trong chương trình, nếu có nhiều tập tin cần liên kết, bạn viết chúng lần lượt mỗi tập tin trên một dòng và được đặt ở đầu chương trình nguồn Chẳng hạn:

#include <stdio.h>

#include <math.h>

Trang 16

Bài gi ảng Cơ sở lập trình -14-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Các dòng khai báo trên không phải là lệnh nên không có dấu chẩm phẩy ở cuối câu Tập tin tiền xử lý có đuôi h (header) chứa các định nghĩa macro, các hàm thông dụng được định nghĩa trước

Tóm l ại: Trong ngôn ngữ lập trình C, việc dịch một tập tin nguồn thành tập tin

th ực thi được tiến hành qua 2 bước độc lập nhau: Tiền xử lý (Preprocessor) và biên

d ịch (Tranlation) Hai bước này được nối tiếp nhau một cách tự động theo cách

th ức mà bạn có ấn tượng rằng nó đã thực hiện như là một xử lý duy nhất

Sự giống và khác nhau của 2 chỉ thị #include và #define:

+ Chỉ thị #include được sử dụng nhằm gộp vào nội dung của các tập tin cần có (header file), không thể thiếu trong việc sử dụng các hàm thư viện chuẩn

+ Chỉ thị #define hay được sử dụng trong các tập tin tiền xử lý đã được định nghĩa trước đó và thường được các lập trình viên khai thác khi định nghĩa các ký hiệu, chẳng hạn: #define SIZE 20

CÁC TẬP TIN TIỀN XỬ LÝ THÔNG DỤNG

stdio.h: Tập tin định nghĩa các hàm vào ra chuẩn (standard input/output) như: printf(), scanf(), getc(), putc(), gets(), puts(), fflush(), fopen(), fclose(), fread(), fwrite(), getchar(), putchar(),

conio.h: Tập tin chứa các định nghĩa vào/ra trong chế độ DOS console như: clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(),clreol(), kbhit(),… math.h: Tập tin định nghĩa các hàm tính toán như: abs(), sqrt(), log(), log10(), sin(), cos(), acos(), asin(), atan(), pow(), exp(),…

alloc.h: Tập tin định nghĩa các hàm liên quan đến việc cấp phát và quản lý bộ nhớ, như: calloc(), realloc(), malloc(), free(); farmalloc(), farcalloc(), farfree(),… io.h: Tập tin định nghĩa các hàm vào/ra cấp thấp, như: open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(),…

ctype.h: Tập tin định nghĩa các hàm xử lý ký tự, như: toASCII(), tolower(), toupper(),…

stdlib.h: Tập tin định nghĩa các hàm liên quan đến cấp phát bộ nhớ

string.h: Tập tin định nghĩa các hàm xử lý xâu ký tự

dos.h: Tập tin định nghĩa các hàm để đọc và xác lập thời gian, ngày tháng năm

graphics.h: Tập tin định nghĩa các hàm liên quan đến đồ họa, như: initgraph(), line(), circle(), putpixel(), getpixel(), setcolor(),…

Trang 17

Bài gi ảng Cơ sở lập trình -15-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

2.2 Hằng (Constant)

2.2.1 Khái niệm: Là đại lượng có giá trị không đổi trong suốt thời gian sử dụng

trong chương trình Hằng được lưu trữ trong bộ nhớ và có tên để dễ sử dụng

2.2.2 Định nghĩa hằng:

- Dùng chỉ thị #define:

+ Cú pháp: #define <Tên_hằng> <Giá_trị_hằng>

+ Tác dụng: Tên_hằng được thay thế bởi Giá_trị_hằng Với cách này có thể định nghĩa lại được giá trị của hằng

+ Ví dụ 2.1: #define MAX 100

Trong chương trình chỗ nào gặp MAX sẽ được thay bằng giá trị 100 + Chú ý: Không có dấu chấm phẩy ở cuối câu định nghĩa hằng

- Sử dụng từ khóa const:

+ Cú pháp: const <kiểu_dữ_liệu> <tên_hằng> = <giá_trị_hằng>;

const <tên_hằng> = <giá_trị_hằng>;

+ Tác dụng: Định nghĩa một hằng có tên là tên_hằng có giá trị bằng giá_trị_hằng và sau này không thể định nghĩa lại (sửa đổi) giá trị của hằng

+ Ví dụ 2.2: const long double PI = 3,141592653589793;

Const d = 7; /* hằng d kiểu integer, có giá trị bằng 7 */

+ Lưu ý: Trong kiểu định nghĩa thứ 2, chương trình tự động ấn định kiểu của hằng là kiểu ngầm định, với turbo C hằng có kiểu ngầm định là int

* S ự khác nhau giữa khai báo hằng số bằng define và const ở chỗ là:

+ Với const, đây là hằng số cố định, một hằng số thực sự, không thể định nghĩa lại

+ Khi gặp hằng định nghĩa bằng #define thì chương trình dịch sẽ lắp giá trị hằng số này vào trong biểu thức cần tính Điều đó, có nghĩa là khi gặp tên hằng, thì máy sẽ dành ra số ô nhớ đủ để chứa giá trị hằng vào đó Loại hằng này không thể định nghĩa lại trong quá trình sử dụng Nó được áp dụng cho loại hằng số, hằng xâu

ký tự, hằng logic,… Thực chất của define là <tên_hằng> sẽ được thay thế tượng trưng cho đoạn văn bản, đó là <giá_trị_hằng> Khi dịch, chương trình sẽ thay thế

<tên_hằng> bằng <giá_trị_hằng>

2.2.3 Các loại hằng:

Hằng int: Là số nguyên có kiểu int

Hằng long: Biểu diễn thêm L hay l vào sau hằng int

Hằng usigned: Biểu diễn thêm u vào sau hằng int

Trang 18

Bài gi ảng Cơ sở lập trình -16-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Hằng int hệ 8 hoặc hệ 16: Các hằng số trong C được ngầm hiểu là ở hệ 10, nhưng bạn hoàn toàn có thể viết hằng trong hệ cơ số 8 (bắt đầu bằng 0) hay cơ số hệ 16 (bắt đầu bằng 0X) Ví dụ 2.3 : 025, 057, 0x24, 0x41,… Hằng ký tự: Là một ký tự được viết trong cặp dấu nháy đơn, Ví dụ 2.4:

‘A’, ‘3’, ‘+’,… Trình biên dịch C sẽ lưu trữ các hằng này bằng cách dùng

mã ASCII ở hệ cơ số 10 C lưu các hằng này thông qua mã ASCII của nó (trong hệ 10) Với ví dụ 2.4, các giá trị được lưu trữ tương ứng: 97, 43, 51 Đối với các hằng ký tự đặc biệt, C quy định cách viết:

‘\’’ biểu diễn cho hằng ’ ‘\”’ biểu diễn cho hằng ”

‘\\’ biểu diễn cho hằng \ ‘\n’ biểu diễn ký tự xuống dòng ‘\0’ biểu diễn cho hằng 0 ‘\t’ biểu diễn ký tự tab

‘\r’ biểu diễn về đầu dòng ‘\b’ biểu diễn ký tự backspace ‘\f’ biểu diễn sang trang

Hằng xâu ký tự (chuỗi ký tự): Giá trị của hằng là dãy các ký tự được bao trong hai dấu nháy kép Ví dụ 2.5: “Truong Dai hoc”;

* Chú ý: Các hằng có thể được định nghĩa ngoài mọi hàm, trong hàm hoặc

trong m ột khối lệnh Với C chuẩn, khi định nghĩa trong một khối thì dòng lệnh định

ngh ĩa phải ở các dòng đầu tiên của khối, tức là trước tất cả các lệnh khác của khối

l ệnh Trong C++ bạn có thể đặt định nghĩa hằng ở bất kỳ vị trí nào

2.3 Biến (Variable)

- Khái niệm: Là đại lượng có giá trị thuộc một kiểu nào đó của ngôn ngữ lập trình, giá trị của biến có thể được thay đổi trong thời gian tồn tại của biến Biến được lưu trữ trong bộ nhớ trong và có tên để dễ sử dụng Chương trình có thể truy xuất đến ô nhớ được cấp phát cho biến để lấy hoặc ghi giá trị thông qua tên biến Muốn sử dụng biến bạn phải khai báo trước khi sử dụng

- Cú pháp khai báo biến:

+ <Danh_sách_tên_các_biến>: Tên các biến cùng kiểu, đặt cách nhau bởi dấu phẩy

+ <Giá_trị>: Giá trị khởi tạo cho biến

Trang 19

Bài gi ảng Cơ sở lập trình -17-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Như vậy, đặc trưng của biến gồm: tên biến, kiểu dữ liệu của biến, giá trị nó đang lưu giữ Trong ngôn ngữ lập trình C biến có thể có thể có kiểu void (kiểu không xác định)

Tên của biến trong C được đặt theo nguyên tắc đặt tên của ngôn ngữ lập trình

C (đã trình bày trong phần 1.1.3 trang 1)

- Ví dụ 2.6: Cách khai báo các biến có kiểu số nguyên, số thực, ký tự

main()

{ int m = 5, n = 10; /* Khai báo biến số nguyên m, n và khởi tạo giá trị*/ float x,y; /* Khai báo biến số thực */

char kt = ‘A’; /* Khai báo biến ký tự và khởi tạo giá trị*/

<Các câu lệnh xử lý trong chương trình>

}

L ưu ý: Khi gặp các lệnh định nghĩa biến, chương trình dịch sẽ cấp phát vùng

nhớ có kích thước phù hợp với kiểu dữ liệu của biến, nếu có thành phần khởi tạo thì chương trình sẽ gán giá trị khởi tạo vào vùng nhớ của biến Địa chỉ của byte đầu tiên trong vùng nhớ được cấp phát cho biến, chính là địa chỉ của biến Để lấy địa chỉ

của biến, bạn dùng cú pháp: &<Tên_biến>;

2.4 Biểu thức và toán tử

2.4.1 Biểu thức (Expression)

- Khái niệm: Biểu thức là một tập hợp gồm các hằng, hàm, biến, toán tử … Biểu thức được tính toán theo một nguyên tắc toán học nào đó để cho ra một giá trị Trong một biểu thức có 2 thành phần chính: Toán tử (operator) được viết ra bằng dấu phép toán; Toán hạng (operand) có thể là hằng, hàm, biến

- Ví dụ 2.7: 15 + sin(x); Dấu + là toán tử, 15 và sin(x) là các toán hạng

- Các loại biểu thức:

+ Biểu thức số học là biểu thức mà kết quả tính toán cho ra giá trị bằng số (số nguyên, số thực)

+ Biểu thức logic: Trong ngôn ngữ lập trình C biểu thức logic là biểu thức

mà kết quả tính toán cho ra giá trị TRUE (giá trị khác 0 mà thường là 1) hoặc FALSE (giá trị bằng 0)

+ Biểu thức quan hệ là biểu thức có chứa các toán tử quan hệ ( <, >, <=, >=,

==, != ) Các toán hạng trong biểu thức quan hệ có thể là số nguyên, số thực, ký tự

và chúng không nhất thiết phải tương thích với nhau về kiểu

2.4.2 Toán tử (Operator)

2.4.2.1 Toán tử số học

Trang 20

Bài gi ảng Cơ sở lập trình -18-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

- Toán tử số học được hổ trợ bởi ngôn ngữ lập trình C là:

+ (Cộng)

- (Trừ)

* (Nhân) / (Chia)

% (lấy phần dư trong phép chia 2 số nguyên)

- Toán tử & (phép AND theo bít)

+ Cú pháp: <Toán_hạng_1> & <Toán_hạng_2>

+ Chức năng: Thực hiện phép AND trên từng bít của 2 toán hạng và trả về kết quả có cùng kích thước với 2 toán hạng

+ Bảng chân trị của phép &

+ Bảng chân trị của phép |

Trang 22

Bài gi ảng Cơ sở lập trình -20-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Kết quả cho ra b = 24 Như vậy, khi dịch trái số a với số lần dịch là k, nếu chưa xảy ra các bít có giá trị 1 của a bị mất, thì kết quả thu được là a*2k Tuy nhiên, khi dịch trái k bít, có khả năng một số bít cao nhất có giá trị 1 của a bị loại bỏ, lúc

Ví dụ 2.15: Trong một đoạn chương trình có thực hiện phép tính I*80, để tối ưu cho việc tính toán nhằm nâng cao tốc độ tính toán, bạn nên viết phép tính dưới dạng:

(I<<6) + (I<<4) vì 80 = 64 + 16 = 26 + 24

Lưu ý: Không tồn tại phép toán logic !, &, |, ^, ~ cho kiểu float, double,

long double, void hay các kiểu dữ liệu phức tạp khác

2.4.2.3 Toán tử logic: Đã trình bày ở mục 1.3.5 trang 12 (chương 1)

Trang 23

Bài gi ảng Cơ sở lập trình -21-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

- Lưu ý:

+ Toán tử == (hai dấu bằng) là toán tử quan hệ dùng để so sánh 2 biểu thức

có bằng nhau hay không Dấu = (một dấu bằng) là toán tử gán dùng để gán biểu thức bên phải cho biến ở vế bên trái

+ Hai vế của biểu thức so sánh phải cùng kiểu (trừ kiểu thực và kiểu nguyên) và chúng có thể là kiểu số nguyên, số thực, char

- Ví dụ 2.16: Kết quả của phép tính (7==5) là 0

Kết quả của phép tính (6 >= 6) là 1

2.4.2.5 Toán tử điều kiện 3 ngôi

- Cú pháp: <Biểu_thức> ? <Giá_trị_1>: < Giá_trị_2>;

Trong đó: Biểu_thức, Giá_trị_1, Giá_trị_2 là các biểu thức

- Tác dụng: Toán tử điều kiện 3 ngôi sẽ tính toán Biểu_thức và ước lượng giá trị của nó, nếu Biểu_thức có giá trị đúng thì biểu thức Giá_trị_1 được tính toán và trở thành giá trị của biểu thức, nếu Biểu_thức có giá trị sai thì biểu thức Giá_trị_2 được tính toán và trở thành giá trị của biểu thức

- Ví dụ 2.17: int x = 5, y = 7, z;

z = x > y? x:y;

Kết quả phép tính z = 7;

2.4.2.6 Các toán tử khác

- Toán tử tăng (++) và toán tử giảm ( ): Giúp cho chương trình tăng hoặc

giảm giá trị chứa trong một biến đi 1 đơn vị Chúng tương đương với +=1 hoặc -=1

Vì vậy, các dòng lệnh sau là tương đương:

A++;

A+=1;

A = A + 1;

Tính chất của toán tử này có thể là tiền tố hoặc hậu tố, nghĩa là toán tử ++,

có thể viết trước tên biến (++A) hoặc viết sau tên biến (A++) Trong những trường hợp đơn giản, hai cách viết trên có cùng ý nghĩa, nhưng trong các thao tác khác, khi mà kết của việc tăng hay giảm được sử dụng trong một biểu thức thì chúng có thể có một ý nghĩa khác biệt quan trọng về mặt ý nghĩa

Trang 24

- Toán tử dấu phẩy (,): Mỗi câu lệnh của C được kết thúc bằng dấu chấm

phẩy, song nó có thể chứa một dãy lệnh (dãy biểu thức tính toán độc lập) chứ không phải chỉ có một biểu thức tính một giá trị Trong trường hợp đó, C cung cấp cho bạn toán tử dấu phẩy (,) được sử dụng để kết hợp các biểu thức lại với nhau Bên trái toán tử dấu phẩy luôn được xem là kiểu void Điều đó, có nghĩa là biểu thức bên

phải trở thành giá trị của tổng các biểu thức được phân cách nhau bởi dấu phẩy

Ví dụ 2.19: x = (y=3,y+1);

Cách tính toán của biểu thức trên: trước hết gán giá trị 3 cho y, rồi thực hiện tính y + 1 = 4, sau đó gán 4 cho biến x Cặp dấu ngoặc đơn là cần thiết vì toán tử dấu phẩy có độ ưu tiên thấp hơn toán tử gán

- Toán tử sizeof (cho biết kích thước của kiểu dữ liệu, đối tượng dữ liệu)

In ra địa chỉ của biến x đã được cấp phát ở bộ nhớ trong

- Toán tử * (truy xuất giá trị qua con trỏ)

+ Cú pháp: *<Tên_con_trỏ>;

Trang 25

Bài gi ảng Cơ sở lập trình -23-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

+ Tác dụng: Truy xuất gián tiếp giá trị của biến thông qua con trỏ quản lý nó.+ Ví dụ 2.22: int x = 5;

2.4.2.7 Độ ưu tiên của các toán tử

Thứ tự ưu tiên của các toán tử được trình bày trong bảng sau (từ cao xuống thấp, trong mỗi mức thì ưu tiên từ trái sang phải)

! ~ & *(truy xuất gián tiếp) - (đổi dấu) Từ phải qua trái

++ (ép kiểu) sizeof

<< >> (các phép dịch bít) trái qua phải

& (phép AND trên bít)

2.4.2.8 Chuyển đổi kiểu

C cho phép trộn lẫn kiểu giá trị với nhau trong cùng biểu thức tính toán Đồng thời mỗi loại kiểu dữ liệu phản ứng khác nhau đối với một phép toán Trong

Trang 26

Bài gi ảng Cơ sở lập trình -24-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

một biểu thức có thể tồn tại nhiều toán hạng với kiểu số học khác nhau (số nguyên,

số thực) Nguyên tắc là C sẽ tự động chuyển kiểu đơn giản lên kiểu cao hơn để tính toán và qui đổi ra kiểu kết quả Chiều cấp bậc tăng dần được sắp xếp như sau:

int long float double long double

Ví dụ 2.23:

short p1 = 2, p2 = 3, p3 = 3;

float x = 15.2;

Kiểu của biểu thức (p1*p2 + p3*x) sẽ là kiểu số thực

Trong một số trường hợp bạn cũng có thể cố ý ra lệnh cho máy chuyển đổi kiểu dữ liệu để nhận được kết quả theo mong muốn

Ví dụ 2.24: int m = 15, n = 2;

float x;

x = m/n; /* Phép chia cho kết quả là phần nguyên 7 */

x = (float) m/n; /* Phép chia cho kết quả là số thực 7.5 */

2.5 Câu lệnh (statement)

2.5.1 Khái niệm và phân loại

- Khái niệm: Một câu lệnh xác định một công việc mà chương trình phải thực hiện để xử lý dữ liệu đã được mô tả và khai báo Các câu lệnh được ngăn cách nhau bởi dấu chấm phẩy (;)

- Phân loại: Có 2 loại câu lệnh: Câu lệnh đơn và câu lệnh có cấu trúc

+ Câu lệnh đơn là câu lệnh không chứa các lệnh khác Các loại câu lệnh đơn gồm: Câu lệnh gán, câu lệnh nhập dữ liệu, câu lệnh xuất dữ liệu,…

+ Câu lệnh có cấu trúc là câu lệnh trong đó có chứa các lệnh khác Câu lệnh

có cấu trúc bao gồm: câu lệnh điều kiện rẽ nhánh, câu lệnh điều kiện lựa chọn, câu lệnh lặp, câu lệnh hợp thành (một nhóm bao gồm nhiều lệnh được gom vào trong cặp dấu { và } )

2.5.2 Câu lệnh gán

- Dùng để gán giá trị một biểu thức cho một biến

+ Cú pháp: <Biến> = <Giá_trị>;

+ Tác dụng: Gán biến có tên ở vế trái nhận giá trị của biểu thức ở vế phải có

kiểu phù hợp với biến Lưu ý: Luôn thực hiện từ trái sang phải và không bao giờ

đảo ngược Chẳng hạn: bạn gán a = b; thì chương trình thực hiện gán giá trị của biến a bằng giá trị đang có trong biến b Sau đó, biến b có thể thay đổi giá trị thì cũng không ảnh hưởng đến giá trị của biến a

+ Ví dụ 2.25: int x,y;

Trang 27

Bài gi ảng Cơ sở lập trình -25-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

x = 10;

y = x + 20;

+ Lưu ý: Một thuộc tính của toán tử gán trong C làm cho nó vượt lên các

ngôn ngữ lập trình khác là: cho phép vế phải có thể chứa các phép gán khác

- Ngoài ra, trong C có thể gán giá trị một biểu thức cho nhiều biến

+ Cú pháp: <Biến_1> = <Biến_2> = … = <Giá_trị>;

+ Tác dụng: Sẽ lần lượt gán <Giá_trị> cho các biến từ phải qua trái

- Phép gán mở rộng (phép gán tích lũy)

+ Cú pháp: <Đích> <Dấu_phép_toán> = <Nguồn>;

Trong đó: <Đích>: Là một biến thuộc kiểu số nguyên hoặc số thực,

<Nguồn> là một giá trị phù hợp, <Dấu_phép_toán> là dấu phép toán số học hay trên bít (hai ngôi): +, -, *, /, %, <<, >>, &, |, ^

2.6 Câu hỏi và bài tập chương 2

1 Hãy cho biết giá trị của t ?

Trang 28

3 Cho khai báo sau:

5 Trong một chương trình, giả sử đã có khai báo các biến kiểu nguyên và

kiểu thực như sau:

Trang 29

7 Giả sử đã có khai báo biến: int n, p, q;

Kết quả của biến n, p, q là mấy sau khi thực hiện các lệnh:

Trang 30

Bài giảng Cơ sở lập trình -28-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

CHƯƠNG 3: NHẬP VÀ XUẤT DỮ LIỆU

M ục tiêu

Kết thúc chương, sinh viên có thể:

Nắm được cú pháp và cách sử dụng các lệnh nhập, xuất dữ liệu trong C Biết cách xuất kết quả tại vị trí và màu sắc theo ý muốn

3.1 Câu lệnh nhập dữ liệu

3.1.1 Nhập dữ liệu bằng hàm scanf

Hàm nhập dữ liệu scanf được sử dụng phổ biến nhất trong C Hàm scanf cho phép chúng ta nhập nhiều loại dữ liệu có các kiểu khác nhau Khi dùng hàm này bạn phải rõ địa chỉ của biến lưu dữ liệu và kiểu của dữ liệu cần nhập

- Cú pháp: scanf(“Chuỗi_các_định_dạng”, Dãy_địa_chỉ_các_biến);

- Chức năng: Hàm cho phép nhập dữ liệu từ bàn phím theo khuôn dạng được xác định trong chuỗi định dạng, dữ liệu nhập vào được lưu vào các biến có địa chỉ tương ứng được chỉ ra trong Dãy_địa_chỉ_các_biến Các địa chỉ biến trong Dãy_địa_chỉ_các_biến được viết cách nhau bởi dấu phẩy

- L ưu ý:

Số các đặc tả trong Chuỗi_các_định_dạng phải tương ứng với số biến trong Dãy_địa_chỉ_các_biến

Ký tự định kiểu trong đặc tả phải phù hợp với kiểu của biến tương ứng

Dữ liệu nhập từ bàn phím phải phù hợp với các đặc tả

Hàm scanf trả về số nguyên là số các trường hợp được nhập dữ liệu

- Ví dụ 3.1:

int a,b;

float x,y;

printf(“Nhap cac gia trị ” );

scanf(“%d %d %f %f”,&a, &b, &x, &y);

Chuỗi các định dạng Địa chỉ các biến

- Trong Chuỗi_các_định_dạng gồm các đặc tả tương ứng với các biến trong Dãy_địa_chỉ_các_biến, có bao nhiêu địa chỉ biến thì cần bấy nhiêu các đặc tả Mỗi đặc tả có dạng %[*][n]<Ký_tự_định_kiểu>

+ [n] là số nguyên dương quy định độ dài tối đa tính theo số ký tự được nhập cho thành phần tương ứng

+ <Ký_tự_định_kiểu>: Là ký tự quy định kiểu dữ liệu cần nhập

Trang 31

Bài giảng Cơ sở lập trình -29-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

+ [*] là thành phần tùy chọn, nếu có sẽ bỏ qua một thành phần dữ liệu được xác định bởi đặc tả này, tức là không có đối tượng tương ứng với đặc tả này

Ví dụ 3.2:

int x,y;

printf(“Nhap cac gia trị ” );

scanf(“%d %*c %d”, &x, &y);

Với ví dụ 3.2 sẽ thực hiện nhập giá trị thực cho biến x, sau đó bỏ qua một thành phần là ký tự, tiếp tục nhập giá trị thực cho biến y

Bảng các ký tự định kiểu dùng cho hàm scanf Chuỗi các

%c Đọc vào ký tự được cho biến khai báo kiểu char

%d Đọc vào số nguyên cho biến khai báo kiểu int

%u Đọc vào số nguyên cho biến khai báo kiểu unsigned int

%hd Đọc vào số nguyên cho biến khai báo kiểu short int

%hu Đọc vào số nguyên cho biến khai báo kiểu unsigned int

%ld Đọc vào số nguyên cho biến khai báo kiểu long int

%lu Đọc số nguyên cho biến khai báo kiểu unsigned long

%f Đọc vào số thực float cho biến khai báo kiểu float (có thể nhập

số theo kiểu viết thông thường hoặc kiểu viết theo số mũ)

%lf hoặc %lu Đọc vào số thực cho biến khai báo kiểu Double

%s Đọc xâu ký tự không chứa dấu cách, dùng với địa chỉ xâu

%o Đọc vào số nguyên cho biến dưới dạng mã octal (hệ cơ số 8)

%x Đọc vào số nguyên cho biến dưới dạng mã hexa (hệ cơ số 6)

Nguyên t ắc đọc dữ liệu trong C:

Khi chúng ta nhập dữ liệu từ bàn phím, việc kết thúc nhập dữ liệu được

xác định bằng phím enter Lúc đó, những dữ liệu nhập từ bàn phím được lưu trong vùng đệm nhập dữ liệu gọi là dòng vào (stdin) Dòng vào này sẽ được cắt tuần tự từ trái qua phải thành từng trường và gán cho các biến, các phần đã được cắt ra sẽ bị loại bỏ khỏi dòng vào

Trước khi tách một trường thì khoảng trắng phía trước của trường sẽ bị

loại bỏ Nếu trong đặc tả không có thành phần n quy định độ dài tối ta của một trường thì đọ dài của trường được xác định cho đến khi gặp dấu cách, tab, enter hoặc khi gặp ký tự không phù hợp với đặc tả (nếu có đặc tả cho dữ liệu nhập vào)

Trang 32

Bài giảng Cơ sở lập trình -30-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Nếu dòng vào có nhiều hơn các thành phần yêu cầu trong hàm nhập thì

các thành phần chưa được cắt bỏ (chưa được nhận) vẫn còn lưu trên dòng vào.

- Ví dụ 3.3:

int a,b;

float x;

scanf(“%d %d %f”,&a,&b,&x);

Giả sử lúc thực hiện chương trình, dữ liệu nhập trên dòng vào là:

∪228∪∪679∪58∪ ↵ (∪ thể hiện cho dấu cách) Lúc đó, việc đọc giá trị vào cho các biến được thực hiện như sau:

Khoảng trắng đầu tiên bị loại bỏ

228 là trường thứ nhất được tách ra và gán cho biến a

Hai khoảng trắng tiếp theo bị loại bỏ

679 là trường thứ 2 được tách ra và gán cho biến b

Một khoảng trắng tiếp theo bị loại bỏ

58 là trường cuối cùng được tách ra và gán cho biến x

- Ví dụ 3.4:

int a,b;

float x;

scanf(“%d %2d %3f”,&a,&b,&x);

Giả sử lúc thực hiện chương trình, dữ liệu nhập trên dòng vào là:

∪140∪638∪8∪58↵ (∪ thể hiện cho dấu cách) Lúc đó, việc đọc giá trị vào cho các biến được thực hiện như sau:

Khoảng trắng đầu tiên bị loại bỏ

140 là trường thứ nhất được tách ra và gán cho biến a

Một khoảng trắng tiếp theo bị loại bỏ

63 là trường thứ 2 được tách ra và gán cho biến b

Một khoảng trắng tiếp theo bị loại bỏ

8 là trường thứ 3 được tách ra và gán cho biến x

Một khoảng trắng tiếp theo bị loại bỏ

dòng vào còn chứa ∪58

- L ưu ý: Chỉ dùng hàm scanf với đặc tả %s để nhập liệu cho các biến chứa dữ

liệu chuỗi là các ký tự liền nhau (không có khoảng trắng) Nếu muốn nhập chuỗi chứa cả khoảng trắng bằng hàm scanf thì bạn dùng đặc tả %[\n] thay thế cho mã

định dạng %s

Trang 33

Bài giảng Cơ sở lập trình -31-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Trang 34

Bài giảng Cơ sở lập trình -32-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

hàm getche() hiện ký tự lên màn hình, còn hàm getch() không hiện ký tự nhập vào lên màn hình Trường hợp ký tự nhập vào thuộc phần mã mở rộng thì hệ thống sẽ đẩy vào bộ đệm nhập liệu 2 byte: byte thứ nhất có giá trị không, byte thứ 2 là mã

+ Lưu ý: Người ta thường ứng dụng hàm getch() để viết đoạn chương trình

gõ password hay đặt lệnh ở cuối chương trình chờ người dùng xem kết quả

3.2 Câu lệnh xuất dữ liệu

3.2.1 Xuất dữ liệu bằng hàm printf

- Chức năng: Hàm printf (nằm trong thư viện stdio.h) dùng để xuất các giá trị của các biểu thức lên màn hình

- Cú pháp: printf(“Chuỗi định dạng”[, “Danh sách các biểu thức”]);

Trong đó:

+ Chuỗi định dạng: Dùng để qui định kiểu dữ liệu, cách biểu diễn, độ

rộng, số chữ số thập phân… Có 3 loại chuỗi định dạng:

Ký tự điều khiển: Là các ký tự đặc biệt, bắt đầu bằng dấu \ sau đó là

ký tự dùng để điều khiển, chẳng hạn chuỗi định dạng của một số ký tự điều khiển

\n chuyển con trỏ màn hình xuống đầu dòng mới \t chuyển con trỏ đi một tab

\b xóa lùi một ký tự (xóa ký tự đứng trước con trỏ hiện tại) Các ký tự thường: Là những ký tự không thuộc loại điều khiển, các

ký tự này được in ra đúng như nó xuất hiện trong chuỗi định dạng Ngoài ra, có một

số ký tự đặc biệt bạn muốn in ra màn hình thì phải đặt ký tự đó sau dấu \

Trang 35

Bài giảng Cơ sở lập trình -33-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

\\ để in ra màn hình dấu \ \’ để in ra màn hình dấu ’

\” để in ra màn hình dấu ”

Các ký tự đặc tả: Ký tự đặc tả có dạng %[-][n.[m]]<ký tự điều khiển> Trong đó:

[n.[m]] quy định độ rộng của kiểu dữ liệu, với m là chữ số thập phân (dùng cho số thực) Nếu độ rộng của dữ liệu cần in nhỏ hơn độ rộng dành cho nó (n) thì các dấu trống được thêm vào bên phải hoặc bên trái tùy theo sự có mặt của thành phần [-] hay không

Nếu thay n bằng dấu *, khi đó dữ liệu được in ra theo đúng độ rộng thực sự của nó

cho unsigned char, unsigned short

Trang 36

Bài giảng Cơ sở lập trình -34-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

%f In ra kiểu số thực viết dưới dạng bình thường với phần

thập phân có 6 chữ số, dùng cho kiểu float, double

%e, %E In ra kiểu số thực dưới dạng số mũ, tức dạng khoa học

x.xxxxxxEyyy với phần định trị có 6 chữ số thập phân, dùng cho kiểu float, double.Dấu e hay E sẽ cho kết quả số

in ra đi với chữ e hay E tương ứng

%g, %G In ra hoặc theo kiểu %f hoặc theo kiểu %e tùy cái nào

ngắn hơn

+ Danh sách các biểu thức: là phần tùy chọn, nếu có thì đó là các biểu

thức mà chúng ta cần xuất giá trị của nó lên màn hình, mỗi biểu thức phân cách nhau bởi dấu phẩy

Lưu ý: Danh sách các biểu thức có thể nhiều hơn số các đặc tả trong chuỗi

định dạng, khi đó các biểu thức cuối (không có đặc tả tương ứng) sẽ bị bỏ qua

Trang 37

Bài giảng Cơ sở lập trình -35-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

+ Một ký tự khi lưu trữ chỉ có kích thước 1 byte, nhưng hàm putch lại có đối

số int chiếm 2 byte bộ nhớ Vì vậy, trong trường hợp ch có giá trị lớn hơn 255 thì ký tự in ra sẽ có mã là ch%255

+ Tương tự hàm printf, một số ký tự đặc biệt được coi là ký tự điều khiển chứ không phải là ký tự in ra màn hình

3.2.3 Các lệnh trình bày màn hình

- Để xuất các ký tự ra màn hình theo đúng vị trí và màu sắc mong muốn, bạn phải sử dụng các lệnh trình bày màn hình C cung cấp cho bạn các lệnh làm công việc này (nằm trong tập tin conio.h) Màn hình trong chế độ văn bản có 25 dòng,

80 cột, tọa độ điểm đầu tiên (dòng 1, cột 1) ở góc trên bên trái màn hình, tọa độ điểm cuối cùng (dòng 25, cột 80) ở góc dưới bên phải của màn hình

- Các hàm trình bày lệnh xuất dữ liệu trên màn hình:

gotoxy(int y, int x) : Đặt con trỏ tại điểm có hoành độ x, tung độ y

clrscr() : Lau sạch màn hình, đưa con trỏ về vị trí góc trên, bên trái màn hình

clreol(): Xóa các ký tự nằm bên phải con trỏ

void textcolor(int color): Đặt màu chữ văn bản

+ color: màu của ký tự, nhận giá trị từ 0 đến 15

+ Bạn có thể tạo cho dòng chữ nhấp nháy bằng cách cộng thêm tham số BLINK

+ Dùng lệnh cprintf thay cho lệnh printf để xuất ra văn bản có màu chữ void textbackground(int color): Đặt màu nền văn bản

+ color: màu của nền văn bản, color là biểu thức nguyên nhận giá trị từ 0 đến 7, tương ứng với 1 trong 8 hằng số màu đầu tiên của bảng các hằng số màu

Trang 38

Bài giảng Cơ sở lập trình -36-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

Bảng các hằng số màu

Trang 39

Bài giảng Cơ sở lập trình -37-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

printf(“Kich thuoc cua bien a = %d”,sizeof(a));

printf(“Kich thuoc cua bien tbc = %d”,sizeof(tbc));

Trang 40

Bài giảng Cơ sở lập trình -38-

Giảng viên: Th.S Trần Tấn Từ - Khoa CNTT – Đại học Phạm Văn Đồng

8 Viết chương trình nhập diện tích s của một mặt cầu Tính và in ra màn hình

thể tích V của hình cầu này Biết rằng:

3

4

.

4

R V

R S

ππ

9 Viết chương trình nhập vào tọa độ 2 điểm A(Xa,Ya) và B(Xb,Yb) Tính và in

ra màn hình khoảng cách AB Biết rằng:

2 2

) (

Ngày đăng: 11/05/2021, 00:39

TỪ KHÓA LIÊN QUAN

w