Viết chương trình nhập tọa độ 3 điểm

BÀI TẬP ĐƯỢC LẤY TỪ QUYỂN SÁCH KỸ THUẬT LẬP TRÌNH C 

CỦA THẦY DƯƠNG THIÊN TỨ




Đề bài: Viết chương trình nhập vào tọa độ (xC,yC) là tâm của một đường tròn, và R là bán kính của đường tròn đó. Nhập vào tọa độ (xM,yM) của một điểm M. Xác định điểm M nằm trong, nằm trên hay nằm ngoài đường tròn.


Video: mình đã hướng dẫn và giải thích cụ thể trong video này


Mã lệnh:
#include <stdio.h>
#include <math.h>
int main(){
float
xc,yc,R,xm,ym;
printf("Nhap toa do tam (xC,yC) va ban kinh R: ");
scanf("%f%f%f",&xc,&yc,&R);
printf("Nhap toa do diem M(xM,yM): ");
scanf("%f%f",&xm,&ym);

float
KC = sqrt((xm-xc)*(xm-xc)+(ym-yc)*(ym-yc));
if
(KC < R)
printf("M nam trong duong tron");
else if
(KC > R)
printf("M nam ngoai duong tron");
else

printf("M nam tren duong tron");

return
0;
}
Mã nguồn: dành cho các bạn không thích gõ mã lệnh, Click here

Xét trường hợp chúng ta cần lưu trữ thông tin của nhiều cuốn sách trong thư viện, mỗi cuốn sách có nhiều loại thông tin như: Tiêu đề, tác giả, thể loại và ID. Trong các kiểu dữ liệu nguyên thủy ta đã học, không có kiểu nào có thể lưu trữ cùng lúc nhiều thông tin như thế. Khi đó, lập trình viên sẽ phải tìm cách tạo ra các kiểu dữ liệu mới để lưu trữ tất cả thông tin của một cuốn sách (là kiểu dữ liệu tự định nghĩa - đã đề cập các bài trước). Trong C++, Cấu trúc (struct) và Lớp (class) chính là hai loại dữ liệu hỗ trợ cho người dùng làm như vậy.

Tuy nhiên, trong phạm vi của lập trình cơ bản,

typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
6 sẽ được sử dụng chủ yếu trong việc tạo ra các kiểu dữ liệu tự định nghĩa, và mức độ sử dụng cũng rất đơn giản. Ta có thể hiểu
typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
6 là một dạng bản ghi, dùng để lưu trữ những thông tin chung nhất của nhiều đối tượng dữ liệu, ví dụ như mọi bản ghi của các sinh viên đại học trong hệ thống của nhà trường đều phải có tên, mã số sinh viên, ngày tháng năm sinh và ngành học; hoặc như ví dụ về lưu trữ các cuốn sách ở trên,...

II. Định nghĩa một cấu trúc

1. Định nghĩa và khai báo các biến cấu trúc

Để định nghĩa một cấu trúc, ta sử dụng cú pháp như sau:

struct {Tên_cấu_trúc}
{
    {Định_nghĩa_thành_viên_1};
    {Định_nghĩa_thành_viên_2};
    ...
    {Định_nghĩa_thành_viên_n};
} {Danh_sách_các_biến_cấu_trúc};

Trong đó, {Tên_cấu_trúc} là một định danh tùy ý người dùng đặt (thông thường tên cấu trúc sẽ viết hoa chữ cái đầu tiên). {Định_nghĩa_thành_viên} là một khai báo biến nào đó ở các kiểu dữ liệu khác nhau, còn {Danh_sách_các_biến_cấu_trúc} là các định danh tên biến.

Ví dụ: Định nghĩa một cấu trúc Books\text{Books}Books lưu thông tin về tên, tác giả, thể loại và ID của một cuốn sách, sau đó khai báo ba biến cấu trúc thể hiện ba cuốn sách:

struct Books
{
    int book_id;
    string book_name, author, category; 
} book_1, book_2, book_3;

Ngoài cách khai báo liền các biến cấu trúc như trên, người dùng có thể khai báo biến cấu trúc ở bất kỳ đâu trong chương trình bằng cú pháp:

typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
8 như ví dụ dưới đây:

int main()
{
    Books book_1, book_2, book_3;
	
    return 0;
}

2. Khai báo các biến cấu trúc với từ khóa typedef struct { {Định_nghĩa_các_thành_viên_của_cấu_trúc}; } {Tên_cấu_trúc}; 9

Từ khóa

typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
9 là một từ khóa rất hữu ích trong lập trình thi đấu, nó giúp người dùng đặt ra các tên mới cho những kiểu dữ liệu, bao gồm cả kiểu dữ liệu nguyên thủy lẫn kiểu dữ liệu người dùng tự định nghĩa. Bạn có thể định nghĩa một
typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
6 với tên cố định bằng cú pháp:

typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};

Ví dụ, cấu trúc Books\text{Books}Books ở trên có thể viết lại như sau:

typedef struct 
{
    int book_id;
    string book_name, author, category; 
} Books;

Kể từ khai báo này trở đi, các biến cấu trúc cũng có thể được khai báo bằng cú pháp giống như khai báo một biến kiểu nguyên thủy thông thường:

Books book_1, book_2, book_3;

Tuy nhiên, cách khai báo này với

typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
6 không quá phổ biến vì nó không giúp cho lập trình viên giảm được về công sức lập trình. Chỉ khi ta có những kiểu dữ liệu quá dài, ví dụ như
typedef struct 
{
    int book_id;
    string book_name, author, category; 
} Books;
3 hay
typedef struct 
{
    int book_id;
    string book_name, author, category; 
} Books;
4 mà không muốn viết dài như vậy, thì từ khóa
typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
9 sẽ phát huy tác dụng, bằng cách đặt lại tên mới ngắn gọn hơn cho kiểu đó:

typedef unsigned long long ULL;

int main()
{
    ULL a, b; // Thay vì khai báo unsigned long long thì có thể sử dụng định danh ULL.
}
III. Các thao tác với cấu trúc

1. Truy cập các thành viên của một biến cấu trúc

Để truy cập tới các thành viên trong một cấu trúc, ta sử dụng cú pháp sau:

{Tên_biến_cấu_trúc}.{Tên_thành_viên}

Khi truy cập theo cách này, người dùng có thể sử dụng thành viên được truy cập tới như một biến đơn thông thường, kết hợp vào các phép toán và câu lệnh khác nhau. Ví dụ, ta có thể nhập xuất tên sách của biến cấu trúc book_1\text{book\_1}book_1 có kiểu là Books\text{Books}Books bằng cú pháp:

int main()
{
    Books book_1;

    cin >> book_1.book_name;	
    cout << book_1.book_name;
}

2. Gán giá trị cho một biến cấu trúc

Biến cấu trúc cung cấp một phép toán gán rất hữu ích. Khi muốn gán giá trị cho các thành viên của một biến cấu trúc gồm nnn thành viên, ta có thể sử dụng cú pháp sau:

{Tên_biến_cấu_trúc} = { {Giá_trị_1}, {Giá_trị_2},..., {Giá_trị_n} };

Khi đó, các {Giá_trị_1}, {Giá_trị_2},..., {Giá_trị_n} sẽ lần lượt được gán cho các {Thành_viên_1}, {Thành_viên_2},..., {Thành_viên_n} của biến

typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
6. Lấy ví dụ:

struct Books
{
    int book_id;
    string book_name, author, category; 
} book_1, book_2, book_3;
0

Biên dịch và chạy đoạn chương trình trên, ta có kết quả là:

struct Books
{
    int book_id;
    string book_name, author, category; 
} book_1, book_2, book_3;
1

3. Truyền cấu trúc vào hàm như một tham số

Ta có thể truyền cấu trúc vào hàm dưới dạng một tham số giống như những biến thông thường, và cũng sẽ có truyền tham chiếu hoặc truyền tham trị. Cú pháp truyền không có gì khác biệt:

struct Books
{
    int book_id;
    string book_name, author, category; 
} book_1, book_2, book_3;
2

Nếu như muốn truyền tham chiếu, chỉ cần thêm toán tử

typedef struct 
{
    int book_id;
    string book_name, author, category; 
} Books;
7 phía trước tên biến tham số. Còn các đối tượng trong cấu trúc thì chỉ giống như biến thông thường nên có thể kết hợp với các câu lệnh như các biến.

Ví dụ: Dưới đây là một đoạn chương trình cho phép nhập vào chiều dài và chiều rộng của NNN hình chữ nhật khác nhau và sử dụng một hàm để tính diện tích của các hình chữ nhật đó:

struct Books
{
    int book_id;
    string book_name, author, category; 
} book_1, book_2, book_3;
3

Hãy thử biên dịch và chạy chương trình trên với Input dưới đây:

struct Books
{
    int book_id;
    string book_name, author, category; 
} book_1, book_2, book_3;
4

Chúng ta sẽ thu được output như sau:

struct Books
{
    int book_id;
    string book_name, author, category; 
} book_1, book_2, book_3;
5IV. Bài tập minh họa

1. Quản lý sinh viên

Đề bài

Định nghĩa một cấu trúc Student để quản lý sinh viên của một lớp học gồm NNN sinh viên khác nhau. Các thông tin cần quản lý bao gồm: Mã số sinh viên, Năm sinh, Điểm thi giữa kỳ, Điểm thi cuối kỳ, Điểm trung bình, Xếp hạng. Cho trước các thông tin: Mã số sinh viên, Năm sinh, Điểm thi giữa kỳ, Điểm thi cuối kỳ của NNN sinh viên theo thứ tự từ 111 tới NNN.

Hãy viết các hàm thực hiện các công việc sau:

  • Đưa ra số lượng sinh viên có năm sinh từ 199919991999 trở về sau.
  • Tính điểm trung bình của mỗi sinh viên theo công thức:

Điểm trung bıˋnh=0.3×(Điểm giữa kyˋ)+0.7×(Điểm cuoˆˊi kyˋ)\text{Điểm trung bình} = 0.3 \times \text{(Điểm giữa kỳ)} + 0.7 \times \text{(Điểm cuối kỳ)}Điểm trung bıˋnh=0.3×(Điểm giữa kyˋ)+0.7×(Điểm cuoˆˊi kyˋ)

Sau đó tính xếp hạng của từng sinh viên theo quy tắc:

  • Nếu Điểm TB<4.0\text{Điểm TB} < 4.0Điểm TB<4.0 thì xếp loại DDD.
  • Nếu 4.0≤Điểm TB<6.04.0 \le \text{Điểm TB} < 6.04.0Điểm TB<6.0 thì xếp loại CCC.
  • Nếu 6.0≤Điểm TB<8.06.0 \le \text{Điểm TB} < 8.06.0Điểm TB<8.0 thì xếp loại BBB.
  • Trường hợp còn lại xếp loại AAA.

  • Đưa ra số lượng sinh viên xếp loại AAA và số lượng sinh viên xếp loại DDD.
  • Đưa ra số thứ tự của các sinh viên có điểm trung bình lớn hơn 4.04.04.0 và nhỏ hơn 8.08.08.0. Nếu không có sinh viên nào thì đưa ra một số 000 duy nhất.

Ý tưởng

Đây là một bài tập khá quen thuộc với các bạn mới học lập trình.

Ý tưởng rất đơn giản, chỉ cần tạo một

typedef struct
{
	{Định_nghĩa_các_thành_viên_của_cấu_trúc};
} {Tên_cấu_trúc};
6 lưu các thông tin như đề bài yêu cầu, sau đó viết ra các hàm:

  • Kiểm tra một sinh viên có sinh từ năm 199919991999 trở về trước không.
  • Tính điểm trung bình của một sinh viên.
  • Xếp hạng một sinh viên dựa trên điểm số.

Hai yêu cầu còn lại có thể làm trong quá trình nhập và xử lý thông tin của các sinh viên.

Cài đặt

struct Books
{
    int book_id;
    string book_name, author, category; 
} book_1, book_2, book_3;
6

2. Tam Giác

Đề bài

Khai báo một cấu trúc lưu thông tin về một tam giác (tọa độ ba đỉnh) trong mặt phẳng OxyOxyOxy.

Hãy viết các hàm sau:

  • Hàm nhập tọa độ đỉnh cho tam giác.
  • Hàm kiểm tra xem ba điểm đã nhập vào có thỏa mãn là ba đỉnh của một tam giác hay không?
  • Hàm tính diện tích tam giác.
  • Hàm tính chu vi tam giác.

Ý tưởng

Trước tiên tạo ra một cấu trúc để biểu diễn điểm trên mặt phẳng tọa độ Oxy,Oxy,Oxy, gồm hoành độ và tung độ.

Sau đó tạo thêm một cấu trúc nữa để biểu diễn một tam giác, gồm ba trường lưu ba điểm của tam giác.

Công việc còn lại rất đơn giản, chỉ cần viết ra các hàm theo đúng yêu cầu của đề bài là xong. Các bạn chỉ cần ghi nhớ hai công thức quan trọng cần sử dụng trong bài:

  • Tính khoảng cách giữa hai điểm (x1,y1)(x_1, y_1)(x1,y1) và (x2,y2)(x_2, y_2)(x2,y2) trên mặt phẳng OxyOxyOxy:

    (x1−x2)2+(y1−y2)2\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}(x1x2)2+(y1y2)2

  • Tính diện tích tam giác với tọa độ ba đỉnh lần lượt là (x1,y1),(x2,y2)(x_1, y_1), (x_2, y_2)(x1,y1),(x2,y2) và (x3,y3)(x_3, y_3)(x3,y3):

    ∣(x2−x1)×(y3−y1)−(x3−x1)×(y2−y1)∣2\frac{\big|(x_2 - x_1) \times (y_3 - y_1) - (x_3 - x_1) \times (y_2 - y_1)\big|}{2}