PDA

View Full Version : Lập trình C++ Hỏi về bài vẽ hình tam giác trong C!!



nlhuykhang
29-11-2011, 09:03 AM
Mình có 2 đề bài thế này:

1/Cho một tam giác vuông có đáy và chiều cao. Hãy viết chương trình vẽ tam giác vuông đó với đáy và chiều cao nhập từ bàn phím.

2/Vẽ một tam giác cân với đáy và chiều cao được nhập từ bàn phím.

Cái khó của bài toàn này là fải thỏa mãn 2 đại lượng là đái và chiều cao của tam giác.

Các bạn giúp mình nhé.Thanks.

VoTichSu
29-11-2011, 11:54 AM
Cái khó của bài là đề bài không rõ ràng. Một khi rõ rảng thì chẳng có gì khó cả.

Vẽ tam giác bằng cái gì? Theo đồ họa hay kỹ thuật in cổ điển (line printer simulation)
Vẽ đặc hay rỗng?

Giả sử vẽ đặc theo kỹ thuật cổ điển



*
**
***
****
*****

*
***
*****


Chỉ việc vẽ hình ra giấy rồi tính cách vẽ. Cách tính dễ nhất là dùng luật tam giác đồng dạng
b = đáy, h = cao

TG vuông:
Vẽ từng lằn h1 = 1 đến h
Mõi lằn vẽ ở dòng h1 sẽ có bề rộng
b1 = b * h1 / h

TG cân:
Vẽ hai TG vuông đối xứng nhau. Hoặc
Dùng công thức như TG vuông nhưng tính thêm số khoảng trống cần chừa ra bên trái.

tb. nếu vẽ TG rỗng thì mỗi dòng chỉ cần vẽ kt ở hai đầu. Trừ dòng cuối cùng thì vẽ trọn.

nlhuykhang
29-11-2011, 07:44 PM
Đề bài rất rõ ràng mà bạn vd cho tam giác vuông có đáy=5, chiều cao=4
=>
*

* *

* * *

* * * * *

clchicken
29-11-2011, 11:36 PM
Tùy chứ bạn :)
Nhiều khi tam giác vuông có đáy chính là cạnh huyền, chiều cao là khoảng cách từ đỉnh góc vuông xuống cạnh huyền.
Chứ đâu nhất thiết phải là đáy là 1 cạnh góc vuông, chiều cao là cạnh góc vuông còn lại đâu ??? .
Đề có nói vậy đâu ?? Rõ ràng là rõ ràng thế nào ?

Nếu nhỡ nó xúi quẩy rơi vào trường hợp 1 là tính toán cho xù cả tóc ra luôn đấy bạn


Mình có 2 đề bài thế này:
....
Cái khó của bài toàn này là fải thỏa mãn 2 đại lượng là đái và chiều cao của tam giác.
Các bạn giúp mình nhé.Thanks.
1 sự nhầm lẫn bàn phím hài hước (:)) (:)) Vô tình mà chính xác (:))

VoTichSu
29-11-2011, 11:39 PM
Bạn chủ quan quá sức. Đã nói không rõ là không rõ. Đầu bài bạn có nói tg đặc hay rỗng chăng?
Bình thường người ta vẽ tam giác rỗng. Nếu muốn đặc thì phải xác định là đặc.



Tg đặc

*
**
***
****
*****

Tg rỗng

*
**
* *
* *
*****


Giải thuật đưa ra đã thỏa mãn điều kiện đáy và chiều cao.

nlhuykhang
30-11-2011, 02:54 AM
Nếu các bạn đã nói vậy thì mình sữa đề lại thế này:
1/ Vẽ một tam giác vuông với 2 cạnh góc vuông đọc nhập từ bàn phím:
a. Vẽ đặc
b. Vẽ rỗ̉ng

Mong các bạn giúp đỡ. Thanks.

VoTichSu
30-11-2011, 08:31 AM
Giả sử rằng đề bài đơn giản (xem chú thích cuối bài), tức là chiều cao là số dòng và đáy là số cột. Cả hai đều là số nguyên.



// Giải thuật đã cho biết rồi, không cần phải lặp lại
// code vẽ hình TG vuông đặc, chiều cao h và đáy b

#define PRCHAR "*"

int h, b;
// code nhập h, b ở đây
// ...

int i, j, w; // dòng, cột, và số cột cần in ở dòng i
for (i=1; i <= h; i++)
{
// không cần phải test h > 0, vì đã vào vòng lặp thì h > 0
w = (int)(1.*i*b/h + 0.5); // dùng con toán số thực để có thể làm tròn số
if (w < 1) w = 1;
for (j=1; j <= w; j++) printf(PRCHAR); // tg đặc
printf("\n");
}

// tg rỗng thì lệnh printf của j viết như vầy
printf((i==1 || i==h || j==1 || j==w)? PRCHAR : " ");

// code chỉ viết dựa trên giải thuật thôi. Cần phải chạy thử và chỉnh sửa
// ở trình độ này, bạn biết phải làm gì rồi. Không cần phải mớm từng muỗng cơm.


tb. đề bài phức tạp cần con tính chiếu số thực thành dòng và cột

ttb. người Việt với nhau dùng chữ "cám ơn" chẳng xuôi tai hơn "thanks" sao?

nlhuykhang
30-11-2011, 04:36 PM
Giả sử rằng đề bài đơn giản (xem chú thích cuối bài), tức là chiều cao là số dòng và đáy là số cột. Cả hai đều là số nguyên.



// Giải thuật đã cho biết rồi, không cần phải lặp lại
// code vẽ hình TG vuông đặc, chiều cao h và đáy b

#define PRCHAR "*"

int h, b;
// code nhập h, b ở đây
// ...

int i, j, w; // dòng, cột, và số cột cần in ở dòng i
for (i=1; i <= h; i++)
{
// không cần phải test h > 0, vì đã vào vòng lặp thì h > 0
w = (int)(1.*i*b/h + 0.5); // dùng con toán số thực để có thể làm tròn số
if (w < 1) w = 1;
for (j=1; j <= w; j++) printf(PRCHAR); // tg đặc
printf("\n");
}

// tg rỗng thì lệnh printf của j viết như vầy
printf((i==1 || i==h || j==1 || j==w)? PRCHAR : " ");

// code chỉ viết dựa trên giải thuật thôi. Cần phải chạy thử và chỉnh sửa
// ở trình độ này, bạn biết phải làm gì rồi. Không cần phải mớm từng muỗng cơm.


tb. đề bài phức tạp cần con tính chiếu số thực thành dòng và cột

ttb. người Việt với nhau dùng chữ "cám ơn" chẳng xuôi tai hơn "thanks" sao?


Bạn có thể giải thích dùm mình trong câu lệnh

w = (int)(1.*i*b/h + 0.5);
thì 1. nghĩa là j k. Khi mình chạy thử cho h=5, b=4, i=1 nếu có 1. thì w=1.3, còn khi không có thì w=0.5 mình đề w ở kiểu float.
Cảm ơn.

clchicken
30-11-2011, 05:50 PM
1. là 1.0 đấy bạn thân mến.
Câu đấy là để đưa phép toán trở về toán chia số thực. Sau đó làm tròn số