background img

Bài Viết Mới

Hiển thị các bài đăng có nhãn C#. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn C#. Hiển thị tất cả bài đăng
Phần này, chúng ta bước vào phần chính của ADO.NET. Đó là làm việc với mô hình phi kết nối nhưng trước hết trong ví dụ dưới đây ta sẽ bỏ qua việc lưu trữ vào XML mà tạm thời dùng bộ nhớ tạm thôi.

Có nghĩa là, dữ liệu từ database được lấy lên và đổ vào Dataset. Sau đó ta có thể ngắt kết nối tới database, lúc này dữ liệu tạm thời nằm ở dataset và ta sẽ thao tác với nó (Thêm, Sửa, Xóa). Sau khi thao tác xong, bạn có thể đồng bộ với database vẫn thông qua DataApdater nhưng trong ví dụ dưới đây chúng ta dùng SqlCommandBuilder để làm việc ngầm cho chúng ta, giảm bớt thao tác code.

Mã Code trong mô hình phi kết nối dưới đây bao gồm các bước.

  • Kết nối với SQL Server

  • Tạo Dataset bao gồm một hoặc nhiểu Table tương ứng để chứa dữ liệu được tải lên.

  • Tải dữ liệu từ database lên và đổ chúng vào dataset với các Table tương ứng.

  • Ngắt kết nối với SQL Server

  • Thao tác thêm, sửa, xóa trên dataset. Hiển thị thông qua Gridview.

  • Lưu dữ liệu từ Dataset vào XML

  • Đồng bộ xuống database. Done !


 

Data Apdater

Đối với DataApdater là cầu nối giữa dataset và database nhưng với mỗi đối tượng data apdater chỉ xử lý 1 bảng trong dataset.
Bạn cần lưu ý điểm này, không dùng chung trên các bảng dữ liệu khác nhau. Vẫn có phương pháp để sử dụng một đối tượng Data apdater nhưng chúng ta sẽ tạm thời không tìm hiểu tại ví dụ này. Enjoy !


1. Kết Nối Server

- Trong các ví dụ trước ta đã biết cách kết nối tới database. Ở đây vẫn dùng cách đó, bạn hãy tham khảo lại.

2. Khởi Tạo Dataset

Trước đó trong class của chúng ta đã khai báo lớp dataset dùng cho toàn class.

private DataSet _dataset;

 
private void ManualDataset()
{
// B1: Tạo mới đối tượng Dataset. Với tên do bạn chỉ định hoặc để trống
_dataset = new DataSet("MyDataClient");

// B2: Tạo mới một bảng để thêm vào dataset ở trên
var table1 = new DataTable("SinhVien");

// B3: Add table SinhVien vừa tạo vào dataset MyDataClient
_dataset.Tables.Add(table1);

// B4: Tạo cột (column). Riêng hàng (row) dùng để làm việc với dữ liệu, vì nó đại diện cho một hàng. Ta dùng nó để thao tác Insert, Update, Delete
var col11 = new DataColumn("MaSV", typeof(string));
var col12 = new DataColumn("HoTenSV", typeof(string));
var col13 = new DataColumn("NgaySinh", typeof(DateTime));
var col14 = new DataColumn("QueQuan", typeof(string));
var col15 = new DataColumn("MaKhoa", typeof(string));

// B5: Add column vào table SinhVien trong dataset: MyDataClient
table1.Columns.Add(col11);
table1.Columns.Add(col12);
table1.Columns.Add(col13);
table1.Columns.Add(col14);
table1.Columns.Add(col15);
//table.Columns.Add("MaSV", Type.GetType("System.String"));

/*************************************************************************************************/
//Tương tự ta tạo tiếp bảng Khoa và add vào dataset MyDataClient
var table2 = new DataTable("Khoa");
_dataset.Tables.Add(table2);
var col21 = new DataColumn("MaKhoa", typeof(string));
var col22 = new DataColumn("TenKhoa", typeof(string));

table2.Columns.Add(col21);
table2.Columns.Add(col22);
}

Hàm trên là một cách tùy chỉnh cho bạn hiểu dataset gồm những gì. Hãy đặt vào hàm Form_Load để nó được khởi tạo luôn lúc chương trình khởi động hoặc thực thi trước khi tải dữ liệu từ database lên.

3. Tải Dữ Liệu Lên Và Đổ Vào Dataset

Ta sẽ tải cả hai bảng SinhVien, Khoa. Riêng bảng SinhVien cần thêm, sửa, xóa nên ta dùng thêm SqlCommandbuilder. Nếu bảng khoa thao tác, bạn làm tương tự.
private void GetAllTableToDataset()
{
/* Phần A: Xử lý với bảng SinhVien
* B1: Thông qua SqlDataApdater và SqlConnection lấy dữ liệu lên
* B2: Nạp đối tượng SqlDataApdater mà chúng ta đã khởi tạo dành riêng cho SinhVien vào SqlCommandBuilder ...
* ...để nó làm việc ngầm cho ta. Như thế việc đồng bộ từ dataset <=> database sẽ đơn giản hơn.
* B3: Đổ dữ liệu đã lấy được vào _dataset.Table["SinhVien"]. Trước đó ta đã khởi tạo 2 table trong dataset thứ tự 0,1.....
* B4: Có thể đổ dữ liệu từ Table trong Dataset ra GridView để xem cụ thể
*/

_dasinhvien = new SqlDataAdapter
{
SelectCommand = new SqlCommand("SELECT * FROM SinhVien", _con)
};
_cmdbdsinhvien = new SqlCommandBuilder(_dasinhvien);

_dasinhvien.Fill(_dataset.Tables["SinhVien"]);
gvSinhVien.DataSource = _dataset.Tables[0]; // Table[0] tương đương Table["SinhVien"]

/* Phần B: Xử lý với bảng Khoa*/
_dakhoa = new SqlDataAdapter
{
SelectCommand = new SqlCommand("SELECT * FROM Khoa", _con)
};
_dakhoa.Fill(_dataset, "Khoa");
//Đổ ra Combbobox
cbbMakhoa.DataSource = _dataset.Tables[1];
cbbMakhoa.ValueMember = _dataset.Tables[1].Columns[0].ColumnName; //MaKhoa
cbbMakhoa.DisplayMember = "TenKhoa"; // Tương tự lệnh trên ;))
// Đổ ra Gridview
gvKhoa.DataSource = _dataset.Tables[1]; // Table[1] tương đương Table["Khoa"]
}

4. Ngắt Kết Nối Tới Server

Sau khi tải dữ liệu xong và đổ vào dataset thì ngắt kết nối. Gọi hàm ngắt kết nối, OK

5. Thao Tác Dữ Liệu Trên Dataset

Bao gồm các thao tác cơ bản: Insert, Update, Delete.

Yên tâm là bạn có thể thêm, bớt thoải mái nhiểu record trước khi qua bước cập nhật xuống database.

Ở bước này, bạn có thể code thêm mã xử lý việc hoàn nguyên dataset nếu như ta ko muốn lưu bằng cách đơn giản nhất là Clear() Table đó trong dataset và tải lại.

a. hàm thêm mới dữ liệu.
private void InsertDataset()
{
var datarow = _dataset.Tables["SinhVien"].NewRow();
datarow[0] = txtMasv.Text;
datarow[1] = txtHoten.Text;
datarow[2] = dtpNgaysinh.Text;
datarow[3] = txtQuequan.Text;
datarow[4] = cbbMakhoa.SelectedValue;
_dataset.Tables[0].Rows.Add(datarow);

}

Đầu vào từ các control : Textbox, Combbobox.....

b. sửa dữ liệu ban đầu
private void UpdateDataset()
{

var temp = txtMasv.Text;
var datarows = _dataset.Tables[0].Select("MaSV =" + "'" + temp + "'");
datarows[0][1] = txtHoten.Text;
datarows[0][2] = dtpNgaysinh.Text;
datarows[0][3] = txtQuequan.Text;
datarows[0][4] = cbbMakhoa.SelectedValue;
// Gán như vậy có nghĩa. Row[vị trí hàng][vị trí cột] của Table[vị trí] của Dataset đã được thay đổi.

}

c. xóa dữ liệu
private void DeleteDataset()
{
if (gvSinhVien.CurrentRow != null)
_dataset.Tables[0].Rows[gvSinhVien.CurrentRow.Index].Delete();
}

Cách này lấy vị trí record trên Gridview của bạn và xóa nó trong Table của Dataset.

Cách khác bạn xác định vị trí index của record trong table thông qua MaSV nhập vào.
var temp = txtMasv.Text;
var datarows = _dataset.Tables[0].Select("MaSV =" + "'" + temp + "'");
foreach (var datarow in datarows)
{
var index = _dataset.Tables[0].Rows.IndexOf(datarow);
_dataset.Tables[0].Rows[index].Delete();
}

6. Đồng Bộ Dataset Với Databbase

Dùng lệnh update của Data Apdater:
 _dasinhvien.Update(_dataset, "SinhVien");

Như vậy quá trình thực thi của mô hình này đã hoàn tất.

Demo

DemoDisconnectModel




Cập nhật: 03/03/2014

Hãy tải về mã nguồn của ví dụ 2.2.1 này để thực hành.  Database vẫn dùng ở các ví dụ trước.
Nguồn: Tự Học IT Online - http://tuhocit.net

ADO.NET Mô Hình Phi Kết Nối Với SQL Server – Phần 2.2.1

Phần này, chúng ta bước vào phần chính của ADO.NET. Đó là làm việc với mô hình phi kết nối nhưng trước hết trong ví dụ dưới đây ta sẽ bỏ qua việc lưu trữ vào XML mà tạm thời dùng bộ nhớ tạm thôi.

Có nghĩa là, dữ liệu từ database được lấy lên và đổ vào Dataset. Sau đó ta có thể ngắt kết nối tới database, lúc này dữ liệu tạm thời nằm ở dataset và ta sẽ thao tác với nó (Thêm, Sửa, Xóa). Sau khi thao tác xong, bạn có thể đồng bộ với database vẫn thông qua DataApdater nhưng trong ví dụ dưới đây chúng ta dùng SqlCommandBuilder để làm việc ngầm cho chúng ta, giảm bớt thao tác code.

Mã Code trong mô hình phi kết nối dưới đây bao gồm các bước.

  • Kết nối với SQL Server

  • Tạo Dataset bao gồm một hoặc nhiểu Table tương ứng để chứa dữ liệu được tải lên.

  • Tải dữ liệu từ database lên và đổ chúng vào dataset với các Table tương ứng.

  • Ngắt kết nối với SQL Server

  • Thao tác thêm, sửa, xóa trên dataset. Hiển thị thông qua Gridview.

  • Lưu dữ liệu từ Dataset vào XML

  • Đồng bộ xuống database. Done !


 

Data Apdater

Đối với DataApdater là cầu nối giữa dataset và database nhưng với mỗi đối tượng data apdater chỉ xử lý 1 bảng trong dataset.
Bạn cần lưu ý điểm này, không dùng chung trên các bảng dữ liệu khác nhau. Vẫn có phương pháp để sử dụng một đối tượng Data apdater nhưng chúng ta sẽ tạm thời không tìm hiểu tại ví dụ này. Enjoy !


1. Kết Nối Server

- Trong các ví dụ trước ta đã biết cách kết nối tới database. Ở đây vẫn dùng cách đó, bạn hãy tham khảo lại.

2. Khởi Tạo Dataset

Trước đó trong class của chúng ta đã khai báo lớp dataset dùng cho toàn class.

private DataSet _dataset;

 
private void ManualDataset()
{
// B1: Tạo mới đối tượng Dataset. Với tên do bạn chỉ định hoặc để trống
_dataset = new DataSet("MyDataClient");

// B2: Tạo mới một bảng để thêm vào dataset ở trên
var table1 = new DataTable("SinhVien");

// B3: Add table SinhVien vừa tạo vào dataset MyDataClient
_dataset.Tables.Add(table1);

// B4: Tạo cột (column). Riêng hàng (row) dùng để làm việc với dữ liệu, vì nó đại diện cho một hàng. Ta dùng nó để thao tác Insert, Update, Delete
var col11 = new DataColumn("MaSV", typeof(string));
var col12 = new DataColumn("HoTenSV", typeof(string));
var col13 = new DataColumn("NgaySinh", typeof(DateTime));
var col14 = new DataColumn("QueQuan", typeof(string));
var col15 = new DataColumn("MaKhoa", typeof(string));

// B5: Add column vào table SinhVien trong dataset: MyDataClient
table1.Columns.Add(col11);
table1.Columns.Add(col12);
table1.Columns.Add(col13);
table1.Columns.Add(col14);
table1.Columns.Add(col15);
//table.Columns.Add("MaSV", Type.GetType("System.String"));

/*************************************************************************************************/
//Tương tự ta tạo tiếp bảng Khoa và add vào dataset MyDataClient
var table2 = new DataTable("Khoa");
_dataset.Tables.Add(table2);
var col21 = new DataColumn("MaKhoa", typeof(string));
var col22 = new DataColumn("TenKhoa", typeof(string));

table2.Columns.Add(col21);
table2.Columns.Add(col22);
}

Hàm trên là một cách tùy chỉnh cho bạn hiểu dataset gồm những gì. Hãy đặt vào hàm Form_Load để nó được khởi tạo luôn lúc chương trình khởi động hoặc thực thi trước khi tải dữ liệu từ database lên.

3. Tải Dữ Liệu Lên Và Đổ Vào Dataset

Ta sẽ tải cả hai bảng SinhVien, Khoa. Riêng bảng SinhVien cần thêm, sửa, xóa nên ta dùng thêm SqlCommandbuilder. Nếu bảng khoa thao tác, bạn làm tương tự.
private void GetAllTableToDataset()
{
/* Phần A: Xử lý với bảng SinhVien
* B1: Thông qua SqlDataApdater và SqlConnection lấy dữ liệu lên
* B2: Nạp đối tượng SqlDataApdater mà chúng ta đã khởi tạo dành riêng cho SinhVien vào SqlCommandBuilder ...
* ...để nó làm việc ngầm cho ta. Như thế việc đồng bộ từ dataset <=> database sẽ đơn giản hơn.
* B3: Đổ dữ liệu đã lấy được vào _dataset.Table["SinhVien"]. Trước đó ta đã khởi tạo 2 table trong dataset thứ tự 0,1.....
* B4: Có thể đổ dữ liệu từ Table trong Dataset ra GridView để xem cụ thể
*/

_dasinhvien = new SqlDataAdapter
{
SelectCommand = new SqlCommand("SELECT * FROM SinhVien", _con)
};
_cmdbdsinhvien = new SqlCommandBuilder(_dasinhvien);

_dasinhvien.Fill(_dataset.Tables["SinhVien"]);
gvSinhVien.DataSource = _dataset.Tables[0]; // Table[0] tương đương Table["SinhVien"]

/* Phần B: Xử lý với bảng Khoa*/
_dakhoa = new SqlDataAdapter
{
SelectCommand = new SqlCommand("SELECT * FROM Khoa", _con)
};
_dakhoa.Fill(_dataset, "Khoa");
//Đổ ra Combbobox
cbbMakhoa.DataSource = _dataset.Tables[1];
cbbMakhoa.ValueMember = _dataset.Tables[1].Columns[0].ColumnName; //MaKhoa
cbbMakhoa.DisplayMember = "TenKhoa"; // Tương tự lệnh trên ;))
// Đổ ra Gridview
gvKhoa.DataSource = _dataset.Tables[1]; // Table[1] tương đương Table["Khoa"]
}

4. Ngắt Kết Nối Tới Server

Sau khi tải dữ liệu xong và đổ vào dataset thì ngắt kết nối. Gọi hàm ngắt kết nối, OK

5. Thao Tác Dữ Liệu Trên Dataset

Bao gồm các thao tác cơ bản: Insert, Update, Delete.

Yên tâm là bạn có thể thêm, bớt thoải mái nhiểu record trước khi qua bước cập nhật xuống database.

Ở bước này, bạn có thể code thêm mã xử lý việc hoàn nguyên dataset nếu như ta ko muốn lưu bằng cách đơn giản nhất là Clear() Table đó trong dataset và tải lại.

a. hàm thêm mới dữ liệu.
private void InsertDataset()
{
var datarow = _dataset.Tables["SinhVien"].NewRow();
datarow[0] = txtMasv.Text;
datarow[1] = txtHoten.Text;
datarow[2] = dtpNgaysinh.Text;
datarow[3] = txtQuequan.Text;
datarow[4] = cbbMakhoa.SelectedValue;
_dataset.Tables[0].Rows.Add(datarow);

}

Đầu vào từ các control : Textbox, Combbobox.....

b. sửa dữ liệu ban đầu
private void UpdateDataset()
{

var temp = txtMasv.Text;
var datarows = _dataset.Tables[0].Select("MaSV =" + "'" + temp + "'");
datarows[0][1] = txtHoten.Text;
datarows[0][2] = dtpNgaysinh.Text;
datarows[0][3] = txtQuequan.Text;
datarows[0][4] = cbbMakhoa.SelectedValue;
// Gán như vậy có nghĩa. Row[vị trí hàng][vị trí cột] của Table[vị trí] của Dataset đã được thay đổi.

}

c. xóa dữ liệu
private void DeleteDataset()
{
if (gvSinhVien.CurrentRow != null)
_dataset.Tables[0].Rows[gvSinhVien.CurrentRow.Index].Delete();
}

Cách này lấy vị trí record trên Gridview của bạn và xóa nó trong Table của Dataset.

Cách khác bạn xác định vị trí index của record trong table thông qua MaSV nhập vào.
var temp = txtMasv.Text;
var datarows = _dataset.Tables[0].Select("MaSV =" + "'" + temp + "'");
foreach (var datarow in datarows)
{
var index = _dataset.Tables[0].Rows.IndexOf(datarow);
_dataset.Tables[0].Rows[index].Delete();
}

6. Đồng Bộ Dataset Với Databbase

Dùng lệnh update của Data Apdater:
 _dasinhvien.Update(_dataset, "SinhVien");

Như vậy quá trình thực thi của mô hình này đã hoàn tất.

Demo

DemoDisconnectModel




Cập nhật: 03/03/2014

Hãy tải về mã nguồn của ví dụ 2.2.1 này để thực hành.  Database vẫn dùng ở các ví dụ trước.
Nguồn: Tự Học IT Online - http://tuhocit.net


Như đã nói, với ADO.NET có hai mô hình sử dụng phổ biến là: Kết Nối & Phi Kết Nối. Hôm nay, chúng ta sẽ tìm hiểu phần mô hình kết Nối.

Phần 2: CÁCH THỨC SỬ DỤNG ADO.NET 


2.1 - Mô Hình Kết Nối
 

   Phần này, chúng ta sẽ tìm hiểu cách thức sử dụng ADO.NET trong mô hình kết nối CSDL. Điều đó có nghĩa, ứng dụng của bạn phải luôn kết nối tới CSDL để thực hiện các thao tác (Chọn, thêm, sửa xóa ...). Và hãy nhớ chúng ta sẽ không sử dụng Datasets, DataApdater trong này, mà chỉ dùng các thành phần cơ bản như: Connection, Command, DataReader.
  

ADO.NET Mô Hình Kết Nối Với SQL Server - Phần 2.1.1


Như đã nói, với ADO.NET có hai mô hình sử dụng phổ biến là: Kết Nối & Phi Kết Nối. Hôm nay, chúng ta sẽ tìm hiểu phần mô hình kết Nối.

Phần 2: CÁCH THỨC SỬ DỤNG ADO.NET 


2.1 - Mô Hình Kết Nối
 

   Phần này, chúng ta sẽ tìm hiểu cách thức sử dụng ADO.NET trong mô hình kết nối CSDL. Điều đó có nghĩa, ứng dụng của bạn phải luôn kết nối tới CSDL để thực hiện các thao tác (Chọn, thêm, sửa xóa ...). Và hãy nhớ chúng ta sẽ không sử dụng Datasets, DataApdater trong này, mà chỉ dùng các thành phần cơ bản như: Connection, Command, DataReader.
  


Với ví dụ nhỏ này, mã nguồn được viết bằng C# bạn có thể sử dụng để chuyển đổi một dãy số tối đa 15 chữ số về dạng chữ. Giống như trong hóa đơn tiền . . . Và có thể build DLL để import vào project  để sử dụng khi cần thiết.

Đây là ví dụ đơn giản, tác giả đã chỉ dùng IF, TRUE, FALSE là các hàm chính để xác định nội dung cần chuyển đổi. Nếu bạn có ý tưởng hay hơn hãy chỉnh sửa nó

Trong đó bạn có thể hiểu một số cú pháp như sau:
if(a==0) return;

// Nếu như trong phương thức bạn viết như vậy thì ngay khi đọc được lệnh này nó sẽ kiểm tra xem a có bằng 0, nếu bằng 0 phương thức sẽ ngừng tại lệnh này và không đọc tiếp các lệnh sau nó. Hàm kiểu void thì bạn return; như vậy. Còn các kiểu int, string thì return về kiểu tương ứng.
int x =  a > b ? 5 : 7;

//Đây là một dạng điều kiện true/false trả về kết quả tương ứng. Như lệnh trên biến x = 5 nếu a > b là True và x = 7 nếu a > b là False. Bạn có thể lồng nhiều câu lệnh vào nhau và chú ý ngoặc ( )

Xem qua demo ứng dụng:









Chuyển Số Thành Chữ Bằng C#
Hình 1: Demo Chính

Trong ứng dụng, các công việc được chia nhỏ ra thành nhiều phương thức theo nhiệm vụ để gộp nên một phương thức tổng quát.




Tải Mẫu : Tại Đây

(Nếu source code bị lỗi không tải được xin hãy để lại lời nhắn tại đây)

Update:  15/11/2013
Nguồn: Tự Học IT Online - http://tuhocit.net

Chuyển Số Thành Chữ Bằng C#

Với ví dụ nhỏ này, mã nguồn được viết bằng C# bạn có thể sử dụng để chuyển đổi một dãy số tối đa 15 chữ số về dạng chữ. Giống như trong hóa đơn tiền . . . Và có thể build DLL để import vào project  để sử dụng khi cần thiết.

Đây là ví dụ đơn giản, tác giả đã chỉ dùng IF, TRUE, FALSE là các hàm chính để xác định nội dung cần chuyển đổi. Nếu bạn có ý tưởng hay hơn hãy chỉnh sửa nó

Trong đó bạn có thể hiểu một số cú pháp như sau:
if(a==0) return;

// Nếu như trong phương thức bạn viết như vậy thì ngay khi đọc được lệnh này nó sẽ kiểm tra xem a có bằng 0, nếu bằng 0 phương thức sẽ ngừng tại lệnh này và không đọc tiếp các lệnh sau nó. Hàm kiểu void thì bạn return; như vậy. Còn các kiểu int, string thì return về kiểu tương ứng.
int x =  a > b ? 5 : 7;

//Đây là một dạng điều kiện true/false trả về kết quả tương ứng. Như lệnh trên biến x = 5 nếu a > b là True và x = 7 nếu a > b là False. Bạn có thể lồng nhiều câu lệnh vào nhau và chú ý ngoặc ( )

Xem qua demo ứng dụng:









Chuyển Số Thành Chữ Bằng C#
Hình 1: Demo Chính

Trong ứng dụng, các công việc được chia nhỏ ra thành nhiều phương thức theo nhiệm vụ để gộp nên một phương thức tổng quát.




Tải Mẫu : Tại Đây

(Nếu source code bị lỗi không tải được xin hãy để lại lời nhắn tại đây)

Update:  15/11/2013
Nguồn: Tự Học IT Online - http://tuhocit.net

- DateTime là một struct xử lý ngày tháng rất mạnh mẽ nằm tại
Namesapce: System  
     Assembly:  mscorlib.dll
Và nó có tới 12 Constructor khác nhau đồng nghĩa có 12 cách truyền tham số khởi tạo đối tượng khác nhau. Cho bạn xử lý thời gian mạnh mẽ hơn kết hợp với các hàm và chúng ta sẽ tìm hiểu tiếp theo đây

 

 



Trong phần này chúng ta đi tìm hiểu các phương thức cộng ngày tháng, giờ, phút................... bằng cách cộng thêm Ngày, tháng, năm ....... mới vào  ngày xác định cho trước  để cho ra kết quả mới. Giá trị add mới có thể là âm / dương để lấy về một kết quả  tăng hoặc giảm như mong muốn.
Phương thức Add bao gồm:

- Add: Trả về ngày giờ mới có thể tăng hoặc giảm tùy thuộc vào tham số truyền vào hàm Timespan. Bạn có thể truyền giá trị âm vào TimeSpan để lấy giá trị giảm.
- AddYears: Trả về ngày tháng mới mà giá trị thay đổi là Năm. Bạn có thể nhận một giá trị tăng hoặc giảm tùy vào tham số truyền vào
- AddMonths: Trả về ngày giờ mới mà giá trị thay đổi là Tháng và Năm . . .
- AddDays: Trả về ngày  giờ mới mà giá trị thay đổi là Ngày, Tháng Năm . . .
- AddHours: Trả về ngày giờ mới mà giá trị thay đổi là Giờ, Ngày, Tháng Năm . . .
- AddMinutes: Trả về ngày giờ mới mà giá trị thay đổi là Phút, Giờ, Ngày, Tháng Năm . . .
- AddSeconds: Trả về ngày giờ mới mà giá trị thay đổi là Giây, Phút, Giờ, Ngày, Tháng Năm . . .
- AddMilliseconds: Tương tự như trên và thay đổi tới mức Mili giây . . .
- AddTicks: Trả vể ngày giờ mới và thay đổi tới mức siêu nhỏ (nanoseconds). Tham số truyền vào có giá trị gấp 100 lần nanoseconds
-------------------------------------------------------------------------------------------------------

Kiểu dữ liệu DateTime trong C# sẽ trả về ngày tháng dạng: 09/23/2013 01:00:00 AM

Dưới đây là các ký tự được dùng cho việc quy định hiển thị một phần giá trị của định dạng trên:
- y hiển thị tháng và năm dạng: Septemper 2013
- yy hiển thị 2 số cuối của năm: 13
- yyy hiển hị năm 3 số nếu năm 4 số thì tự chuyển qua: 2013
- yyyy hiển thị năm dạng 4 số: 2013
- M hiển thị tháng dạng chữ cái + ngày dạng số: Septemper 23
- MMM hiển thị tháng dưới dạng 3 chữ cái đầu tiên trong tên tháng: Sep
- MMMM hiển thị tháng dạng chữ cái đầy đủ: Septemper
- d hiển thị ngày tháng năm dạng: 23/09/2013
- dd hiển thị chỉ ngày dạng số: 23
- ddd hiển thị thứ của ngày dạng 3 chữ cái: Mon
- dddd hiển thị thứ của ngày dạng đầy đủ: Monday

- HH hiển thị giờ theo dạng 24h
- mm hiển thị phút dưới dạng 2 số
- ss hiển thị giây dạng 2 số
- tt hiển thị AM/PM  :            01:21:45:AM

- N Hiển thị dấu phẩy cho dãy số. Có thể tùy chỉnh N0, N1, N2 . . .


Tuy nhiên, chúng ta có cách khác ngoài việc dùng các ký tự trong lúc in ra ngày giờ bằng cách sau:
DateTime today= DateTime.Now;
int year = today.Year;
int month = today.Month;
int day = today.Day;
int hour = today.Hour;
int minute = today.Minute;
int second = today.Second;
int millisecond = today.Millisecond;

Các biến ở trên get ra Năm, Tháng, Ngày, Giờ . . . hiện tại của ngày đã cho
long tick = today.Ticks; 

Đối với biến tick mà chúng ta get ra được ở trên nó khác hoàn toàn với các biến trên nó, bởi vì tick này chính là tổng ngày tháng, giờ....tính ra dạng ticks. Cho độ chính xác cao, từ biến này ta có thể in ra các kết quả dạng
// 21,338,580,000,000,000 nanoseconds 
// 2,190,385,800,000,000 ticks 
// 219,333,580.00 seconds 
// 2,555,643.00 minutes 
//...................... hour, day, month, year

----------------------------------------------------------------------------------------------------------------
1. Add Method()
- Trả về ngày mới tăng hoặc giảm tuy vào quy định của giá trị truyền vào trong phương thức TimeSpan.  Times Span ở đây nó sẽ khởi tạo một ngày mới do ta cài đặt và nó có 5 cách sử dụng tức là có 5 cách truyền tham số (Parameter) vào nó.
Sau khi thiết lập ngày giờ cho TimesSpan thì gán vào phương thức Add() để xử lý ra ngày giờ mới. Và Add() chỉ nhận giá trị của TimeSpan. Bạn không thể gán giá DateTime vào nó.

- Ở ví dụ này, chúng ta sẽ truyền vào nó 4 tham số kiểu Int: Ngày, Giờ, Phút, Giây
    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DateTimeDemo
{
class Program
{
static void Main(string[] args)
{
var today = DateTime.Now;
var duration = new TimeSpan(0, 0, 0, 0);
DateTime newday = today.Add(duration);

Console.WriteLine("{0}", newday);
/* Out: 9/23/2013 1:31:50:AM */
Console.WriteLine("{0:yyyy}", newday);
/* Out: 2013 */
Console.WriteLine("{0:MMMM}", newday);
/* Out: Septemper */
Console.WriteLine("{0:dd}", newday);
/* Out: 23 */
Console.WriteLine("{0:HH}", newday);
/* Out: 01 */
Console.WriteLine("{0:mm}", newday);
/* Out: 31 */
Console.WriteLine("{0:ss}", newday);
/* Out: 50 */
Console.WriteLine("{0:tt}", newday);
/* Out: AM */
Console.ReadLine();
}
}
}

 

2. AddYears()
- Tham số truyền vào là kiểu int và tất nhiên là có thể âm hoặc dương
DateTime today = DateTime.Now;
DateTime newday = today.AddYears(5);

Console.WriteLine(today);
Console.WriteLine(newday);
/*
* Output:
* today: 9/24/2013
* newday: 9/24/2018
*/

3. AddMonths()
- Tương tự tham số truyền vào là kiểu Int và có thể âm hoặc dương
DateTime today = DateTime.Now;
DateTime newday = today.AddMonths(15);

Console.WriteLine(today);
Console.WriteLine(newday);
/*
* Output:
* today: 9/24/2013
* newday: 12/24/2014
*/

4. AddDays()
- Trả về ngày mới tăng hoặc giảm tùy vào giá trị tham số truyền vào phương thức AddDays() . Giá trị truyền vào là kiểu Double quy định cho số ngày bạn cần Add là bao nhiêu và có thể âm hoặc dương.
DateTime today = DateTime.Now; //Get Date time now on system
DateTime newday = today.AddDays(6); // Adding 6 days from the current date
Console.WriteLine("Today: {0:d}", today);
Console.WriteLine("6 days from today: {0:d}", newday);

/* Output
* Today: 9/23/2013
* 6 days from today: 9/29/2013
*/

5. AddHours()
- Trả về ngày mới tăng hoặc giảm tùy thuộc vào tham số truyền vào phương thức AddHours(). Giá trị truyền vào là kiểu Double   quy định cho số giờ bạn cần Add là bao nhiêu và có thể âm hoặc dương.
DateTime today = DateTime.Now;
DateTime newday = today.AddHours(-4);
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 10:30: AM
*/

6. AddMinutes()
- Tương tự như AddHour. Trả về ngày mới tùy thuộc vào tham số truyền vào hàm AddMinutes(). Giá trị truyền vào là kiểu Double quy định cho số phút bạn Add vào
DateTime today = DateTime.Now;
DateTime newday = today.AddMinutes(60);
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 3:30: PM
*/

7. AddSeconds()
Tương tự, tham số truyền vào là kiểu Double

DateTime today = DateTime.Now;
DateTime newday = today.AddSeconds(3600); // 3600s = 60 minutes
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 3:30: PM
*/

 
8. AddMilliseconds()
Tương tự, tham số truyền vào là kiểu Double
DateTime today = DateTime.Now;
DateTime newday = today.AddMilliseconds(1000); // 1000 Milliseconds = 1 Seconds
Console.WriteLine("{0}", today);
Console.WriteLine("{0}", newday);
/*
* Output
* today: 9/24/2013 2:30:40 PM
* newday: 9/24/2013 3:30:41 PM
*/

9. AddTicks()
Tham số truyền vào là kiểu long 64bit

- Nanosecond là đơn vị thời gian cực nhỏ với:






1 nanosecond = 1.0 x 10-9 Seconds

Trong C# chúng ta sử dụng hàm AddTicks để tính phép công có giá trị thời gian nhỏ cỡ nano nhưng:
1 ticks = 100 nanosecond

Demo 1:


DateTime today = DateTime.Now;
DateTime newday = today.AddTicks(10000000);
/*
* 1 Seconds = 1000.000.000 nanoseconds
* 1 Seconds = 10.000.000 Ticks
* 1 Ticks = 100 nanoseconds
*/
Console.WriteLine("{0}", today);
Console.WriteLine("{0}", newday);
/*
* Output
* today: 9/24/2013 2:30:40 PM
* newday: 9/24/2013 2:30:41 PM
*/

 Demo 2: Ví dụ chuyển ngày tháng cụ thể sang dạng Ticks và sử dụng biến này in ra các dạng khác nhau của ngày tháng
DateTime today = DateTime.Now;
long varTick = today.Ticks;
TimeSpan ts = new TimeSpan(varTick);

Console.WriteLine("Today is: {0:f}",today);
Console.WriteLine(" {0:N0} nanoseconds", varTick * 100);
Console.WriteLine(" {0:N0} ticks", varTick);
Console.WriteLine(" {0:N2} seconds", ts.TotalSeconds);
Console.WriteLine(" {0:N2} minutes", ts.TotalMinutes);
Console.WriteLine(" {0:N0} days, {1} hours, {2} minutes, {3} seconds",
ts.Days, ts.Hours,
ts.Minutes, ts.Seconds);

 





Demo:
To be continued . . .
Nguồn: Tự Học IT Online - http://tuhocit.net

Xử lý DateTime trong C# - Phần 1

- DateTime là một struct xử lý ngày tháng rất mạnh mẽ nằm tại
Namesapce: System  
     Assembly:  mscorlib.dll
Và nó có tới 12 Constructor khác nhau đồng nghĩa có 12 cách truyền tham số khởi tạo đối tượng khác nhau. Cho bạn xử lý thời gian mạnh mẽ hơn kết hợp với các hàm và chúng ta sẽ tìm hiểu tiếp theo đây

 

 



Trong phần này chúng ta đi tìm hiểu các phương thức cộng ngày tháng, giờ, phút................... bằng cách cộng thêm Ngày, tháng, năm ....... mới vào  ngày xác định cho trước  để cho ra kết quả mới. Giá trị add mới có thể là âm / dương để lấy về một kết quả  tăng hoặc giảm như mong muốn.
Phương thức Add bao gồm:

- Add: Trả về ngày giờ mới có thể tăng hoặc giảm tùy thuộc vào tham số truyền vào hàm Timespan. Bạn có thể truyền giá trị âm vào TimeSpan để lấy giá trị giảm.
- AddYears: Trả về ngày tháng mới mà giá trị thay đổi là Năm. Bạn có thể nhận một giá trị tăng hoặc giảm tùy vào tham số truyền vào
- AddMonths: Trả về ngày giờ mới mà giá trị thay đổi là Tháng và Năm . . .
- AddDays: Trả về ngày  giờ mới mà giá trị thay đổi là Ngày, Tháng Năm . . .
- AddHours: Trả về ngày giờ mới mà giá trị thay đổi là Giờ, Ngày, Tháng Năm . . .
- AddMinutes: Trả về ngày giờ mới mà giá trị thay đổi là Phút, Giờ, Ngày, Tháng Năm . . .
- AddSeconds: Trả về ngày giờ mới mà giá trị thay đổi là Giây, Phút, Giờ, Ngày, Tháng Năm . . .
- AddMilliseconds: Tương tự như trên và thay đổi tới mức Mili giây . . .
- AddTicks: Trả vể ngày giờ mới và thay đổi tới mức siêu nhỏ (nanoseconds). Tham số truyền vào có giá trị gấp 100 lần nanoseconds
-------------------------------------------------------------------------------------------------------

Kiểu dữ liệu DateTime trong C# sẽ trả về ngày tháng dạng: 09/23/2013 01:00:00 AM

Dưới đây là các ký tự được dùng cho việc quy định hiển thị một phần giá trị của định dạng trên:
- y hiển thị tháng và năm dạng: Septemper 2013
- yy hiển thị 2 số cuối của năm: 13
- yyy hiển hị năm 3 số nếu năm 4 số thì tự chuyển qua: 2013
- yyyy hiển thị năm dạng 4 số: 2013
- M hiển thị tháng dạng chữ cái + ngày dạng số: Septemper 23
- MMM hiển thị tháng dưới dạng 3 chữ cái đầu tiên trong tên tháng: Sep
- MMMM hiển thị tháng dạng chữ cái đầy đủ: Septemper
- d hiển thị ngày tháng năm dạng: 23/09/2013
- dd hiển thị chỉ ngày dạng số: 23
- ddd hiển thị thứ của ngày dạng 3 chữ cái: Mon
- dddd hiển thị thứ của ngày dạng đầy đủ: Monday

- HH hiển thị giờ theo dạng 24h
- mm hiển thị phút dưới dạng 2 số
- ss hiển thị giây dạng 2 số
- tt hiển thị AM/PM  :            01:21:45:AM

- N Hiển thị dấu phẩy cho dãy số. Có thể tùy chỉnh N0, N1, N2 . . .


Tuy nhiên, chúng ta có cách khác ngoài việc dùng các ký tự trong lúc in ra ngày giờ bằng cách sau:
DateTime today= DateTime.Now;
int year = today.Year;
int month = today.Month;
int day = today.Day;
int hour = today.Hour;
int minute = today.Minute;
int second = today.Second;
int millisecond = today.Millisecond;

Các biến ở trên get ra Năm, Tháng, Ngày, Giờ . . . hiện tại của ngày đã cho
long tick = today.Ticks; 

Đối với biến tick mà chúng ta get ra được ở trên nó khác hoàn toàn với các biến trên nó, bởi vì tick này chính là tổng ngày tháng, giờ....tính ra dạng ticks. Cho độ chính xác cao, từ biến này ta có thể in ra các kết quả dạng
// 21,338,580,000,000,000 nanoseconds 
// 2,190,385,800,000,000 ticks 
// 219,333,580.00 seconds 
// 2,555,643.00 minutes 
//...................... hour, day, month, year

----------------------------------------------------------------------------------------------------------------
1. Add Method()
- Trả về ngày mới tăng hoặc giảm tuy vào quy định của giá trị truyền vào trong phương thức TimeSpan.  Times Span ở đây nó sẽ khởi tạo một ngày mới do ta cài đặt và nó có 5 cách sử dụng tức là có 5 cách truyền tham số (Parameter) vào nó.
Sau khi thiết lập ngày giờ cho TimesSpan thì gán vào phương thức Add() để xử lý ra ngày giờ mới. Và Add() chỉ nhận giá trị của TimeSpan. Bạn không thể gán giá DateTime vào nó.

- Ở ví dụ này, chúng ta sẽ truyền vào nó 4 tham số kiểu Int: Ngày, Giờ, Phút, Giây
    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DateTimeDemo
{
class Program
{
static void Main(string[] args)
{
var today = DateTime.Now;
var duration = new TimeSpan(0, 0, 0, 0);
DateTime newday = today.Add(duration);

Console.WriteLine("{0}", newday);
/* Out: 9/23/2013 1:31:50:AM */
Console.WriteLine("{0:yyyy}", newday);
/* Out: 2013 */
Console.WriteLine("{0:MMMM}", newday);
/* Out: Septemper */
Console.WriteLine("{0:dd}", newday);
/* Out: 23 */
Console.WriteLine("{0:HH}", newday);
/* Out: 01 */
Console.WriteLine("{0:mm}", newday);
/* Out: 31 */
Console.WriteLine("{0:ss}", newday);
/* Out: 50 */
Console.WriteLine("{0:tt}", newday);
/* Out: AM */
Console.ReadLine();
}
}
}

 

2. AddYears()
- Tham số truyền vào là kiểu int và tất nhiên là có thể âm hoặc dương
DateTime today = DateTime.Now;
DateTime newday = today.AddYears(5);

Console.WriteLine(today);
Console.WriteLine(newday);
/*
* Output:
* today: 9/24/2013
* newday: 9/24/2018
*/

3. AddMonths()
- Tương tự tham số truyền vào là kiểu Int và có thể âm hoặc dương
DateTime today = DateTime.Now;
DateTime newday = today.AddMonths(15);

Console.WriteLine(today);
Console.WriteLine(newday);
/*
* Output:
* today: 9/24/2013
* newday: 12/24/2014
*/

4. AddDays()
- Trả về ngày mới tăng hoặc giảm tùy vào giá trị tham số truyền vào phương thức AddDays() . Giá trị truyền vào là kiểu Double quy định cho số ngày bạn cần Add là bao nhiêu và có thể âm hoặc dương.
DateTime today = DateTime.Now; //Get Date time now on system
DateTime newday = today.AddDays(6); // Adding 6 days from the current date
Console.WriteLine("Today: {0:d}", today);
Console.WriteLine("6 days from today: {0:d}", newday);

/* Output
* Today: 9/23/2013
* 6 days from today: 9/29/2013
*/

5. AddHours()
- Trả về ngày mới tăng hoặc giảm tùy thuộc vào tham số truyền vào phương thức AddHours(). Giá trị truyền vào là kiểu Double   quy định cho số giờ bạn cần Add là bao nhiêu và có thể âm hoặc dương.
DateTime today = DateTime.Now;
DateTime newday = today.AddHours(-4);
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 10:30: AM
*/

6. AddMinutes()
- Tương tự như AddHour. Trả về ngày mới tùy thuộc vào tham số truyền vào hàm AddMinutes(). Giá trị truyền vào là kiểu Double quy định cho số phút bạn Add vào
DateTime today = DateTime.Now;
DateTime newday = today.AddMinutes(60);
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 3:30: PM
*/

7. AddSeconds()
Tương tự, tham số truyền vào là kiểu Double

DateTime today = DateTime.Now;
DateTime newday = today.AddSeconds(3600); // 3600s = 60 minutes
Console.WriteLine("{0}",newday);

/* Today: 9/24/2013 2:30: PM
* Output
* newday: 9/24/2013 3:30: PM
*/

 
8. AddMilliseconds()
Tương tự, tham số truyền vào là kiểu Double
DateTime today = DateTime.Now;
DateTime newday = today.AddMilliseconds(1000); // 1000 Milliseconds = 1 Seconds
Console.WriteLine("{0}", today);
Console.WriteLine("{0}", newday);
/*
* Output
* today: 9/24/2013 2:30:40 PM
* newday: 9/24/2013 3:30:41 PM
*/

9. AddTicks()
Tham số truyền vào là kiểu long 64bit

- Nanosecond là đơn vị thời gian cực nhỏ với:






1 nanosecond = 1.0 x 10-9 Seconds

Trong C# chúng ta sử dụng hàm AddTicks để tính phép công có giá trị thời gian nhỏ cỡ nano nhưng:
1 ticks = 100 nanosecond

Demo 1:


DateTime today = DateTime.Now;
DateTime newday = today.AddTicks(10000000);
/*
* 1 Seconds = 1000.000.000 nanoseconds
* 1 Seconds = 10.000.000 Ticks
* 1 Ticks = 100 nanoseconds
*/
Console.WriteLine("{0}", today);
Console.WriteLine("{0}", newday);
/*
* Output
* today: 9/24/2013 2:30:40 PM
* newday: 9/24/2013 2:30:41 PM
*/

 Demo 2: Ví dụ chuyển ngày tháng cụ thể sang dạng Ticks và sử dụng biến này in ra các dạng khác nhau của ngày tháng
DateTime today = DateTime.Now;
long varTick = today.Ticks;
TimeSpan ts = new TimeSpan(varTick);

Console.WriteLine("Today is: {0:f}",today);
Console.WriteLine(" {0:N0} nanoseconds", varTick * 100);
Console.WriteLine(" {0:N0} ticks", varTick);
Console.WriteLine(" {0:N2} seconds", ts.TotalSeconds);
Console.WriteLine(" {0:N2} minutes", ts.TotalMinutes);
Console.WriteLine(" {0:N0} days, {1} hours, {2} minutes, {3} seconds",
ts.Days, ts.Hours,
ts.Minutes, ts.Seconds);

 





Demo:
To be continued . . .
Nguồn: Tự Học IT Online - http://tuhocit.net

Inheritance : tính kế thừa.

 

Polymorphism : tính đa hình

Encapsulation : tính đóng gói.





Đây là ba đặc điểm chính của lập trình hướng đối tượng và đây là nội dung chính chúng ta cần quan tâm. Các bài trước là tiền đề để ta nắm rõ các phương pháp này, tuy nhiên vẫn còn thiếu sót một vài vấn đề mà trong bài này sẽ bổ sung tiếp cho các bạn.

A. Tính Thừa Kế

Thừa kế ở đây là gì ? Là sự kế thừa, tái sử dụng phương thức, thuộc tính của lớp cơ sở. Và lớp kế thừa được gọi là lớp con, nó sẽ thừa hưởng những gì lớp cha có và cho phép. Kế thừa giúp tiết kiệm thời gian viết code, tái sử dụng và mở rộng hiệu quả, dễ bảo trì sửa chữa. Có 2 loại thừa kế, đó là đa thừa kế và đơn thừa kế. Trong các ngôn ngữ hướng đối tượng như C#,Java . . . thì không hỗ trợ đa thừa kế. (C++ có hỗ trợ đa thừa kế).

- Đa thừa kế là một lớp con có thể kế thừa từ hai hoặc nhiều lớp cha (lớp cơ sở). Nó mang lại sự phức tạp, trùng lặp không đáng có . . .Chúng ta không tìm hiểu thêm tại đây
- Đơn thừa kế là một lớp con chỉ kế thừa từ một lớp cha. Và tất nhiên một lớp cha có thể có nhiều lớp con kế thừa từ nó và lớp con đó có thể là lớp cha của lớp khác.
- Trong kế thừa nếu Class B kế thừa từ Class A và Class C kế thừa từ Class B. Thì Class C được thừa hưởng các thuộc tính phương thức (cho phép) của A và B.

Trong C# ta dùng dấu hai chấm ':' để kế thừa class khác.
Cách gọi :
Lớp cha (lớp cơ sở) - Base class
Lớp con (lớp dẫn xuất) - Derived class

Xem ví dụ dưới






- Từ hình trên bạn có thể thấy, chúng ta có 2 interface. Và class A kế thừa cùng lúc cả 2 interface này, bên dưới class B kế thừa A tương tự ta có class C kế thừa B.
- Hình mũi tên màu đen miêu tả sự kế thừa của các class.
Màu đỏ miều tả class C được thừa hưởng từ A và B.
Màu xanh  miêu tả class B vẫn có thể thể hiện các interface do class A kế thừa. Nếu class A không thực thi các interface này mà nhường cho lớp B của nó bằng cách sử dụng abstract.

Interface

- Nó giống như abstract class. Bất kỳ một class nào kế thừa phải thực thi các method của nó.
- Một class có thể kế thừa cùng lúc nhiều interface
- Cú pháp của nó chỉ đơn giản là các method trống giống abstract vậy
- Cùng xem các ví dụ để hiểu rõ hơn nhé !


B. Tính Đa Hình

Tính đa hình cho phép các chức năng (method) khác nhau được thực thi khác nhau trên các đối tượng khác nhau. Nói nôm na đơn giản hơn là bạn có 3 lớp A,B,C kế thừa nhau và trong 3 lớp này có ba method cùng tên là show(); . Khi ta tạo mới đối tượng cho các lớp trên thì những đối tượng này gọi tới method show() nằm ở lớp nào thì thực thi chức năng phương thức ở lớp đó. Bởi vì chúng kế thừa nên sử dụng rõ tính đa hình này.

Cụ thể ta có đa hình tĩnh và đa hình động.

1. Đa hình tĩnh là việc dùng Overloading gồm các phương thức có trùng tên trong một class. Nhưng các phương thức này được thực thi khác nhau, tùy vào cài đặt. Bạn xem lại bài trước . . . Ở đây chúng ta không đề cập tới nữa

2. Đa hình động lại gồm có Abstract và Virtual. Trong đó abstract bạn có thể xem lại bài trước, chúng ta sẽ nói rõ về phương thức Virtual.

Thực ra virtual cũng giống như abstract, điểm khác biệt là bạn có thể viết các tuyên bố lệnh cho nó còn abstract method thì không. Và khi sử dụng phương thức abstract thì class đó cũng là abstract class còn Virtual thì không.

// Virtual method
public virtual void abc()
{
// Do something here !
}

// Abstract method
public abstract void abc();



Giả sử ta có lớp con kế thừa từ lớp cha chứa 2 phương thức virtual abstract. Thì lớp con này buộc phải triển khai lớp abstract từ lớp cha. Nhưng đối với phương thức virtual lớp con có thể sử dụng hoặc không. Một điểm chung đó là khi triển khai cả hai phương thức này ở lớp con chúng ta cần phải override chúng.

Vậy từ nãy giờ lang man mà cụ thể đa hình là sao, hoạt động như thế nào ?

Từ hình trên ta thấy rằng lớp B và C đã triển khai phương thức Abstract từ A (là bắt buộc). Tuy nhiên B triển khai tiếp phương thức Virtual của A mà C lại không (Vì không bắt buộc).
Giờ ta để ý p.thức virtual mà B tái sử dụng có từ khóa base, từ này ở đây có tác dụng gọi lại chức năng phương thức gốc của lớp A. Bạn có thể bỏ đi nếu không cần thiết và thay thế mã mới theo yêu cầu cài đặt.

Tại hàm Main khởi tạo đối tượng (Object) mới cho class B và C. Bạn có thể khởi tạo đối tượng bằng lệnh:  classB obj = new classB();
Sau đó thực thi 3 phương thức ta có kết quả như hình trên.
Lưu ý: Abstract class A không thể khởi tạo đối tượng vì nó là abstract.

C. Tính Đóng Gói

Đơn giản là việc sử dụng các  Access Modifiers để che dấu và bảo vệ thông tin cho các trường dữ liệu hoặc phương thức. Xem lại bài trước về access modifiers. Việc sử dụng thuần thục nó là rất quan trọng, vì nếu các thông tin về dữ liệu không được bảo vệ cẩn thận thì sẽ để lại lỗ hổng rất đáng lo ngại.

-----------------------------------------------------------------------
Dưới đây là mã nguồn demo các bạn tải về để xem nhé !



Chú ý:

Demo được thực hiện bằng VS Studio 2012. Nếu bạn dùng phiên bản thấp hơn, chẳng hạn 2010 thì làm như sau:

B1: Mở file *.sln bằng Notepad
B2: Bạn sẽ thấy những dòng đầu như thế này
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11 .........
...................................

B3: Thay số 12.00 in đậm thành 11.00 và 2012 thành 2010.
B4: Save
Hope this helps !


:hi:

BavoHex
Nguồn: Tự Học IT Online - http://tuhocit.net

OOP: Tính Kế Thừa - Tính Đa Hình - Tính Đóng Gói

Inheritance : tính kế thừa.

 

Polymorphism : tính đa hình

Encapsulation : tính đóng gói.





Đây là ba đặc điểm chính của lập trình hướng đối tượng và đây là nội dung chính chúng ta cần quan tâm. Các bài trước là tiền đề để ta nắm rõ các phương pháp này, tuy nhiên vẫn còn thiếu sót một vài vấn đề mà trong bài này sẽ bổ sung tiếp cho các bạn.

A. Tính Thừa Kế

Thừa kế ở đây là gì ? Là sự kế thừa, tái sử dụng phương thức, thuộc tính của lớp cơ sở. Và lớp kế thừa được gọi là lớp con, nó sẽ thừa hưởng những gì lớp cha có và cho phép. Kế thừa giúp tiết kiệm thời gian viết code, tái sử dụng và mở rộng hiệu quả, dễ bảo trì sửa chữa. Có 2 loại thừa kế, đó là đa thừa kế và đơn thừa kế. Trong các ngôn ngữ hướng đối tượng như C#,Java . . . thì không hỗ trợ đa thừa kế. (C++ có hỗ trợ đa thừa kế).

- Đa thừa kế là một lớp con có thể kế thừa từ hai hoặc nhiều lớp cha (lớp cơ sở). Nó mang lại sự phức tạp, trùng lặp không đáng có . . .Chúng ta không tìm hiểu thêm tại đây
- Đơn thừa kế là một lớp con chỉ kế thừa từ một lớp cha. Và tất nhiên một lớp cha có thể có nhiều lớp con kế thừa từ nó và lớp con đó có thể là lớp cha của lớp khác.
- Trong kế thừa nếu Class B kế thừa từ Class A và Class C kế thừa từ Class B. Thì Class C được thừa hưởng các thuộc tính phương thức (cho phép) của A và B.

Trong C# ta dùng dấu hai chấm ':' để kế thừa class khác.
Cách gọi :
Lớp cha (lớp cơ sở) - Base class
Lớp con (lớp dẫn xuất) - Derived class

Xem ví dụ dưới






- Từ hình trên bạn có thể thấy, chúng ta có 2 interface. Và class A kế thừa cùng lúc cả 2 interface này, bên dưới class B kế thừa A tương tự ta có class C kế thừa B.
- Hình mũi tên màu đen miêu tả sự kế thừa của các class.
Màu đỏ miều tả class C được thừa hưởng từ A và B.
Màu xanh  miêu tả class B vẫn có thể thể hiện các interface do class A kế thừa. Nếu class A không thực thi các interface này mà nhường cho lớp B của nó bằng cách sử dụng abstract.

Interface

- Nó giống như abstract class. Bất kỳ một class nào kế thừa phải thực thi các method của nó.
- Một class có thể kế thừa cùng lúc nhiều interface
- Cú pháp của nó chỉ đơn giản là các method trống giống abstract vậy
- Cùng xem các ví dụ để hiểu rõ hơn nhé !


B. Tính Đa Hình

Tính đa hình cho phép các chức năng (method) khác nhau được thực thi khác nhau trên các đối tượng khác nhau. Nói nôm na đơn giản hơn là bạn có 3 lớp A,B,C kế thừa nhau và trong 3 lớp này có ba method cùng tên là show(); . Khi ta tạo mới đối tượng cho các lớp trên thì những đối tượng này gọi tới method show() nằm ở lớp nào thì thực thi chức năng phương thức ở lớp đó. Bởi vì chúng kế thừa nên sử dụng rõ tính đa hình này.

Cụ thể ta có đa hình tĩnh và đa hình động.

1. Đa hình tĩnh là việc dùng Overloading gồm các phương thức có trùng tên trong một class. Nhưng các phương thức này được thực thi khác nhau, tùy vào cài đặt. Bạn xem lại bài trước . . . Ở đây chúng ta không đề cập tới nữa

2. Đa hình động lại gồm có Abstract và Virtual. Trong đó abstract bạn có thể xem lại bài trước, chúng ta sẽ nói rõ về phương thức Virtual.

Thực ra virtual cũng giống như abstract, điểm khác biệt là bạn có thể viết các tuyên bố lệnh cho nó còn abstract method thì không. Và khi sử dụng phương thức abstract thì class đó cũng là abstract class còn Virtual thì không.

// Virtual method
public virtual void abc()
{
// Do something here !
}

// Abstract method
public abstract void abc();



Giả sử ta có lớp con kế thừa từ lớp cha chứa 2 phương thức virtual abstract. Thì lớp con này buộc phải triển khai lớp abstract từ lớp cha. Nhưng đối với phương thức virtual lớp con có thể sử dụng hoặc không. Một điểm chung đó là khi triển khai cả hai phương thức này ở lớp con chúng ta cần phải override chúng.

Vậy từ nãy giờ lang man mà cụ thể đa hình là sao, hoạt động như thế nào ?

Từ hình trên ta thấy rằng lớp B và C đã triển khai phương thức Abstract từ A (là bắt buộc). Tuy nhiên B triển khai tiếp phương thức Virtual của A mà C lại không (Vì không bắt buộc).
Giờ ta để ý p.thức virtual mà B tái sử dụng có từ khóa base, từ này ở đây có tác dụng gọi lại chức năng phương thức gốc của lớp A. Bạn có thể bỏ đi nếu không cần thiết và thay thế mã mới theo yêu cầu cài đặt.

Tại hàm Main khởi tạo đối tượng (Object) mới cho class B và C. Bạn có thể khởi tạo đối tượng bằng lệnh:  classB obj = new classB();
Sau đó thực thi 3 phương thức ta có kết quả như hình trên.
Lưu ý: Abstract class A không thể khởi tạo đối tượng vì nó là abstract.

C. Tính Đóng Gói

Đơn giản là việc sử dụng các  Access Modifiers để che dấu và bảo vệ thông tin cho các trường dữ liệu hoặc phương thức. Xem lại bài trước về access modifiers. Việc sử dụng thuần thục nó là rất quan trọng, vì nếu các thông tin về dữ liệu không được bảo vệ cẩn thận thì sẽ để lại lỗ hổng rất đáng lo ngại.

-----------------------------------------------------------------------
Dưới đây là mã nguồn demo các bạn tải về để xem nhé !



Chú ý:

Demo được thực hiện bằng VS Studio 2012. Nếu bạn dùng phiên bản thấp hơn, chẳng hạn 2010 thì làm như sau:

B1: Mở file *.sln bằng Notepad
B2: Bạn sẽ thấy những dòng đầu như thế này
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11 .........
...................................

B3: Thay số 12.00 in đậm thành 11.00 và 2012 thành 2010.
B4: Save
Hope this helps !


:hi:

BavoHex
Nguồn: Tự Học IT Online - http://tuhocit.net

Linq in .NET

Introduction

Có thể khái quát về LINQ qua các ý chính sau đây, trong những bài tới bạn có thể nắm rõ nó hơn với những ví dụ cụ thể . . .

- LINQ ( Language-Integrated Query ) :  là tập hợp các tính năng công nghệ được giới thiệu trong Visual Studio 2008 mở rộng khả năng truy vấn mạnh mẽ với cú pháp ngôn ngữ C #Visual Basic. Bắt đầu từ phiên bản .NET Framework này LINQ như là một cầu nối mạnh mẽ giữa các Object và Dữ liệu.
(LINQ được sử dụng từ .NET FW 3.5 và cao hơn)
- Trước đây, các truy vấn đối với dữ liệu được thể hiện như các chuỗi đơn giản mà không cần kiểm tra kiểu thời gian biên dịch hoặc hỗ trợ IntelliSense. Hơn nữa, bạn phải học một ngôn ngữ khác nhau truy vấn cho từng loại nguồn dữ liệu: cơ sở dữ liệu SQL, các tài liệu XML, các dịch vụ web khác nhau. LINQ giúp bạn xây dựng các truy vấn trên tất cả các loại hình đó. Các tính năng nổi bật giúp nó vươn lên đứng đầu trong khái niệm truy vấn.
- Bạn viết truy vấn  mạnh mẽ cho các đối tượng bằng cách sử dụng các từ từ khóa (keywords C# / VB.NET)  và Toán Tử quen thuộc ( Operators).


- LINQ với mã code trong sáng, hướng đối tượng cho thấy một cái nhìn rất một phú.

Ví dụ mẫu code LINQ với C#
 var numbers = testDS.Tables["Numbers"].AsEnumerable();

var numberGroups =
from n in numbers
group n by n.Field<int>("number") % 5 into g
select new { Remainder = g.Key, Numbers = g };

foreach (var g in numberGroups)
{
Console.WriteLine("Numbers with a remainder of {0} when divided by 5:", g.Remainder);
foreach (var n in g.Numbers)
{
Console.WriteLine(n.Field<int>("number"));
}
}

 

- Cho bạn thấy phải làm gì với những hỗ trợ của LINQ, không phải mất thời gian cho việc phát triển nó


- Bạn có thể viết các truy vấn LINQ trong Visual Basic hoặc C # với cơ sở dữ liệu SQL Server, các tài liệu XML, ADO.NET Datasets, và bất kỳ đối tượng nào có hỗ trợ IEnumerable hoặc generic IEnumerable Interface.
- LINQ có thể biến đổi kết quả trả về từ các truy vấn đến dạng này sang dạng khác. (Truy vấn từ SQL Server xuất ra XML)
- Đặc biệt hơn, kết quả của truy vấn này có thể được dụng bởi truy vấn thứ 2. Một truy vấn có thể là truy vấn phụ của một truy vấn khác
- Bạn có thấy LINQ cực kỳ năng động với mã code đơn giản rành mạch mà lại truy vấn được nhiều loại dữ liệu khác nhau. Giúp bạn rút ngắn thời gian triển khai dự án, và rất nhiều lợi ích khác mà bạn sẽ biết sau khi tìm hiểu loạt bài giới thiệu về LINQ này. . . 

Hiện tại LINQ hỗ trợ các công nghệ sau







 

:bye:

Bài viết xin được kết thúc tại đây, vì hiện tại Microsoft đã không còn hỗ trợ Linq to SQL nên chúng ta chỉ tìm hiểu sơ qua như vậy thôi. Nếu bạn quan tâm hãy để lại bình luận, trong bài tới sẽ tập trung vào Entity Framework, đây là cũng là phương tiện truy xuất CSDL như LINQ dạng ORM nhưng nó thuần ORM hơn Linq và đang được MS khuyến khích sử dụng bởi các tính năng của nó . . .

 


Nguồn: Tự Học IT Online - http://tuhocit.net

LINQ : What is Linq in .NET

Linq in .NET

Introduction

Có thể khái quát về LINQ qua các ý chính sau đây, trong những bài tới bạn có thể nắm rõ nó hơn với những ví dụ cụ thể . . .

- LINQ ( Language-Integrated Query ) :  là tập hợp các tính năng công nghệ được giới thiệu trong Visual Studio 2008 mở rộng khả năng truy vấn mạnh mẽ với cú pháp ngôn ngữ C #Visual Basic. Bắt đầu từ phiên bản .NET Framework này LINQ như là một cầu nối mạnh mẽ giữa các Object và Dữ liệu.
(LINQ được sử dụng từ .NET FW 3.5 và cao hơn)
- Trước đây, các truy vấn đối với dữ liệu được thể hiện như các chuỗi đơn giản mà không cần kiểm tra kiểu thời gian biên dịch hoặc hỗ trợ IntelliSense. Hơn nữa, bạn phải học một ngôn ngữ khác nhau truy vấn cho từng loại nguồn dữ liệu: cơ sở dữ liệu SQL, các tài liệu XML, các dịch vụ web khác nhau. LINQ giúp bạn xây dựng các truy vấn trên tất cả các loại hình đó. Các tính năng nổi bật giúp nó vươn lên đứng đầu trong khái niệm truy vấn.
- Bạn viết truy vấn  mạnh mẽ cho các đối tượng bằng cách sử dụng các từ từ khóa (keywords C# / VB.NET)  và Toán Tử quen thuộc ( Operators).


- LINQ với mã code trong sáng, hướng đối tượng cho thấy một cái nhìn rất một phú.

Ví dụ mẫu code LINQ với C#
 var numbers = testDS.Tables["Numbers"].AsEnumerable();

var numberGroups =
from n in numbers
group n by n.Field<int>("number") % 5 into g
select new { Remainder = g.Key, Numbers = g };

foreach (var g in numberGroups)
{
Console.WriteLine("Numbers with a remainder of {0} when divided by 5:", g.Remainder);
foreach (var n in g.Numbers)
{
Console.WriteLine(n.Field<int>("number"));
}
}

 

- Cho bạn thấy phải làm gì với những hỗ trợ của LINQ, không phải mất thời gian cho việc phát triển nó


- Bạn có thể viết các truy vấn LINQ trong Visual Basic hoặc C # với cơ sở dữ liệu SQL Server, các tài liệu XML, ADO.NET Datasets, và bất kỳ đối tượng nào có hỗ trợ IEnumerable hoặc generic IEnumerable Interface.
- LINQ có thể biến đổi kết quả trả về từ các truy vấn đến dạng này sang dạng khác. (Truy vấn từ SQL Server xuất ra XML)
- Đặc biệt hơn, kết quả của truy vấn này có thể được dụng bởi truy vấn thứ 2. Một truy vấn có thể là truy vấn phụ của một truy vấn khác
- Bạn có thấy LINQ cực kỳ năng động với mã code đơn giản rành mạch mà lại truy vấn được nhiều loại dữ liệu khác nhau. Giúp bạn rút ngắn thời gian triển khai dự án, và rất nhiều lợi ích khác mà bạn sẽ biết sau khi tìm hiểu loạt bài giới thiệu về LINQ này. . . 

Hiện tại LINQ hỗ trợ các công nghệ sau







 

:bye:

Bài viết xin được kết thúc tại đây, vì hiện tại Microsoft đã không còn hỗ trợ Linq to SQL nên chúng ta chỉ tìm hiểu sơ qua như vậy thôi. Nếu bạn quan tâm hãy để lại bình luận, trong bài tới sẽ tập trung vào Entity Framework, đây là cũng là phương tiện truy xuất CSDL như LINQ dạng ORM nhưng nó thuần ORM hơn Linq và đang được MS khuyến khích sử dụng bởi các tính năng của nó . . .

 


Nguồn: Tự Học IT Online - http://tuhocit.net

Giới thiệu về C/C++


Đây là bài tập rất cơ bản khi các bạn học C/C++

- Vì sao tôi dùng chung từ khóa  "C/C++"  ? C++ được phát triển trên C, hầu hết các cú pháp  vẫn được sử dụng trong C++.

- Trong ví dụ dưới đây, tôi dùng VS Studio -> C++ Console

- Nếu bạn muốn code chạy được trên Bornland C hay Code Block . . . chỉ cần loại bỏ 1 vài từ khóa trong code chỉ dành cho C++ là được

 

Ví dụ này thực hiện việc:

- Nhập - Xuất mảng

 

- Chèn một phần tử vào vị trí bất kỳ

- Thêm mới . . .

- Xóa . . .

- Sắp xếp Tăng - Giảm
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <windows.h>
#define MAX 5 // defines the value of an element.

using namespace std; //Dung cho Cout / Cin

void themPhanTu(int a[], int &n)
{
do{
printf("\n Nhap so phan tu cua mang: ");
scanf("%d",&n);
if(n < 0 || n > 10)
printf("\n Tong so phan tu khong hop le !!!");
}
while(n<0 || n >10);
for(int i = 0; i < n; i ++)
{
printf("\n a[%d] :",i);
scanf("%d",&a[i]);
}
}
/* Print the array */
void xuatMang(int a[], int n)
{
for(int i = 0; i < n; i ++)
{
printf("\t%d ",a[i]);
}
}

/* Chen 1 phan tu vao vi tri bat ky */
void chenPhanTu(int a[], int n, int &ptsins , int &elmins )
{
printf("\n Enter the position to insert :");
scanf("%d",&ptsins);
printf("\n Enter the element to insert :");
scanf("%d",&elmins);
for(int i = 0; i < n; i ++)
{
if(i == ptsins && ptsins >= 0 && ptsins < n)
a[i]=elmins;
}

}

/* Them moi 1 phan tu vao vi tri bat ky*/
void themPhanTu(int a[],int &n,int &ptsadd,int &elmadd)
{
n++; //Tang len 1 vi tri
do{
printf("\n Enter the position to add :");
scanf("%d",&ptsadd);
if(ptsadd <0 || ptsadd >= n);
}
while(ptsadd <0 || ptsadd >= n);
printf("\n Enter the element to add :");
scanf("%d",&elmadd);
int i;
if(ptsadd < n)
{
for( i=n-1; i > ptsadd;i--)
{
a[i]=a[i-1];

}
for(i =0; i<n; i++)
{
if(i == ptsadd && ptsadd >= 0 && ptsadd < n)
a[i]=elmadd;
//break;
}
xuatMang(a,n);
}
else if(ptsadd > n-1&& ptsadd<n+1)
{
a[n-1]= elmadd;
xuatMang(a,n);

}
}
void xoaPhanTu(int a[], int &n)
{
n--; // Giam di 1 vi tri.
int vt;
do{
printf("\nNhap vi tri muon xoa: ");
scanf("%d",&vt);
if(vt <0 || vt >= n);
}
while(vt <0 || vt > n);

for(int i=0; i < n; i++)
{
if(i==vt)
{
a[i] = NULL;
}
if(vt ==0)
{
a[i] = NULL;
break;
}
if(vt == n -1)
{
a[n-1] = NULL;
break;
}
}
for(int i = vt; i < n; i ++)
{
a[i]=a[i+1];
}
xuatMang(a,n);
}
void sortArray(int a[], int n, int mode = 0)
{
for(int i = 0; i < n-1; i ++)
for(int j=i+1;j<n;j++)
if(a[i]>a[j] == mode)
{
int temp = a[i];
a[i]=a[j];
a[j] = temp;
}
}
/*Menu*/
int menu(int a[], int n)
{
//clrscr();
system("cls");
printf("Current array is: \n");
xuatMang(a,n);
printf("\n");
//textcolor(CYAN);
printf("-------------------------------------------------------\n");
printf(" 1.Chen 1 phan tu vao vi tri bat ky \n");
printf(" 2.Them phan tu tai vi tri bat ky\n");
printf(" 3.Xoa 1 phan tu tai vi tri bat ky\n");
printf(" 4.Sap xep mang tang dan\n");
printf(" 5.Sap xep mang giam dan\n");
printf(" ------------------------------------------\n");
printf(" 9.Information\n");
printf(" 0.Exit\n\n");
printf(" Chon chuc nang so: ");
int choice;
scanf("%d",&choice);
return choice;
}
void main()
{
//clrscr();
system("cls");
int choice;
int a[MAX];
int n;
int ptsins;
int elmins;
int elmadd;
int ptsadd;
int vt;
themPhanTu(a,n);
while(1)
{
//textcolor(GREEN); //Color: CYAN, RED, BLUE, MAGENTA v.v...
choice=menu(a,n);
switch (choice)
{
case 1: chenPhanTu(a,n,ptsins,elmins);xuatMang(a,n); break;
case 2: themPhanTu(a,n,ptsadd, elmadd);break;
case 3: xoaPhanTu(a,n) ;break;
case 4: sortArray(a,n,1);xuatMang(a,n);break; // 1 is ascending
case 5: sortArray(a,n,0);xuatMang(a,n);break; //0 is descending
}
if(choice==0)break;
getch();
}
}

 
Nguồn: Tự Học IT Online - http://tuhocit.net

Chèn - Thêm - Xóa Trong Mảng 1 Chiều [C/C++ Basic]

Giới thiệu về C/C++


Đây là bài tập rất cơ bản khi các bạn học C/C++

- Vì sao tôi dùng chung từ khóa  "C/C++"  ? C++ được phát triển trên C, hầu hết các cú pháp  vẫn được sử dụng trong C++.

- Trong ví dụ dưới đây, tôi dùng VS Studio -> C++ Console

- Nếu bạn muốn code chạy được trên Bornland C hay Code Block . . . chỉ cần loại bỏ 1 vài từ khóa trong code chỉ dành cho C++ là được

 

Ví dụ này thực hiện việc:

- Nhập - Xuất mảng

 

- Chèn một phần tử vào vị trí bất kỳ

- Thêm mới . . .

- Xóa . . .

- Sắp xếp Tăng - Giảm
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <windows.h>
#define MAX 5 // defines the value of an element.

using namespace std; //Dung cho Cout / Cin

void themPhanTu(int a[], int &n)
{
do{
printf("\n Nhap so phan tu cua mang: ");
scanf("%d",&n);
if(n < 0 || n > 10)
printf("\n Tong so phan tu khong hop le !!!");
}
while(n<0 || n >10);
for(int i = 0; i < n; i ++)
{
printf("\n a[%d] :",i);
scanf("%d",&a[i]);
}
}
/* Print the array */
void xuatMang(int a[], int n)
{
for(int i = 0; i < n; i ++)
{
printf("\t%d ",a[i]);
}
}

/* Chen 1 phan tu vao vi tri bat ky */
void chenPhanTu(int a[], int n, int &ptsins , int &elmins )
{
printf("\n Enter the position to insert :");
scanf("%d",&ptsins);
printf("\n Enter the element to insert :");
scanf("%d",&elmins);
for(int i = 0; i < n; i ++)
{
if(i == ptsins && ptsins >= 0 && ptsins < n)
a[i]=elmins;
}

}

/* Them moi 1 phan tu vao vi tri bat ky*/
void themPhanTu(int a[],int &n,int &ptsadd,int &elmadd)
{
n++; //Tang len 1 vi tri
do{
printf("\n Enter the position to add :");
scanf("%d",&ptsadd);
if(ptsadd <0 || ptsadd >= n);
}
while(ptsadd <0 || ptsadd >= n);
printf("\n Enter the element to add :");
scanf("%d",&elmadd);
int i;
if(ptsadd < n)
{
for( i=n-1; i > ptsadd;i--)
{
a[i]=a[i-1];

}
for(i =0; i<n; i++)
{
if(i == ptsadd && ptsadd >= 0 && ptsadd < n)
a[i]=elmadd;
//break;
}
xuatMang(a,n);
}
else if(ptsadd > n-1&& ptsadd<n+1)
{
a[n-1]= elmadd;
xuatMang(a,n);

}
}
void xoaPhanTu(int a[], int &n)
{
n--; // Giam di 1 vi tri.
int vt;
do{
printf("\nNhap vi tri muon xoa: ");
scanf("%d",&vt);
if(vt <0 || vt >= n);
}
while(vt <0 || vt > n);

for(int i=0; i < n; i++)
{
if(i==vt)
{
a[i] = NULL;
}
if(vt ==0)
{
a[i] = NULL;
break;
}
if(vt == n -1)
{
a[n-1] = NULL;
break;
}
}
for(int i = vt; i < n; i ++)
{
a[i]=a[i+1];
}
xuatMang(a,n);
}
void sortArray(int a[], int n, int mode = 0)
{
for(int i = 0; i < n-1; i ++)
for(int j=i+1;j<n;j++)
if(a[i]>a[j] == mode)
{
int temp = a[i];
a[i]=a[j];
a[j] = temp;
}
}
/*Menu*/
int menu(int a[], int n)
{
//clrscr();
system("cls");
printf("Current array is: \n");
xuatMang(a,n);
printf("\n");
//textcolor(CYAN);
printf("-------------------------------------------------------\n");
printf(" 1.Chen 1 phan tu vao vi tri bat ky \n");
printf(" 2.Them phan tu tai vi tri bat ky\n");
printf(" 3.Xoa 1 phan tu tai vi tri bat ky\n");
printf(" 4.Sap xep mang tang dan\n");
printf(" 5.Sap xep mang giam dan\n");
printf(" ------------------------------------------\n");
printf(" 9.Information\n");
printf(" 0.Exit\n\n");
printf(" Chon chuc nang so: ");
int choice;
scanf("%d",&choice);
return choice;
}
void main()
{
//clrscr();
system("cls");
int choice;
int a[MAX];
int n;
int ptsins;
int elmins;
int elmadd;
int ptsadd;
int vt;
themPhanTu(a,n);
while(1)
{
//textcolor(GREEN); //Color: CYAN, RED, BLUE, MAGENTA v.v...
choice=menu(a,n);
switch (choice)
{
case 1: chenPhanTu(a,n,ptsins,elmins);xuatMang(a,n); break;
case 2: themPhanTu(a,n,ptsadd, elmadd);break;
case 3: xoaPhanTu(a,n) ;break;
case 4: sortArray(a,n,1);xuatMang(a,n);break; // 1 is ascending
case 5: sortArray(a,n,0);xuatMang(a,n);break; //0 is descending
}
if(choice==0)break;
getch();
}
}

 
Nguồn: Tự Học IT Online - http://tuhocit.net

Giới thiệu về C/C++


Ngôn ngữ C có những đặc điểm cơ bản sau:



  • Tính cô đọng (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng hầu hết đều được biểu diễn bằng những chuỗi ký tự ngắn gọn.

  • Tính cấu trúc (structured): C có một tập hợp những chỉ thị của lập trình như cấu trúc lựa chọn, lặp… Từ đó các chương trình viết bằng C được tổ chức rõ ràng, dễ hiểu.

  • Tính tương thích (compatible): C có bộ tiền xử lý và một thư viện chuẩn vô cùng phong phú nên khi chuyển từ máy tính này sang máy tính khác các chương trình viết bằng C vẫn hoàn toàn tương thích.

  • Tính linh động (flexible): C là một ngôn ngữ rất uyển chuyển và cú pháp, chấp nhận nhiều cách thể hiện, có thể thu gọn kích thước của các mã lệnh làm chương trình chạy nhanh hơn.

  • Biên dịch (compile): C cho phép biên dịch nhiều tập tin chương trình riêng rẽ thành các tập tin đối tượng (object) và liên kết (link) các đối tượng đó lại với nhau thành một chương trình có thể thực thi được (executable) thống nhất.


Bộ chữ viết trong C


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):

  • ƒ 26 chữ cái latinh lớn A,B,C...Z

  •  26 chữ cái latinh nhỏ a,b,c ...z.

  • 10 chữ số thập phân 0,1,2...9.

  • 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.


Các từ khoá trong c


Từ khóa là các từ dành riêng (reserved words) của C mà người lập trình có thể sử dụng nó trong chương trình tùy theo ý nghĩa của từng từ. Ta không được dùng từ khóa để đặt cho các tên của riêng mình. Các từ khóa của Turbo C 3.0 bao gồm:
asm auto break case cdecl char
class const continue _cs default delete
do double _ds else enum _es
extern _export far _fastcall float for
friend goto huge if inline int
interrupt _loadds long near new operator
pascal private protected public register return
_saveregs _seg short signed sizeof _ss
static struct switch template this typedef
union unsigned virtual void volatile while

Cặp dấu ghi chú thích


Khi viết chương trình đôi lúc ta cần phải có vài lời ghi chú về 1 đoạn chương trình nào đó để dễ nhớ và dễ điều chỉnh sau này; nhất là phần nội dung ghi chú phải không thuộc về chương trình (khi biên dịch phần này bị bỏ qua). Trong ngôn ngữ lập trình C, nội dung chú thích phải được viết trong cặp dấu /* và */.


Ví dụ :
#include <iostream.h>
#include<conio.h>
void main ()
{
char ten[50]; /* khai bao bien ten kieu char 50 ky tu */
/*Xuat chuoi ra man hinh*/
cout<<“Xin cho biet ten cua ban !”;
cin>>ten; /*Doc vao 1 chuoi la ten cua ban*/
cout<<"Xin chao ban: "<<ten;
cout<<"Chao mung ban den voi ngon ngu C/C++";
/*Dung chuong trinh, cho go phim*/
getch();
}

Các kiểu dữ liệu sơ cấp trong C/C++

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 

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. Kiểu số nguyên trong C được chia thành      các kiểu dữ liệu con, mỗi kiểu có một 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:

  • unsigned char: Từ 0 đến 255 (tương đương 256 ký tự trong bảng mã ASCII). Để khai báo một biến là kiểu ký tự thì ta khai báo biến kiểu unsigned char. Mỗi số trong miền giá trị của kiểu unsigned char tương ứng với một ký tự trong bảng mã ASCII .

  • char: 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:

  • 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 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

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:

  • float(4 bytes) Từ 3.4 * 10-38 đến 3.4 * 1038

  • double(8 bytes) Từ 1.7 * 10-308 đến 1.7 * 10308

  • long double(10 bytes) Từ 3.4 *10-4932 đến 1.1 *104932


Mỗi kiểu số thực ở trên đều có miền giá trị và độ chính xác (số số lẻ) khác nhau. Tùy vào nhu cầu sử dụng mà ta có thể khai báo biến thuộc 1 trong 3 kiểu trên.

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 và hằng trong C

Tên (danh biểu) 

Tên hay còn gọi là danh biểu (identifier) được dùng để đặt cho chương trình, hằng, kiểu, biến, chương trình con... Tên có hai loại là tên chuẩn và tên do người lập trình đặt.

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

  • 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,…


Hằng (Constant)

Là đại lượng không đổi trong suốt quá trình thực thi của chương trình. Hằng có thể là một chuỗi ký tự, một ký tự, một con số xác định. Chúng có thể được biểu diễn hay định dạng (Format) với nhiều dạng thức khác nhau.

  • Hằng số thực


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:

Cách 1: Sử dụng cách viết thông thường mà chúng ta đã sử dụng trong các môn Toán, Lý, …Điều cần lưu ý là sử dụng dấu thập phân là dấu chấm (.);

Ví dụ: 123.34 -223.333 3.00 -56.0

Cách 2: Sử dụng cách viết theo số mũ hay số khoa học. Một số thực được tách làm 2 phần, cách nhau bằng ký tự e hay E

Phần giá trị: là một số nguyên hay số thực được viết theo cách 1.

Phần mũ: là một số nguyên

Giá trị của số thực là: Phần giá trị nhân với 10 mũ phần mũ.

Ví dụ: 1234.56e-3 = 1.23456 (là số 1234.56 * 10-3) -123.45E4 = -1234500 ( là -123.45 *104)

  • Hằng số nguyên


Số nguyên gồm các kiểu int (2 bytes) , long (4 bytes) được thể hiện theo những cách sau.

Hằng số nguyên 2 bytes (int) hệ thập phân: Là kiểu số mà chúng ta sử dụng thông thường, hệ thập phân sử dụng các ký số từ 0 đến 9 để biểu diễn một giá trị nguyên.

Ví dụ: 123 ( một trăm hai mươi ba), -242 ( trừ hai trăm bốn mươi hai).

Hằng số nguyên 2 byte (int) hệ bát phân: Là kiểu số nguyên sử dụng 8 ký số từ 0 đến 7 để biểu diễn một số nguyên.

Cách biểu diễn: 0<các ký số từ 0 đến 7>

Ví dụ : 0345 (số 345 trong hệ bát phân)

-020 (số -20 trong hệ bát phân)

Hằng số nguyên 2 byte (int) hệ thập lục phân: Là kiểu số nguyên sử dụng 10 ký số từ 0 đến 9 và 6 ký tự A, B, C, D, E ,F để biểu diễn một số nguyên.

Hằng số nguyên 4 byte (long): Số long (số nguyên dài) được biểu diễn như số int trong hệ thập phân và kèm theo ký tự l hoặc L. Một số nguyên nằm ngoài miền giá trị của số int ( 2 bytes) là số long ( 4 bytes).

Các hằng số còn lại: Viết như cách viết thông thường (không có dấu phân cách giữa 3 số)

  • Hằng ký tự


Hằng ký tự là một ký tự riêng biệt được viết trong cặp dấu nháy đơn (‘). Mỗi một ký tự tương ứng với một giá trị trong bảng mã ASCII. Hằng ký tự cũng được xem như trị số nguyên.

Ví dụ: ‘a’, ‘A’, ‘0’, ‘9’

Chúng ta có thể thực hiện các phép toán số học trên 2 ký tự (thực chất là thực hiện phép toán trên giá trị ASCII của chúng)

  • Hằng chuỗi ký tự


Hằng chuỗi ký tự là một chuỗi hay một xâu ký tự được đặt trong cặp dấu nháy kép (“).

Ví dụ: “Ngon ngu lap trinh C”, “Khoa CNTT-DHCT”, “NVLinh-DVHieu”

Chú ý:

- Một chuỗi không có nội dung “” được gọi là chuỗi rỗng.

- Khi lưu trữ trong bộ nhớ, một chuỗi được kết thúc bằng ký tự NULL (‘�’: mã Ascii là 0).

- Để biểu diễn ký tự đặc biệt bên trong chuỗi ta phải thêm dấu phía trước.

Ví dụ: “I’m a student” phải viết “I’m a student”

“Day la ky tu “dac biet”” phải viết “Day la ky tu ”dac biet”“

Biến và biểu thức

  • Biến:


Biến là một đại lượng được người lập trình định nghĩa và được đặt tên thông qua việc khai báo biến. Biến dùng để chứa dữ liệu trong quá trình thực hiện chương trình và giá trị của biến có thể bị thay đổi trong quá trình này. Cách đặt tên biến giống như cách đặt tên đã nói trong phần trên.

Mỗi biến thuộc về một kiểu dữ liệu xác định và có giá trị thuộc kiểu đó.

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

<Kiểu dữ liệu> Danh sách các tên biến cách nhau bởi dấu phẩy;

Ví dụ:
int a, b, c; /*Ba biến a, b,c có kiểu int*/

long int chu_vi; /*Biến chu_vi có kiểu long*/

float nua_chu_vi; /*Biến nua_chu_vi có kiểu float*/

double dien_tich; /*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, ta phải khai báo biến đúng vị trí. Nếu khai báo (đặt các biến) không đúng vị trí sẽ dẫn đến những sai sót ngoài ý muốn mà người lập trình không lường trước (hiệu ứng lề). Chúng ta có 2 cách đặt vị trí của biến như sau:

a) Khai báo biến ngoài: Các biến này được đặt bên ngoài tất cả các hàm và nó có tác dụng hay ảnh hưởng đến toàn bộ chương trình (còn gọi là biến toàn cục).

Ví dụ:
int i; /*Bien ben ngoai */ 

float pi; /*Bien ben ngoai*/

int main()

{ … }

b) Khai báo biến trong: Các biến được đặt ở bên trong hàm, chương trình chính hay một khối lệnh. Các biến này chỉ có tác dụng hay ảnh hưởng đến hàm, chương trình hay khối lệnh chứa nó. Khi khai báo biến, phải đặt các biến này ở đầu của khối lệnh, trước các lệnh gán, …

Ví dụ 1:
#include <iostream.h> 

#include<conio.h>

int bienngoai; /*khai bao bien ngoai*/

void main ()

{ int j,i; /*khai bao bien ben trong chuong trinh chinh*/

clrscr();

i=1; j=2;

bienngoai=3;

cout<<"n Gia7 tri cua i la %d"<<i;

/*%d là số nguyên, sẽ biết sau */

cout"n Gia tri cua j la %d",<<j;

cout<<"n Gia tri cua bienngoai la %d"<<bienngoai;

getch();

}

 

Ví dụ 2: 
#include <iostream.h>

#include<conio.h>

void main ()

{ int i, j; /*Bien ben trong*/

clrscr();

i=4; j=5;

cout<<"n Gia tri cua i la %d"<<i;

cout"n Gia tri cua j la %d"<<j;

if(j>i)

{

int hieu=j-i; /*Bien ben trong */

cout<<"n Hieu so cua j tru i la %d"<<hieu;

}

else

{

int hieu=i-j ; /*Bien ben trong*/

cout<<"n Gia tri cua i tru j la %d"<<hieu;

}

getch();

}

 

  • Biểu thức


Biểu thức là một sự kết hợp giữa các toán tử (operator) và các toán hạng (operand) theo đúng một trật tự nhất định. Mỗi toán hạng có thể là một hằng, một biến hoặc một biểu thức khác. Trong trường hợp, biểu thức có nhiều toán tử, ta dùng cặp dấu ngoặc đơn () để chỉ định toán tử nào được thực hiện trước.

Ví dụ: Biểu thức nghiệm của phương trình bậc hai: (-b + sqrt(Delta))/(2*a). Trong đó 2 là hằng; a, b, Delta là biến.

Các toán tử số học

Trong ngôn ngữ C, các toán tử +, -, *, / làm việc tương tự như khi chúng làm việc trong các ngôn ngữ khác. Ta có thể áp dụng chúng cho đa số kiểu dữ liệu có sẵn được cho phép bởi C. Khi ta áp dụng phép / cho một số nguyên hay một ký tự, bất kỳ phần dư nào cũng bị cắt bỏ. Chẳng hạn, 5/2 bằng 2 trong phép chia nguyên.



































Toán tửÝ nghĩa
+Cộng
-Trừ
*Nhân
/Chia
%Chia lấy phần dư
--Giảm một đơn vị
++Tăng thêm một đơn vị

Các toán tử quan hệ và các toán tử Logic


Ý tưởng chính của toán tử quan hệ và toán tử Logic là đúng hoặc sai. Trong C mọi giá trị khác 0 được gọi là đúng, còn sai là 0. Các biểu thức sử dụng các toán tử quan hệ và Logic trả về 0 nếu sai và trả về 1 nếu đúng.




















































Toán tửÝ nghĩa
Các toán tử quan hệ
>Lớn hơn
>=Lớn hơn hoặc bằng
<Nhỏ
<=Nhỏ hơn hoặc bằng
==Bằng
!=Khác
Các toán tử logic
&&AND
||OR
!NOT

Bảng chân trị cho các toán tử Logic:









































pqp&&qp||qp!q
00001
01011
10010
11110

Các toán tử Bitwise: Các toán tử Bitwise ý nói đến kiểm tra, gán hay sự thay đổi các Bit thật sự trong 1 Byte của Word, mà trong C chuẩn là các kiểu dữ liệu và biến char, int. Ta không thể sử dụng các toán tử Bitwise với dữ liệu thuộc các kiểu float, double, long double, void hay các kiểu phức tạp khác.


































Toán tửÝ nghĩa
&AND
|OR
^XOR
~NOT
>>Dịch phải
<<Dịch trái

Bảng chân trị toán tử ^(XOR)































pqp^q
000
011
101
110

Toán tử ? cùng với : 


C có một toán tử rất mạnh và thích hợp để thay thế cho các câu lệnh của IfThen-Else. Cú pháp của việc sử dụng toán tử ? là: E1 ? E2 : E3


Trong đó E1, E2, E3 là các biểu thức.


Ý nghĩa: Trước tiên E1 được ước lượng, nếu đúng E2 được ước lượng và nó trở thành giá trị của biểu thức; nếu E1 sai, E2 được ước lượng và trở thành giá trị của biểu thức.


Ví dụ:


X = 10


Y = X > 9 ? 100 : 200


Thì Y được gán giá trị 100, nếu X nhỏ hơn 9 thì Y sẽ nhận giá trị là 200. Đoạn mã này tương đương cấu trúc if như sau:


X = 10


if (X < 9) Y = 100


else Y = 200


Toán tử con trỏ & và *


Một con trỏ là địa chỉ trong bộ nhớ của một biến. Một biến con trỏ là một biến được khai báo riêng để chứa một con trỏ đến một đối tượng của kiểu đã chỉ ra nó. Ta sẽ tìm hiểu kỹ hơn về con trỏ trong chương về con trỏ. Ở đây, chúng ta sẽ đề cập ngắn gọn đến hai toán tử được sử dụng để thao tác với các con trỏ.


Toán tử thứ nhất là &, là một toán tử quy ước trả về địa chỉ bộ nhớ của hệ số của nó.


Ví dụ: m = &count


Đặt vào biến m địa chỉ bộ nhớ của biến count.


Chẳng hạn, biến count ở vị trí bộ nhớ 2000, giả sử count có giá trị là 100. Sau câu lệnh trên m sẽ nhận giá trị 2000.


Toán tử thứ hai là *, là một bổ sung cho &; đây là một toán tử quy ước trả về giá trị của biến được cấp phát tại địa chỉ theo sau đó.


Ví dụ: q = *


Sẽ đặt giá trị của count vào q. Bây giờ q sẽ có giá trị là 100 vì 100 được lưu trữ tại địa chỉ 2000.


Toán tử dấu phẩy ,


Toán tử dấu , được sử dụng để kết hợp các biểu thức lại với nhau. Bên trái của toán tử dấu , 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 bởi dấu phẩy.


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


Trước hết gán 3 cho y rồi gán 4 cho x. Cặp dấu ngoặc đơn là cần thiết vì toán tử dấu , có độ ưu tiên thấp hơn toán tử gán.


Xem các dấu ngoặc đơn và cặp dấu ngoặc vuông là toán tử


Trong C, cặp dấu ngoặc đơn là toán tử để tăng độ ưu tiên của các biểu thức bên trong nó. Các cặp dấu ngoặc vuông thực hiện thao tác truy xuất phần tử trong mảng.


Cách viết tắt trong C 


Có nhiều phép gán khác nhau, đôi khi ta có thể sử dụng viết tắt trong C nữa.


Chẳng hạn:


x = x + 10 được viết thành x +=10


Toán tử += báo cho chương trình dịch biết để tăng giá trị của x lên 10.


Cách viết này làm việc trên tất cả các toán tử nhị phân (phép toán hai ngôi) của C. Tổng quát: 


(Biến) = (Biến) (Toán tử) (Biểu thức) 


có thể được viết:


(Biến) (Toán tử)= (Biểu thức)


Các tập tin thư viện thông dụng 


Đây là các tập tin chứa các hàm thông dụng khi lập trinh C, muốn sử dụng các hàm trong các tập tin header này thì phải khai báo #include <Tên tập tin> ở phần đầu của chương trình




  • stdio.h: Tập tin định nghĩa các hàm vào/ra chuẩn (standard input/output). Gồm các hàm in dữ liệu (printf()), nhập giá trị cho biến (scanf()), nhận ký tự từ bàn phím (getc()), in ký tự ra màn hình (putc()), nhận một dãy ký tự từ bàm phím (gets()), in chuỗi ký tự ra màn hình (puts()), xóa vùng đệm bàn phím (fflush()), fopen(), fclose(), fread(), fwrite(), getchar(), putchar(), getw(), putw()…

  • conio.h : Tập tin định nghĩa các hàm vào ra trong chế độ DOS (DOS console). Gồm các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(),…

  • math.h: Tập tin định nghĩa các hàm tính toán gồm các hàm abs(), sqrt(), log(). log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(),…

  • alloc.h: Tập tin định nghĩa các hàm liên quan đến việc quản lý bộ nhớ. Gồm các hàm 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. Gồm các hàm open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(),…

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

  • Còn nhiều tập tin khác nữa.


Cú pháp khai báo các phần bên trong môt chương trình C

  • Chỉ thị #include để sử dụng tập tin thư viện


Cú pháp:

#include <Tên tập tin> // Tên tập tin được đạt trong dấu <> hay #include “Tên đường dẫn”

Menu Option của Turbo C có mục INCLUDE DIRECTORIES, mục này dùng để chỉ định các tập tin thư viện được lưu trữ trong thư mục nào. Nếu ta dùng #include<Tên tập tin> thì Turbo C sẽ tìm tập tin thư viện trong thư mục đã được xác định trong INCLUDE DIRECTORIES.

Ví dụ: include <stdio.h>

Nếu ta dùng #include”Tên đường dẫn” thì ta phải chỉ rõ tên ở đâu, tên thư mục và tập tin thư viện.

Ví dụ: #include”C:\TC\math.h”

Trong trường hợp tập tin thư viện nằm trong thư mục hiện hành thì ta chỉ cần đưa tên tập tin thư viện. Ví dụ: #include”math.h”.

  • Chỉ thị #define để định nghĩa hằng số


Cú pháp: #define <Tên hằng> <Giá trị>

Ví dụ: #define MAXINT 32767

  • Khai báo các prototype của hàm


Cú pháp: <Kiểu kết quả trả về> Tên hàm (danh sách đối số)

Ví dụ: long giaithua( int n); //Hàm tính giai thừa của số nguyên n

double x_mu_y(float x, float y); /*Hàm tính x mũ y*/

  • Cấu trúc của hàm “bình thường”


Cú pháp:

<Kiểu kết quả trả về> Tên hàm (các đối số)

{

Các khai báo và các câu lệnh định nghĩa hàm

return kết quả;

}

Ví dụ:
int tong(int x, int y) /*Hàm tính tổng 2 số nguyên*/

{

return (x+y);

}

float tong(float x, float y) /*Hàm tính tổng 2 số thực*/

{

return (x+y);

}

 

  • Cấu trúc của hàm main


Hàm main chính là chương trình chính, gồm các lệnh xử lý, các lời gọi các hàm khác.

Cú pháp:

<Kết quả trả về> main( đối số)

{

Các khai báo và các câu lệnh định nghĩa hàm

return <kết quả>;

}

Ví dụ 1:
int main()

{

cout<<“Day la chuong trinh chinh”;

getch();

return 0;

}

 

Ví dụ 2:
int main()

{

int a=5, b=6,c;

float x=3.5, y=4.5,z;

cout<<“Day la chuong trinh chinh”;

c=tong(a,b);

cout<<“n Tong cua %d va %d la %d”<<a<<b<<c;

z=tong(x,y);

cout<<“n Tong cua %f và %f là %f”<<x<<y<<z;

getch();

return 0;

}

 

 
Nguồn: Tự Học IT Online - http://tuhocit.net

[C++] Giới thiệu về C/C++ - Bài 1

Giới thiệu về C/C++


Ngôn ngữ C có những đặc điểm cơ bản sau:



  • Tính cô đọng (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử chuẩn, nhưng hầu hết đều được biểu diễn bằng những chuỗi ký tự ngắn gọn.

  • Tính cấu trúc (structured): C có một tập hợp những chỉ thị của lập trình như cấu trúc lựa chọn, lặp… Từ đó các chương trình viết bằng C được tổ chức rõ ràng, dễ hiểu.

  • Tính tương thích (compatible): C có bộ tiền xử lý và một thư viện chuẩn vô cùng phong phú nên khi chuyển từ máy tính này sang máy tính khác các chương trình viết bằng C vẫn hoàn toàn tương thích.

  • Tính linh động (flexible): C là một ngôn ngữ rất uyển chuyển và cú pháp, chấp nhận nhiều cách thể hiện, có thể thu gọn kích thước của các mã lệnh làm chương trình chạy nhanh hơn.

  • Biên dịch (compile): C cho phép biên dịch nhiều tập tin chương trình riêng rẽ thành các tập tin đối tượng (object) và liên kết (link) các đối tượng đó lại với nhau thành một chương trình có thể thực thi được (executable) thống nhất.


Bộ chữ viết trong C


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):

  • ƒ 26 chữ cái latinh lớn A,B,C...Z

  •  26 chữ cái latinh nhỏ a,b,c ...z.

  • 10 chữ số thập phân 0,1,2...9.

  • 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.


Các từ khoá trong c


Từ khóa là các từ dành riêng (reserved words) của C mà người lập trình có thể sử dụng nó trong chương trình tùy theo ý nghĩa của từng từ. Ta không được dùng từ khóa để đặt cho các tên của riêng mình. Các từ khóa của Turbo C 3.0 bao gồm:
asm auto break case cdecl char
class const continue _cs default delete
do double _ds else enum _es
extern _export far _fastcall float for
friend goto huge if inline int
interrupt _loadds long near new operator
pascal private protected public register return
_saveregs _seg short signed sizeof _ss
static struct switch template this typedef
union unsigned virtual void volatile while

Cặp dấu ghi chú thích


Khi viết chương trình đôi lúc ta cần phải có vài lời ghi chú về 1 đoạn chương trình nào đó để dễ nhớ và dễ điều chỉnh sau này; nhất là phần nội dung ghi chú phải không thuộc về chương trình (khi biên dịch phần này bị bỏ qua). Trong ngôn ngữ lập trình C, nội dung chú thích phải được viết trong cặp dấu /* và */.


Ví dụ :
#include <iostream.h>
#include<conio.h>
void main ()
{
char ten[50]; /* khai bao bien ten kieu char 50 ky tu */
/*Xuat chuoi ra man hinh*/
cout<<“Xin cho biet ten cua ban !”;
cin>>ten; /*Doc vao 1 chuoi la ten cua ban*/
cout<<"Xin chao ban: "<<ten;
cout<<"Chao mung ban den voi ngon ngu C/C++";
/*Dung chuong trinh, cho go phim*/
getch();
}

Các kiểu dữ liệu sơ cấp trong C/C++

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 

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. Kiểu số nguyên trong C được chia thành      các kiểu dữ liệu con, mỗi kiểu có một 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:

  • unsigned char: Từ 0 đến 255 (tương đương 256 ký tự trong bảng mã ASCII). Để khai báo một biến là kiểu ký tự thì ta khai báo biến kiểu unsigned char. Mỗi số trong miền giá trị của kiểu unsigned char tương ứng với một ký tự trong bảng mã ASCII .

  • char: 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:

  • 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 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

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:

  • float(4 bytes) Từ 3.4 * 10-38 đến 3.4 * 1038

  • double(8 bytes) Từ 1.7 * 10-308 đến 1.7 * 10308

  • long double(10 bytes) Từ 3.4 *10-4932 đến 1.1 *104932


Mỗi kiểu số thực ở trên đều có miền giá trị và độ chính xác (số số lẻ) khác nhau. Tùy vào nhu cầu sử dụng mà ta có thể khai báo biến thuộc 1 trong 3 kiểu trên.

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 và hằng trong C

Tên (danh biểu) 

Tên hay còn gọi là danh biểu (identifier) được dùng để đặt cho chương trình, hằng, kiểu, biến, chương trình con... Tên có hai loại là tên chuẩn và tên do người lập trình đặt.

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

  • 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,…


Hằng (Constant)

Là đại lượng không đổi trong suốt quá trình thực thi của chương trình. Hằng có thể là một chuỗi ký tự, một ký tự, một con số xác định. Chúng có thể được biểu diễn hay định dạng (Format) với nhiều dạng thức khác nhau.

  • Hằng số thực


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:

Cách 1: Sử dụng cách viết thông thường mà chúng ta đã sử dụng trong các môn Toán, Lý, …Điều cần lưu ý là sử dụng dấu thập phân là dấu chấm (.);

Ví dụ: 123.34 -223.333 3.00 -56.0

Cách 2: Sử dụng cách viết theo số mũ hay số khoa học. Một số thực được tách làm 2 phần, cách nhau bằng ký tự e hay E

Phần giá trị: là một số nguyên hay số thực được viết theo cách 1.

Phần mũ: là một số nguyên

Giá trị của số thực là: Phần giá trị nhân với 10 mũ phần mũ.

Ví dụ: 1234.56e-3 = 1.23456 (là số 1234.56 * 10-3) -123.45E4 = -1234500 ( là -123.45 *104)

  • Hằng số nguyên


Số nguyên gồm các kiểu int (2 bytes) , long (4 bytes) được thể hiện theo những cách sau.

Hằng số nguyên 2 bytes (int) hệ thập phân: Là kiểu số mà chúng ta sử dụng thông thường, hệ thập phân sử dụng các ký số từ 0 đến 9 để biểu diễn một giá trị nguyên.

Ví dụ: 123 ( một trăm hai mươi ba), -242 ( trừ hai trăm bốn mươi hai).

Hằng số nguyên 2 byte (int) hệ bát phân: Là kiểu số nguyên sử dụng 8 ký số từ 0 đến 7 để biểu diễn một số nguyên.

Cách biểu diễn: 0<các ký số từ 0 đến 7>

Ví dụ : 0345 (số 345 trong hệ bát phân)

-020 (số -20 trong hệ bát phân)

Hằng số nguyên 2 byte (int) hệ thập lục phân: Là kiểu số nguyên sử dụng 10 ký số từ 0 đến 9 và 6 ký tự A, B, C, D, E ,F để biểu diễn một số nguyên.

Hằng số nguyên 4 byte (long): Số long (số nguyên dài) được biểu diễn như số int trong hệ thập phân và kèm theo ký tự l hoặc L. Một số nguyên nằm ngoài miền giá trị của số int ( 2 bytes) là số long ( 4 bytes).

Các hằng số còn lại: Viết như cách viết thông thường (không có dấu phân cách giữa 3 số)

  • Hằng ký tự


Hằng ký tự là một ký tự riêng biệt được viết trong cặp dấu nháy đơn (‘). Mỗi một ký tự tương ứng với một giá trị trong bảng mã ASCII. Hằng ký tự cũng được xem như trị số nguyên.

Ví dụ: ‘a’, ‘A’, ‘0’, ‘9’

Chúng ta có thể thực hiện các phép toán số học trên 2 ký tự (thực chất là thực hiện phép toán trên giá trị ASCII của chúng)

  • Hằng chuỗi ký tự


Hằng chuỗi ký tự là một chuỗi hay một xâu ký tự được đặt trong cặp dấu nháy kép (“).

Ví dụ: “Ngon ngu lap trinh C”, “Khoa CNTT-DHCT”, “NVLinh-DVHieu”

Chú ý:

- Một chuỗi không có nội dung “” được gọi là chuỗi rỗng.

- Khi lưu trữ trong bộ nhớ, một chuỗi được kết thúc bằng ký tự NULL (‘�’: mã Ascii là 0).

- Để biểu diễn ký tự đặc biệt bên trong chuỗi ta phải thêm dấu phía trước.

Ví dụ: “I’m a student” phải viết “I’m a student”

“Day la ky tu “dac biet”” phải viết “Day la ky tu ”dac biet”“

Biến và biểu thức

  • Biến:


Biến là một đại lượng được người lập trình định nghĩa và được đặt tên thông qua việc khai báo biến. Biến dùng để chứa dữ liệu trong quá trình thực hiện chương trình và giá trị của biến có thể bị thay đổi trong quá trình này. Cách đặt tên biến giống như cách đặt tên đã nói trong phần trên.

Mỗi biến thuộc về một kiểu dữ liệu xác định và có giá trị thuộc kiểu đó.

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

<Kiểu dữ liệu> Danh sách các tên biến cách nhau bởi dấu phẩy;

Ví dụ:
int a, b, c; /*Ba biến a, b,c có kiểu int*/

long int chu_vi; /*Biến chu_vi có kiểu long*/

float nua_chu_vi; /*Biến nua_chu_vi có kiểu float*/

double dien_tich; /*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, ta phải khai báo biến đúng vị trí. Nếu khai báo (đặt các biến) không đúng vị trí sẽ dẫn đến những sai sót ngoài ý muốn mà người lập trình không lường trước (hiệu ứng lề). Chúng ta có 2 cách đặt vị trí của biến như sau:

a) Khai báo biến ngoài: Các biến này được đặt bên ngoài tất cả các hàm và nó có tác dụng hay ảnh hưởng đến toàn bộ chương trình (còn gọi là biến toàn cục).

Ví dụ:
int i; /*Bien ben ngoai */ 

float pi; /*Bien ben ngoai*/

int main()

{ … }

b) Khai báo biến trong: Các biến được đặt ở bên trong hàm, chương trình chính hay một khối lệnh. Các biến này chỉ có tác dụng hay ảnh hưởng đến hàm, chương trình hay khối lệnh chứa nó. Khi khai báo biến, phải đặt các biến này ở đầu của khối lệnh, trước các lệnh gán, …

Ví dụ 1:
#include <iostream.h> 

#include<conio.h>

int bienngoai; /*khai bao bien ngoai*/

void main ()

{ int j,i; /*khai bao bien ben trong chuong trinh chinh*/

clrscr();

i=1; j=2;

bienngoai=3;

cout<<"n Gia7 tri cua i la %d"<<i;

/*%d là số nguyên, sẽ biết sau */

cout"n Gia tri cua j la %d",<<j;

cout<<"n Gia tri cua bienngoai la %d"<<bienngoai;

getch();

}

 

Ví dụ 2: 
#include <iostream.h>

#include<conio.h>

void main ()

{ int i, j; /*Bien ben trong*/

clrscr();

i=4; j=5;

cout<<"n Gia tri cua i la %d"<<i;

cout"n Gia tri cua j la %d"<<j;

if(j>i)

{

int hieu=j-i; /*Bien ben trong */

cout<<"n Hieu so cua j tru i la %d"<<hieu;

}

else

{

int hieu=i-j ; /*Bien ben trong*/

cout<<"n Gia tri cua i tru j la %d"<<hieu;

}

getch();

}

 

  • Biểu thức


Biểu thức là một sự kết hợp giữa các toán tử (operator) và các toán hạng (operand) theo đúng một trật tự nhất định. Mỗi toán hạng có thể là một hằng, một biến hoặc một biểu thức khác. Trong trường hợp, biểu thức có nhiều toán tử, ta dùng cặp dấu ngoặc đơn () để chỉ định toán tử nào được thực hiện trước.

Ví dụ: Biểu thức nghiệm của phương trình bậc hai: (-b + sqrt(Delta))/(2*a). Trong đó 2 là hằng; a, b, Delta là biến.

Các toán tử số học

Trong ngôn ngữ C, các toán tử +, -, *, / làm việc tương tự như khi chúng làm việc trong các ngôn ngữ khác. Ta có thể áp dụng chúng cho đa số kiểu dữ liệu có sẵn được cho phép bởi C. Khi ta áp dụng phép / cho một số nguyên hay một ký tự, bất kỳ phần dư nào cũng bị cắt bỏ. Chẳng hạn, 5/2 bằng 2 trong phép chia nguyên.



































Toán tửÝ nghĩa
+Cộng
-Trừ
*Nhân
/Chia
%Chia lấy phần dư
--Giảm một đơn vị
++Tăng thêm một đơn vị

Các toán tử quan hệ và các toán tử Logic


Ý tưởng chính của toán tử quan hệ và toán tử Logic là đúng hoặc sai. Trong C mọi giá trị khác 0 được gọi là đúng, còn sai là 0. Các biểu thức sử dụng các toán tử quan hệ và Logic trả về 0 nếu sai và trả về 1 nếu đúng.




















































Toán tửÝ nghĩa
Các toán tử quan hệ
>Lớn hơn
>=Lớn hơn hoặc bằng
<Nhỏ
<=Nhỏ hơn hoặc bằng
==Bằng
!=Khác
Các toán tử logic
&&AND
||OR
!NOT

Bảng chân trị cho các toán tử Logic:









































pqp&&qp||qp!q
00001
01011
10010
11110

Các toán tử Bitwise: Các toán tử Bitwise ý nói đến kiểm tra, gán hay sự thay đổi các Bit thật sự trong 1 Byte của Word, mà trong C chuẩn là các kiểu dữ liệu và biến char, int. Ta không thể sử dụng các toán tử Bitwise với dữ liệu thuộc các kiểu float, double, long double, void hay các kiểu phức tạp khác.


































Toán tửÝ nghĩa
&AND
|OR
^XOR
~NOT
>>Dịch phải
<<Dịch trái

Bảng chân trị toán tử ^(XOR)































pqp^q
000
011
101
110

Toán tử ? cùng với : 


C có một toán tử rất mạnh và thích hợp để thay thế cho các câu lệnh của IfThen-Else. Cú pháp của việc sử dụng toán tử ? là: E1 ? E2 : E3


Trong đó E1, E2, E3 là các biểu thức.


Ý nghĩa: Trước tiên E1 được ước lượng, nếu đúng E2 được ước lượng và nó trở thành giá trị của biểu thức; nếu E1 sai, E2 được ước lượng và trở thành giá trị của biểu thức.


Ví dụ:


X = 10


Y = X > 9 ? 100 : 200


Thì Y được gán giá trị 100, nếu X nhỏ hơn 9 thì Y sẽ nhận giá trị là 200. Đoạn mã này tương đương cấu trúc if như sau:


X = 10


if (X < 9) Y = 100


else Y = 200


Toán tử con trỏ & và *


Một con trỏ là địa chỉ trong bộ nhớ của một biến. Một biến con trỏ là một biến được khai báo riêng để chứa một con trỏ đến một đối tượng của kiểu đã chỉ ra nó. Ta sẽ tìm hiểu kỹ hơn về con trỏ trong chương về con trỏ. Ở đây, chúng ta sẽ đề cập ngắn gọn đến hai toán tử được sử dụng để thao tác với các con trỏ.


Toán tử thứ nhất là &, là một toán tử quy ước trả về địa chỉ bộ nhớ của hệ số của nó.


Ví dụ: m = &count


Đặt vào biến m địa chỉ bộ nhớ của biến count.


Chẳng hạn, biến count ở vị trí bộ nhớ 2000, giả sử count có giá trị là 100. Sau câu lệnh trên m sẽ nhận giá trị 2000.


Toán tử thứ hai là *, là một bổ sung cho &; đây là một toán tử quy ước trả về giá trị của biến được cấp phát tại địa chỉ theo sau đó.


Ví dụ: q = *


Sẽ đặt giá trị của count vào q. Bây giờ q sẽ có giá trị là 100 vì 100 được lưu trữ tại địa chỉ 2000.


Toán tử dấu phẩy ,


Toán tử dấu , được sử dụng để kết hợp các biểu thức lại với nhau. Bên trái của toán tử dấu , 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 bởi dấu phẩy.


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


Trước hết gán 3 cho y rồi gán 4 cho x. Cặp dấu ngoặc đơn là cần thiết vì toán tử dấu , có độ ưu tiên thấp hơn toán tử gán.


Xem các dấu ngoặc đơn và cặp dấu ngoặc vuông là toán tử


Trong C, cặp dấu ngoặc đơn là toán tử để tăng độ ưu tiên của các biểu thức bên trong nó. Các cặp dấu ngoặc vuông thực hiện thao tác truy xuất phần tử trong mảng.


Cách viết tắt trong C 


Có nhiều phép gán khác nhau, đôi khi ta có thể sử dụng viết tắt trong C nữa.


Chẳng hạn:


x = x + 10 được viết thành x +=10


Toán tử += báo cho chương trình dịch biết để tăng giá trị của x lên 10.


Cách viết này làm việc trên tất cả các toán tử nhị phân (phép toán hai ngôi) của C. Tổng quát: 


(Biến) = (Biến) (Toán tử) (Biểu thức) 


có thể được viết:


(Biến) (Toán tử)= (Biểu thức)


Các tập tin thư viện thông dụng 


Đây là các tập tin chứa các hàm thông dụng khi lập trinh C, muốn sử dụng các hàm trong các tập tin header này thì phải khai báo #include <Tên tập tin> ở phần đầu của chương trình




  • stdio.h: Tập tin định nghĩa các hàm vào/ra chuẩn (standard input/output). Gồm các hàm in dữ liệu (printf()), nhập giá trị cho biến (scanf()), nhận ký tự từ bàn phím (getc()), in ký tự ra màn hình (putc()), nhận một dãy ký tự từ bàm phím (gets()), in chuỗi ký tự ra màn hình (puts()), xóa vùng đệm bàn phím (fflush()), fopen(), fclose(), fread(), fwrite(), getchar(), putchar(), getw(), putw()…

  • conio.h : Tập tin định nghĩa các hàm vào ra trong chế độ DOS (DOS console). Gồm các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(),…

  • math.h: Tập tin định nghĩa các hàm tính toán gồm các hàm abs(), sqrt(), log(). log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(),…

  • alloc.h: Tập tin định nghĩa các hàm liên quan đến việc quản lý bộ nhớ. Gồm các hàm 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. Gồm các hàm open(), _open(), read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(),…

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

  • Còn nhiều tập tin khác nữa.


Cú pháp khai báo các phần bên trong môt chương trình C

  • Chỉ thị #include để sử dụng tập tin thư viện


Cú pháp:

#include <Tên tập tin> // Tên tập tin được đạt trong dấu <> hay #include “Tên đường dẫn”

Menu Option của Turbo C có mục INCLUDE DIRECTORIES, mục này dùng để chỉ định các tập tin thư viện được lưu trữ trong thư mục nào. Nếu ta dùng #include<Tên tập tin> thì Turbo C sẽ tìm tập tin thư viện trong thư mục đã được xác định trong INCLUDE DIRECTORIES.

Ví dụ: include <stdio.h>

Nếu ta dùng #include”Tên đường dẫn” thì ta phải chỉ rõ tên ở đâu, tên thư mục và tập tin thư viện.

Ví dụ: #include”C:\TC\math.h”

Trong trường hợp tập tin thư viện nằm trong thư mục hiện hành thì ta chỉ cần đưa tên tập tin thư viện. Ví dụ: #include”math.h”.

  • Chỉ thị #define để định nghĩa hằng số


Cú pháp: #define <Tên hằng> <Giá trị>

Ví dụ: #define MAXINT 32767

  • Khai báo các prototype của hàm


Cú pháp: <Kiểu kết quả trả về> Tên hàm (danh sách đối số)

Ví dụ: long giaithua( int n); //Hàm tính giai thừa của số nguyên n

double x_mu_y(float x, float y); /*Hàm tính x mũ y*/

  • Cấu trúc của hàm “bình thường”


Cú pháp:

<Kiểu kết quả trả về> Tên hàm (các đối số)

{

Các khai báo và các câu lệnh định nghĩa hàm

return kết quả;

}

Ví dụ:
int tong(int x, int y) /*Hàm tính tổng 2 số nguyên*/

{

return (x+y);

}

float tong(float x, float y) /*Hàm tính tổng 2 số thực*/

{

return (x+y);

}

 

  • Cấu trúc của hàm main


Hàm main chính là chương trình chính, gồm các lệnh xử lý, các lời gọi các hàm khác.

Cú pháp:

<Kết quả trả về> main( đối số)

{

Các khai báo và các câu lệnh định nghĩa hàm

return <kết quả>;

}

Ví dụ 1:
int main()

{

cout<<“Day la chuong trinh chinh”;

getch();

return 0;

}

 

Ví dụ 2:
int main()

{

int a=5, b=6,c;

float x=3.5, y=4.5,z;

cout<<“Day la chuong trinh chinh”;

c=tong(a,b);

cout<<“n Tong cua %d va %d la %d”<<a<<b<<c;

z=tong(x,y);

cout<<“n Tong cua %f và %f là %f”<<x<<y<<z;

getch();

return 0;

}

 

 
Nguồn: Tự Học IT Online - http://tuhocit.net

Xem Nhiều