Kiến thức toàn diện về Lập trình C từ cơ bản đến nâng cao

MỤC LỤC

Kiểu số thực

Phần định trị và phần mũ có thể có dấu đi kèm, chúng được viết liền nhau không có dấu ngăn cách. Do cách lưu trữ số thực trong máy tính, ta không nên kiểm tra sự bằng nhau giữa 2 số thực mà ta kiểm tra fabs( a - b ) < esp hay không.

Kiểu Boolean

Phần nguyên hay phần thập phân có thể không có nhưng dấu chấm không thể thiếu.

Kiểu kí tự (character)

Các kí tự này có thể đưa ra màn hình nhưng không thể đưa ra máy in nhờ các lệnh DOS. Xâu kí tự được lưu trong 1 mảng ô nhớ liền nhau có các phần tử là các kí tự riêng biệt, phần tử cuối cùng là kí tự NULL ( \0 là kí hiệu kết thúc của xâu kí tự ).

Các kiểu dữ liệu tự định nghĩa

Toán tử

    Việc dùng phép gán mở rộng có thể gây khó hiểu nhưng nhiều bộ biên dịch tạo ra mã hiệu quả hơn nếu ta dùng nó. Nếu biểu_thức1 là đúng (khác 0) thì giá trị của biểu thức trên là biểu_thức2, nếu biểu_thức1 là sai (bằng 0) thì giá trị của biểu thức trên là biểu_thức3.

    Thứ tự ưu tiên giữa các phép toán

    Nếu a > b là TRUE thì max được gán bằng a, nếu không thì được gán bằng b.

    Sự hiệu chỉnh khi tính toán

    Sự chuyển đổi số học

    Việc chuyển đổi kiểu giá trị cũng xảy ra khi gán giá trị kiểu này cho biến (hoặc phần tử mảng) kiểu kia, khi truyền giá trị các đối số cho các tham số, trong câu lệnh return. Khi chuyển đổi theo chiều ngược lại thì sẽ bị mất mát thông tin, có thể có cảnh báo nhưng không có lỗi.

    Sự ưu tiên cho kiểu số

    Việc chuyển đổi kiểu giá trị xảy ra tự động khi trong biểu thức có các toán hạng khác kiểu.

    Haìm printf()

      - Khi fw lớn hơn độ dài thực tế của trường ra thì các vị trí dư thừa sẽ được lấp đầy bởi các khoảng trắng hoặc các số 0 tùy thuộc vào sự có mặt của số 0. - Khi không có fw hoặc fw lớn hơn độ dài thực tế của trường ra thì độ rộng dành cho trường sẽ bằng độ dài thực tế của trường ra.

      Âỉa ra mạy in

      Dữ liệu nhập vào từ bàn phím được lưu vào stdin để chờ xử lí chứ không được xử lí trực tiếp từ bàn phím. Do dữ liệu đã có sẵn trong stdin nên máy tính đọc luôn số này và gán cho biến tương ứng mà khụng chờ ta gừ tiếp vào từ bàn phớm.

      Doìng vaìo stdin

      Các hàm xuất kí tự puts và putchar

      Cạc haỡm vaỡo ra trón maỡn hỗnh vaỡ baỡn phờm

      Trỗnh baỡy maỡn hỗnh

        Newcolor có giá trị từ 0 đến 15 tương ứng với các màu ở bảng trên Để các kí tự nhấp nháy ta cộng thêm 128 vào giá trị màu. Chức năng cprintf, cscanf gần giống như printf, scanf nhưng với các hàm cprintf, cscanf các kí tự hiện trên màn hình sẽ ảnh hưởng bởi câu lệnh textcolor, còn printf, scanf thì khọng. Viết chương trình nhập theo thứ tự các thông tin của một người (họ tên, tuổi, nghề nghiệp, địa chỉ,..) rồi xuất ra màn hình các thông tin đó.

        Nếu số từ khóa if bằng số từ khóa else thì ta có tương ứng từng cặp if-else Nếu số từ khóa if nhiều hơn số từ khóa else thì else được gắn với if liền trước nó.

        Câu lệnh switch

        Nếu trong khối lệnh đó không có lệnh nhảy thì sẽ thực hiện tiếp tục các khối lệnh bên dưới mà không cần so sánh tiếp. Khi biểu thức bằng với hằng i, để sau khi thực hiện xong khối lệnh i chương trình sẽ thoát ra ngoài câu lệnh switch sớm hơn ta có thể dùng lệnh break. Máy sẽ tiếp tục làm việc khi chưa gặp lệnh thoát, vì vậy ta có thể sắp xếp để có nhiều giá trị case trong một trường hợp.

        Ta nên sử dụng default cho dù không bao giờ xảy ra trường hợp đó: ta dùng default để kiểm tra xem có thể có lỗi hay không bằng cách đặt một thông báo lỗi ở đó, từ đó ta dễ gỡ rối.

        Câu lệnh for

        Các biểu thức trong ngoặc vuông có thể có, có thể không nhưng các dấu chấm phẩy, ngoặc đơn bắt buộc phải có mặt. Biểu thức 2 có thể gồm nhiều biểu thức nhưng tính đúng sai của nó là tính đúng sai của biểu thức cuối cùng. Ta cũng có thể tạo vòng lặp for không có câu lệnh nào trong vòng lặp, mọi công việc đã được thực hiện trong câu lệnh for.

        Khi gặp lệnh break trong vòng lặp for thì máy sẽ ra khỏi vòng lặp for sâu nhất chứa lệnh này.

        Câu lệnh while

        Tất nhiên, trong côngviệc phải có lệnh để thoát ra khỏi vòng lặp vô hạn này.

        Câu lệnh do .. while

        Lệnh goto

        • Câu lệnh goto và nhãn phải nằm trong cùng một hàm, không thể nhảy từ hàm naìy sang haìm khạc. • Không cho phép sử dụng goto để nhảy từ ngoài vào trong khối lệnh, thường là nhảy từ trong khối lệnh ra ngoài. Ta nên hạn chế sử dụng lệnh này đến mức tối đa, chỉ dùng trong những trường hợp thật cần thiết bằng cách sử dụng các lệnh điều khiển khác vì việc điều khiển dễ bị rối.

        Bài tập

        Nhập vào một số nguyên dương, kiểm tra xem số đó có tuần hoàn hay không. Viết chương trình nhập số nguyên dương n và tính tổng các chữ số của nó. Kiểm tra số nguyên n có bằng tổng lập phương các chữ số của nó không.

        Tìm số lớn nhất, nhỏ nhất có 3 chữ số sao cho tổng 3 chữ số bằng tích của chúng.

        Haìm

          Việc truyền đối số cho hàm được thực hiện theo một kiểu duy nhất : truyền theo giá trị: hàm không làm thay đổi giá trị của các biến dùng làm đối số vì hàm chỉ làm việc trên các bản sao của các đối số mà thôi. Để tránh điều này ta có thể sử dụng cách truyền địa chỉ hoặc sử dụng biến toàn cục, nhưng sử dụng biến toàn cục gặp một số vấn đề như bộ nhớ, giá trị của nó có thể bị thay đổi ở moỹi nồi trong chổồng trỗnh. Khi đó trình biên dịch không cấp phát ô nhớ nào cho biến đó, lệnh này chỉ nhằm mục đích báo rằng biến đó được khai báo đâu đó trong chỉồng trỗnh (trong modul naỡo õọ cuớa chỉồng trỗnh).

          Nếu chương trình được viết trên nhiều file và biến a được khai báo ở ngoài các hàm như sau: static int a; thì biến a chỉ được biết đến trong modul hiện tại, không được biết đến trong cạc modul khạc.

          Maíng

            Trong trường hợp xấu nhất, phương pháp trước so sánh 2*n lần trong khi phương pháp sau so sánh nhiều nhất n+1 lần. Thay đổi vị trí của các phần tử trong mảng để chúng tuân theo một trật tự nào đó. Sắp xếp theo thứ tự tăng dần: Đầu tiên đem phần tử thứ nhất lần lượt so sánh với các phần tử tiếp theo, nếu nó lớn hơn thì đổi chỗ 2 phần tử được so sánh.

            Trong chương trình trên, ta không sử dụng hàm vì đối với mảng nhiều chiều, ta không truyền như mảng một chiều được.

            Con troí

              Qua ví dụ trên ta thấy rằng các giá trị đầu vào thì ta khai báo biến bình thường, các giá trị đầu ra thì ta sử dụng con trỏ vì ta cần phải thay đổi giá trị của chúng. Tương tự như trên ta có thể viết hàm giải phương trình bậc 2, giá trị trả về tùy theo việc phương trình có nghiệm hay không, giá trị đầu ra là các nghiệm (nếu có). Khi đó ta có thể thay đổi giá trị của mảng ở bên trong hàm và khi thoát ra khỏi hàm, giá trị của mảng có thể thay đổi so với lúc gọi hàm (khác với truyền biến õồn cho haỡm).

              Tên hàm không có dấu () là hằng con trỏ trỏ tới hàm đó (tức là chứa địa chỉ bắt đầu của hàm đó), vì vậy khi ta khởi tạo con trỏ (con trỏ trỏ tới hàm) ta có thể thao tác trên con trỏ như thao tác trên hàm vậy.

              Bài tập

              Sử dụng hàm viết chương trình tính tổng các số dương, tổng bình phương của các số âm trong mảng 1 chiều. Nhập mảng 1 chiều, nhập số n và kiểm tra xem trong mảng có chuỗi con (gồm n phần tử liên tiếp) tăng hay không. - Có 2 cột nào tỉ lệ với nhau không, có 2 hàng nào bằng nhau hay không - Tính tổng các phần tử trên đường chéo phụ.

              Đếm số từ trong xâu ( các từ chỉ chứa các kí tự alphabet, được ngăn cách nhau bởi khoảng trắng, dấu tab).

              Kiểu cấu trúc

                Ta có thể sử dụng phép toán lấy địa chỉ đối với thành phần cấu trúc Vê duû : scanf(“%d”,&khach_thu_1.tuoi);. Ta không thể lấy địa chỉ thành phần kiểu field, không thể xây dựng mảng kiểu field và thành phần kiểu field không thể làm giá trị trả về. Tương tự như con trỏ biến thường, phép toán số học đối với con trỏ cấu trúc cũng hoạt õọỹng tổồng tổỷ.

                Cũng như các biến cấu trúc, ta có thể gán các phần tử của mảng cho nhau và cho các biến cấu trúc đơn.

                Kiểu Union

                Thực ra trong dos.h người ta đã định nghĩa kiểu dữ liệu union có tên REGS để phục vụ cho việc truy cập các thanh ghi của CPU trong việc gọi ngắt trong C. Dựa vào thành phần type mà ta biết được cần xử lý số liệu theo kiểu số nào.

                Các hàm xử lí tập tin trong C

                  Chú ý : Trong các kiểu đọc ghi, cần làm sạch vùng đệm trước khi chuyển từ đọc sang ghi hoặc ghi sang đọc nhờ hàm fflush hoặc hàm dịch chuyển vị trí con trỏ. Công dụng : đóng tất cả các tập tin đang mở, nếu thành công trả về giá trị bằng số tập tin đóng được, nếu không trả về giá trị EOF. Công dụng : làm sạch tất cả vùng đệm của các tập tin đang mở, nếu thành công trả về giá trị bằng số tập tin được làm sạch, nếu không trả về giá trị EOF.

                  Công dụng : Đọc dữ liệu từ tệp f theo khuôn dạng được xác định trong chuỗi điều khiển đk và kết quả được lưu vào trong danh sách các đối số (dsđs).