You are on page 1of 45

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

KỸ THUẬT LẬP TRÌNH HỆ CƠ ĐIỆN TỬ


Programming for Mechatronic Systems

Giảng viên: PGS. TS. Mạc Thị Thoa


Đơn vị: Khoa Cơ điện tử

1
Chapter I. Basics and data management of C++
Các khái niệm và quản lý dữ liệu trong C++

❖ 1. Creation of C++ programs (tạo chương trình C++)


❖ 2. Basic data types, variables and constants (Các kiểu dữ liệu cơ
bản, biến và hằng)
❖ 3. Basic operations and expressions (Các toán tử và phép tính)
❖ 4. Control program structures (Cấu trúc chương trình)
❖ 5. Exception handling (Xử lý ngoại lệ)
❖ 6. Pointers, references and dynamic memory management (quản
lý con trỏ, tham chiếu, bộ nhớ động)
❖ 7. Arrays and strings (mảng và chuỗi kí tự)
❖ 8. User-defined data types (Các loại dữ liệu tự định nghĩa)

2
Chapter I. Basics and data management of C++

❖ 1. Creation of C++ programs


❖ 2. Basic data types, variables and constants
❖ 3. Basic operations and expressions
❖ 4. Control program structures
❖ 5. Exception handling
❖ 6. Pointers, references and dynamic memory
management
❖ 7. Arrays and strings
❖ 8. User-defined data types

3
8. User-defined data types
❖ The structure type
▪ Structure type and structure variables
• Một cấu trúc dữ liệu là một tập hợp của những kiểu dữ liệu
khác nhau được gộp lại với một cái tên duy nhất. Dạng thức
của nó như sau:
struct model_name {
type1 element1 ;
type2 element2 ;
type3 element3 ; …
} object_name ;

A structure variable (a structure) of the type above can be created by the


already known method:

4
8. User-defined data types
Trong đó model_name là tên của mẫu kiểu dữ liệu và tham
số tùy chọn object_name là một tên hợp lệ cho đối tượng.
Bên trong cặp ngoặc nhọn là tên các phần tử của cấu trúc
và kiểu của chúng.
Nếu định nghĩa của cấu trúc bao gồm tham
số model_name (tuỳ chọn), tham số này trở thành một tên
kiểu hợp lệ tương đương với cấu trúc. Ví dụ:

struct products {
char name [30];
float price;
};
products apple;
products orange, melon;
8. User-defined data types

❖ The structure type


▪ Structure type and structure variables
• In C++, the name standing after the keywords struct, union and class can be
used as type names without using the keywords. When typedef is used, the
difference between the two programming languages disappears:

6
8. User-defined data types
• Chúng ta đã định nghĩa cấu trúc products với hai
trường: name và price, mỗi trường có một kiểu khác nhau.
Chúng ta cũng đã sử dụng tên của kiểu cấu trúc (products) để
khai báo ba đối tượng có kiểu đó : apple, orange và melon.

• Sau khi được khai báo, products trở thành một tên kiểu hợp lệ
giống các kiểu cơ bản như int, char hay short.

• Trường tuỳ chọn object_name có thể nằm ở cuối của phần khai
báo cấu trúc dùng để khai báo trực tiếp đối tượng có kiểu cấu
trúc. Ví dụ, để khai báo các đối tượng apple, orange và
melon như đã làm ở phần trước chúng ta cũng có thể làm theo
cách sau:

7
8. User-defined data types
struct products {
char name [30];
float price;
} apple, orange, melon;

• Hơn nữa, trong trường hợp này tham số model_name trở


thành tuỳ chọn. Mặc dù nếu model_name không được sử
dụng thì chúng ta sẽ không thể khai báo thêm các đối
tượng có kiểu mẫu này.

8
8. User-defined data types
Dưới đây là cách khai báo biến cấu trúc Book, CD:

struct Books
struct musicCD {
{ // the performer and the title of the CD
char tieude[50]; string performer, title;
char tacgia[50]; int year; // year of publication
int price; // price of the CD
char chude[100]; };
int book_id;
}book;
Biến có thể định nghĩa với musicCD

musicCD classic = { "Vivaldi","The Four Seasons", 2009, 2590 };

9
8. User-defined data types

Giả sử định nghĩa biến như sau:


musicCD relax;

Kích thước của một cấu


trúc bằng tổng kích thước
của các thành viên dữ liệu
của nó.

Structure in memory
10
struct Student {// tên cấu trúc
string ID;// ma sinh vien
string name;// ten sinh vien
string DateofBirth;// ngay sinh
float mark;//diem
} sinhvien;// bien cau truc la sinh vien
8. User-defined data types
❖ The structure type truy cập các đổi tượng của cấu trúc
▪ Accessing the data members of structures
• Let's define some variables by using the type musicCD declared before.

struct musicCD {
// the performer and the title of the CD
string performer, title;
int year; // year of publication
int price; // price of the CD
};
musicCD classic = { "Vivaldi","The Four Seasons", 2009, 2590 };
musicCD s1, s2, *ps;
ps = new (nothrow) musicCD;
if (!ps) exit(-1); the dot ( . ) operator
// ...
delete ps; The operand of dot operatorleft-
hand side s is a structure variable,
s1.performer = "Vivaldi"; the right-hand side operand selects
s1.title = "The Four Seasons"; a data member within the structure.
s1.year = 2005;
s1.price = 2560; 12
Bài tập: Nhập dữ liệu từ bàn phím các thông tin về struct CD
#include <iostream>
#include <string>
using namespace std;
struct musicCD {
string performer, title;
int year, price;};
int main() {
musicCD cd;
// reading the data from the keyboard
cout << "Please type in the data of the music CD." << endl;
cout << "Performer : "; getline(cin, cd.performer);
cout << "Title : "; getline(cin, cd.title);
cout << "Year of publication : "; cin >> cd.year;
cout << "Price : "; cin >> cd.price;
cin.get();// printing out the data
cout << "\nData of the music CD:" << endl;
cout << "Performer : "; cout << cd.performer << endl;
cout << "Title : "; cout << cd.title << endl;
cout << "Year of publication : "; cout << cd.year << endl;
cout << "Price : "; cout << cd.price << endl;
cin.get();
return 0;
}
Bài tập: Viết chương trình tạo 1 struct về
movies (gồm tên và năm). Sau đó in ra màn
hình film mà bạn yêu thích
Ví dụ: tạo một cấu trúc về movie
int main(){
char buffer[50];
strcpy_s(mine.title,
#include <iostream> "2001 A Space Odyssey");
#include <string> mine.year = 1968;
#include <stdlib.h> cout << "Enter title: ";
using namespace std; cin.getline(yours.title, 50);
struct movies_t { cout << "Enter year: ";
char title[50];
cin.getline(buffer, 50);
int year;
} mine, yours;
yours.year = atoi(buffer);
void printmovie(movies_t movie) cout << "My favourite movie is:\n ";
{ printmovie(mine);
cout << movie.title; cout << "And yours:\n ";
cout << " (" << movie.year << ")\n"; printmovie(yours);
} cin.get();
return 0;
}
8. User-defined data types

• Ví dụ này:
- Cho chúng ta thấy cách sử dụng các phần tử của một cấu trúc
và bản thân cấu trúc như là các biến thông thường. Ví dụ,
yours.year là một biến hợp lệ có kiểu int cũng
như mine.title là một mảng hợp lệ với 50 phần tử kiểu chars.
- Chú ý rằng cả mine and yours đều được coi là các biến hợp lệ
kiểu movie_t khi được truyền cho hàm printmovie(). Hơn nữa
một lợi thế quan trọng của cấu trúc là chúng ta có thể xét các
phần tử của chúng một cách riêng biệt hoặc toàn bộ cấu trúc
như là một khối.

17
8. User-defined data types

Các cấu trúc được sử dụng rất nhiều


để xây dựng cơ sở dữ liệu đặc biệt
nếu chúng ta xét đến khả năng xây
dựng các mảng của chúng.
#include <iostream>
#include <stdlib.h>
#define N_MOVIES 3
using namespace std;
struct movies_t {
char title[50];
int year;
} films[N_MOVIES];
void printmovie(movies_t movie) {
cout << movie.title;
cout << " (" << movie.year << ")\n";
} {
cout << "Enter title: ";
int main() { cin.getline(films[n].title, 50);
char buffer[50]; cout << "Enter year: ";
int n; cin.getline(buffer, 50);
for (n = 0; n < N_MOVIES; n++) films[n].year = atoi(buffer);
//Convert string to integer
}
cout << "\nYou have entered these movies:\n";
for (n = 0; n < N_MOVIES; n++)
printmovie(films[n]);
cin.get();
return 0;
}
Ví dụ: sử dụng struct để quản lý thông tin các cuốn sách

#include <iostream>
#include <cstring>

using namespace std;

struct Books
{
char tieude[50];
char tacgia[50];
char chude[100];
int book_id;
};

int main()
{
struct Books QuyenSach1; // Declare QuyenSach1 of type Book
struct Books QuyenSach2; // Declare QuyenSach2 of type Book

// chi tiet ve quyen sach thu nhat


strcpy_s(QuyenSach1.tieude, "Mechatronic Systems Programming in C++");
strcpy_s(QuyenSach1.tacgia, "Peter Tamas");
strcpy_s(QuyenSach1.chude, "Lap trinh");
QuyenSach1.book_id = 1225;
// chi tiet ve quyen sach thu hai
strcpy_s(QuyenSach2.tieude, "Toi thay hoa vang tren co xanh");
strcpy_s(QuyenSach2.tacgia, "Nguyen Nhat Anh");
strcpy_s(QuyenSach2.chude, "Van hoc");
QuyenSach2.book_id = 3214;

// in thong tin ve QuyenSach1


cout << "Tieu de cua Quyen sach thu nhat la: " << QuyenSach1.tieude << endl;
cout << "Tac gia cua Quyen sach thu nhat la: " << QuyenSach1.tacgia << endl;
cout << "Chu de cua Quyen sach thu nhat la: " << QuyenSach1.chude << endl;
cout << "ID cua Quyen sach thu nhat la: " << QuyenSach1.book_id << endl;

cout << "\n\n=============================================\n\n" << endl;

// in thong tin ve QuyenSach2


cout << "Tieu de cua Quyen sach thu hai la: " << QuyenSach2.tieude << endl;
cout << "Tac gia cua Quyen sach thu hai la: " << QuyenSach2.tacgia << endl;
cout << "Chu de cua Quyen sach thu hai la: " << QuyenSach2.chude << endl;
cout << "ID cua Quyen sach thu hai la: " << QuyenSach2.book_id << endl;

cin.get();
return 0;
}
8. User-defined data types

Cấu trúc dưới dạng tham số


hàm trong C++
Truyền một cấu trúc như một
tham số của hàm theo cách khá
giống như truyền bất kỳ biến hay
con trỏ khác.
#include <iostream>
#include <cstring>

using namespace std;


void inthongtin(struct Books book);

struct Books
{
char tieude[50];
char tacgia[50];
char chude[100];
int book_id;
};
void inthongtin(struct Books book)
{
cout << "Tieu de sach: " << book.tieude << endl;
cout << "Tac gia: " << book.tacgia << endl;
cout << "Chu de: " << book.chude << endl;
cout << "ID cua sach la: " << book.book_id << endl;
cout << "\n\n========================================\n\n" << endl;
}
int main()
{
struct Books QuyenSach1; // Khai bao QuyenSach1 la cua kieu Books
struct Books QuyenSach2; // Khai bao QuyenSach2 la cua kieu Books
// chi tiet ve quyen sach thu nhat
strcpy_s(QuyenSach1.tieude, "Mechatronic Systems Programming in C++");
strcpy_s(QuyenSach1.tacgia, "Peter Tamas");
strcpy_s(QuyenSach1.chude, "Lap trinh");
QuyenSach1.book_id = 1225;
// chi tiet ve quyen sach thu hai
strcpy_s(QuyenSach2.tieude, "Toi thay hoa vang tren co xanh");
strcpy_s(QuyenSach2.tacgia, "Nguyen Nhat Anh");
strcpy_s(QuyenSach2.chude, "Van hoc");
QuyenSach2.book_id = 3214;
// in thong tin ve QuyenSach1
inthongtin(QuyenSach1);
// in thong tin ve QuyenSach2
inthongtin(QuyenSach2);
cin.get();
return 0;
}
8. User-defined data types
❖ The structure type truy cập các đổi tượng của cấu trúc
▪ Accessing the data members of structures
• Con trỏ trỏ đến cấu trúc
• Như bất kì các kiểu dữ liệu nào khác, các cấu trúc có thể được trỏ đến bởi con trỏ. Quy
tắc hoàn toàn giống như đối với bất kì kiểu dữ liệu cơ bản nào:
• struct Books *contro_struct;
• Địa chỉ của biến cấu trúc trong biến con trỏ được định nghĩa ở trên. Để tìm địa chỉ của
một biến cấu trúc, đặt toán tử & trước tên cấu trúc như sau:
• contro_struct = &QuyenSach1;
• Để truy cập vào thành viên của một structure sử dụng con trỏ tới structure đó, sử dụng
toán tử -> như sau:
• contro_struct->tieude;

25
Con trỏ trỏ đến cấu trúc
#include <iostream> #include <iostream>
#include <cstring> #include <cstring>
using namespace std; using namespace std;
void inthongtin(struct Books *book); void inthongtin(struct Books book);
struct Books{ struct Books{
char tieude[50]; char tieude[50];
char tacgia[50]; char tacgia[50];
char chude[100]; char chude[100];
int book_id; int book_id;
}; };
void inthongtin(struct Books *book) void inthongtin(struct Books book)
{cout << "Tieu de sach:"<<book->tieude {cout << "Tieu de sach: " <<
<< endl; book.tieude << endl;
cout << "Tac gia: " << book->tacgia << cout << "Tac gia: " << book.tacgia <<
endl; endl;
cout << "Chu de: " << book->chude << cout << "Chu de: " << book.chude <<
endl; endl;
cout << "ID cua sach: " << book- cout << "ID cua sach la: " <<
>book_id << endl; book.book_id << endl;
cout << "\n\n===========\n\n" << endl; cout << "\n\n===============\n\n" <<
} endl;
}
26
Con trỏ trỏ đến cấu trúc
int main() {
struct Books QuyenSach1; // Khai bao QuyenSach1 la cua kieu Books
struct Books QuyenSach2; // Khai bao QuyenSach2 la cua kieu Book
// thong tin chi thiet ve quyen sach thu nhat
strcpy_s(QuyenSach1.tieude, "Mechatronic Systems Programming in C++");
strcpy_s(QuyenSach1.tacgia, "Peter Tamas");
strcpy_s(QuyenSach1.chude, "Lap trinh");
QuyenSach1.book_id = 1225;
// thong tin chi thiet ve quyen sach thu hai
strcpy_s(QuyenSach2.tieude, "Toi thay hoa vang tren co xanh");
strcpy_s(QuyenSach2.tacgia, "Nguyen Nhat Anh");
strcpy_s(QuyenSach2.chude, "Van hoc");
QuyenSach2.book_id = 3214;
// in thong tin cua QuyenSach1, bang cach truyen dia chi cua cau truc
inthongtin(&QuyenSach1);
// in thong tin cua QuyenSach2, bang cach truyen dia chi cua cau truc
inthongtin(&QuyenSach2);
cin.get();
return 0;}
// Ham nay chap nhan con tro toi cau truc lam tham so.

27
Con trỏ trỏ đến cấu trúc

• Đoạn mã trên giới thiệu một điều quan trọng: toán tử ->.
Đây là một toán tử tham chiếu chỉ dùng để trỏ tới các cấu
trúc và các lớp (class). Nó cho phép chúng ta không phải
dùng ngoặc mỗi khi tham chiếu đến một phần tử của cấu
trúc.

struct movies_t {
char title [50];
amovie là một đối tượng có kiểu movies_t
int year; và pmovie là một con trỏ trỏ tới đối tượng movies_t
};
movies_t amovie;
movies_t * pmovie;

28
#include <iostream> int main() {
using namespace std; char buffer[50];
struct movies_t { movies_t amovie;
char title[50]; movies_t * pmovie;
int year; pmovie = &amovie;
}; cout << "Enter title: ";
cin.getline(pmovie->title, 50);
cout << "Enter year: ";
cin.getline(buffer, 50);
pmovie->year = atoi(buffer); //convert string to integer
cout << "\nYou have entered:\n";
cout << pmovie->title;
cout << " (" << pmovie->year << ")\n";
cin.get();
return 0;
}
Cấu trúc dưới dạng tham số hàm

Biểu thức Mô tả Tương đương với


Phần tử title của cấu
movies.title
trúc movies
Phần tử titlecủa cấu trúc
movies->title (*movies).title
được trỏ bởi movies
Giá trị được trỏ bởi phần
*movies.title tử title của cấu *(movies.title)
trúc movies

30
8. User-defined data types

❖ The structure type


▪ Nested structures- Cấu trúc lồng
▪ Structures can have data members of any type. If a structure has one or more
data members that are also structures, it is a nested structure.
struct movies_t {
char title[50];
int year;
}
struct friends_t {
char name[50];
char email[50];
movies_t favourite_movie;
} charlie, maria;
friends_t * pfriends = &charlie;

Ví dụ: tạo 1 struct gồm 1 struct khác


31
8. User-defined data types

charlie.name maria.favourite_movie.title
charlie.favourite_movie.year pfriends->favourite_movie.year
(trong đó hai biểu thức cuối cùng là tương đương).

• Các khái niệm cơ bản về cấu trúc được đề cập đến trong
phần này là hoàn toàn giống với ngôn ngữ C, tuy nhiên
trong C++, cấu trúc đã được mở rộng thêm các chức
năng của một lớp với tính chất đặc trưng là tất cả các
phần tử của nó đều là công cộng (public).

32
#include <iostream>
using namespace std;
struct point{
float X;
float Y;
};
struct line {
point diemA;
point diemB;
};
float distance(struct point A, point B) {
return(sqrt(pow(B.X - A.X, 2) + pow(B.Y - A.Y, 2)));
}
float length(struct line line1) {
return(sqrt(pow(line1.diemA.X- line1.diemB.X, 2) + pow(line1.diemA.Y - line1.diemB.Y, 2)));
}
int main() {
line dt;
dt.diemA.X = 0;
dt.diemA.Y = 0;
dt.diemB.X = 3;
dt.diemB.Y = 4;
cout << "Khoang cach giua hai diem la: " << distance(dt.diemA, dt.diemB)<<endl;
cout << "Chieu dai cua duong thang la: " << length(dt)<<endl;
cin.get();
return 0;
}
8. User-defined data types

❖ The structure type


▪ Nested structures
• If the structure of type date is not used anywhere else then it can be integrated
directly as an anonymous structure in the structure person:

• Self-referential structures

34
8. User-defined data types

❖ The structure type


▪ Structures and arrays (Cấu trúc và mảng)
• Arrays as data members of a structure
• Lập trình có thể được thực hiện hiệu quả hơn nhiều nếu các mảng và cấu trúc
được sử dụng cùng nhau trong một loại dữ liệu. Trong các mã đơn giản sau,
trước tiên chúng ta đặt một mảng một chiều trong một cấu trúc sau đó chúng ta
tạo một mảng một chiều của các thành phần kiểu cấu trúc.
• Mảng có thể là một thành viên của cấu trúc
• Cấu trúc có thể sử dụng như phần tử của mảng

35
#include <iostream>
#include <stdlib.h>
using namespace std;
const int maxn = 10;
struct svector {
int v[maxn];
int n;
};
int main(){
svector a = { {23, 7, 12}, 3 };
svector b = { {0}, maxn };
svector c = {};
c = a;
int sum = 0;
for (int i = 0; i < c.n; i++) {
sum += c.v[i]; }
cout << "gia tri cua cac phan tu cua c là:" << sum << endl;
cin.get();
return 0;
}
8. User-defined data types
Hãy sử dụng loại nhạcCD được khai báo ở trên để tạo danh mục CD
gồm 100 phần tử và hãy đưa ra các giá trị ban đầu cho hai phần tử
đầu tiên của CDcatalog.
musicCD CDcatalog[100] = { {"Vivaldi","The Four Seasons",2004,1002},{} };

Để tham chiếu các thành viên dữ liệu của các cấu trúc như các phần tử mảng,
trước tiên chúng ta phải chọn thành phần mảng và sau đó là thành viên cấu trúc:

CDcatalog[10].price = 2004;
8. User-defined data types
If the CD-catalogue is intended to be created dynamically, identification has to be
done with a pointer:

musicCD *pCDcatalog;
Memory space for structure elements can be allocated by the operator new in the
dynamically managed memory space:

pCDcatalog = new musicCD[100];


The structure stored in an array element can be accessed by using the dot
operator:

pCDcatalog[10].price = 2004;
If array elements are not needed anymore, then the allocated memory space should
be freed by the operator delete []:

delete[] pCDcatalog;

Certain operations (like sorting) can be carried out more efficiently if the pointers of
the dynamically created CDs are stored in a pointer array:

musicCD* dCDcatalog[100];
Bài tập: Tìm kiếm tất cả các đĩa CD được xuất bản từ năm 2019 đến 2020 trong danh
mục CD được tạo động có chứa số lượng đĩa CD cố định.
#include <iostream>
#include <string>
using namespace std;
struct musicCD {
string performer, title;
int year, price;};
int main() {
cout << "The number of CDs:";
int num;
cin >> num;
cin.ignore(80, '\n');
// Memory allocation with checking
musicCD *pCDcatalog = new (nothrow) musicCD[num];
if (!pCDcatalog) {
cerr << "\a\nThere is not enough memory!\n";
return -1;
}
// Reading the data of CDs from the keyboard
for (int i = 0; i < num; i++) {
cout << endl << "The data of the " << i << "th CD:" << endl;
cout << "Performer: ";
getline(cin, pCDcatalog[i].performer);
cout << "Title: "; getline(cin, pCDcatalog[i].title);
cout << "Year: "; cin >> pCDcatalog[i].year;
cout << "Price: "; cin >> pCDcatalog[i].price;
cin.ignore(80, '\n');
}// Searching for the requested CDs 40
int found = 0;
for (int i = 0; i < num; i++) {
if (pCDcatalog[i].year >= 2019 &&
pCDcatalog[i].year <= 2020) {
cout << endl << pCDcatalog[i].performer << endl;
cout << pCDcatalog[i].title << endl;
cout << pCDcatalog[i].year << endl;
found++;}
}// Printing out the results
if (found)
cout << "\nThe number of found elements: " << found << endl;
else
cout << "There is no CD that matches the criteria!" << endl;
// Deallocating memory space
delete[] pCDcatalog;
cin.get();
}

41
8. User-defined data types
❖ The structure type
Creating singly linked lists: Danh sách liên kết đơn là một tập hợp các
Node được phân bố động, được sắp xếp theo cách sao cho mỗi Node chứa “một
giá trị”(Data) và “một con trỏ”(Next). Con trỏ sẽ trỏ đến phần tử kế tiếp của danh
sách liên kết đó. Nếu con trỏ mà trỏ tới NULL, nghĩa là đó là phần tử cuối cùng của
linked list.

42
#include<iostream>
//truy cap vao phan thu
using namespace std;
//phan tu dau tien
struct Node {
int data; cout <<"Du lieu tron phan tu dau tien: «
Node *pnext; <<first->data << endl;
}; //truy cap den tat ca cac phan tu
int main(){
Node *first = new Node(); Node *p = first;
first->data = 1; cout << "tat ca cac du lieu tron lien ket don: ";
while (p != NULL) {
first->pnext = NULL;
int data = p->data;
p = p->pnext;
Node *second = new Node(); cout << data<<" ";
second->data = 2; }
second->pnext = NULL; cout<<endl;
system("pause");
Node *third = new Node(); }
third->data = 3;
third->pnext = NULL;

//tao lien ket voi nhau


first->pnext = second;
second->pnext = third;
Từ khóa typedef trong C++

Từ khóa typedef trong C++

• Có một cách dễ dàng hơn để định nghĩa các cấu trúc


hoặc bạn có thể "alias" các kiểu bạn tạo. Ví dụ:

• Lúc này, bạn có thể sử dụng Books một cách trực tiếp để
định nghĩa các biến của kiểu cấu trúc Books mà không
sử dụng từ khóa struct.

44
Từ khóa typedef trong C++

• Ví dụ:

• Bạn có thể sử dụng từ khóa typedef trong C++ cho các


dạng không phải cấu trúc, như sau:

Với x, y và z là tất cả con trỏ tới long int.

45

You might also like