Giới thiệu cách dùng cấu trúc struct trong ngôn ngữ lập trình C và C++ cho các sinh viên ngành công nghệ thông tin
Trang 1TÀI LIỆU HỖ TRỢ LẬP TRÌNH C / C++
struct
Trang 2Struct trong C/C++
1 Giới thiệu
Struct là cấu trúc mà người lập trình tự xây dựng ra các kiểu dữ liệu khác ngoài các kiểu dữ liệu nguyên thủy, có sẵn trong ngôn ngữ lập trình như int, float, double, char,… Với những dữ liệu về một thực thể thường nó không chỉ chứa một trường dữ liệu kiểu nguyên thủy mà có thể có nhiều trường dữ liệu Ví dụ thông tin của một Sinh viên, thông tin của một hình cơ bản, thông tin của một phân số,… Gặp tình huống như vậy người ta thường có xu thế muốn gộp chúng thành một để khai báo và xử lý cho dễ Đó cũng là tư tưởng của việc dùng struct trong C và C++
Giả sử như thông tin về 1 điểm trong hệ trục tọa độ xOy, 1 điểm có 2 thành phần tọa độ là x, và y Khi làm việc với một điểm thì ta có thể dùng 2 biến x và y để sử dụng Nhưng khi số điểm lên tới hàng trăm hàng nghìn thì thao tác xử lý có vẻ đã thấy nhiều vấn đề Struct trong C và C++ cho phép ta coi cả 2 dữ liệu x và y thành một kiểu dữ liệu mới Ta sẽ xem xét bây giờ
2 Khai báo
Để khai báo một struct trong C ta làm như sau
struct point {
float x;
float y;
};
typedef struct point Point;
// Hoac khai bao nhu sau
typedef struct {
float x;
float y;
} Point;
// Hai cach khai bao tren la tuong duong nhau
Trang 3Để khai báo struct trong C++ ta có thể làm như sau
struct Point {
float x;
float y;
};
Sau các cách khai báo trên ta có thể sử dụng Point như là một kiểu dữ liệu mới Nó có chứa hai trường x, và y Thể hiện tọa độ của một điểm trong hệ trục xOy
3 Sử dụng
Sau khi định nghĩa struct ta có thể sử dụng chúng như sau
Sử dụng như là một biến
// Voi C
Point A;
A.x = 0.0;
A.y = 1.0;
printf(“(%f , %f)\n”, B.x, B.y) ; // Voi C
// Voi C++
Point B;
cout << “Nhap x, y:”;
cin >> B.x >> B.y;
cout << B.x << “ “ << B.y << endl; // Voi C++
Sử dụng như là một con trỏ
// Voi C
Point *pA;
// Xin cap phat vung nho
pA = (Point*) malloc(sizeof(Point));
printf("Nhap toa do diem A: ");
scanf("%f %f", &(pA->x), &(pA->y));
printf("%f %f\n", pA->x, pA->y);
free(pA); // Giai phong vung nho cap phap
Trang 4pB = new Point;
cout << “Nhap toa do diem B: “;
cin >> pB->x >> pB->y;
cout << pB->x << “ ” << pB->y << endl;
delete pB;
Sử dụng như là một mảng tĩnh
// Voi C
Point arr[100];
int n, i;
printf("Nhap so diem:");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Nhap toa do diem %d : ", i + 1);
scanf("%f %f", &(arr[i].x), &(arr[i].y));
}
for (i = 0; i < n; i++) {
printf("(%f, %f), ", arr[i].x, arr[i].y);
}
// Voi C++
Point a[100];
int n;
cout << "Nhap so diem:";
cin >> n;
for (int i = 0; i < n; i++) {
cout << "Nhap toa do diem " << i + 1 << " : ";
cin >> a[i].x >> a[i].y;
}
cout << "Cac diem vua nhap la: ";
for (int i = 0; i < n; i++) {
cout << "(" << a[i].x << ", " << a[i].y << "), "; }
Trang 5Sử dụng như là một mảng động
// Voi C
Point *p;
int n, i;
printf("Nhap so diem:");
scanf("%d", &n);
p = (Point*) calloc(n, sizeof(Point));
for (i = 0; i < n; i++) {
printf("Nhap toa do diem %d : ", i + 1);
scanf("%f %f", &(p[i].x), &(p[i].y));
}
for (i = 0; i < n; i++) {
printf("(%f, %f), ", p[i].x, p[i].y);
}
free(p);
// Voi C++
Point *p;
int n;
cout << "Nhap so diem:";
cin >> n;
p = new Point[n];
for (int i = 0; i < n; i++) {
cout << "Nhap toa do diem " << i + 1 << " : "; cin >> p[i].x >> p[i].y;
}
cout << "Cac diem vua nhap la: ";
for (int i = 0; i < n; i++) {
cout << "(" << p[i].x << ", " << p[i].y << "), "; }
delete []p;
4 Mở rộng
Bạn có thể viết các hàm khởi tạo cho struct, viết các hàm cho struct, quá tải
Trang 6Ví dụ với struct PhanSo sau như của mình
// PhanSo.cpp
// Cuong Pc 2013
#include <iostream>
#include <conio.h>
using namespace std;
int ucln(int a, int b);
struct PhanSo {
int tu;
int mau;
// Cac ham khoi tao
PhanSo();
PhanSo(int _a, int _b);
// Mot so phuong thuc
void rutgon();
// Qua tai mot so toan tu thong thuong
PhanSo& operator+ (PhanSo& a);
PhanSo& operator* (PhanSo& a);
PhanSo& operator- (PhanSo& a);
PhanSo& operator/ (PhanSo& a);
};
// Qua tai toan tu nhap xuat
istream& operator>> (istream &is, PhanSo &n);
ostream& operator<< (ostream &os, PhanSo &n);
int main() {
PhanSo psA(1, 2); // Ham khoi tao PhanSo(1, 2); PhanSo psB(3, 4); //
cout << "Phan so A: " << psA << endl;
Trang 7// Dung duoc do da qua tai toan tu xuat <<
cout << "Phan so B: " << psB << endl;
cout << "A + B = " << (psA + psB) << endl;
cout << "A - B = " << (psA - psB) << endl;
cout << "A * B = " << (psA * psB) << endl;
cout << "A / B = " << (psA / psB) << endl;
PhanSo psC;
cout << "Nhap 1 phan so:";
cin >> psC;
// Co the dung do da qua tai toan tu nhap >>
cout << "Phan so vua nhap: " << psC << endl;
getch();
return 0;
}
// Ham tim uoc chung lon nhat
int ucln(int a, int b) {
int tmp;
if (a < 0)
a = -a;
if (b < 0)
b = -b;
if (a < b) {
tmp = a;
a = b;
b = tmp;
} while(a % b != 0) {
tmp = b;
b = a % b;
a = tmp;
Trang 8// Ham khoi tao co tham so
PhanSo::PhanSo(int _a, int _b) {
if (_b == 0) {
tu = 0;
mau = 1;
cout << "Nhap mau bang 0, chuyen thanh phan so
= 0" << endl;
} else {
tu = _a;
mau = _b;
rutgon();
} }
// Ham khoi tao khong tham so
PhanSo::PhanSo() {
tu = 0;
mau = 1;
}
// Rut gon phan so
void PhanSo::rutgon() {
if (mau < 0) {
tu = -tu;
mau = -mau;
} int uc = ucln(tu, mau);
tu /= uc;
mau /= uc;
}
// Qua tai toan tu xuat
ostream& operator<< (ostream &os, PhanSo &n) {
os << n.tu << " / " << n.mau;
return os;
}
Trang 9// Qua tai toan tu nhap
istream& operator>> (istream &is, PhanSo &n) {
is >> n.tu >> n.mau;
return is;
}
// Qua tai toan tu cong(+)
PhanSo& PhanSo::operator+ (PhanSo&a) {
PhanSo *result = new PhanSo;
result->tu = tu * a.mau + a.tu * mau;
result->mau = a.mau * mau;
result->rutgon();
return *result;
}
// Qua tai toan tu nhan(*)
PhanSo& PhanSo::operator* (PhanSo& a) {
PhanSo *result = new PhanSo;
result->tu = tu * a.tu;
result->mau = a.mau * mau;
result->rutgon();
return *result;
}
// Qua tai toan tu tru (-)
PhanSo& PhanSo::operator- (PhanSo& a) {
PhanSo *result = new PhanSo;
result->tu = tu * a.mau - a.tu * mau;
result->mau = a.mau * mau;
result->rutgon();
return *result;
}
// Qua tai toan tu chia (/)
PhanSo& PhanSo::operator/ (PhanSo& a) {
Trang 10result->rutgon();
return *result;
}
Ngoài ra, từ struct trong C và C++ ta có thể xây dựng các cấu trúc dữ liệu đặc biệt như Danh sách liên kết (đơn, kép), Ngăn xếp, Hàng đợi, Cây,… Mình sẽ trình bày trong các bài viết sau
Hi vọng phần nào có thể giúp đỡ các bạn hiểu về struct hơn Cảm ơn các bạn
system(“PAUSE”);