Bài tập C++

Chương trình trên đây là chương trình đầu tiên mà hầu hết những người học nghề lập

trình viết đầu tiên và kết quả của nó là viết câu "Hello, World" lên màn hình. Đây là một

trong những chương trình đơn giản nhất có thể viết bằng C++ nhưng nó đã bao gồm

những phần cơ bản mà mọi chương trình C++ có. Hãy cùng xem xét từng dòng một :

// my first program in C++

Đây là dòng chú thích. Tất cả các dòng bắt đầu bằng hai dấu sổ (//) được coi là chút thích

mà chúng không có bất kì một ảnh hưởng nào đến hoạt động của chương trình. Chúng có

thể được các lập trình viên dùng để giải thích hay bình phẩm bên trong mã nguồn của

chương trình. Trong trường hợp này, dòng chú thích là một giải thích ngắn gọn những gì

mà chương trình chúng ta làm.

pdf65 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1893 | Lượt tải: 0download
Tóm tắt nội dung Bài tập C++, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 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. 
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. 
// array of structures 
#include 
#include 
#define N_MOVIES 5 
struct movies_t { 
 char title [50]; 
 int year; 
} films [N_MOVIES]; 
void printmovie (movies_t movie); 
int main () 
{ 
 char buffer [50]; 
 int n; 
 for (n=0; n<N_MOVIES; n++) 
 { 
 cout << "Enter title: "; 
 cin.getline 
Enter title: Alien 
Enter year: 1979 
Enter title: Blade Runner 
Enter year: 1982 
Enter title: Matrix 
Enter year: 1999 
Enter title: Rear Window 
Enter year: 1954 
Enter title: Taxi Driver 
Enter year: 1975 
You have entered these movies: 
Alien (1979) 
Blade Runner (1982) 
Matrix (1999) 
Rear Window (1954) 
Taxi Driver (1975) 
(films[n].title,50); 
 cout << "Enter year: "; 
 cin.getline (buffer,50); 
 films[n].year = atoi (buffer); 
 } 
 cout << "\nYou have entered these 
movies:\n"; 
 for (n=0; n<N_MOVIES; n++) 
 printmovie (films[n]); 
 return 0; 
} 
void printmovie (movies_t movie) 
{ 
 cout << movie.title; 
 cout << " (" << movie.year << 
")\n"; 
} 
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 movies_t { 
 char title [50]; 
 int year; 
}; 
movies_t amovie; 
movies_t * pmovie; 
Ở đây amovie là một đối tượng có kiểu movies_t và pmovie là một con trỏ trỏ tới đối 
tượng movies_t. OK, bây giờ chúng ta sẽ đến với một ví dụ khác, nó sẽ giới thiệu một 
toán tử mới: 
// pointers to structures 
#include 
#include 
struct movies_t { 
 char title [50]; 
 int year; 
}; 
int main () 
{ 
 char buffer[50]; 
Enter title: Matrix 
Enter year: 1999 
You have entered: 
Matrix (1999) 
 movies_t amovie; 
 movies_t * pmovie; 
 pmovie = & amovie; 
 cout << "Enter title: "; 
 cin.getline (pmovie->title,50); 
 cout << "Enter year: "; 
 cin.getline (buffer,50); 
 pmovie->year = atoi (buffer); 
 cout << "\nYou have entered:\n"; 
 cout title; 
 cout year << 
")\n"; 
 return 0; 
} 
Đ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. Trong ví dụ này chúng ta sử 
dụng: 
movies->title 
nó có thể được dịch thành: 
(*movies).title 
cả hai biểu thức movies->title và (*movies).title đều hợp lệ và chúng đều dùng để 
tham chiếu đến phần tử title của cấu trúc được trỏ bởi movies. Bạn cần phân biệt rõ 
ràng với: 
*movies.title 
nó tương đương với 
*(movies.title) 
lệnh này dùng để tính toán giá trị được trỏ bởi phần tử title của cấu trúc movies, trong 
trường hợp này (title không phải là một con trỏ) nó chẳng có ý nghĩa gì nhiều. Bản dưới 
đây tổng kết tất cả các kết hợp có thể được giữa con trỏ và cấu trúc: 
Biểu thức Mô tả Tương đương với 
movies.title Phần tử title của cấu trúc movies 
movies->title Phần tử title của cấu trúc được trỏ bởi (*movies).title 
movies 
*movies.title 
Giá trị được trỏ bởi phần tử title của cấu 
trúc movies 
*(movies.title) 
Các cấu trúc lồng nhau 
Các cấu trúc có thể được đặt lồng nhau vì vậy một phần tử hợp lệ của một cấu trúc có thể 
là một cấu trúc khác. 
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ì vậy, sau phần khai báo trên chúng ta có thể sử dụng các biểu thức sau: 
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). Bạn sẽ 
có thêm các thông tin chi tiết trong phần 4.1, Lớp. 
Bài 12:Các Kiểu Dữ Liệu Do Người Dùng Định Nghĩa 
Trong bài trước chúng ta đã xem xét một loại dữ liệu được định nghĩa bởi người dùng 
(người lập trình): cấu trúc. Nhưng có còn nhiều kiểu dữ liệu tự định nghĩa khác: 
Tự định nghĩa các kiểu dữ liệu (typedef). 
C++ cho phép chúng ta định nghĩa các kiểu dữ liệu của riêng mình dựa trên các kiểu dữ 
liệu đã có. Để có thể làm việc đó chúng ta sẽ sử dụng từ khoá typedef, dạng thức như 
sau: 
typedef existing_type new_type_name ; 
trong đó existing_type là một kiểu dữ liệu cơ bản hay bất kì một kiểu dữ liệu đã định 
nghĩa và new_type_name là tên của kiểu dữ liệu mới. Ví dụ 
typedef char C; 
typedef unsigned int WORD; 
typedef char * string_t; 
typedef char field [50]; 
Trong trường hợp này chúng ta đã định nghĩa bốn kiểu dữ liệu mới: C, WORD, string_t 
và field kiểu char, unsigned int, char* kiểu char[50], chúng ta hoàn toàn có thể sử 
dụng chúng như là các kiểu dữ liệu hợp lệ: 
C achar, anotherchar, *ptchar1; 
WORD myword; 
string_t ptchar2; 
field name; 
typedef có thể hữu dụng khi bạn muốn định nghĩa một kiểu dữ liệu được dùng lặp đi lặp 
lại trong chương trình hoặc kiểu dữ liệu bạn muốn dùng có tên quá dài và bạn muốn nó 
có tên ngắn hơn. 
Union 
Union cho phép một phần bộ nhớ có thể được truy xuất dưới dạng nhiều kiểu dữ liệu 
khác nhau mặc dù tất cả chúng đều nằm cùng một vị trí trong bộ nhớ. Phần khai báo và 
sử dụng nó tương tự với cấu trúc nhưng chức năng thì khác hoàn toàn: 
union model_name { 
 type1 element1; 
 type2 element2; 
 type3 element3; 
 . 
 . 
} object_name; 
Tất cả các phần tử của union đều chiếm cùng một chỗ trong bộ nhớ. Kích thước của nó là 
kích thước của phần tử lớn nhất. Ví dụ: 
union mytypes_t { 
 char c; 
 int i; 
 float f; 
 } mytypes; 
định nghĩa ba phần tử 
mytypes.c 
mytypes.i 
mytypes.f 
mỗi phần tử có một kiểu dữ liệu khác nhau. Nhưng vì tất cả chúng đều nằm cùng một chỗ 
trong bộ nhớ nên bất kì sự thay đổi nào đối với một phần tử sẽ ảnh hưởng tới tất cả các 
thành phần còn lại. 
Một trong những công dụng của union là dùng để kết hợp một kiểu dữ liêu cơ bản với 
một mảng hay các cấu trúc gồm các phần tử nhỏ hơn. Ví dụ: 
union mix_t{ 
 long l; 
 struct { 
 short hi; 
 short lo; 
 } s; 
 char c[4]; 
} mix; 
định nghĩa ba phần tử cho phép chúng ta truy xuất đến cùng một nhóm 4 byte: mix.l, 
mix.s và mix.c mà chúng ta có thể sử dụng tuỳ theo việc chúng ta muốn truy xuất đến 
nhóm 4 byte này như thế nào. Tôi dùng nhiều kiểu dữ liệu khác nhau, mảng và cấu trúc 
trong union để bạn có thể thấy các cách khác nhau mà chúng ta có thể truy xuất dữ liệu. 
Các unions vô danh 
Trong C++ chúng ta có thể sử dụng các unions vô danh. Nếu chúng ta đặt một union 
trong một cấu trúc mà không đề tên (phần đi sau cặp ngoặc nhọn { }) union sẽ trở thành 
vô danh và chúng ta có thể truy xuất trực tiếp đến các phần tử của nó mà không cần đến 
tên của union (có cần cũng không được). Ví dụ, hãy xem xét sự khác biệt giữa hai phần 
khai báo sau đây: 
union union vô danh 
struct { 
 char title[50]; 
 char author[50]; 
 union { 
 float dollars; 
struct { 
 char title[50]; 
 char author[50]; 
 union { 
 float dollars; 
 int yens; 
 } price; 
} book; 
 int yens; 
 }; 
} book; 
Sự khác biệt duy nhất giữa hai đoạn mã này là trong đoạn mã đầu tiên chúng ta đặt tên 
cho union (price) còn trong cái thứ hai thì không. Khi truy nhập vào các phần tử 
dollars và yens, trong trường hợp thứ nhất chúng ta viết: 
book.price.dollars 
book.price.yens 
còn trong trường hợp thứ hai: 
book.dollars 
book.yens 
Một lần nữa tôi nhắc lại rằng vì nó là một union, hai trường dollars và yens đều chiếm 
cùng một chỗ trong bộ nhớ nên chúng không thể giữ hai giá trị khác nhau. 
Kiểu liệt kê (enum) 
Kiểu dữ liệu liệt kê dùng để tạo ra các kiểu dữ liệu chứa một cái gì đó hơi đặc biệt một 
chút, không phải kiểu số hay kiểu kí tự hoặc các hằng true và false. Dạng thức của nó 
như sau: 
enum model_name { 
 value1, 
 value2, 
 value3, 
 . 
 . 
} object_name; 
Ví dụ, chúng ta có thể tạo ra một kiểu dữ liệu mới có tên color để lưu trữ các màu với 
phần khai báo như sau: 
enum colors_t {black, blue, green, cyan, red, purple, 
yellow, white}; 
Chú ý rằng chúng ta không sử dụng bất kì một kiểu dữ liệu cơ bản nào trong phần khai 
báo. Chúng ta đã tạo ra một kiểu dữ liệu mới mà không dựa trên bất kì kiểu dữ liệu nào 
có sẵn: kiểu color_t, những giá trị có thể của kiểu color_t được viết trong cặp ngoặc 
nhọn {}. Ví dụ, sau khi khai báo kiểu liệt kê, biểu thức sau sẽ là hợp lệ: 
colors_t mycolor; 
mycolor = blue; 
if (mycolor == green) mycolor = red; 
Trên thực tế kiểu dữ liệu liệt kê được dịch là một số nguyên và các giá trị của nó là các 
hằng số nguyên được chỉ định. Nếu điều này không đựoc chỉ định, giá trị nguyên tương 
đương với phần tử đầu tiên là 0 và các giá trị tiếp theo cứ thế tăng lên 1, Vì vậy, trong 
kiểu dữ liệu colors_t mà chúng ta định nghĩa ở trên, white tương đương với 0, blue 
tương đương với 1, green tương đương với 2 và cứ tiếp tục như thế. 
Nếu chúng ta chỉ định một giá trị nguyên cho một giá trị nào đó của kiểu dữ liệu liệt kê 
(trong ví dụ này là phần tử đầu tiên) các giá trị tiếp theo sẽ là các giá trị nguyên tiếp theo, 
ví dụ: 
enum months_t { january=1, february, march, april, 
 may, june, july, august, 
 september, october, november, december} 
y2k; 
trong trường hợp này, biến y2k có kiểu dữ liệu liệt kê months_t có thể chứa một trong 12 
giá trị từ january đến december và tương đương với các giá trị nguyên từ 1 đến 12, 
không phải 0 đến 11 vì chúng ta đã đặt january bằng 1 
Nguồn internet 

File đính kèm:

  • pdfC++.pdf