Bài 1 - TỔNG QUAN Nội dung bài học Mục đích của môn học là cung cấp cho sinh viên những kiến thức cơ bản về kỹ thuật lập trình nói chung và kỹ năng sử dụng công cụ lập trình C/C++ trong
TỔNG QUAN
Công cụ lập trình
Mục đích của môn học là trang bị cho sinh viên những kiến thức cơ bản về kỹ thuật lập trình nói chung và rèn luyện kỹ năng sử dụng công cụ lập trình C/C++ để giải quyết các bài toán bằng chương trình trên máy tính Khóa học tập trung vào các nguyên lý lập trình, cấu trúc dữ liệu, viết mã và gỡ lỗi với C/C++, đồng thời giới thiệu quy trình thiết kế giải pháp phần mềm và quản lý mã nguồn nhằm giúp người học vận dụng ngôn ngữ C/C++ để triển khai các bài toán thực tế một cách hiệu quả.
Kết thúc môn học sinh viên được trang bị những kiến thức về:
- Cách thức giải quyết một bài toán trên máy tính;
- Công cụ, kiếm thức về việc thuật toán hóa bài toán;
- Một số cấu trúc dữ liệu và giải thuật điển hình
Yêu cầu đối với sinh viên
- Có hiểu biết cơ bản về cấu trúc máy tính;
- Có hiểu biết cơ bản về hệ điều hành;
- Biết sử dụng các phần mềm hệ thống trong việc quản lý tài nguyên, sao chép/copy dữ liệu;
- Biết sử dụng các phần mền ứng dụng như công cụ soạn thảo văn bản, truy cập internet, web
- Nghe giảng và làm bài tập
Xem chi tiết ở mục lục
3 Tài liệu học tập và tham khảo
1 Hà Đại Dương, Nguyễn Mậu Uyên, Tập Bài giảng Lập trình co bản, HVKTQS 2010;
2 Trần Đức Huyên, Phương pháp giải các bài toán trong tin học, Nhà xuất bản giáo dục 1997;
3 Đào Thanh Tĩnh, Hà Đại Dương, Tin học đại cương, Học viện KTQS, 2003;
4 Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, NXB Giáo dục, 1997;
5 Robert Sedgewick, Algorithns in C++, Addison-Wesley 1992;
6 Niklaus Wirth Bản dịch của Nguyễn Quốc Cường, Cấu trúc dữ liệu + Giải thuật = Chương trình, , NXB KHKT, 2001;
7 Giáo trình Tin Học Đại Cương A, Nguyễn Văn Linh, Khoa Công Nghệ Thông Tin, Đại học Cần Thơ, 1991
8 Giáo trình lý thuyết và bài tập ngôn ngữ C; Nguyễn Đình Tê, Hoàng Đức Hải, Nhà xuất bản Giáo dục, 1999
9 C - Tham khảo toàn diện, Nguyễn Cẩn, Nhà xuất bản Đồng Nai, 1996
10 Giúp tự học Lập Trình với ngôn ngữ C, Võ Văn Viện, Nhà xuất bản Đồng Nai, 2002
11 The C Programming Language, Brain W Kernighan & Dennis Ritchie, Prentice Hall Publisher, 1988
II Bài toán và việc giải bài toán trên máy tính
1 Phương pháp tổng quát để giải một bài toán trên máy tính Để giải một bài toán trên máy tính cần thực hiện các bước sau:
2 Xác định cấu trúc dữ liệu để mô tả bài toán;
4 Soạn thảo văn bản chương trình, kiểm tra và hoàn thiện chương trình
Khái quát về bài toán
Trong quá trình tồn tại và phát triển, mỗi người đều đối mặt và phải giải quyết nhiều bài toán của cuộc sống Có thể nói, cuộc sống là một chuỗi các bài toán mà ta liên tục đối đầu để tìm lời giải Theo nhiều nhà nghiên cứu, mọi bài toán đều có thể được diễn đạt bằng một sơ đồ chung, tạo nền tảng cho phân tích và tìm giải pháp hiệu quả.
- A là giả thiết, điều kiện ban đầu, thông tin đã cho, đã biết;
- B là kết luận, là mục tiêu cần đạt hoặc cái phải tìm, phải làm ra khi kết thúc bài toán;
là suy luận, giải pháp cần xác định hoặc chuỗi các thao tác cần thực hiện để có được kết quả B từ cái đã có A
Theo sơ đồ đã cho, việc xác định bài toán đồng nghĩa với việc nhận diện hai điểm A và B; nếu có thể, cần xác định cả lộ trình và các bước thực hiện để từ A có thể đi đến B Quá trình này giúp làm rõ mục tiêu và phạm vi của bài toán, xác định trình tự hành động và tối ưu hoá giải pháp để đạt được kết quả mong muốn.
Bài toán trên máy tính
- A gọi là đầu vào (INPUT);
- B gọi là đầu ra (OUTPUT);
là CHƯƠNG TRÌNH MÁY TÍNH cho kết quả B với đầu vào A
Việc xác định một bài toán trên máy tính thường gặp khó khăn sau:
- Thông tin về A, B thường không rõ ràng và không đầy đủ;
- Thông báo về điều kiện đặt ra cho cách giải (=>) thường không được nêu ra một cách minh bạch;
Ví dụ 1 : Hãy viết chương trình cho phép giải phương trình bậc 2
Ví dụ 2: Giả sử người A có một số tiền X gửi tiết kiệm với lãi suất tháng là L%, hỏi sau T tháng thì A có bao nhiêu tiền, biết rằng cứ 3 tháng thì tiền lãi được cộng vào gốc Lãi suất được cộng dồn theo từng chu kỳ 3 tháng, nên mỗi chu kỳ tăng theo tỷ lệ 1 + 3L/100 Với k = ⌊T/3⌋ là số chu kỳ đã qua, số tiền cuối kỳ sẽ là X × (1 + 3L/100)^k Nếu T chia hết cho 3 (T = 3k), thì sau T tháng A có X × (1 + 3L/100)^k tiền.
Ví dụ 3 : Bài toán 8 hậu - Hãy tìm cách đặt 8 con hậu trên một bàn cờ vua sao cho không có quân hậu nào có thể ăn quân hậu khác
Ví dụ 4 : Cho dãy số a1, a2, , an hãy sắp xếp dãy trên theo thứ tự giảm dần
Ví dụ 5 : Hãy xây dựng hệ thống quản lý hồ sơ và kết quả học tập của sinh viên
Việc xác định bài toán là rất rất quan trọng, nó ảnh hưởng tới cách thức và chất lượng của việc giải quyết bài toán;
Ngay cả khi một bài toán được diễn đạt chi tiết và rõ ràng, phần lớn thông tin về A và B vẫn tiềm ẩn trong đầu người giải Thông tin về A hoặc B thường chỉ là các ký hiệu nhằm gợi nhớ những yếu tố tiềm ẩn, chứ không phải là dữ kiện đầy đủ được ghi lại Do vậy, cách hiểu đúng bài toán phụ thuộc vào việc nhận diện và diễn giải các ký hiệu A và B như những gợi ý cho các thông tin ẩn bên trong.
Để xác định một bài toán một cách hiệu quả, bước đầu là phát biểu lại bài toán một cách chính xác theo ngôn ngữ của riêng bạn Việc diễn đạt lại giúp bạn làm rõ yêu cầu, phạm vi và điều kiện giới hạn của bài toán, từ đó xác định cách tiếp cận và hướng giải đúng đắn Phương pháp này tăng khả năng hiểu vấn đề sâu sắc và giảm sự hiểu nhầm khi triển khai các bước giải Khi đã nắm được bản chất thông qua sự diễn đạt cá nhân, bạn có thể xây dựng chiến lược phân tích và áp dụng các kỹ thuật phù hợp để giải bài toán.
- Bước tiếp là tìm hiểu thông tin Input A, Output B và các mối liên hệ giữa chúng;
Để hiểu đúng bài toán, nên xét một vài trường hợp cụ thể làm bằng chứng cho các thao tác phải thực hiện Việc phân tích các ví dụ giúp làm rõ quy trình giải và các bước thao tác cần thiết Thực tế cho thấy nhiều bài toán trong tin học chỉ có thể được mô tả đầy đủ qua các ví dụ minh họa.
3 Cấu trúc dữ liệu và Giải thuật
Trong khoa học máy tính, cấu trúc dữ liệu là cách tổ chức lưu trữ và truy cập dữ liệu trên máy tính nhằm tối ưu hóa hiệu suất sử dụng và đáp ứng yêu cầu của chương trình Việc chọn đúng cấu trúc dữ liệu giúp thao tác dữ liệu nhanh hơn, tiết kiệm bộ nhớ và nâng cao độ tin cậy của hệ thống Cấu trúc dữ liệu phụ thuộc vào ngôn ngữ lập trình và các công cụ phát triển, vì vậy người làm software cần nắm vững đặc điểm và giới hạn của từng kiểu để áp dụng phù hợp cho từng bài toán cụ thể.
- Ví dụ (trong C): Mảng (Array), Con trỏ (Pointer), Xâu ký tự (String), File, Stack, Queue
- Thông thường, một cấu trúc dữ liệu được chọn cẩn thận sẽ cho phép thực hiện thuật toán hiệu quả hơn
- Việc chọn cấu trúc dữ liệu thường bắt đầu từ chọn một cấu trúc dữ liệu trừu tượng Một cấu trúc dữ liệu được thiết kế tốt cho phép thực hiện nhiều phép toán, sử dụng càng ít tài nguyên, thời gian xử lý và không gian bộ nhớ càng tốt
- Các cấu trúc dữ liệu được triển khai bằng cách sử dụng các kiểu dữ liệu, các tham chiếu và các phép toán trên đó được cung cấp bởi một ngôn ngữ lập trình
Thuật toán, hay còn gọi là giải thuật, là một tập hợp hữu hạn các chỉ thị hoặc phương pháp được định nghĩa rõ ràng để thực hiện các nhiệm vụ từ một trạng thái ban đầu đã cho Các bước này được thiết kế nhằm đảm bảo trình tự thực thi và cho phép hoàn tất một số sự việc một cách có hệ thống Khi các chỉ thị này được áp dụng triệt để, chúng sẽ dẫn đến kết quả cuối cùng đúng như dự đoán, tạo nền tảng cho xử lý tính toán, tự động hóa và ra quyết định trong nhiều lĩnh vực.
Thuật toán là một tập hợp các quy tắc và quy trình cụ thể được thiết kế để giải quyết một vấn đề bằng một chuỗi các bước hữu finite, nhằm tạo ra một kết quả từ tập dữ liệu đầu vào Mỗi bước của thuật toán được thực hiện theo trình tự xác định, từ đó cho ra đầu ra tương ứng với dữ liệu đã cho Thuật toán là nền tảng của lập trình và khoa học máy tính, giúp tối ưu hóa việc xử lý thông tin và đảm bảo tính đúng đắn, tính lặp lại và khả năng tối ưu hóa về thời gian cũng như tài nguyên.
Ví dụ 1 mô tả hai bình A và B chứa hai dung dịch khác nhau, A chứa dung dịch Da và B chứa dung dịch Db Thuật toán để đổi vị trí Da sang bình B và Db sang bình A được trình bày ở mức khái quát nhằm đảm bảo hai dung dịch được trao đổi một cách rõ ràng và có kiểm soát, đồng thời duy trì tính chất riêng của mỗi dung dịch và tránh lẫn lộn giữa chúng Bài viết nhằm làm sáng tỏ khái niệm hoán đổi dung dịch giữa hai bình, nêu các yếu tố cần xem xét khi thiết kế thuật toán và tối ưu hóa mô tả cho mục tiêu SEO.
Yêu cầu phải có thêm một bình thứ ba gọi là bình C
Bước 1: Đổ dung dịch Db vào bình C;
Bước 2: Đổ dung dịch Da vào bình B;
Bước 3: Đổ dung dịch Db vào bình A
Ví dụ 2 : Một trong những giải thuật tìm ước chung lớn nhất của hai số a và b là:
Bước 1: Nhập vào hai số a và b
Bước 2: So sánh 2 số a,b chọn số nhỏ nhất gán cho UCLN
Bước 3: Nếu hai số a và b chia hết cho UCLN thì
Bước 4: Giảm UCLN một đơn vị và quay lại bước 3
Bước 5: In UCLN - Kết thúc
Một thuật toán có các tính chất sau:
- Tính chính xác: để đảm bảo kết quả tính toán hay các thao tác mà máy tính thực hiện được là chính xác
- Tính rõ ràng: Thuật toán phải được thể hiện bằng các câu lệnh minh bạch; các câu lệnh được sắp xếp theo thứ tự nhất định
- Tính khách quan: Một thuật toán dù được viết bởi nhiều người trên nhiều máy tính vẫn phải cho kết quả như nhau
Thuật toán thể hiện tính phổ dụng: nó không chỉ phù hợp với một bài toán duy nhất mà còn có thể áp dụng cho một lớp bài toán có đầu vào tương tự nhau Nhờ tính phổ dụng này, các bài toán thuộc cùng nhóm có cấu trúc và yêu cầu giải quyết tương đồng có thể được xử lý bằng cùng khuôn mẫu thuật toán, giúp tăng tính nhất quán và hiệu quả triển khai trong thực tế.
- Tính kết thúc: Thuật toán phải gồm một số hữu hạn các bước tính toán
Trình tự thực hiện các bước của thuật toán
Giải thuật được thiết kế theo ba cấu trúc suy luận cơ bản sau đây:
1 Tuần tự (Sequential): Các công việc được thực hiện một cách tuần tự, công việc này nối tiếp công việc kia
2 Cấu trúc lựa chọn (Selection) : Lựa chọn một công việc để thực hiện căn cứ vào một điều kiện nào đó Có một số dạng như sau:
- Cấu trúc 1: Nếu < điều kiện> (đúng) thì thực hiện
- Cấu trúc 2: Nếu < điều kiện> (đúng) thì thực hiện , ngược lại (điều kiện sai) thì thực hiện
- Cấu trúc 3: Trường hợp < i> thực hiện
3 Cấu trúc lặp (Repeating): Thực hiện lặp lại một công việc không hoặc nhiều lần căn cứ vào một điều kiện nào đó Có hai dạng như sau:
- Lặp xác định: là loại lặp mà khi viết chương trình, người lập trình đã xác định được công việc sẽ lặp bao nhiêu lần
Lặp không xác định là loại vòng lặp trong lập trình mà người lập trình không xác định được số lần lặp trước khi chạy chương trình; số lần lặp chỉ được xác định tại thời điểm thực thi dựa trên điều kiện và dữ liệu phát sinh trong quá trình chạy, khiến vòng lặp phụ thuộc ngữ cảnh runtime và có thể kết thúc hoặc vẫn tiếp tục tùy thuộc vào điều kiện này.
Tóm tắt nội dung bài học
3 Tài liệu học tập và tham khảo
4 Hình thức đánh giá kết quả môn học
5 Tổng quan về máy tính
II Bài toán và việc giải bài toán trên máy tính
2 Cấu trúc dữ liệu và Giải thuật
3 Chương trình III Công cụ lập trình
3 Công cụ lập trình Dev-C++
Bài tập
1 Biểu diễn thuật toán giải các bài toán sau bằng sơ đồ khối và giả mã: a Giải phương trình bậc 2; b Giải hệ phương trình bậc nhất; c Tính số ngày của một tháng một năm nào đó; d Thuật toán tìm ước số chung lớn nhất;
2 Cài đặt, làm quen với giao diện Dev-C++
3 Tìm hiểu những bài toán thực tế, mô tả thuật toán để giải quyết vấn đề đó.
NGÔN NGỮ LẬP TRÌNH C/C++
Một số khái niệm cơ bản
III Cấu trúc chương trình đơn giản trong C
IV Nhập/Xuất dữ liệu
- C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển các ứng dụng
Vào những năm cuối thập kỷ 60 và đầu thập kỷ 70 của thế kỷ XX, Dennis Ritchie tại Bell Labs đã phát triển ngôn ngữ lập trình C dựa trên BCPL do Martin Richards đưa ra vào năm 1967; Ken Thompson phát triển ngôn ngữ B từ BCPL vào năm 1970 khi viết hệ điều hành UNIX trên máy PDP-7, và C được cài đặt lần đầu tiên trên hệ điều hành UNIX của máy DEC PDP-11.
- Năm 1978, Dennish Ritchie và B.W Kernighan đã cho xuất bản quyển “Ngôn ngữ lập trình C” và được phổ biến rộng rãi đến nay
Ban đầu, ngôn ngữ lập trình C được thiết kế để lập trình trong môi trường hệ điều hành Unix nhằm hỗ trợ các công việc lập trình phức tạp Tuy nhiên, với nhu cầu phát triển ngày càng tăng của lĩnh vực phần mềm, C đã vượt ra khỏi khuôn khổ của phòng thí nghiệm Bell Labs và nhanh chóng hòa nhập vào thế giới lập trình, được các công ty sử dụng rộng rãi Sau đó, các hãng sản xuất phần mềm lần lượt tung ra các phiên bản hỗ trợ ngôn ngữ C và chuẩn ANSI C được hình thành từ quá trình này.
Ngôn ngữ lập trình C là một ngôn ngữ lập trình hệ thống mạnh mẽ và linh hoạt, với thư viện hàm sẵn phong phú giúp người lập trình tận dụng để giải quyết các bài toán mà không cần viết lại từ đầu C hỗ trợ nhiều phép toán và cung cấp các công cụ phù hợp cho các bài toán kỹ thuật có công thức phức tạp, đồng thời cho phép người lập trình tự định nghĩa thêm các kiểu dữ liệu trừu tượng Tuy nhiên, người mới học thường gặp khó khăn vì tính mềm dẻo của C có thể khiến ngôn ngữ này khó hiểu ở mức ban đầu Dù vậy, C được phổ biến rộng rãi và đã trở thành một công cụ lập trình rất mạnh, thường được sử dụng làm ngôn ngữ chủ đạo trong việc xây dựng các phần mềm hiện nay.
Ngôn ngữ C có tính cô đọng cao với chỉ 32 từ khóa chuẩn và 40 toán tử chuẩn, song phần lớn được diễn đạt bằng các chuỗi ký tự ngắn gọn Nó mang tính cấu trúc nhờ các chỉ thị điều khiển như cấu trúc lựa chọn và lặp, giúp các chương trình viết bằng C được tổ chức rõ ràng và dễ hiểu Tính tương thích của C được hỗ trợ bởi bộ tiền xử lý và thư viện chuẩn phong phú, cho phép các chương trình viết bằng C vẫn chạy được khi chuyển giữa các máy tính khác nhau C cũng có tính linh động nhờ cú pháp linh hoạt và nhiều cách thể hiện, có thể tối ưu kích thước mã lệnh và giúp chương trình chạy nhanh hơn Cuối cùng, tính biên dịch của C cho phép biên dịch nhiều tập tin chương trình riêng lẻ thành các tập tin đối tượng và liên kết chúng lại với nhau thành một chương trình thực thi thống nhất.
II Một số khái niệm cơ bản
Bộ chữ viết trong ngôn ngữ C bao gồm những ký tự, ký hiệu sau: (phân biệt chữ in hoa và in thường):
- Các ký hiệu toán học: +, -, *, /, =, , (, )
- Các ký hiệu đặc biệt: : , ; " ' _ @ # $ ! ^ [ ] { } ;
- Dấu cách hay khoảng trống
Trong ngôn ngữ C, từ khóa (reserved words) là những từ dành riêng với mục đích đã được xác định trước và không thể dùng làm tên biến hay hàm Từ khóa cho phép biên dịch viên hiểu rõ ý định của chương trình và xác định kiểu dữ liệu hoặc cấu trúc ngữ pháp tương ứng, ví dụ điển hình là từ khóa int được dùng để khai báo biến hoặc hàm có kiểu dữ liệu số nguyên Việc nắm vững danh sách các từ khóa của C giúp người lập trình viết mã nguồn chuẩn, tối ưu và tránh xung đột tên, đồng thời đảm bảo mã nguồn dễ đọc và dễ bảo trì.
- Từ khóa if dùng để xây dựng câu lệnh cấu trúc chọn;
- Từ khóa for dùng để xây dựng câu lệnh cấu trúc lặp
Danh sách các từ khóa:
Lưu ý: không được dùng từ khóa vào mục đích khác hoặc đặt tên bất kỳ đối tượng nào (biến, hằng, tên hàm, v.v.) trùng với từ khóa; các từ khóa của Turbo C 3.0 nên được liệt kê rõ ràng và sử dụng đúng ngữ cảnh SEO, nhằm duy trì sự nhất quán và tránh nhầm lẫn giữa nội dung và mã nguồn.
Các kiểu dữ liệu sơ cấp chuẩn trong C có thể được chia làm 2 dạng : kiểu số nguyên, kiểu số thực
Kiểu số nguyên là kiểu dữ liệu dùng để lưu các giá trị nguyên hay còn gọi là kiểu đếm được Trong C, kiểu số nguyên được chia thành các kiểu dữ liệu con khác nhau, mỗi kiểu có miền giá trị riêng biệt.
Kiểu số nguyên 1 byte (8 bits): Kiểu số nguyên một byte gồm có 2 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
1 unsigned char Từ 0 đến 255 (tương đương 256 ký tự trong bảng mã ASCII)
Kiểu unsigned char: lưu các số nguyên dương từ 0 đến 255
Để khai báo một biến thuộc kiểu ký tự, ta sử dụng kiểu dữ liệu unsigned char Trong phạm vi giá trị của unsigned char, mỗi giá trị sẽ tương ứng với một ký tự trong bảng mã ASCII.
Kiểu char: lưu các số nguyên từ -128 đến 127 Kiểu char sử dụng bit trái nhất để làm bit dấu
Nếu gán giá trị > 127 cho biến kiểu char thì giá trị của biến này có thể là số âm (?)
Kiểu số nguyên 2 bytes (16 bits): Kiểu số nguyên 2 bytes gồm có 4 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
Kiểu enum, short int, int : Lưu các số nguyên từ -32768 đến 32767 Sử dụng bit bên trái nhất để làm bit dấu
Nếu gán giá trị >32767 cho biến có 1 trong 3 kiểu trên thì giá trị của biến này có thể là số âm
Kiểu unsigned int: Kiểu unsigned int lưu các số nguyên dương từ 0 đến 65535
Kiểu số nguyên 4 byte (32 bits): Kiểu số nguyên 4 bytes hay còn gọi là số nguyên dài (long) gồm có 2 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
Kiểu long : Lưu các số nguyên từ -2147483658 đến 2147483647 Sử dụng bit bên trái nhất để làm bit dấu
Nếu gán giá trị >2147483647 cho biến có kiểu long thì giá trị của biến này có thể là số âm
Kiểu unsigned long: Kiểu unsigned long lưu các số nguyên dương từ 0 đến 4294967295
Kiểu số thực dùng để lưu các số thực hay các số có dấu chấm thập phân gồm có 3 kiểu sau:
STT Kiểu dữ liệu Kích thước (Size) Miền giá trị (Domain)
3 long double 10 bytes Từ 3.4 *10 -4932 đến 1.1 *10 4932
Mỗi kiểu số thực được nhắc đến ở trên có miền giá trị và độ chính xác riêng biệt Tùy theo nhu cầu sử dụng trong lập trình, ta có thể khai báo biến thuộc một trong ba kiểu số thực phổ biến để tối ưu hóa hiệu suất và độ chính xác của ứng dụng.
Ngoài ra ta còn có kiểu dữ liệu void, kiểu này mang ý nghĩa là kiểu rỗng không chứa giá trị gì cả
Identifier hay danh biểu là tên dùng để gán cho các thành phần của chương trình như hằng, kiểu dữ liệu, biến, chương trình con và các đối tượng khác trong mã nguồn Có hai loại tên: tên chuẩn (là các tên được quy định sẵn hoặc tuân thủ quy tắc của ngôn ngữ lập trình) và tên do lập trình viên tự đặt để thể hiện rõ chức năng của thành phần Việc đặt tên nhất quán, có ý nghĩa và dễ đọc không chỉ giúp tăng tính bảo trì và khả năng đọc hiểu mã mà còn hỗ trợ SEO và tìm kiếm nội dung liên quan trong dự án.
- Tên chuẩn là tên do C đặt sẵn như tên kiểu: int, char, float,…; tên hàm: sin, cos
- Tên do người lập trình tự đặt để dùng trong chương trình của mình
Sử dụng bộ chữ cái, chữ số và dấu gạch dưới (_) để đặt tên, nhưng phải tuân thủ quy tắc:
- Bắt đầu bằng một chữ cái hoặc dấu gạch dưới;
- Không có khoảng trống ở giữa tên;
- Không được trùng với từ khóa;
- Độ dài tối đa của tên là không giới hạn, tuy nhiên chỉ có 31 ký tự đầu tiên là có ý nghĩa;
- Không cấm việc đặt tên trùng với tên chuẩn nhưng khi đó ý nghĩa của tên chuẩn không còn giá trị nữa
Ví dụ: tên do người lập trình đặt:
Chieu_dai, Chieu_Rong, Chu_Vi, Dien_Tich
Tên không hợp lệ: Do Dai, 12A2,…
Biến là một đại lượng do người lập trình định nghĩa và được đặt tên thông qua khai báo biến Nó dùng để lưu trữ dữ liệu trong quá trình thực thi chương trình và giá trị của biến có thể thay đổi theo thời gian Mỗi biến thuộc về một kiểu dữ liệu xác định và có miền giá trị tương ứng với kiểu đó, đảm bảo tính nhất quán và an toàn cho quá trình xử lý dữ liệu.
Cú pháp khai báo biến:
Danh sách các tên biến cách nhau bởi dấu phẩy;
Ví dụ này trình bày cách khai báo biến với các kiểu dữ liệu khác nhau trong C Có ba biến a, b và c có kiểu int; biến chu_vi có kiểu long int; biến nua_chu_vi có kiểu float; và biến dien_tich có kiểu double Các chú thích đi kèm làm rõ kiểu dữ liệu của từng biến: a, b, c là int, chu_vi là long int, nua_chu_vi là float và dien_tich là double.
Lưu ý: Để kết thúc 1 lệnh phải có dấu chấm phẩy (;) ở cuối lệnh
Vị trí khai báo biến trong C
Trong ngôn ngữ lập trình C, khai báo biến đúng vị trí là yếu tố ảnh hưởng đến phạm vi và hành vi của chương trình Khai báo ở vị trí sai có thể dẫn tới những sai sót ngoài ý muốn và hiệu ứng lề khiến mã khó đọc và khó dự đoán, nhất là với những quy tắc của từng phiên bản Có hai cách đặt vị trí khai báo biến phổ biến: một là khai báo ở đầu mỗi khối trước khi thực thi câu lệnh, hai là khai báo và khởi tạo biến ngay trước khi bạn sử dụng chúng với các chuẩn C hiện đại cho phép khai báo linh hoạt Việc nắm rõ hai cách này giúp quản lý phạm vi biến, tránh lỗi phổ biến và tăng tính bảo trì của mã nguồn.
Khái niệm khai báo biến ngoài chỉ ra các biến được đặt ở ngoài tất cả các hàm và được gọi là biến toàn cục, có phạm vi truy cập xuyên suốt chương trình và ảnh hưởng đến mọi phần của mã Những biến này tồn tại ở phạm vi toàn cục, cho phép chia sẻ và truy cập từ nhiều hàm khác nhau, giúp quản lý trạng thái của chương trình ở cấp độ toàn cục Ví dụ về biến ngoài có thể là int i; hoặc float pi;, và chúng thường xuất hiện ở đầu chương trình hoặc trước các hàm chính, như int main().
Khai báo biến được thực hiện bên trong hàm, chương trình chính hoặc một khối lệnh Các biến này chỉ có tác dụng và ảnh hưởng đến hàm, chương trình hoặc khối lệnh chứa chúng Khi khai báo biến, cần đặt biến ở đầu khối lệnh, trước các lệnh gán và các thao tác liên quan đến biến để đảm bảo phạm vi biến và thứ tự thực thi được duy trì.
#include int bienngoai; /*khai bao bien ngoai*/ int main ()
{ int j,i; /*khai bao bien ben trong chuong trinh chinh*/ i=1; j=2; bienngoai=3; printf("\n Gia tri cua i la %d",i);
/*%d là số nguyên, sẽ biết sau */ printf("\n Gia tri cua j la %d",j); printf("\n Gia tri cua bienngoai la %d",bienngoai); getch(); return 0;
{ int i, j; /*Bien ben trong*/ i=4; j=5; printf("\n Gia tri cua i la %d",i); printf("\n Gia tri cua j la %d",j); if(j>i)
{ int hieu=j-i; /*Bien ben trong */ printf("\n Hieu so cua j tru i la %d",hieu);
{ int hieu=i-j ; /*Bien ben trong*/ printf("\n Gia tri cua i tru j la %d",hieu);
Là đại lượng không đổi trong suốt quá trình thực thi của chương trình
Cú pháp: const = Giá_trị;
Ví dụ: const int heso;
Số thực bao gồm các giá trị kiểu float, double, long double được thể hiện theo 2 cách sau:
Nhập/Xuất dữ liệu
- C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập trình hệ thống cùng với Assembler và phát triển các ứng dụng
Vào những năm cuối thập kỷ 60 và đầu thập kỷ 70 của thế kỷ XX, Dennis Ritchie tại Bell Labs đã phát triển ngôn ngữ lập trình C dựa trên BCPL do Martin Richards đề xuất năm 1967 và ngôn ngữ B do Ken Thompson phát triển từ BCPL năm 1970, và C được cài đặt lần đầu trên hệ điều hành UNIX của máy DEC PDP-11, đánh dấu một bước đột phá quan trọng cho lĩnh vực lập trình và hệ điều hành.
- Năm 1978, Dennish Ritchie và B.W Kernighan đã cho xuất bản quyển “Ngôn ngữ lập trình C” và được phổ biến rộng rãi đến nay
Ban đầu, ngôn ngữ lập trình C được thiết kế để làm việc trong môi trường hệ điều hành Unix nhằm hỗ trợ các nhiệm vụ lập trình phức tạp Tuy nhiên, trước sự gia tăng nhanh của nhu cầu phát triển phần mềm, C vượt khỏi khuôn khổ phòng thí nghiệm Bell Labs và nhanh chóng hòa nhập vào thế giới lập trình, trở thành công cụ được các công ty công nghệ sử dụng rộng rãi Sau đó, các nhà sản xuất phần mềm lần lượt phát hành các phiên bản hỗ trợ ngôn ngữ C, và chuẩn ANSI C được hình thành từ quá trình này, mở đường cho sự phổ biến và tính tương thích trên nhiều nền tảng khác nhau.
Ngôn ngữ lập trình C là một ngôn ngữ lập trình hệ thống rất mạnh và linh hoạt, đi kèm với một thư viện hàm chuẩn phong phú cho phép người lập trình tận dụng các chức năng có sẵn để giải quyết bài toán mà không cần viết lại từ đầu C hỗ trợ nhiều phép toán và cho phép tự định nghĩa các kiểu dữ liệu trừu tượng, phù hợp cho các bài toán kỹ thuật có công thức phức tạp và tối ưu hóa hiệu suất Dù sự mềm dẻo của C có thể khiến người mới học gặp khó khăn khi làm quen, nhưng C vẫn được sử dụng rộng rãi và trở thành công cụ lập trình chủ chốt trong việc xây dựng phần mềm hiện nay.
Ngôn ngữ C có tính cô đọng với chỉ 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng hầu hết được thể hiện bằng các chuỗi ký tự ngắn gọn giúp viết mã súc tích và dễ đọc Nó cũng mang tính cấu trúc cao nhờ các chỉ thị điều khiển và cấu trúc lặp, từ đó các chương trình viết bằng C được tổ chức rõ ràng và dễ hiểu Tính tương thích được đảm bảo nhờ bộ tiền xử lý và thư viện chuẩn phong phú, giúp các chương trình C duy trì khả năng chạy trên nhiều hệ thống khác nhau Tính linh động cho phép cú pháp linh hoạt, nhiều cách thể hiện và có thể tối ưu kích thước mã để tăng tốc độ thực thi Cuối cùng, khả năng biên dịch của C cho phép biên dịch nhiều tập tin thành các đối tượng riêng lẻ và liên kết chúng lại với nhau thành một chương trình thực thi thống nhất.
II Một số khái niệm cơ bản
Bộ chữ viết trong ngôn ngữ C bao gồm những ký tự, ký hiệu sau: (phân biệt chữ in hoa và in thường):
- Các ký hiệu toán học: +, -, *, /, =, , (, )
- Các ký hiệu đặc biệt: : , ; " ' _ @ # $ ! ^ [ ] { } ;
- Dấu cách hay khoảng trống
Trong ngôn ngữ C, từ khóa (reserved words) là các từ có ý nghĩa được định sẵn để biểu diễn cú pháp và kiểu dữ liệu của ngôn ngữ; chúng được gọi là từ khóa dự phòng và không thể dùng làm tên biến, hàm hay bất kỳ đối tượng nào khác trong mã nguồn Ví dụ điển hình là từ khóa int, được dùng để khai báo biến hoặc hàm có kiểu dữ liệu số nguyên; bên cạnh đó còn có các từ khóa như if, else, for và while để kiểm soát luồng thực thi, hay return để trả về giá trị từ một hàm, và các từ khóa khác liên quan đến định nghĩa kiểu dữ liệu và cấu trúc như typedef, struct, enum Hiểu rõ danh sách từ khóa và vai trò của chúng giúp viết mã an toàn, dễ hiểu và tối ưu cho SEO khi chia sẻ kiến thức về lập trình C.
- Từ khóa if dùng để xây dựng câu lệnh cấu trúc chọn;
- Từ khóa for dùng để xây dựng câu lệnh cấu trúc lặp
Danh sách các từ khóa:
Để tối ưu SEO và tránh nhầm lẫn, bài viết nhấn mạnh rằng không được dùng từ khóa cho mục đích khác và cũng không được đặt tên cho bất kỳ đối tượng nào như biến, hằng hay tên hàm trùng với từ khóa Các từ khóa của Turbo C 3.0 nên được liệt kê và sử dụng một cách có chủ đích, đảm bảo ngữ cảnh phù hợp và tự nhiên trong nội dung, tránh nhồi nhét và lặp lại quá mức Việc tuân thủ nguyên tắc này giúp người đọc hiểu rõ mối liên hệ giữa từ khóa và nội dung, đồng thời cải thiện khả năng tối ưu hóa cho các công cụ tìm kiếm.
Các kiểu dữ liệu sơ cấp chuẩn trong C có thể được chia làm 2 dạng : kiểu số nguyên, kiểu số thực
Kiểu số nguyên là kiểu dữ liệu dùng để lưu các giá trị nguyên, hay còn gọi là kiểu đếm được Trong ngôn ngữ C, kiểu số nguyên được chia thành các kiểu dữ liệu con, mỗi kiểu có miền giá trị khác nhau.
Kiểu số nguyên 1 byte (8 bits): Kiểu số nguyên một byte gồm có 2 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
1 unsigned char Từ 0 đến 255 (tương đương 256 ký tự trong bảng mã ASCII)
Kiểu unsigned char: lưu các số nguyên dương từ 0 đến 255
Để khai báo một biến thuộc kiểu ký tự, ta sử dụng kiểu unsigned char Dải giá trị của unsigned char từ 0 đến 255 và mỗi giá trị trong dải này tương ứng với một ký tự trong bảng mã ASCII.
Kiểu char: lưu các số nguyên từ -128 đến 127 Kiểu char sử dụng bit trái nhất để làm bit dấu
Nếu gán giá trị > 127 cho biến kiểu char thì giá trị của biến này có thể là số âm (?)
Kiểu số nguyên 2 bytes (16 bits): Kiểu số nguyên 2 bytes gồm có 4 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
Kiểu enum, short int, int : Lưu các số nguyên từ -32768 đến 32767 Sử dụng bit bên trái nhất để làm bit dấu
Nếu gán giá trị >32767 cho biến có 1 trong 3 kiểu trên thì giá trị của biến này có thể là số âm
Kiểu unsigned int: Kiểu unsigned int lưu các số nguyên dương từ 0 đến 65535
Kiểu số nguyên 4 byte (32 bits): Kiểu số nguyên 4 bytes hay còn gọi là số nguyên dài (long) gồm có 2 kiểu sau:
STT Kiểu dữ liệu Miền giá trị (Domain)
Kiểu long : Lưu các số nguyên từ -2147483658 đến 2147483647 Sử dụng bit bên trái nhất để làm bit dấu
Nếu gán giá trị >2147483647 cho biến có kiểu long thì giá trị của biến này có thể là số âm
Kiểu unsigned long: Kiểu unsigned long lưu các số nguyên dương từ 0 đến 4294967295
Kiểu số thực dùng để lưu các số thực hay các số có dấu chấm thập phân gồm có 3 kiểu sau:
STT Kiểu dữ liệu Kích thước (Size) Miền giá trị (Domain)
3 long double 10 bytes Từ 3.4 *10 -4932 đến 1.1 *10 4932
Mỗi kiểu số thực được trình bày ở trên có miền giá trị và độ chính xác khác nhau, vì vậy người dùng có thể chọn kiểu phù hợp với nhu cầu cụ thể Các kiểu phổ biến như float, double và long double có phạm vi đại diện và số chữ số thập phân khác nhau, ảnh hưởng trực tiếp tới hiệu suất và bộ nhớ Tùy vào mục đích sử dụng mà ta có thể khai báo biến thuộc một trong ba kiểu này để cân bằng giữa độ chính xác và tài nguyên hệ thống.
Ngoài ra ta còn có kiểu dữ liệu void, kiểu này mang ý nghĩa là kiểu rỗng không chứa giá trị gì cả
Tên hay còn gọi là danh biểu (identifier) được dùng để đặt cho các thành phần của chương trình, bao gồm chương trình, hằng, kiểu dữ liệu, biến và chương trình con Danh biểu cho phép tham chiếu và quản lý các đối tượng trong mã nguồn, giúp mã dễ đọc và bảo trì Có hai loại tên: tên chuẩn (built-in) do ngôn ngữ cung cấp và tên do người lập trình đặt (user-defined), cho phép tuỳ biến theo mục đích và phong cách lập trình của dự án.
- Tên chuẩn là tên do C đặt sẵn như tên kiểu: int, char, float,…; tên hàm: sin, cos
- Tên do người lập trình tự đặt để dùng trong chương trình của mình
Sử dụng bộ chữ cái, chữ số và dấu gạch dưới (_) để đặt tên, nhưng phải tuân thủ quy tắc:
- Bắt đầu bằng một chữ cái hoặc dấu gạch dưới;
- Không có khoảng trống ở giữa tên;
- Không được trùng với từ khóa;
- Độ dài tối đa của tên là không giới hạn, tuy nhiên chỉ có 31 ký tự đầu tiên là có ý nghĩa;
- Không cấm việc đặt tên trùng với tên chuẩn nhưng khi đó ý nghĩa của tên chuẩn không còn giá trị nữa
Ví dụ: tên do người lập trình đặt:
Chieu_dai, Chieu_Rong, Chu_Vi, Dien_Tich
Tên không hợp lệ: Do Dai, 12A2,…
Biến là đại lượng do lập trình viên định nghĩa và đặt tên thông qua khai báo biến Biến được dùng để chứa dữ liệu trong quá trình thực thi chương trình và giá trị của biến có thể thay đổi theo thời gian chạy Mỗi biến thuộc về một kiểu dữ liệu xác định và có miền giá trị tương ứng với kiểu đó.
Cú pháp khai báo biến:
Danh sách các tên biến cách nhau bởi dấu phẩy;
Ví dụ về khai báo biến trong ngôn ngữ C cho thấy cách gán kiểu dữ liệu cho từng biến int a, b, c thể hiện ba biến a, b và c cùng kiểu int long int chu_vi cho biết biến chu_vi có kiểu long int float nua_chu_vi cho biết biến nua_chu_vi có kiểu float double dien_tich cho biết biến dien_tich có kiểu double.
Lưu ý: Để kết thúc 1 lệnh phải có dấu chấm phẩy (;) ở cuối lệnh
Vị trí khai báo biến trong C
Trong ngôn ngữ lập trình C, khai báo biến đúng vị trí là yếu tố đảm bảo sự ổn định và dự đoán được của chương trình; khai báo ở sai vị trí có thể gây ra những lỗi ngoài ý muốn do cách sắp xếp biến trong khối lệnh Có hai cách phổ biến để đặt vị trí khai báo biến: khai báo ở đầu mỗi khối, trước khi thực hiện các câu lệnh, hoặc khai báo khi cần dùng trước từng biến Hiểu rõ phạm vi và thứ tự khai báo giúp quản lý biến tốt hơn, hạn chế lỗi biên dịch và tăng tính dễ đọc cho mã nguồn C.
Khai báo biến ngoài là các biến được đặt bên ngoài mọi hàm trong chương trình, có phạm vi và ảnh hưởng đến toàn bộ chương trình (còn gọi là biến toàn cục) Những biến này có thể được truy cập ở mọi hàm và tồn tại trong suốt quá trình thực thi, cho phép chia sẻ dữ liệu giữa các phần của chương trình nhưng đồng thời đòi hỏi quản lý cẩn thận để tránh xung đột Ví dụ: int i; /*Bien ben ngoai */ float pi; /*Bien ben ngoai*/ int main()
Biến được khai báo bên trong hàm, chương trình chính hoặc một khối lệnh và được gọi là biến cục bộ; những biến này chỉ có tác dụng và ảnh hưởng đến hàm, chương trình hoặc khối lệnh chứa chúng Khi khai báo biến, cần đặt biến ở đầu khối lệnh, trước các lệnh gán và các thao tác khác để đảm bảo phạm vi và thời gian sống của biến được xác định rõ.
#include int bienngoai; /*khai bao bien ngoai*/ int main ()
{ int j,i; /*khai bao bien ben trong chuong trinh chinh*/ i=1; j=2; bienngoai=3; printf("\n Gia tri cua i la %d",i);
/*%d là số nguyên, sẽ biết sau */ printf("\n Gia tri cua j la %d",j); printf("\n Gia tri cua bienngoai la %d",bienngoai); getch(); return 0;
{ int i, j; /*Bien ben trong*/ i=4; j=5; printf("\n Gia tri cua i la %d",i); printf("\n Gia tri cua j la %d",j); if(j>i)
{ int hieu=j-i; /*Bien ben trong */ printf("\n Hieu so cua j tru i la %d",hieu);
{ int hieu=i-j ; /*Bien ben trong*/ printf("\n Gia tri cua i tru j la %d",hieu);
Là đại lượng không đổi trong suốt quá trình thực thi của chương trình
Cú pháp: const = Giá_trị;
Ví dụ: const int heso;
Số thực bao gồm các giá trị kiểu float, double, long double được thể hiện theo 2 cách sau:
Tóm tắt nội dung bài học
II Một số khái niệm cơ bản
5 Biểu thức III Cấu trúc chương trình đơn giản trong C
2 Khai báo sử dụng thư viện
3 Khai báo hằng, biến, kiểu
IV Nhập/Xuất dữ liệu
1 Nhập dữ liệu từ bàn phím – Hàm scanf()
2 Xuất dữ liệu ra màn hình – Hàm printf()
Bài tập
Xem Bài 3 - Bài tập thực hànhMôi trường lập trình Dev-C++ và các lệnh vào/ra cơ bản.