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

Sử dụng Struct trong C và C++ - Tài liệu hỗ trợ lập trình C/C++.pdf

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





TÀI LIỆU HỖ TRỢ LẬP TRÌNH C / C++

struct





struct

2014

2 Tài liệu hỗ trợ học lập trình C/C++


Struct 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


struct

2014

3 Tài liệu hỗ trợ học lập trình C/C++


Để 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


// Voi C++
Point *pB;
struct

2014

4 Tài liệu hỗ trợ học lập trình C/C++


pB = 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 << "), ";
}


struct

2014

5 Tài liệu hỗ trợ học lập trình C/C++


Sử 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
các toán tử để struct của bạn được linh hoạt hơn, giống với các kiểu dữ liệu
nguyên thủy hơn.
struct

2014


6 Tài liệu hỗ trợ học lập trình C/C++


Ví 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;
struct

2014

7 Tài liệu hỗ trợ học lập trình C/C++


// 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;
}
return b;
}
struct

2014


8 Tài liệu hỗ trợ học lập trình C/C++



// 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;
}

struct

2014

9 Tài liệu hỗ trợ học lập trình C/C++


// 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) {
PhanSo *result = new PhanSo;
result->tu = tu * a.mau;
result->mau = mau * a.tu;
struct

2014


10 Tài liệu hỗ trợ học lập trình C/C++


result->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”);

×