Tải bản đầy đủ (.pdf) (176 trang)

Giáo trình lập trình c c++ cơ bản

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.19 MB, 176 trang )

<span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>MỤC LỤC </b>

Lời mở đầu ... 5

<b>Chương 1. Các kiến thức cơ bản ... 7 </b>

1.1. Thông tin và biểu diễn thông tin trong máy tính ... 7

1.2. Các hệ đếm thơng dụng ... 7

1.3. Chương trình máy tính ... 10

1.4. Ngơn ngữ lưu đồ ... 13

Bài tập ... 17

<b>Chương 2. Cơ bản về ngơn ngữ lập trình C/C++ ... 19 </b>

2.1. Làm quen với mơi trường lập trình C/C++ ... 19

2.2. Các thành phần cơ bản của ngôn ngữ C ... 20

2.3. Các kiểu dữ liệu cơ bản ... 26

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

7.2. Định nghĩa cấu trúc với typedef ... 112

7.3. Khai báo biến cấu trúc ... 113

7.4. Khởi động các biến cấu trúc ... 114

7.5. Truy cập vào các thành phần của cấu trúc ... 115

Bài tập ... 119

<b>Chương 8. Kiểu tập tin ... 127 </b>

8.1. Khai báo ... 127

8.2. Mở file ... 127

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

8. Sử dụng thư viện <bits/stdc++.h> ... 169

<b>Phụ lục 2. Sử dụng trình gỡ lỗi trong dev C++ ... 171 </b>

<i><b>Tài liệu tham khảo ... 175 </b></i>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>LỜI MỞ ĐẦU </b>

Theo khung chương trình đào tạo các ngành Công nghệ Thông

<b>tin ở các hệ Đại học và Cao đẳng, Lập trình C/C++ là một trong </b>

những kỹ năng quan trọng, làm nền tảng cho việc học tập và nghiên cứu các lĩnh vực Công nghệ Thông tin và Truyền thông như: Công nghệ phần mềm, Kỹ thuật mạng...

Qua nhiều năm nghiên cứu và giảng dạy ở các trường Đại học Khoa học - Đại học Huế, Đại học Duy Tân, Đại học Sư phạm - Đại học Đà Nẵng và một số trường Đại học khác ở miền Trung và Tây

<b>Nguyên, chúng tôi đã cố gắng đúc kết để biên soạn cuốn sách Giáo </b>

<b>trình lập trình C/C++ cơ bản nhằm đáp ứng nhu cầu học tập và </b>

nghiên cứu của học sinh, sinh viên và những bạn đọc quan tâm đến lĩnh vực Công nghệ Thông tin và Truyền thông, giúp bạn đọc có một tài liệu tham khảo tốt khi làm quen với các kiến thức cũng như kỹ năng cơ bản và tư duy về lập trình.

Nội dung của cuốn sách này được chia thành 7 chương. Các vấn đề trong mỗi chương được trình bày ngắn gọn từ các kiến thức cơ bản đến cách xây dựng thuật toán và cài đặt mã lệnh. Cuối mỗi chương là hệ thống bài tập từ dễ đến khó, đối với các bài tập khó đều có gợi ý về cách giải. Để thuận tiện cho việc thực hành, tất cả các mã nguồn trong giáo trình đều tương thích với trình biên dịch Dev C++ 5.X, đây cũng là một trong những cơng cụ hỗ trợ lập trình gọn nhẹ, có thể biên dịch được trên cả hai hệ điều hành Windows lẫn Linux và được sử dụng khá phổ biến trong việc học tập và giảng dạy tại các trường học cũng như trong các kỳ thi Olympic Tin học sinh viên và ACM/IPCP Quốc tế.

Chân thành cảm ơn các đồng nghiệp ở các trường Đại học Sư phạm - Đại học Đà Nẵng, Đại học Bách Khoa - Đại học Đà Nẵng, Đại học Duy Tân, Đại học Khoa học - Đại học Huế đã giúp đỡ, đóng góp nhiều ý kiến q báu để chúng tơi hồn thiện nội dung giáo trình này.

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Chúng tôi cũng hy vọng sớm nhận được các ý kiến đóng góp, phê bình của bạn đọc về nội dung, chất lượng và hình thức trình bày để giáo trình ngày một hồn thiện hơn.

<i>Đà Nẵng, Tháng 12 Năm 2019 </i>

<i><b>Thay mặt nhóm tác giả </b></i>

<b>Phạm Anh Phương </b>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>CHƯƠNG 1 </b>

<b>CÁC KIẾN THỨC CƠ BẢN 1.1. Thông tin và biểu diễn thông tin trong máy tính 1.1.1. Khái niệm về thơng tin </b>

Bất kỳ một thơng báo hay một tín hiệu gì có giá trị đối với con người đều được coi là thông tin (information). Việc trao đổi hay tiếp nhận thơng tin mang tính chủ quan, tuỳ thuộc vào người tiếp nhận thông tin.

Các thông tin chúng ta đưa vào máy tính xử lý cịn có thể gọi là dữ liệu (data). Máy tính có thể lưu trữ và xử lý nhiều loại thơng tin như văn bản, hình ảnh, âm thanh, phim...

<b>1.1.2. Biểu diễn thơng tin trong máy tính </b>

Do máy tính được chế tạo bằng các linh kiện, vật liệu điện tử chỉ có hai trạng thái, chẳng hạn: đóng/mở của mạch điện (On-Off), bật/tắt của cơng tắc, thơng/hở của đèn điện tử hay đèn bán dẫn...Vì vậy người ta dùng hai ký tự 0 và 1 tương ứng với hai trạng thái đóng/mở để lưu trữ và xử lý thông tin.

<b>1.1.3. Các đơn vị đo thông tin </b>

Mỗi giá trị 0 hoặc 1 gọi là bit (Binary digit), 8 bit lập thành 1 byte. Ngồi ra người ta cịn hay dùng các đơn vị sau để chỉ bội số của byte:

1KB = 2<small>10</small> byte = 1024 byte (Kilô byte) 1MB = 2<small>10</small> KB = 1024 KB (Mêga byte) 1GB = 2<small>10</small> MB = 1024 MB (Giga byte) 1TB = 2<small>10</small> GB = 1024 GB (Tera byte)

<b>1.2. Các hệ đếm thông dụng </b>

Hệ đếm được hiểu như là các ký hiệu và quy tắc sử dụng tập ký hiệu đó để biểu diễn và xác định giá trị của các số.

<b>1.2.1. Hệ thập phân </b>

Hệ này còn gọi là hệ đếm cơ số 10: dùng 10 ký hiệu là 10 chữ số do người A-rập phát minh ra: 0,1,2,3,4,5,6,7,8,9 để biểu diễn các số. Đây là hệ đếm thường dùng trong cuộc sống hàng ngày.

<b>Ví dụ 1.1: (2019)</b><small>10</small><b> = 2×10<small>3</small> + 0×10<small>2</small> + 1×10<small>1</small> + 9×10<small>0</small></b>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Hệ này cịn được gọi là hệ đếm cơ số 16 hay hệ Hecxa, dùng 16 ký hiệu: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F tương ứng với các giá trị thập phân từ 0 đến 15 để biểu diễn các số.

<b>Ví dụ 1.3: (F5A)</b><small>16</small> <b>= F×16<small>2</small> + 5×16</b><small>1</small><b> + A×16<small>0</small></b> = 15×256 + 5×16 + 10 <b>= 3840 + 80 + 10 = (3930)</b><small>10</small>

<b>1.2.4. Định nghĩa một hệ đếm tổng quát </b>

<i><b>Định nghĩa: Một số N trong hệ cơ số B, B nguyên lớn hơn 1, </b></i>

<i>được biểu diễn là: d<small>n-1</small>d<small>n-2</small>...d<small>0</small><b>.d</b><small>-1</small>...d<small>-m</small> và giá trị của N được xác định theo công thức: </i>

<i>N = d<small>n-1</small>B<small>n-1</small> + d<small>n-2</small>B<small>n-2</small> +...+ d<small>1</small>B<small>1</small> + d<small>0</small>B<small>0</small> + d<small>-1</small>B<small>-1</small>+...+ d<small>-m</small>B<small>-m</small></i>

<i>trong đó d<small>i</small> thỏa mãn: 0≤d<small>i</small><B và n là số lượng các chữ số bên trái, còn m là số lượng các chữ số bên phải dấu phân chia giữa phần </i>

<b>1.2.5. Các quy tắc chuyển đổi giữa các hệ đếm </b>

Cách đổi một số từ hệ đếm bất kỳ sang hệ thập phân được thực hiện trực tiếp theo định nghĩa đã trình bày ở phần 1.2.5.

Sau đây là các quy tắc chuyển đổi qua lại giữa các hệ đếm cơ số

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>Quy tắc 1: Muốn đổi một số từ hệ đếm này sang hệ đếm khác, </b>

ta đổi phần nguyên sang phần nguyên và phần lẻ sang phần lẻ.

<b>Quy tắc 2: Muốn đổi một số thập phân nguyên sang số nhị phân </b>

ta chia liên tiếp số nguyên đó cho 2, thương số của phép chia trước là số bị chia của phép chia sau, cho đến khi nào được thương số bằng 0. Số nhị phân nhận được là các số dư của các phép chia được viết liên tiếp theo thứ tự ngược lại.

Ví dụ 1.5: Đổi số 46 (hệ 10) sang hệ cơ số 2:

<b>Quy tắc 3: Muốn đổi một số thập phân lẻ nhỏ hơn 1 sang số nhị </b>

phân, ta thực hiện phép nhân liên tiếp với 2, phần lẻ của tích số trước là số bị nhân của phép nhân sau, cho đến khi nào phần lẻ của tích số bằng 0. Số nhị phân nhận được là phần nguyên của các tích số viết theo thứ tự của chiều thuận.

<i><b>Chú ý: Trong quy tắc này quá trình nhân có thể khơng bao giờ </b></i>

dừng (phần lẻ của tích số khơng bao giờ bằng 0), khi đó ta phải tiến hành việc làm trịn kết quả.

Ví dụ 1.6: Đổi 0.25 (hệ 10) sang số hệ 2:

<b>1.2.6. Các phép toán cơ bản trên hệ nhị phân </b>

<i><b>Phép cộng: Việc cộng hai số được tiến hành bằng cách cộng từng cặp </b></i>

chữ số của chúng (bắt đầu từ cặp chữ số tận cùng bên phải) theo quy tắc:

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

0+0=0; 0+1=1; 1+0=1; 1+1=0 nhớ 1. Ví dụ 1.7:

<i><b>Phép trừ: Việc trừ hai số được tiến hành bằng cách trừ từng cặp </b></i>

chữ số của chúng (bắt đầu từ cặp chữ số tận cùng bên phải) theo quy tắc: 0-0=0; 0-1=1 nợ 1; 1-0=1; 1-1=0.

Ví dụ 1.8:

<i><b>Phép nhân: Việc nhân hai số được tiến hành bằng cách nhân </b></i>

từng chữ số của số nhân với các chữ số của số bị nhân theo quy tắc:

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>1.3.1. Khái niệm về thuật toán </b>

Khái niệm thuật toán dùng để chỉ phương pháp (method) hay cách thức để giải quyết vấn đề. Thuật tốn có thể minh họa bằng ngơn ngữ tự nhiên (natural language), bằng sơ đồ (flow chart) hoặc bằng mã giả (pseudo code). Trong thực tế thuật toán thường được minh họa bằng mã giả hoặc bằng ngơn ngữ lập trình nào đó.

Thuật tốn (algorithrm) là một dãy các câu lệnh (statement) chặt chẽ và rõ ràng xác định một trình tự các thao tác trên một số đối tượng nào đó sao cho sau một số hữu hạn bước thực hiện ta đạt được kết quả

- Bước 3: Nếu b = 0 thì thơng báo phương trình đã cho có vơ số nghiệm, ngược lại thì thơng báo phương trình vô nghiệm. Chuyển sang bước 5.

- Bước 4: Thơng báo nghiệm của phương trình là -b/a. - Bước 5: Dừng thuật toán.

<b>1.3.2. Các đặc trưng của thuật tốn </b>

<i><b>1.3.2.1 Tính xác định </b></i>

Tính xác định địi hỏi, ở mỗi bước của thuật toán, các thao tác đều phải rõ ràng, không gây ra sự nhập nhằng, lẫn lộn. Nói khác đi, trong cùng một điều kiện, hai bộ xử lý (người hoặc máy) thực hiện cùng một bước của thuật tốn thì phải cho cùng một kết quả. Hơn nữa, các bộ xử lý thuật tốn khơng cần phải hiểu được ý nghĩa của các bước thao tác này.

Tính xác định của thuật tốn rất quan trọng, nhờ nó mà ta có thể giao cho các thiết bị tự động thực hiện các chức năng của thuật toán, làm một số công việc thay thế cho con người.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<i><b>1.3.2.2 Tính kết thúc (tính dừng) </b></i>

Thuật toán bao giờ cũng phải dừng sau một số hữu hạn bước thực hiện.

Trong thực hành khi xây dựng các thuật tốn có chứa các hành động lặp đi lặp lại thì phải nêu điều kiện chấm dứt các vịng lặp để tránh tình trạng lặp lại vơ hạn lần các thao tác lặp đó.

<i>1.3.2.3 Tính đúng đắn </i>

Yêu cầu bắt buộc của thuật tốn là tính đúng đắn: với dữ liệu đầu vào cho trước, sau một số hữu hạn các bước thực hiện sẽ dừng và cho kết quả đầu ra đúng.

<i>1.3.2.4 Tính phổ dụng </i>

Thuật tốn thường được xây dựng khơng chỉ để giải một bài tốn riêng lẻ mà phải giải được một lớp các bài tốn có cùng cấu trúc với dữ liệu đầu vào khác nhau và luôn luôn dẫn đến kết quả mong muốn.

<i>1.3.2.5 Tính hiệu quả </i>

Tính hiệu quả được đánh giá dựa trên một số tiêu chuẩn nhất định như khối lượng tính tốn, thời gian và không gian được sử dụng bởi thuật tốn.

Một khía cạnh khác của tính hiệu quả là tính hiện thực. Một bài tốn dù đã có thuật tốn nhưng nếu ta khơng thể có đủ thời gian để đi đến kết quả cuối cùng thì thuật tốn đó cũng thiếu tính hiện thực. Vì vậy cần lựa chọn những thuật toán nào mà thời gian thực hiện của nó là chấp nhận được.

<b>1.3.3. Các đại lượng vào (input) và ra (output) </b>

Một thuật tốn có thể có nhiều đại lượng vào mà ta thường gọi là dữ liệu vào.

Sau khi dừng thuật tốn thì tùy theo chức năng của thuật tốn mà ta có thể thu được một số đại lượng ra xác định. Các đại lượng ra cũng thường được gọi là dữ liệu ra hay kết quả.

<b>1.3.4. Các phương pháp biểu diễn thuật toán </b>

Một thuật toán được diễn đạt rõ ràng sẽ bảo đảm cho bộ xử lý

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

mong muốn. Có cơng cụ biểu diễn thuật tốn cần quan tâm: Ngơn ngữ mơ tả thuật tốn và bộ xử lý thực hiện thuật toán đã được diễn tả bằng ngơn ngữ nói trên.

Do bộ xử lý được dùng để thực hiện thuật toán đã được diễn tả theo ngơn ngữ nên nó phải hiểu được ngơn ngữ diễn tả thuật tốn.

Theo cách tiếp cận này, mỗi thuật tốn sẽ được mơ tả dưới ngơn ngữ thuật tốn, dưới dạng một dãy các lệnh. Bộ xử lý sẽ thực hiện các lệnh theo một trật tự xác định cho đến khi gặp một lệnh dừng.

Có nhiều ngơn ngữ biểu diễn thuật tốn khác nhau, cụ thể: - Ngơn ngữ tự nhiên (ngôn ngữ liệt kê các bước)

- Ngôn ngữ lưu đồ (sơ đồ khối) - Ngôn ngữ phỏng trình (mã giả) - Ngơn ngữ lập trình.

Phần tiếp theo sẽ giới thiệu công cụ biểu diễn thuật tốn là ngơn ngữ lưu đồ. Biểu diễn thuật tốn bằng ngơn ngữ lập trình sẽ được giới thiệu sau khi học về ngơn ngữ lập trình C/C++.

<b>1.4. Ngôn ngữ lưu đồ </b>

Ngôn ngữ lưu đồ hay sơ đồ là công cụ trực quan để diễn đạt các thuật toán. Nếu biết sử dụng khéo léo ngơn ngữ này, ta có thể tránh được những đoạn giải thích bằng lời có thể dẫn đến sự nhập nhằng về ngữ nghĩa, đồng thời biểu diễn bằng lưu đồ sẽ giúp ta có được cái nhìn tổng quan hơn về tồn cảnh của q trình xử lý của một thuật tốn cho trước. Lưu đồ là một hệ thống những nút có hình dạng khác nhau, thể hiện các chức năng khác nhau của chúng và được nối với nhau bởi các cung. Cụ thể, chúng được tạo bởi 4 thành phần chủ yếu sau đây:

<b>1.4.1. Nút giới hạn </b>

Được biểu diễn bởi hình ơvan, trong đó có ghi chữ: BẮT ĐẦU hoặc KẾT THÚC. Chúng còn được gọi là các nút đầu và nút cuối của lưu đồ.

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>1.4.5. Đường đi của thuật tốn </b>

Là những đường có hướng nối từ nút này đến nút khác của lưu đồ. Hoạt động của thuật toán dưới dạng lưu đồ được bắt đầu từ nút đầu tiên. Sau khi thực hiện các thao tác hoặc kiểm tra điều kiện ở mỗi nút thì bộ xử lý sẽ đi theo một cung để đến nút khác cho đến khi gặp

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

Ví dụ 1.13: Vẽ sơ đồ khối để giải phương trình bậc hai

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Ví dụ 1.15: Vẽ sơ đồ khối để tìm số lớn nhất trong ba số a, b, c.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Thực hiện các phép tính a + b; a - b; a*b, a/b.

<i><b> Hướng dẫn: Sau đây là cách chuyển đổi nhanh giữa hệ nhị phân </b></i>

<i><b>và hệ thập lục. </b></i>

<i><b>Đối từ hệ nhị phân sang thập lục: Tách và chuyển từng nhóm </b></i>

4 chữ số nhị phân (từ phải sang trái) sang hệ thập lục. Ví dụ: (10.1110.0110)<small>2</small> = (2E6)<small>16</small> vì (0110)<small>2</small> = (6)<small>16</small>, (1110)<small>2</small> = (E)<small>16</small>

và (10)<small>2</small> = (2)<small>16</small> (từ phải sang trái).

<i><b>Đối từ hệ thập lục sang nhị phân: Đổi từng chữ số ở hệ thập </b></i>

lục sang số nhị phân 4 bit rồi ghép chúng lại theo thứ tự từ trái sang phải. Ví dụ: (2E6)<small>16</small> = (0010.1110.0110)<small>2</small> vì (2)16 = (0010)<small>2</small>, (E)<small>16</small> = (1110)<small>2</small> và (6)<small>16</small> = (0110)<small>2</small>.

<b>Bài 1.5. Vẽ sơ đồ khối để giải các bài toán sau: </b>

1) Nhập vào một số nguyên dương n và kiểm tra n là số chẵn hay số lẻ.

2) Tìm số nhỏ nhất của bốn số: a, b, c, d.

3) Nhập vào N số nguyên từ bàn phím và in ra tổng của các số vừa được nhập vào.

4) Nhập vào các số nguyên cho đến khi nào gặp số 0 thì kết thúc. Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào. 5) Đếm tất cả các ước số của số nguyên dương N.

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

6) Kiểm tra số tự nhiên N có phải là số nguyên tố hay không.

<i><b>Ý tưởng: </b></i>

N là số nguyên tố nếu N có 2 ước số nào từ 1  N. Từ định nghĩa này ta đưa ra giải thuật:

- Đếm số ước số của N từ 1  N lưu vào biến d.

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>CHƯƠNG 2 </b>

<b>CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH C/C++ </b>

Ngơn ngữ lập trình C do Dennis Ritchie đề xuất vào năm 1972 tại phịng thí nghiệm Bell Telephone, mục đích ban đầu của ngơn ngữ C là để thiết kế hệ điều hành UNIX.

C là ngơn ngữ lập trình mạnh và linh hoạt nên đã được sử dụng khá phổ biến. Tuy nhiên, do có nhiều tổ chức khác nhau sử dụng các phiên bản C khác nhau nên đã có nhiều sự khác biệt trong các trình biên dịch của C gây khó khăn cho nhiều người lập trình. Để khắc phục vấn đề này, năm 1983 Viện Tiêu chuẩn Quốc gia Hoa Kỳ (ANSI) đã đưa ra một định nghĩa chuẩn cho ngôn ngữ C, gọi là ANSI Standard C.

Ngơn ngữ lập trình C được đánh giá cao nhờ các đặc điểm sau: - C là một ngôn ngữ mạnh và linh hoạt. Hạn chế duy nhất của C là sự hạn chế trong tư duy trừu tượng của chính người lập trình. Ngôn ngữ C được sử dụng để thiết kế các hệ điều hành, các bộ soạn thảo văn bản, đồ hoạ, trang tính, và đơi khi làm chương trình dịch cho các ngơn ngữ khác.

- C là ngôn ngữ phổ thông, được nhiều nhà lập trình chun nghiệp thích dùng.

- C là ngôn ngữ ngắn gọn, nó chỉ chứa một số các từ khóa (keyword) làm cơ sở để tạo ra các câu lệnh cho ngôn ngữ.

C++ là sự mở rộng của C, nó cung cấp thêm một số khả năng cho phép lập trình hướng đối tượng. Các ứng dụng được viết theo hướng đối tượng bao gồm một tập các đối tượng tương tác lẫn nhau, C++ cho phép người lập trình định nghĩa "Class" để đặc tả các đối tượng khi xây dựng ứng dụng.

<b>2.1. Làm quen với mơi trường lập trình C/C++ </b>

<b>2.1.1. Các bước cơ bản khi lập một chương trình C/C++ </b>

<i><b>Bước 1: Khởi động trình soạn thảo. Bước 2: Soạn thảo chương trình. </b></i>

<i><b>Bước 3: Dịch chương trình, nếu có lỗi thì phải sửa lỗi. Bước 4: Chạy chương trình. </b></i>

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<b>2.1.2. Cấu trúc chung của một chương trình C/C++ </b>

<b>#include <thư viện.h> //khai báo các thư viện [Khai báo các hằng biến, biến, kiểu, hàm...] </b>

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Từ khóa là những từ ngơn ngữ lập trình dành riêng để phục vụ cho mục đích của nó. Đối với ngơn ngữ C, các từ khóa được viết bằng chữ thường. Sau đây là các từ khóa của ngơn ngữ C:

<i>asm auto break case char const continue default do double else enum extern far float for goto huge if int long near pascal register return short static struct signed sizeof switch typedef union unsigned void while </i>

Chú ý: Người lập trình khơng được phép đặt tên trùng với tên của các từ khóa.

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<i><b>/* Chức năng của hàm này là </b></i>

<i><b>tính tổng của n số tự nhiên đầu tiên*/ </b></i>

Các kiểu dữ liệu này sẽ được giới thiệu chi tiết ở mục 2.3.

<i><b>2.2.3.2. Các kiểu dữ liệu có cấu trúc </b></i>

- Kiểu mảng

- Kiểu chuỗi (string) - Kiểu cấu trúc (struct) - Kiểu file

Các kiểu dữ liệu này sẽ được giới thiệu chi tiết ở các chương

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

<b>2.2.4. Biến </b>

Biến là một đại lượng dùng để chứa nhiều giá trị khác nhau trong một chương trình. Chúng được lưu trữ ở bộ nhớ trong tại một địa chỉ nào đó.

<i><b>2.2.4.1. Tên biến </b></i>

Mỗi biến khi sử dụng trong chương trình đều phải được đặt tên theo quy định như sau:

- Tên biến là một dãy ký tự bao gồm: chữ cái, chữ số và dấu gạch chân ( _ )

- Ký tự đầu tiên phải là chữ cái hoặc ký tự _

<i>Chú ý: </i>

- Khi đặt tên biến không được đặt trùng tên với các từ khóa của C. - Tên biến trong C có sự phân biệt giữa chữ hoa và chữ thường.

<i>Ví dụ: aBc, abc hay ABC là các tên biến khác nhau. </i>

- Độ dài mặc định của tên biến là 32.

- Các tên hằng, tên mảng, tên hàm, tên kiểu, tên con trỏ,... được đặt theo quy định của tên biến.

- Để thuận tiện trong việc lập trình, các tên biến chúng ta nên đặt in thường (lower_case), các tên hằng nên đặt in hoa (UPPER_CASE), các tên kiểu, tên hàm nên đặt theo dạng in hoa ký tự đầu (Title_Case).

<i><b>2.2.4.2. Khai báo biến </b></i>

Mọi biến đều phải được khai báo trước khi sử dụng. Việc khai báo biến thực hiện theo cú pháp sau đây:

<Tên_kiểu_dữ liệu> <Danh_sách_biến>; Ví dụ 2.4:

int n; <i>// khai báo biến n kiểu số nguyên </i>

<i>float a, b; // khai báo hai biến a,b kiểu số thực </i>

Biến có thể được khai báo ở mọi nơi trong chương trình, phạm vi ảnh hưởng của biến tùy thuộc vào vị trí của nó trong chương trình.

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<i>int a = 65, b = 67; // khởi gán giá trị đầu cho a và b float x = 6.5, y; // khởi gán giá trị đầu cho x </i>

- Lấy địa chỉ của biến: Mỗi biến khi được khai báo sẽ được cấp phát một vùng ở bộ nhớ trong, vùng nhớ đó có kích thước là kích thước của kiểu dữ liệu được khai báo, gồm một số byte liên tiếp. Để lấy địa chỉ của biến (tức là lấy địa chỉ của vùng nhớ chứa giá trị của biến) ta dùng phép toán & , cú pháp như sau:

<b>&<tên_biến> 2.2.5. Hằng </b>

Hằng là một đại lượng mà giá trị của nó khơng thay đổi trong q trình thực hiện chương trình.

<i><b>2.2.5.1. Khai báo hằng </b></i>

<b>Cú pháp: const <kiểu> <tên_hằng> = <giá_trị>; </b>

hoặc <b>#define <Tên_hằng> <giá_trị> </b>

<b>Câu lệnh #define là câu lệnh tiền xử lý nên chỉ có thể đặt ở ngồi </b>

các hàm ở đầu chương trình hoặc bắt đầu của một khối.

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

Biểu thức là một cơng thức tính tốn bao gồm một dãy các tốn hạng được kết nối với nhau bởi các toán tử, có thể sử dụng các dấu ngoặc đơn ( ), và cho kết quả là một giá trị gọi là giá trị của biểu thức.

- Toán hạng: gồm các biến, các hằng, các hàm (lời gọi hàm). - Toán tử: là các phép toán số học, logic, quan hệ, ...

Ví dụ 2.8: Các dãy biểu diễn dưới đây là các biểu thức

<i><b>2.2.7.1. Câu lệnh đơn giản </b></i>

<b>- Câu lệnh gán ( = ): <Tên biến> = <Biểu thức>; </b>

- Các lệnh xuất nhập dữ liệu: cin/scanf, cout/printf.

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<b>2.3. Các kiểu dữ liệu cơ bản 2.3.1 Kiểu char </b>

<b>Kiểu char có kích thước 1 byte (8 bit), có thể dùng để biểu diễn </b>

1 ký tự trong bảng mã ASCII.

<b>Có hai kiểu char là signed char (char có dấu) và unsigned char (char không dấu). Kiểu signed char biểu diễn một số nguyên từ -128 đến 127 và unsigned char biểu diễn số nguyên có giá trị từ 0 đến 255. Một số hàm cơ bản trên kiểu char (sử dụng thư viện <ctype.h>): </b>

<b> int isalpha(char c): Kiểm tra ký tự c có phải là ký tự chữ cái </b>

hay không.

<b> int isdigit(char c): Kiểm tra ký tự c có phải là ký tự chữ số </b>

hay không.

<b> int islower(char c): Kiểm tra ký tự c có phải là ký tự chữ cái </b>

thường hay không.

<b> int isupper(char c): Kiểm tra ký tự c có phải là ký tự chữ cái </b>

hoa hay khơng.

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

<i><b>Kiểu float có độ chính xác là 6 chữ số sau dấu chấm thập phân. Kiểu double có độ chính xác là 15 chữ số sau dấu chấm thập phân. </b></i>

<b>Sau đây là một số hàm số học thông dụng (sử dụng thư viện <math.h>): </b>

 Hàm trả về trị tuyệt đối của x: |x|

<b>o double log(double x): logarit tự nhiên của x o double log10(double x): logarit cơ số 10 của x </b>

 Hàm lũy thừa: x<small>y</small>

<b>o double pow(double x,double y) </b>

<b>2.3.4. Kiểu logic (bool) </b>

<i><b>Chỉ có hai giá trị là true và false. </b></i>

<b>2.3.5. Định nghĩa kiểu dữ liệu mới </b>

<i><b>Cú pháp: typedef <Tên_kiểu> <Tên_kiểu_định_nghĩa>; </b></i>

Ví dụ 2.9: typedef int NGUYEN; Với định nghĩa này thì các khai báo sau là tương đương:

int n;

NGUYEN n;

<b>2.3.6. Các phép toán a) Các phép tốn số học </b>

<i><b> Các phép tốn hai ngơi </b></i>

% Lấy phần dư (đối với kiểu nguyên) a % b

<i>Chú ý: </i> <b> int / int </b><b> int (2/3 </b> 0; nhưng (float) 2/3  0.6666667)

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<i><b> Phép tốn một ngơi: Phép toán - (âm) đứng trước một toán </b></i>

<b>hạng, chỉ rõ là trả về giá trị trái dấu với toán hạng. </b>

<b>- Kết quả của phép tốn quan hệ ln luôn là một số nguyên: 1 nếu đúng và 0 nếu sai. </b>

- Các phép toán >, >=, <, <= là cùng thứ tự ưu tiên, hai phép toán ==, != cùng thứ tự ưu tiên nhưng thấp hơn thứ tự ưu tiên của bốn phép

<b>Kết quả của phép toán logic trả về một trong hai giá trị: 1 nếu đúng và 0 nếu sai. Ý nghĩa của các phép toán được cho bởi các bảng sau: </b>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<b>d) Các phép toán xử lý bit (BitWise) </b>

~ Lấy phần bù theo bit ~a & Phép AND theo bit a & b

| Phép OR theo bit a | b ^ Phép XOR theo bit a ^ b << Dịch trái a << b >> Dịch phải a >> b

<i><b>Chú ý: Các phép toán xử lý bit chỉ thực hiện trên các tốn hạng </b></i>

<b>có kiểu dữ liệu là số nguyên như: char, int, long (kể cả signed hoặc </b>

<b>e) Phép tốn điều kiện 3 ngơi ( ? : ) </b>

<i><b>Cú pháp: biểu_thức_logic ? biểu_thức_1 : biểu_thức_2 Diễn giải: Nếu biểu_thức_logic đúng (khác 0) thì kết quả của </b></i>

<i>phép toán là giá trị của biểu_thức_1, ngược lại kết quả phép toán là giá trị của biểu_thức_2. </i>

Kiểu của phép toán điều kiện là kiểu lớn nhất trong các kiểu của

<i>biểu_thức_1 và biểu_thức_2. </i>

<b>Phép toán này thực chất là cách viết tắt của cấu trúc if ... else (sẽ </b>

được trình bày ở chương sau). Như vậy, câu lệnh:

<i><b>z = ( biểu_thức_logic ? biểu_thức_1 : biểu_thức_2 ); </b></i>

tương đương với:

<i><b>if (biểu_thức_logic) z = biểu_thức_1; </b></i>

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

Ví dụ 2.11: z = ((x < y) ? (x) : (y));

<i>Câu lệnh này sẽ gán giá trị nhỏ nhất của x và y cho biến z. </i>

<b>2.4. Các lệnh xuất nhập dữ liệu </b>

<b>2.4.1. Xuất dữ liệu ra màn hình với hàm printf() </b>

Cú pháp của hàm printf() như sau:

<b>int printf( const char *format [,arg,...]); </b>

Chuỗi format có dạng: %[flags][width][.prec][l,L]<type>

 flags: nếu khơng có: dữ liệu được in ra canh phải - : dữ liệu được in ra canh trái

+ : dữ liệu được in ra có dấu phụ.

blank: dữ liệu được in ra có dấu âm, nếu là dương thì dấu + được thay bằng khoảng trắng

# : đổi dạng biểu diễn (chuyển đúng kiểu với mã đổi kiểu ở đối số sau).

 width: chỉ độ rộng tối thiểu để in dữ liệu. Nếu số chữ số của dữ liệu bé hơn width thì các khoảng thừa được lắp đầy bởi các khoảng trắng. Nếu width là 0n: tương tự như trên nhưng thay vì khoảng trắng, bây giờ là số 0.

 prec: dạng số thực. Số con số có ý nghĩa sau dấu chấm thập phân.

 [l,L]: hai đối số để đổi dữ liệu thành long, L dùng cho kiểu double.

 type: mã định dạng, được liệt kê bởi bảng sau:

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

<b>2.4.2. Nhập dữ liệu từ bàn phím với hàm scanf() </b>

Cú pháp của hàm scanf() như sau:

<b>int scanf(const char *format [,adds,...]); </b>

Chuỗi format có dạng: %[width][l,L]<type>.

<b>adds có dạng như sau &<biến>. Các đối số này là địa chỉ các biến </b>

tương ứng với chuỗi định dạng.

Phép toán lấy địa chỉ: & để lấy địa chỉ của một biến. Giả sử x là biến thì &x địa chỉ của biến x.

<b>Ví dụ 2.13: Nhập dữ liệu cho hai biến x và y: </b>

<b>2.4.3. Xuất/nhập dữ liệu trong C++ </b>

Đối với C++, ta có thể xuất/nhập dữ liệu với hai phương thức sau

<b>(cung cấp bởi thư viện <iostream.h>): </b>

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<i><b>Để định dạng số thực hiển thị ra màn hình với p chữ số sau dấu </b></i>

chấm thập phân, ta sử dụng đồng thời các hàm sau (được cung cấp bởi

<i>Câu lệnh trên sẽ có hiệu lực đối với tất cả các phép toán xuất tiếp theo cho đến khi gặp một câu lệnh định dạng mới. </i>

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<b>BÀI TẬP </b>

<b>Bài tập 2.1: (STAMGIAC) Viết chương trình nhập vào độ dài hai </b>

cạnh của tam giác và góc giữa hai cạnh đó, sau đó tính và in ra màn hình diện tích của tam giác.

<b>Input: a, b và theta (theo độ) </b>

<b>Output: S là diện tích tam giác, làm trịn đến 2 chữ số thập phân </b>

<i><b>* Bài giải mẫu: (dùng để chấm bài tự động) </b></i>

 <i><b>Đặt tên file đúng với mã đề bài (STAMGIAC.CPP) </b></i>

 <i><b>Xuất nhập vừa đủ, không thừa </b></i>

11. cout<<fixed<<setprecision(2); //Lấy 2 chữ số thập phân 12. <i><b>cout<<s; //Xuất ra vừa đủ, không thừa 13. </b></i> return 0;

14. }

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<b>Bài tập 2.2: (CANBACN) Viết chương trình tính </b><i><small>n</small></i>

<b>Bài tập 2.3: (SWAP) Viết chương trình nhập vào 2 số ngun a, b. </b>

Sau đó hốn đổi giá trị của 2 số đó: a/ Cho phép dùng biến trung gian.

b/ Không được phép dùng biến trung gian.

<b>Bài tập 2.5: (HINHHOP) Biết diện tích 3 mặt của một hình hộp chữ </b>

nhật: S1, S2 và S3. Viết chương trình tính tổng chu vi 3 mặt của hình hộp chữ nhật.

<b>Input: Các số nguyên S1, S2, S3 ≤ 10</b><small>6</small>

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

Ví dụ:

<b>Bài tập 2.6: (LOWER) Đổi chữ cái in hoa ra chữ cái thường tương ứng. Input: Chữ cái hoa </b>

<b>Output: Chữ cái thường tương ứng </b>

Ví dụ:

<b>Bài tập 2.7: (UPPER) Đổi chữ cái thường ra chữ cái in hoa tương ứng. Input: Chữ cái thường </b>

<b>Output: Chữ cái in hoa tương ứng </b>

Ví dụ:

<b>Bài tập 2.8: (BEHIND) Cho chữ cái hoa A và số nguyên dương N≤10. </b>

In ra chữ cái hoa đứng sau chữ cái A N đơn vị (chú ý: các chữ cái xếp theo vòng tròn, vì vậy nếu A = ‘Z’ và N = 1 thì đáp án là ‘A’).

<b>Input: Chữ cái hoa A và số nguyên dương N Output: Chữ cái thỏa mãn đề bài. </b>

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

<b>Bài tập 2.11: (DISTANCE) Cho 2 điểm A(x1,y1) và B(x2,y2). Tính </b>

khoảng cách giữa A và B (làm tròn đến hai chữ số thập phân).

<b>Bài tập 2.12: (VECTOR) Cho vector 𝑎⃗ =(a</b><small>1</small>,a<small>2</small>). Tính modul của vector theo công thức sau <small>22</small>

<b>Bài tập 2.13: (SCALAR) Cho 2 vector 𝑎⃗ =(a1,a2) và 𝑏⃗⃗ =(b1,b2). </b>

Tính tích vơ hướng của hai vector (làm trịn đến hai chữ số thập phân).

<b>Input: a1, a2, b1, b2 ≤ 10</b><sup>6</sup> <b>Output: S là tích vơ hướng </b>

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

Ví dụ:

<b>Bài tập 2.15: (MIDPOINT) Cho 2 điểm A(x1,y1) và B(x2,y2). Tìm </b>

tọa độ trung điểm M của AB (làm tròn đến hai chữ số thập phân).

<b>Bài tập 2.16: (LINEAR) Phương trình tổng quát của đường thẳng có </b>

dạng Ax + By + C = 0 (A và B không đồng thời bằng 0). Cho 2 điểm P(x1,y1) và Q(x2,y2). Tìm phương trình đường thẳng qua PQ (làm

<b>Bài tập 2.17: (PTOLINE) Cho đường thẳng </b>: Ax + By + C = 0 và điểm M(x<small>0</small>;y<small>0</small>). Tính khoảng cách từ M đến đường thẳng  (làm tròn

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

<b>Bài tập 2.19: (TAMDTRON) Cho 3 điểm A(x1,y1), B(x2,y2) và </b>

C(x3,y3). Tìm tọa độ tâm đường tròn ngoại tiếp tam giác ABC (làm tròn đến hai chữ số thập phân).

<b>Input: x1, y1, x2, y2, x3, y3 ≤ 10</b><small>6</small>

<b>Output: x, y là tọa độ tâm của đường trịn </b>

Ví dụ:

0 0 0 2 2 0 1.00 1.00

<b>Bài tập 2.20: (MAXIMA) Cho số nguyên dương n ≤ 10</b><small>6</small>. Tách n thành 2 số a, b sao cho tích P=a*b<small>2</small> đạt cực đại.

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

<i><b>Các câu lệnh sau if hoặc else có thể là đơn hoặc phức hợp. Nếu các câu lệnh if lồng nhau trong phạm vi một khối thì else sẽ đi với if </b></i>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

Ví dụ 3.2: Viết chương trình nhập vào ba số nguyên a, b, c. Tìm và in

<i><expression> phải có kết quả là một trong số các giá trị nguyên value_1, ..., value_n khác nhau. </i>

<i>Nếu <expression> có giá trị bằng với một value_k nào đó thì chương </i>

<i><b>trình sẽ chuyển điều khiển đến case value_k và thực hiện từ lệnh S</b><small>k</small></i>

</div>

×