Chuong1 c

49
Bo mon MMT&TT 1 Lập trình hướng đối tượng C++ Giảng viên giảng dạy Nguyễn Hữu Vân Long

Transcript of Chuong1 c

Bo mon MMT&TT 1

Lập trình hướng đối tượng C++

Giảng viên giảng dạyNguyễn Hữu Vân Long

Bo mon MMT&TT 2

Chương 1

Các đặc điểm của C++

p Các khái niệm cơ bản của C++

p Lập trình cấu trúc trong C++

p Các đặc điểm mới của C++

Bo mon MMT&TT 3

Nội dung bài giảng Giới thiệu

Các khái niệm cơ bản trong C++

Cấu trúc điều khiển

Hàm và cấu trúc chương trình

Tham số mặc nhiên của hàm

Con trỏ và chuỗi ký tự

Tái định nghĩa hàm

Hàm tại chổ (inline)

Con trỏ/Tham chiếu

Truyền tham số

Structure

Bo mon MMT&TT 4

Giới thiệu C++

Là một tập “cha” (superset) của C. Hỗ trợ cho lập trình hướng đối tượng

Một số trình biên dịch C++ TurboC (win) BorlandC (win) Gcc (win + linux) Microsoft C (win) …

Bo mon MMT&TT 5

Các khái niệm cơ bản Từ khóa (Keywords)

Thông thường là chữ thường.

Dành riêng cho ngôn ngữ không được dùng đặt tên

VD : char, int, return, for, else, const, static

Tên/Định danh (Identifier)

Tên biến, tên hàm, tên kiểu dữ liệu do người dùng định nghĩa...được gọi chung là những định danh.

Phân biệt chữ HOA và chữ thường.

Gồm chữ, số, ‘_’ và phải bắt đầu bằng chữ cái.

Độ dài tối đa là 32.

VD: x, hoten, a1, num_of_var, Delta, TEN, ...

Bo mon MMT&TT 6

Kiểu dữ liệu

Các khái niệm cơ bản

Tên kiểuTên kiểu Kích thướcKích thước Phạm viPhạm vi

char 1 byte -128 127

unsigned char 1 byte 0 255

int 2 bytes -32768 32767

unsigned int 2 bytes 0 65535

short 2 bytes 0 65535

long 4 bytes -231 231 - 1

unsigned long 4 bytes 0 232 - 1

float 4 bytes 1.2e-38 3.4e38

double 8 bytes 2.2e-308 1.8e308

Bo mon MMT&TT 7

Biến (Variable)

Dùng để lưu trữ dữ liệu xử lý trong chương trình

Tên biến: Đặt theo quy tắc tên định danh

Khai báo : bất kỳ vị trí nào trong chương trình

Khởi tạo : có thể vừa khai báo và khởi tạo

Cú pháp <kiểu DL> <{<tên biến>[=giá trị]}[,…n]>;

VD:int x=5, y=10;

for(int i=0,tong=0;i<10;i++) tong +=i;

Phạm vi của biến

VD: if( delta >0 ) {

float x1= (-b +sqrt(delta)) / (2*a);

float x2= (-b - sqrt(delta)) / (2*a); ...}

Các khái niệm cơ bản

Bo mon MMT&TT 8

Biến (Variable)

Biến toàn cục : có tác dụng trong toàn bộ CT.

Biến địa phương (cục bộ): chỉ có tác dụng trong phạm vi của nó.

VD: int so = 5;

void GanSo(int x) {

so = x;}

int NuaSo(int x) {

int c=2, so =x/c ;

return so;}

Các khái niệm cơ bản

Bo mon MMT&TT 9

Hằng (Constant)

Khai báo

VD: #define MAX 100

const int MAX=100;

Một số hằng quan trọng

Số nguyên: 10 , -5, 300000, 1000L, …

Số thực : 3.1416, .5 , 123E-5, …

Ký tự : char ch1 = ‘A’ , ch2=97;

Chuỗi ký tự :

char *str=“Chuoi Ky Tu”;

char chuoi[50]; strcpy(chuoi,“ ”);

if ( strcmp(chuoi,“”)==0)

cout << “Chuoi rong”;

Các khái niệm cơ bản

Bo mon MMT&TT 10

Kiểu

Chuyển đổi kiểu/Ép kiểu (Type Casting)

Mặc nhiên/Không tường minh (implicit) tự động

float x = 123.4;

int y = x;

float z = x – y;

Tường minh – Do người lập trình sử dụng (Explicit)

Cú pháp: ( Kiểu ) biểu thức hoặc Kiểu ( biểu thức )

float x = 3.1416;

int y= (int) x;

Các khái niệm cơ bản

double to float

float to int

int to float

Bo mon MMT&TT 11

Các phép toán (Operators)

Các khái niệm cơ bản

Phép toán Toán tử

Số học +, -, *, /, %, ++, --

Quan hệ ==, !=, >, <, >=, <=

Logic &&, ||, !

Gán =, +=, -=, *=, /=, %=<<=, >>=, &=, |=, ^=

Con trỏ, struct *, &, ., ->

Điều kiện (e1) ? e2 : e3

Lấy kích thước sizeof

Bộ nhớ new, delete

Bitwise &, |, ^

Ví dụ:int i=1000, s;s = sizeof(i); s=2

int *p;p = new int[10];delete p;

max = (a>b) ? a : b;

Bo mon MMT&TT 12

Mảng

1 dãy các phần tử cùng kiểu

Khai báo mảng có n phần tử

<Kiểu> <Tên mảng> [<Kích thước>];

VD : int m[10]; float ds[MAX];

Thứ tự phần tử : từ 0 đến (kích thước -1)

Truy xuất một phần tử của mảng: <tên mảng>[chỉ số]

VD: // CT tính tổng của 10 số Fibonacci đầu tiên

long a[10]; a[0]=a[1]=1;

for (int i=2; i<10 ; i++)

a[i] = a[i-1] + a[i-2];

long tong=0;

for(i=0 ; i<10 ; i++) tong+=a[i];

Các khái niệm cơ bản

Bo mon MMT&TT 13

Chú thích Trên 1 dòng :

// chú thích trên 1 dòng Trên nhiều dòng :

/* chú thích trên nhiều dòng */

Các chỉ thị tiền biên dịch :# define # undefine # include

# if # else # endif

# if # elif # else # endif

# ifdef # else # endif

# ifndef # else # endif

# error

Các khái niệm cơ bản

Bo mon MMT&TT 14

Trong C++, nhập/xuất được thực hiện thông qua khái niệm luồng (stream).

Luồng: dòng dữ liệu

Thư viện hàm: <iostream.h>

Toán tử xuất (insertion): <<

Toán tử nhập (extraction): >>

Luồng xuất chuẩn: cout (màn hình)

Luồng nhập chuẩn: cin (bàn phím)

Nhập xuất trong C++

nhập >>nguồn

đích

Bo mon MMT&TT 15

Ưu điểm

Đơn giản: không cần sử dụng chuỗi định dạng.

Có thể tái định nghĩa các toán tử nhập, xuất để nhập xuất các kiểu dữ liệu do người dùng định nghĩa

Cú pháp

Nhập : std::cin >> Biến

Xuất : std::cout << (Biểu thức)

Các kiểu dữ liệu có thể nhập xuất

char , int, unsigned, long, unsigned long, …

float, double, char* , char []

(void*): lấy địa chỉ đầu của chuỗi

Nhập xuất trong C++#include <iostream.h>void main() { cout << “Hello world”;}

#include <iostream.h>void main() { int a, b, max; cout << “Nhap a: ”; cin >> a; cout << “Nhap b: ”; cin >> b;

max = (a>b)? a : b; cout << “Max(a, b)= ” << max;}

Bo mon MMT&TT 16

Nhập xuất

Một số hàm định dạng toàn cục:

cin.width(n)

cout.width(n)

cout.precision(n)

cin.seekg(n)

Ký tự đặc biệt : \n, \t, \0, \b, \r

Định dạng khác: endl, ends, flush, …

Nhập chuỗi :

gets(char* str);

cin.getline(char* str, int n);

Nhập xuất trong C++

Bo mon MMT&TT 17

Tuần tự: các lệnh được thực hiện 1 cách tuần tự

Câu lệnh đơn: viết trên một hay nhiều dòng

Khối lệnh :

Là dãy các lệnh viết trong cặp { }

Tương đương với 1 câu lệnh đơn

Giá trị của biểu thức điều kiện

Bằng 0 : <=> SAI

Khác 0 : <=> đúng

Rẽ nhánh (braching, decision making): dùng để quyết định sự thực hiện một khối lệnh dựa vào giá trị của một biểu thức điều kiện.

Lặp (loop): dùng để thực hiện lặp lại một khối lệnh trong khi một điều kiện nào đó được thỏa mãn.

Cấu trúc điều khiển

Bo mon MMT&TT 18

Cấu trúc điều khiển Rẽ nhánh

Lệnh if ... else

if (bthức đkiện)

Lệnh 1;

[else

Lệnh 2;

]

Lệnh switch … case:

switch (biểu thức) {

case <gtrị 1>:

Lệnh 1; break;

case <gtrị 2>:

Lệnh 2; break;

...

case <gtrị n>:

Lệnh n; break;

[default:

Lệnh n+1; ]

}

Chú ý: l Biểu thức trong lệnh switch phải là biểu thức tương thích với kiểu int.l Lệnh switch luôn dùng phép so sánh bằng (==)

Bo mon MMT&TT 19

Lệnh lặp

Lệnh while:

while (bthức đkiện)

Lệnh;

Lệnh do … while:

do

Lệnh;

while (bthức đkiện)

Lệnh for:

for (e1; e2; e3)

Lệnh;

Cấu trúc điều khiển

//Ctrình giải PTBNint a, b;float x;char tieptuc=‘n’;

do { //nhap a, b //giai PTBN

printf(“Ban muon tiep tuc?”); scanf(“%c”, &tieptuc);} while (tieptuc==‘y’);

Bo mon MMT&TT 20

Từ khóa break: Thoát ra khỏi lệnh switch và các lệnh lặp.

Từ khóa continue: Trở về đầu vòng lặp.

Cấu trúc điều khiển

printf(“Nhap n (<>0): ”);scanf(“%s”, &str);

if (!(n = atoi(str))) { printf(“Nhap ko hop le!”); continue;}printf(“%d^2=%d”, n, n*n);

//Ctrình tính bình phương một sốchar str[5];int n;char tieptuc=‘n’;do {

...

printf(“Ban muon tiep tuc?”); scanf(“%c”, &tieptuc);} while (tieptuc=‘y’);

Bo mon MMT&TT 21

Hàm

<Kiểu trả về> <Tên hàm> (Danh sách kiểu và tham số)

{ [ Khai báo dữ liệu cục bộ ]

[ Thân hàm ]

[ Câu lệnh return ]

}

VD: int Max ( int x, int y) {

int somax;

somax = (x>y) ? x : y;

return somax;

}

Hàm và cấu trúc chương trình

Bo mon MMT&TT 22

Hàm: Khai báo prototype

<Kiểu trả về> <Tên hàm> ( Danh sách kiểu );

int Max ( int , int );

int Min ( int , int );

void main()

{

int a =10 , b =5;

cout<<“So max=” << Max(a,b)<< endl;

cout<<“So min=” << Min(a,b)<< endl;

}

int Max ( int x , int y) { ... }

int Min ( int x , int y) { ... }

Hàm và cấu trúc chương trình

Khai báo hàm

Định nghĩa hàm

Hàm phải được khai báo hoặc định nghĩa trước khi sử dụng!

Bo mon MMT&TT 23

Hàm

Cách gọi : Tên hàm(tham số theo thứ tự từ trái sang)

Tham số và đối số:

int Max ( int x, int y) {

if(x>y) return x;

return y; }

void main() {

int a =10 , b = 5;

cout<<“So max= “<< Max ( a , b ) << endl; }

Hàm và cấu trúc chương trình

Tham số (hình thức)

Đối số (Tham số thực tế)

Bo mon MMT&TT 24

Cấu trúc chương trình

Chương trình theo dạng lập trình cấu trúc gồm tập hợp nhiều hàm độc lập nhau.

Hàm main() là hàm thực thi.

Một chương trình chỉ có thể có 1 hàm main() duy nhất.

Dạng chung :

Hàm và cấu trúc chương trình

# include < Thư viện hàm >

Khai báo prototype;

Khai báo dữ liệu toàn cục

Định nghĩa các hàm đã khai báo.

Định nghĩa hàm main().

Bo mon MMT&TT 25

Khái niệm

Là 1 đối tượng dữ liệu lưu địa chỉ của 1 DTDL khác.

Kích thước con trỏ = 1 ô nhớ của hệ điều hành.

Trên MS-DOS, kích thước của con trỏ là 2 bytes.

Khai báo : < Kiểu> *<Tên con trỏ>;

VD: long x = 20;

long *y = &x;

Các phép toán

Địa chỉ : &y

Giá trị : y

Giá trị dữ liệu mà con trỏ đang trỏ tới : *y

Con trỏ

20

1035H

x

1035

1080H

*y

Bo mon MMT&TT 26

Cách tính địa chỉ

int x=10; // Chẳng hạn biến x đang ở địa chỉ 1000

int *px = &x; // px =1000

<=> int *px; px = &x;

(*px)++; // Gán x=11

px++; // px = 1002 vì px là con trỏ kiểu int

px +=n; // px đang trỏ đến địa chỉ (1002 + 2*n )

Cấp vùng nhớ : Con trỏ = new <Kiểu> [ Số lượng ];

Ví dụ: int *px= new int;

long *py= new long[20];

Thu hồi vùng nhớ : delete <con trỏ>;

Ví dụ: delete px;

delete[] py;

Con trỏ

Bo mon MMT&TT 27

Con trỏ và mảng

Con trỏ là 1 mảng động => kích thước có thể thay đổi.

Mảng như là 1 con trỏ nhưng độ lớn vùng nhớ cố định.

Con trỏ

float *ds; int n;

cout << “Nhap so luong n = ”; cin >> n;

ds = new float [n];

for (int i=0; i<n; i++) {

cout << “Phan tu ” << i+1 << “ : ”; cin >> ds[i];

}

cout << “Danh sach vua nhap :” << endl;for(i=0; i<n; i++) cout << ds[i] << “\t” ;delete[] ds;

Cách sử dụng mảng và con trỏ gần như giống nhau

Cấp vùng nhớ vừa đủ

cho con trỏ

Thu hồi lại vùng nhớ

Bo mon MMT&TT 28

Phân biệt mảng con trỏ và con trỏ đến mảng

Con trỏ

Mảng gồm 10 con trỏ Con trỏ đến 1 mảng 10 phần tử kiểu int

Bo mon MMT&TT 29

Con trỏ đến con trỏ

Tương tự (tổng quát hơn) mảng nhiều chiều.

Cẩn thận khi cấp vùng nhớ.

Con trỏ

Bo mon MMT&TT 30

Là con trỏ đặc biệt dùng để trỏ đến địa chỉ mã lệnh thực thi của 1 hàm.

Khai báo con trỏ đến hàm phải đặt trong cặp dấu ngoặc. (*p):

int (*p1) (const char *, const char *);

long (*p2) (int a, int b);

Thường dùng con trỏ này để gọi 1 hàm và gửi hàm đó như là 1 đối số đến 1 hàm khác.

void check(char *a, char *b,

int (*cmp)(const char *, const char *));

Gọi hàm:

check(“abc”,”ABC”, strcmp);

Con trỏ

Bo mon MMT&TT 31

Ví dụ

Con trỏ

Gọi hàm check sử dụng con trỏ đến hàm như là 1 đối số

Bo mon MMT&TT 32

Có thể trỏ đến bất kỳ loại dữ liệu nào.

Phải dùng phép ép kiểu khi thay đổi.

Con trỏ void*

Bo mon MMT&TT 33

Chuỗi ký tự

Là 1 mảng ký tự hay con trỏ ký tự

=> truy xuất phần tử của chuỗi tương tự như mảng.

VD: char chuoi1[20], *chuoi2;

char c = chuoi1[0];

Phải cấp vùng nhớ cho chuỗi dạng con trỏ.

VD: chuoi2 = new char [50];

Chuỗi sẽ được đánh dấu bởi ký tự kết thúc : ‘\0’

Hàm nhập chuỗi :

gets(chuoi2);

cin.getline(chuoi2, 49);

In chuỗi ra màn hình: cout<<chuoi1<<chuoi2;

Con trỏ và chuỗi ký tự

Bo mon MMT&TT 34

Chuỗi ký tự

Một số hàm xử lý chuỗi trong <string.h>:

Copy chuỗi: char* strcpy (char* s1, char* s2);

Tạo bản sao: char* strdup (char* s1);

Chiều dài: int strlen (char* s);

So sánh: int strcmp (char* s1, char* s2);

Ghép chuỗi: char* strcat (char* s1, char* s2);

Đảo ngược: char* strrev (char* s);

Đổi sang HOA: char* strupr (char* s);

Đổi sang thường: char* strlwr (char* s);

Gán n ký tự c: char* strnset (char* s, int c , int n);

Con trỏ và chuỗi ký tự

Bo mon MMT&TT 35

Mục đích

Gán các giá trị mặc nhiên cho các tham số của hàm.

Ưu điểm

Không cần phải hiểu rõ ý nghĩa tất cả các tham số --> đơn giản hóa việc sử dụng hàm

Có thể giảm được số lượng hàm cần định nghĩa.

Quy tắc

Tất cả các tham số mặc nhiên đều phải đặt ở cuối hàm.

Chỉ thiết đặt trong prototype hoặc định nghĩa hàm, không được đặt trong cả hai.

Khai báo

<kiểu DL> <tên đối số> = <giá trị mặc nhiên>

Tham số mặc nhiên

Bo mon MMT&TT 36

Gọi hàm có tham số mặc nhiên

Nếu cung cấp giá trị cho đối số dùng tham số truyền vào.

Nếu không đủ tham số dùng giá trị mặc nhiên.

Ví dụ:

Tham số mặc nhiên

void HamThu(int =0, int =1);void main() { int x=10, y=20; cout<< “Goi ham Thu 4 lan, ta duoc : << endl; HamThu(x,y); HamThu(x); HamThu(y); HamThu(); }

void HamThu(int a, int b) { cout << “tham so 1 = ” << a << endl; cout << “tham so 2 = ” << b << endl;}

Bo mon MMT&TT 37

Ví dụ

Tham số mặc nhiên

MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK )

MessageBox(“Hien thi thong bao ra man hinh");

MessageBox( “Chuc nang khong su dung duoc", “Bao loi“ );

Có thể gọi hàm theo các dạng sau:

MessageBox( “Ban muon thoat khoi chuong trinh?", “Thong bao“, MB_YESNO | MB_ICONASTERISK );

37

Hàm thể hiện 1 cửa sổ thông báo trong Visual C++

Bo mon MMT&TT 38

Khái niệm

Tái định nghĩa hàm: định nghĩa các hàm trùng tên.

Quy tắc tái định nghĩa

Các hàm trùng tên phải khác nhau về tham số:

Số lượng

Thứ tự

Kiểu

Quy tắc gọi hàm

Tìm hàm có kiểu tham số phù hợp.

Dùng phép ép kiểu tự động.

Tìm hàm gần đúng (phù hợp) nhất.

Tái định nghĩa hàm

Bo mon MMT&TT 39

Tái định nghĩa hàmĐịnh nghĩa hàm:int Max (int a, int b) { return (a>b) ? a : b; }float Max (float a, float b) { return (a>b) ? a : b; }SinhVien Max(SinhVien a, SinhVien b) { return (a.diemtb > b.diemtb) ? a : b;}

Gọi hàm:int x1=1, y1=2; float x2=3, y2=4;long x3=5 , y3=6;

cout<< Max(x1,y1) << “\t” << Max(x2,y2) << endl;cout << Max(x3,y1) << endl; // Gọi hàm 1cout << Max(x3,y2) << endl; // Gọi hàm 2cout << Max(x3,y3) << endl; // Lỗi!

Bo mon MMT&TT 40

Là 1 hàm nhưng tác dụng tương tự như một macro.

Khắc phục được các nhược điểm của hàm và macro.

Giảm thời gian thực thi chương trình.

Tăng kích thước của mã lệnh thực thi.

Chỉ nên định nghĩa inline khi hàm có kích thước nhỏ.

Cú pháp : thêm từ khóa inline vào trước hàm.

VD: inline float sqr(float x) {

return (x*x); }

inline int Max(int a, int b) {

return ((a>b) ? a : b) ; }

Hàm inline

Bo mon MMT&TT 41

Khái niệm Là 1 loại đối tượng dữ liệu “tham chiếu” đến 1 đối tượng có

sẵn. Là 1 bí danh như con trỏ, nhưng không cần có tác tử *.

VD: int x = 10;

int *px = &x;

int &rx = x;

3 cách thay đổi giá trị của x :

x = 5;

*px = 5;

rx = 5

Tham chiếu

10

1035H

x

1035

1080H

*px

&rx

Bo mon MMT&TT 42

Tham chiếu dùng như một biến

Khởi tạo : int x=5; int &rx = x;

int &a; int &b=5; // SAI Tham chiếu hằng : không thể sửa đổi giá trị.

const int &n=10;

<=> int x=3; const int &n=x;

n=5; // Báo lỗi vì n lúc này là hằng số

Gán trị lại

Không thể sửa đổi đối tượng tham chiếu.

Chỉ là thay đối giá trị.

int x = 5, y = 20; int &rx = x;

rx = y; // Chính là gán x=20

// không phải là rx tham chiếu đến y

Tham chiếu

Bo mon MMT&TT 43

Tham chiếu dùng như đối số của hàm

Làm thay đổi giá trị của tham số.

Hữu ích cho hàm trả về nhiều kết quả.

Tiết kiệm được ô nhớ trung gian (tham số hình thức) trong hàm.

Tham chiếu

void Nhap (int& a, float& b) { cout<< “Nhap tham so 1 : “; cin>>a; cout<< “Nhap tham so 2 : “; cin>>b; }void main() { int n; float m; Nhap( n , m ); }

Bo mon MMT&TT 44

Tham chiếu dùng như trị trả về của hàm

Đối tượng trả về vẫn bền vững khi hàm kết thúc.

Trị trả về là 1 đối tượng toàn cục hay 1 vùng nhớ cục bộ.

VD: long a[1000];

long& GiaTri(int i) { return a[i]; }

void main() {

GiaTri(1) = 1; GiaTri(2) = 1;

for( int i= 3; i<1000; i++)

GiaTri(i) = GiaTri(i-1) + GiaTri(i-2); }

=> Ích lợi : che đi cách biểu diễn của dữ liệu.

( Chẳng hạn : ta đổi lại dùng CTDL là danh sách liên kết => chỉ viết lại hàm GiaTri(int ) mà thôi )

Tham chiếu

Bo mon MMT&TT 45

Truyền theo giá trị

Giá trị tham số khi ra khỏi hàm sẽ không thay đổi.

Truyền tham số

void Swap1(int a, int b) { int temp = a; a = b; b = temp;}

void main(){ int x = 5, y = 10; Swap1( x , y ); cout << “ x = “ << x << “ y = “ << y << endl;}

5

10

x

y

a

b

main Swap1

STEP 01

5

10

x

y

5

10

a

b

main Swap1

STEP 02

5

10

x

y

10

5

a

b

main Swap1

STEP 03

Bo mon MMT&TT 46

Truyền theo địa chỉ (con trỏ)

Giá trị tham số khi ra khỏi hàm có thể thay đổi.

Truyền tham số

void Swap2(int* a, int* b) { int temp = *a; *a = *b; *b = temp;}

void main(){ int x = 5, y = 10; Swap2( &x , &y ); cout << “ x = “ << x << “ y = “ << y << endl;}

5

10

x

y

a

b

main Swap2

STEP 01

100

200

5

10

x

y

100

200

a

b

main Swap2

STEP 02

100

200

10

5

x

y

100

200

a

b

main Swap2

STEP 03

100

200

Bo mon MMT&TT 47

Truyền theo tham chiếu:

Giá trị tham số khi ra khỏi hàm có thể thay đổi.

Truyền tham số

void Swap3(int& a, int& b) { int temp = a; a = b; b = temp;}

void main(){ int x = 5, y = 10; Swap3( x , y ); cout << “ x = “ << x << “ y = “ << y << endl;}

5 10x y

main

STEP 01

a b

Swap3

10 5x y

main

STEP 02

a b

Swap3

10 5x y

mainSTEP

03

Bo mon MMT&TT 48

Khái niệm

Struct Là 1 dạng cấu trúc dữ liệu mà bản thân có thể chứa nhiều loại dữ liệu có kiểu khác nhau.

Khai báo

Struct

SinhVien a;

2 bytes

2 bytes

4 bytes

8 bytes

diemtb

namsinh

*hoten

masosv[]

Bo mon MMT&TT 49

Biến kiểu struct :

SinhVien a, b, ds1[20], *ds2;

Truy xuất các thành phần của struct :

cout << “Nam sinh cua b la : “<<b.namsinh;

cin >> ds[19].namsinh;

gets(a.mssv);

ds2->hoten = new char[50];

Gán struct :

SinhVien c = a;

Con trỏ struct :

SinhVien *ds= new SinhVien[100];

Struct