PDA

View Full Version : Tạo Tam giác cân với độ cao h!



hienclubvn
24-06-2010, 04:13 PM
các bạn làm dùm mình bài này nha.
bài 1:xuất ra màn hình tam giác cân với độ cao h nhập từ bàn phím
bài 2: tương tự như trên nhưng là tam giác rỗng ở giữa

hjx, cố biểu diễn cái tam giác ra mà ko đc. thông củm
(8-)>

peterdrew
24-06-2010, 04:19 PM
Yêu cầu này thì không có lời giải mất rồi! (Chỉ có Chiều cao của Tam giác thì sao mà làm được?)

hienclubvn
24-06-2010, 04:24 PM
anh peter ơi, bài này nằm trong chuơng các cấu trúc đk thui.
ko phải như anh tườg đâu.
ví dụ như xuất ra hình tam giác đc biểu diễn bằng các dấu "*" thôi
chỉ cần 1 biến thôi ạ,
thuộc loại cơ bản ạ,
hi, em chưa nghĩ ra cái thuật toán.

langman
24-06-2010, 04:28 PM
0. khởi tạo chế độ đồ họa

1. đầu tiên , vẽ 1 cạnh đáy, để đơn giản vấn đề nhất, đề bài cũng ko yêu cầu rõ ràng
ta vẽ 1 đoạn thằng BC nằm ngang
y= a
có chiều dài lẻ pixel

2. tính trung điểm của đoạn này, do đáy lẻ nên sẽ được 1 trung điểm chuẩn hơn
M(xm,ym)

3. tịnh tiến điểm này theo phương vuông góc với đáy được điểm A(xm+h,y);

4. dùng DDA nối A với B, A với C, được 1 tam giác cân như yêu cầu

5. dùng dòng quyét hoặc dầu loang để tô màu ko gian giữa tam giác đó

peterdrew
24-06-2010, 04:28 PM
Phải có thêm điều kiện (nhập) vào 1 cạnh nữa chứ?

langman
24-06-2010, 04:30 PM
Trời, nói rõ ra là tam giác *
tưởng vẽ tam giác

pó hand với các câu hỏi ko rõ ràng

tauit_dnmd
24-06-2010, 04:30 PM
anh peter ơi, bài này nằm trong chuơng các cấu trúc đk thui.
ko phải như anh tườg đâu.
ví dụ như xuất ra hình tam giác đc biểu diễn bằng các dấu "*" thôi
chỉ cần 1 biến thôi ạ,
thuộc loại cơ bản ạ,
hi, em chưa nghĩ ra cái thuật toán.

Sặc,Tam giác cân mà chỉ có chiều cao thì làm sao mà vẽ đc cha nội.Vậy h=5 thì bạn sẽ vẽ tam giác cân với cạnh đáy có độ dài bao nhiêu??
Phải có thêm cạnh đáy nữa chứ

hienclubvn
24-06-2010, 04:31 PM
hjx, anh langman ơi, đi quá xa rùi
như anh peter thôi. nội dung của bài là vậy, do em biểu diễn mà ko đc
như ví dụ đầu tiên của anh peter, nhưng là cân, chứ ko phải vuông cân.

hienclubvn
24-06-2010, 04:33 PM
hi, i'm sory anh langman nha,
tại em vẽ ra mà nó cứ bị dồn qua bên trái, lầm sau rút kinh nghiệm
:D

langman
24-06-2010, 04:41 PM
ý a

#include "iostream"
using namespace std;
#include "iomanip"

void main()
{
int h=9;
//nhap h
while (h)
{
cout.fill(' ');
cout<<setw(30-h)<<' ';
cout.fill('*');
cout<<setw(2*h---1)<<'*'<<endl;
}
system("pause");
}

đúng 1 biến ko hơn ko kém
(đây là trình bày dễ hiếu cứ ko thì chỉ cần 1 câu lệnh là ok )

langman
24-06-2010, 04:44 PM
nói có sách mách có chứng
1a. ngắn gọn

#include "iostream"
using namespace std;
#include "iomanip"

void main()
{
int h=9;
//nhap h
while (h)
cout<<setfill(' ')<<setw(30-h)<<' '<<setfill('*')<<setw(2*h---1)<<"*\n";
system("pause");
}

ý b

#include "iostream"
using namespace std;
#include "iomanip"

void main()
{
int h=9;
//nhap h
cout<<setw(29-h)<<' '<<setfill('*')<<setw(2*h--)<<"*\n"<<setfill(' ');
while (h)
cout<<setw(30-h)<<" *"<<setw(2*h---2)<<'*'<<(h==1?"\b ":"\n");
system("pause");
}

dinhha471
24-06-2010, 06:08 PM
hj` cái này là C căn bản thôi bạn..
cái này là suy ra từ hình vuông là ok thôi mà..

#include<stdio.h>
void main()
{
int h,i,j;
printf("nhap h: ");
scanf("%d",&h);
for(i=0;i<h;i++,putchar('\n'))
for(j=0;j<h;j++)
(j<h-i-1)?printf(" "):printf("* ");
}


là sv năm nhất nên toàn học đại cương ...chưa sờ mó chi C hết nên code đc có vậy..

langman
24-06-2010, 06:11 PM
hj` cái này là C căn bản thôi bạn..
cái này là suy ra từ hình vuông là ok thôi mà..

#include<stdio.h>
void main()
{
int h,i,j;
printf("nhap h: ");
scanf("%d",&h);
for(i=0;i<h;i++,putchar('\n'))
for(j=0;j<h;j++)
(j<h-i-1)?printf(" "):printf("* ");
}


là sv năm nhất nên toàn học đại cương ...chưa sờ mó chi C hết nên code đc có vậy..
tớ thấy người ta có nói yêu cầu là chỉ dùng 1 biến mà ?
nhưng mà code khá sáng tạo, rất tốt

dinhha471
24-06-2010, 06:27 PM
đọc chưa kĩ đề trừ 50% số điểm :(

hienclubvn
24-06-2010, 07:00 PM
hjx, thanks các bác.
em đâu có nói là phải dùng 1 biến đâu,
nhập vào là biến h (chiều cao), còn biến phát sinh thì tùy ý chứ.
anh @langman nè, em chạy đoạn Code của anh nhưng chưa thỏa , nó chưa thực sự cân, cân thì nó phải là các số lẻ, ví dụ dòng đầu là 1 *, thì dòng 2 phải 3 ***, còn của anh chỉ toàn là số chẵn thui,nên nhìn ko đẹp.

hienclubvn
24-06-2010, 07:04 PM
thanks @dinhha471 nha.
đoạn CODE rất tuyệt.
:D

sunshine
24-06-2010, 07:35 PM
các bạn làm dùm mình bài này nha.
bài 1:xuất ra màn hình tam giác cân với độ cao h nhập từ bàn phím
bài 2: tương tự như trên nhưng là tam giác rỗng ở giữa

hjx, cố biểu diễn cái tam giác ra mà ko đc. thông củm
(8-)>

Thấy mọi người nhiệt tình. Mình ghóp vui một tí.Mới làm được ý a thôi.Còn ý b chưa làm được. chờ mọi người giúp sau vậy.Nếu nghĩ được mình sẽ post tiếp


#include <stdio.h>
#include <conio.h>

void main ()
{
int i,j,n;
printf ("\n Nhap vao chieu cao :");
do {
scanf ("%d",&n);
if (n < 0)
printf ("\n Hay nhap lai (n > 0) :");

}while (n < 0);

for (i = 1;i <=n; i++)
{
printf ("%*c",n-i+1,' ');
for (j = 1;j <= 2*i -1 ; j++)
printf ("*");
printf ("\n");
}


getch ();
}

conrongchautien
24-06-2010, 08:10 PM
code bằng C nà

#include<stdio.h>
#include<conio.h>

void intamgiac(int h)
{
int i,j;
for(i=0;i<h;i++)
{
for(j=0;j<h+i-1;j++)
{
if(i<j) printf(" ");
else printf("*");
}
printf("\n");
}
}

void intamgiacrong(int h)
{
int i,j;
for(i=0;i<=h;i++)
{
for(j=0;j<h+i-1;j++)
{
if(i==j||j==h+i-1||i=n) printf("*");
else printf(" ");
}
printf("\n");
}
}
void main()
{
int h=5;
intamgiac(h);
intamgiacrong(h);
getch();
}

hienclubvn
24-06-2010, 08:29 PM
cảm ơn bạn shunshine nha, cái CODE mà tui mong đợi, có lẽ của bạn là phu hợp với trình độ " gà " của tui nhất.
:D

printf ("%*c",n-i+1,' ');
à, bạn giải thích đoạn này cho mình ró nha.
đối số %*c ở đây với ý nghĩa là gì?

hienclubvn
24-06-2010, 08:43 PM
bạn @conrongchautien ơi, bạn xem lại CODE của bạn nhé. có vấn đề rùi đó.
thứ 1: tam giác cân chứ ko phải vuông cân
thứ 2: tam giác rỗng có vấn đề.

dinhha471
24-06-2010, 08:50 PM
thử coi cái này nè:

#include<stdio.h>
void main()
{
int h,i,j;
printf("nhap h: ");
scanf("%d",&h);
for(i=0;i<h-1;i++,putchar('\n'))
for(j=0;j<2*h-1;j++)
((j==h-i-1)||(j==h+i-1))?printf("*"):printf(" ");
for(j=0;j<h;j++)
printf("* ");
}

@langmang : cái này là do ngưởi viết đề ko hiểu cái nào là biến cái nào là chiều cao nhập vào chứ ko phải là em lạc đề...ý của ngưởi viết đề là cái chiều cao là 1 biến đó ( cái này em cũng qua rồi :D)

hienclubvn
24-06-2010, 09:04 PM
và đây là đoạn CODE của em sau khi tham khảo các anh chị

#include<iostream>
#include<conio.h>
using namespace std;
int main ()
{
int h;
cout<<"h=";
cin>>h;
for (int i=1;i<=h;i++)
{
for(int j=1;j<=h-i;j++) cout<<" ";
for(int j=1;j<=2*i-1;j++) cout<<"* ";
cout<<endl;
}
getch();
return 0;
}

chạy ngon lành, và đúng như hình vẽ yêu cầu của bài toán, các hàng thẳng tăm tắp, dễ hiểu pk0?
:D

hienclubvn
24-06-2010, 10:04 PM
và đây là đoạn CODE của ý b

#include<iostream>
#include<conio.h>
using namespace std;
int main ()
{
int h;
cout<<"h=";
cin>>h;
for (int i=1;i<=h;i++)
{
if (i!=h)
{
for(int j=1;j<=h-i;j++) cout<<" ";
for(int j=1;j<=2*i-1;j++)
{
if ((j==1)||(j==2*i-1)) cout<<"* ";
else cout<<" ";
}
cout<<endl;
}
else for (int j=1;j<=2*h-1;j++) cout<<"* ";
}
getch();
return 0;
}

:D

hunterphu
24-06-2010, 10:07 PM
@langmang ....
các bạn trêu mod àh (:))

hienclubvn
24-06-2010, 10:11 PM
sao lại là trêu mod chứ.
anh hunterphu nói vậy lỡ may mod tưởng thật thì chít em mất. :D

langman
25-06-2010, 07:23 AM
hjx, thanks các bác.
em đâu có nói là phải dùng 1 biến đâu,
nhập vào là biến h (chiều cao), còn biến phát sinh thì tùy ý chứ.
anh @langman nè, em chạy đoạn Code của anh nhưng chưa thỏa , nó chưa thực sự cân, cân thì nó phải là các số lẻ, ví dụ dòng đầu là 1 *, thì dòng 2 phải 3 ***, còn của anh chỉ toàn là số chẵn thui,nên nhìn ko đẹp.
là do yêu cầu của cậu đưa ra quá khắt khe , 1 biến, thì chỉ được thế thôi, :D:D:D

donvuon
25-06-2010, 09:39 PM
các bạn làm dùm mình bài này nha.
bài 1:xuất ra màn hình tam giác cân với độ cao h nhập từ bàn phím
bài 2: tương tự như trên nhưng là tam giác rỗng ở giữa

hjx, cố biểu diễn cái tam giác ra mà ko đc. thông củm
(8-)>
Cho mình góp vui, cậu xem cái này liệu đúng ý cậu chưa nha.

#include <stdio.h>

void tamgiacdac(int n)
{
for (int k = 0; k < n; k++)
{
for (int j = 0; j < 2*n-1; j++)
if (j < n && k + j >= n-1 || j >=n && k > j-n)
printf("%c", '*');
else printf("%c", '-'); // Mình in ra '-' để dễ kiểm tra, cậu thay bằng 32 là ok liền (ở dưới cũng vậy nha).
printf("\n");
}
}

void tamgiacrong(int n)
{
for (int k = 0; k < n; k++)
{
for (int j = 0; j < 2*n-1; j++)
if (k == n-1 || j+k == n-1 || j-k == n-1)
printf("%c", '*');
else printf("%c", '-');
printf("\n");
}
}

void main()
{
tamgiacdac(10);
tamgiacrong(10);
}

ddatduong
26-06-2010, 10:53 AM
Code câu a:

/*thap tam giac*/
#include "stdio.h"
#include "conio.h"
main()
{
int n,i,j,dem;
printf("Nhap so tang thap: ");
scanf("%d", &n);
dem=0;
for (i=1;i<=n;i++)
{
for (j=1;j<=(n-dem-1);j++) printf(" ");
for (j=1;j<=(i+dem);j++) printf("*");
printf("\n");
dem=i;
}
getch();
}


Thêm đoạn code này ae xem thêm :D

/*thap so
1
232
34543
4567654
567898765
67890109876
7890123210987
890123454321098
90123456765432109
0123456789876543210
*/

#include "stdio.h"
#include "conio.h"
main()
{
int i,j,k,dem,tang,giua;
printf("Chuong trinh in ra tam giac so.\n");
printf("Nhap vao so tang thap: ");
scanf("%d", &tang);
dem=0;
for (i=1;i<=tang;i++)
{
for(j=1;j<=(tang-dem-1);j++) printf(" ");
giua=((i+dem)/2+1); //khoi tao gia tri moc doi xung
for (j=1;j<=giua;j++) printf("%d",(i+j-1)%10); //viet so tu i tang den giua
for (j=giua-1;j>=1;j--) printf("%d",(i+j-1)%10); //viet so tu giua ve i
printf("\n");
dem=i;
}
getch();
}

hienclubvn
28-06-2010, 11:46 AM
@ddatduong ơi , bạn có thể nói giải thuật của bài tháp số không? Mình test thì ok. Nhưng để hiểu và vận dụng nó thì không đơn giản .
Các bro cho em ý kiến luôn nha.
Giả sử gặp những bài toán tương tự thì phải làm sao?
điều gì mình cần quan tâm nhất ?

hienclubvn
29-06-2010, 10:48 AM
chào @ddatduong, sau 1 thời gian châm cứu, tôi đã ngộ ra đc giải thuật của bài tháp số. dựa trên cơ sở bài làm của bạn, cảm ơn bạn nhiều. bài này rất hay đó.
và CODE của nó t đã làm. dễ hiểu hơn bài của bạn là chắc. :D

// IN RA THAP S0
#include<iostream>
#include<conio.h>
using namespace std;
void thap_so(int n)
{
int i,j,moc; // moc o giua
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i;j++) cout<<" ";
moc=2*i-1;
for(j=i;j<=2*i-1;j++) cout<<j%10;
for(j=2*i-2;j>=i;j--) cout<<j%10;
cout<<"\n";
}
}
int main ()
{
int n=10;
cout<<"nhap chieu cao thap:";
cin>>n;
thap_so(n);
getch();
return 0;
}

ddatduong
29-06-2010, 01:22 PM
/*thap so
1
232
34543
4567654
567898765
67890109876
7890123210987
890123454321098
90123456765432109
0123456789876543210
*/
Nhìn tháp số thì ta có thể thấy mỗi hàng đều là một số lẻ các chữ số (1,3,5,7,9...), vì vậy mà mình lấy một mốc ở giữa mỗi hàng (biến giua theo code của mình) để làm mốc và sau đó viết viết mỗi số lên mỗi hàng và để ý rằng mỗi hàng đều bắt đầu bằng con số của hàng đó (VD hàng 1 thì bắt đầu hàng là 1, hàng 2 bắt đầu bằng 2) và viết số tăng dần cho đến giữa, còn từ giữa trở đi thì viết ngược lại cho đến số của đầu hàng.
Chuyện gì sẽ xảy ra nếu số tầng lớn hơn 9??? Vì khi là 10 hoặc 1 số có 2 chữ số thì tương ứng sẽ có bấy nhiêu hàng, khi đó thì chương trình sẽ viết ra 2 chữ số (VD hàng 10 bắt đầu là 10-11-12-13 đúng không?) vì vậy mà ta lấy phần dư của nó với 10.
Đó là thuật toán của mình.
@bài bạn cũng rất hay, bạn giản lược bớt code của mình một số biến không cần thiết nên làm cho code sáng sủa và dễ hiểu hơn. Thanks bạn!

duongtk77
06-11-2010, 10:56 PM
Có bác nào có code như yêu cầu trên mà là tam giác vuông rỗng không cho em với

kill-you
11-11-2013, 04:36 PM
for(i=0;i<h;i++)
{
for(j=0;j<h+i-1;j++)
{
if(i>j) printf("*");
else printf(" ");
}
printf("\n");
}


Ai giải thích cho mình cái code tam giác * này với. j biểu diễn cho cái gì và tại sao là j<h+i-1?

khi dán vào ct, nhập h = 7 nó ra kết quả như vậy:


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

kill-you
13-11-2013, 10:59 PM
Ai giải thích cho mình cái code tam giác * này với. j biểu diễn cho cái gì và tại sao là j<h+i-1?

khi dán vào ct, nhập h = 7 nó ra kết quả như vậy:


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

somebody can help me~~~~~~~~~~~?