PDA

View Full Version : Chương trình in tam giác * trên C



kidkid
19-11-2006, 09:06 PM
Mình đang bối rối chỗ viết 1 chương trình in tam giác * có dạng
*
* *
* *
* * * * * * với chiều cao nhập vào từ bàn phím . Tam giác này ứng với n=4

Hiện tại mình đã làm dạng
* *
*** **
***** ***
Các bạn thử coi (D:)>

Kevin Hoang
19-11-2006, 09:17 PM
Bà con quen rồi, Mẫu viết tiêu đề điền ngay trước mắt cũng không nhìn luôn

In Tam giác mà chỉ cho mỗi chiều cao thôi sao? Bài này dễ mà, hình như Pete làm bài giống như thế này ở một Topic trước đó rồi thì phải.

Xcross87
19-11-2006, 10:36 PM
Cái bài số 1 của bạn pete chả hiểu nó ra làm sao ..> chả thấy logic gì cả .
Bài số 2 thì dễ rồi , làm cho chạy 1 lượt 3 tham số quét * là xong
* i cho quét dòng
* j cho quét tam giác phía trước
* k cho tam giác phía sau

:D

kidkid
20-11-2006, 08:41 PM
Ối chán thiệt tớ viết 1 đường mà đưa vào diễn đàn hiện ra một nẻo
Thế này thì toi .
Ý mình là hiện ra tam giác thế này . Giả sử A là khoảng trắng .
aaaaa*
aaaa*a*
aaa*aaa*
aa*aaaaa*
a*aaaaaaa*
**********
Đấy tam giác trên là ứng với chiều cao n=6 // có nghĩa là có 6 dòng .
Pete làm rồi cho mình coi scource đi .

Xcross87
20-11-2006, 08:55 PM
for ( row = 1 ; row < n ; row ++ )
{
for ( draw_a = 1 ; draw_a < n - i ; draw_a ++ ) printf("a");
for ( draw_ask = 1 ; draw_ask <= 2*(i-1)+1 ; draw_ask++ )
{
if ( ( draw_ask == 1 ) || ( draw_ask == 2*(i-1)+1 ) ) printf("*");
else printf("a");
}
}
for ( ; i < n+1 ; i++ ) for ( draw_ask = 1 ; draw_ask < 2*n ; draw_ask++, printf("*") ) ;



body là như thế :D

Còn lại bạn xử lý nốt nhé ^o^

t2d2c2
22-11-2006, 05:22 PM
Mình đang bối rối chỗ viết 1 chương trình in tam giác * có dạng
*
* *
* *
* * * * * * với chiều cao nhập vào từ bàn phím . Tam giác này ứng với n=4

Hiện tại mình đã làm dạng
* *
*** **
***** ***
Các bạn thử coi (D:)>

Nếu chỉ cần chiều cao.Thì nó là tam giác cân.Đỉnh cao nhất là 1 * . Sau đó nở dần ra.
Bài này là tam giác cân nên ý tưởng cũng đơn giản,nó tập cho bạn use vòng lập for thôi.
Bạn dùng các vòng lập for lồng vào nhau.
- Cho 1 biến i chẳng hạn,chạy từ 1 đến n ( chiều cao ).
- Một biến j chạy thừ 1 đến < i .
- Sau đó in ra * vào khoảng trắng thích hợp.
==========================
Bài này đơn giản,bạn tự code nha.

++++++++++++++++++++++
+ Mới học C nửa ngày. +
+ HVA Exploitation. +
++++++++++++++++++++++

kidkid
22-11-2006, 07:39 PM
Gởi Pete : Pe te có thể giải thích cho mình được không mình không hiểu sao khi biên dịch lại chạy không chính xác vả lại mình cũng không rõ lắm về ý nghĩa của code trên

Kevin Hoang
22-11-2006, 07:58 PM
Bạn nên đưa các hình vào tag code thì nó mới giữ được vị trí, nếu không người trả lời sẽ bị nhầm.(Dreaminess cũng bị nhầm)

Làm như code của Pete cũng được, nhưng đã sử dụng quá nhiều vòng lặp for.

Ở đây Dreaminess giúp bạn làm việc chỉ với 1 vòng lặp mà thôi. Xem nhé:


#include<stdio.h>
#include<conio.h>
int main()
{
int i,n;
printf("Nhap n: ");
scanf("%d",&n);

for(i=1;i<=n;i++)
{
{ /*<--Khối này dùng để in cạnh tam giác */
gotoxy(n-i+1,i+3);
putchar('*');
gotoxy(i+n-1,i+3);
putchar('*');
}

/*Phần còn lại là in đáy */
gotoxy(i+1,n+3);
putchar('*');
gotoxy(n-2+i,n+3);
putchar('*');
}
return 0;
}

Xcross87
22-11-2006, 10:57 PM
@dreaminess : pete toàn xài Dev-C++ không có thư viện conio.h chuẩn nên không xài được gotoxy() :D cho nên mới phải vẽ thế kia ^o^

Kevin Hoang
23-11-2006, 12:05 AM
Uh nhỉ cái thằng gotoxy() nó lại là của conio.h, nếu dùng VC++6 cũng không có. Nhưng không sao, sau đây Dreaminess vẽ ra một cách nữa, mà có thể compiling bằng bất cứ Compiler nào. Xem nhé



#include<stdio.h>
int main()
{
int i,j,n;
printf("Nhap n: ");
scanf("%d",&n);

for(i=1;i<=n;i++)
{
for(j=1;j<=n+i-1;j++)
{
if(i==n) /* Nếu là đáy */
putchar('*');
else if((n+1==i+j)||(n-1==j-i)) /*Để in cạnh*/
putchar('*');
else
putchar(' ');
}
putchar('\n');
}
return 0;
}

Trông cũng khá chứ nhỉ?

@Pete: Vẫn đang nghiên cứu cái bài Text_game đó, nhưng mà chưa nghĩ ra cách làm hiệu quả, đành ngồi làm bài này giải trí vậy. Biết đâu lại tìm được cái gì đó? Nhưng mà lần này thì không. Chuối.

Xcross87
23-11-2006, 03:03 PM
Tại ông thầy máu lên bắt học sinh toàn làm bài tập cử chuối ... Đã thế còn phải làm 1 cái project mà đến giờ vẫn chưa bắt tay làm trong khi sắp hết hạn -_-! ..... Đau cả đầu

kidkid
25-11-2006, 10:02 PM
Uhm cảm ơn mọi người lắm , đang định hỏi cái ni mà phải về rồi để ít hôm nữa ngâm cứu xong tớ post lên ha

thinhCN
26-11-2006, 12:15 AM
lỗi của bạn mình cũng đã từng gặp hồi đầu sử dụng Pascal ý, cái này là do vòng lặp For quản lý kô chính xác nên vị trí của các dấu in ra hơi sai vị trí.Bạn nên quan niệm rằng khi in ra cái tam giác như của bạn thì cũng giống như in một hình vuông với nửa đầu là dấu cách trống,còn nửa sau là dấu sao. Chúc bạn may mắn !

kidkid
01-12-2006, 10:44 AM
hèm scoure của D mình phải bỏ dòng return(0) ở cuối sau đó thêm getch(); vào nữa mới được không bít sao lạ thế .

kidkid
01-12-2006, 11:06 AM
hèm scoure của D mình phải bỏ dòng return(0) ở cuối sau đó thêm getch(); vào nữa mới được không bít sao lạ thế .

Kevin Hoang
01-12-2006, 11:56 AM
return 0 có hay không chương trình vẫn chạy bình thường, nhưng nếu bạn dùng turbo C thì cần thiết phải đưa getch(); là để dừng lại chờ nhập một phím bất kỳ mới thoát. Khi đó bạn có thể xem kết quả trên màn hình.

Có getch(); hay không chương trình vẫn được thực hiện bình thường, nhưng bạn không nhìn thấy kết quả vì nó thoát luôn mà. Thường thì với một chương trình C tương đối người ta sẽ phải làm menu hoặc commandline để thoát chứ không có viết xuông như vậy.

kidkid
04-12-2006, 06:46 PM
kid ngoài chơi một chặp vì đang nghiên cứu mảng , thì tự nhiên nghĩ ra được cách viết khác , tuy hơi ... nhưng thấy cũng được , không cần đến gotoxy() đơn giản chỉ dùng for và if else thui ....



for (i=1 ; i<n; i++)
{
for(j=i;j<n;j++)
printf(" "); // cái này dùng in khoảng trắng
for(j=1;j<2*i;j++)
{
if ( j==1 ||j==2*i-1) // in cạnh tam giác
printf("*");
else printf(" "); // in phần rỗng phía trong
}
printf("\n");
for (i=1;i<=2*n-1;i++)
printf("*"); // cái này dùng in đáy
}


Mọi người coi thử như thế có ổn không ?
Mình còn nghĩ ra cách tạo ra 3 tam giác nhưng vẫn còn nhiều vướng mắc để hôm nào đưa code lên mọi người thảo luận giúp xem sao

Kevin Hoang
04-12-2006, 11:21 PM
Mọi người coi thử như thế có ổn không ?
Mình còn nghĩ ra cách tạo ra 3 tam giác nhưng vẫn còn nhiều vướng mắc để hôm nào đưa code lên mọi người thảo luận giúp xem sao

Cũng được, cái chính là Dreaminess thấy bạn đã hiểu được vấn đề rồi đó

online125
05-12-2006, 04:08 PM
sẵn đây bác chỉ giùm em cách để những khoảng trắng bên trong tam giác
---> "*".Cảm ơn

PoPoPoPo
05-12-2006, 04:19 PM
Ý tưởng về cái Game_Text cũng hay đó nhỉ, chả cần phải đồ họa gì cho mệt, cứ các kí tự ghép với nhau thôi.
Mình nhớ không nhầm là có bộ phim star_war gì đó được dựng hoàn toàn bằng các kí tự text đó.
Sẵn đây mời mọi người tham gia lập trình cái trò chơi Ô ăn quan!
Chúc vui vẻ!

kidkid
05-12-2006, 07:17 PM
Ý bạn là làm thành 1 tam giác đặc luôn chứ gì , có phải là dạng thế này không


*
***
*****


Nếu vậy thì bạn coi lại đi phía trên có code rồi mà .
Còn nếu í bạn là chuyển chỗ trống trong tam giác thành 1 kí tự bất kì ví dụ như 'a' thì bạn sữa lại chỗ này :



for (i=1 ; i<n; i++)
{
for(j=i;j<n;j++)
printf(" "); // cái này dùng in khoảng trắng
for(j=1;j<2*i;j++)
{
if ( j==1 ||j==2*i-1) // in cạnh tam giác
printf("*");
else printf("a"); // chuyển phần rỗng phía trong thành a}
printf("\n");
for (i=1;i<=2*n-1;i++)
printf("*"); // cái này dùng in đáy
}


Tớ còn gà lắm , vì mới bập bẹ học nên có thể phương án của tớ không cool như D hay pete , cậu có thắc mắc thì hỏi mọi người giúp cho :)

shinichi_haha
05-12-2006, 07:52 PM
Nhân sự kiện Noel sắp tới sẵn tiện bài này các bạn thử làm bài này xem
Nhập vào chiều cao n in ra cây thông n tầng.
Ví dụ n=3 màn hình sẽ là.


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

kidkid
06-12-2006, 02:44 PM
Hèm để tớ nghiên cứu thử xem , thế nếu làm ra thì D có tặng thưởng gì không nhỉ ? Mọi người đừng cười vì đề bài dễ ha , với tui thì khó quá chời à.

PoPoPoPo
06-12-2006, 03:29 PM
Bài này thì chỉ dùng vòng for thôi:
-với đầu vào N thì in ra n tầng :
+tầng trên cùng là tam giác có 2 hàng
+tầng tiếp theo có 3 hàng
+..
+tầng dưới cùng có (n+1) hàng.
Vậy thì
for(i=1;i<=n;i++)
{
intamgiac(i+1);
}
Còn hàm intamgiac(int n);
thì chúng ta đã thảo luận xong trên đây.

Xcross87
06-12-2006, 05:01 PM
Mấy cái này làm chỉ để luyện vòng for thôi. ... các bác đầu óc một chút ..:D
Nghiên cứu cái này mất thời gian ... :D .. Sao không viết game = C đi .. Cứ ngồi làm máy cái này thì học co' tác dụng gì :D

kidkid
07-12-2006, 01:27 PM
Hay thế vậy mà mình ngồi viết ra cái ni , dở thiệt nhưng cứ thử đưa lên xem sao , nhưng mà pete này , cũng phải luyện từ từ lên chứ như tụi newbie bọn tớ thì làm sao viết game được ... Nếu pete có ý kiến thì pete kiếm cái để nào đơn giản viết đưa lên cho bọn gà như tớ học hỏi thì tuyệt hơn nhiều .


#include <stdio.h>
main()
{
int tang,m,i,j;

printf("nhap so tang: ");
scanf("%d",&tang);

for(m=1;m<=tang;m++) // số tầng cần in
{
for(i=0;i<m+1;i++) // chiều cao mỗi tầng
{
for(j=0;j<tang-i;j++)// Khoảng trắng cho mỗi hàng của tầng
printf(" ");
for(j=0;j<2*i+1;j++) // Lượng sao cần in trong mỗi hàng của tầng
printf("*");
printf("\n")
}
}
}

Xcross87
07-12-2006, 07:07 PM
pete cũng là newbie thôi mới học C được có 13 tuần :D ... nhưng cũng kha khá ^_^!

shinichi_haha
07-12-2006, 07:20 PM
Tiện thể đổi đề một chút n=4 cây như vậy


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

Xcross87
07-12-2006, 07:31 PM
Tiện thể đổi đề một chút n=3 cây như vậy


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




Illogical ... cho thêm ví dụ n = 4 , 5 , 6 xem như thế nào ?

shinichi_haha
07-12-2006, 07:47 PM
@pete_87: Rồi mình edit lại ở trên rồi đó

kidkid
08-12-2006, 09:27 AM
ặc pete học được 13 tuần rùi hả , thế thì hơn mình , mình mới 2 tuần chưa tới , he he , phải cố gắng mới bắt kịp pete thui , nhưng mà chán quá mình hiện không có máy tính nên học cái gì cũng khó ...

kidkid
08-12-2006, 09:46 AM
Còn cái cây thông trên của shinichi thì mình tính thế này , nếu tang =1 thì in ra cây thông noen 1 tầng có chóp , nếu lớn hơn 1 thì in tiếp các tầng khác nhưng không có chóp. Không biết có được không nhỉ .

anhhungnup
08-12-2006, 02:46 PM
Tặng bạn cái này coi chơi: (Chẳng biết sao khi post lên nó ra vậy nữa, nhưng không sao bạn hãy copy về chạy thử coi.)


#include<stdio.h>
#include<conio.h>
#include<string.h>
int i,j,n,x;
void gioithieu()
{
char chuoi[] = "C H U O N G T R I N H I N S A O";
textcolor(YELLOW);
gotoxy((80-strlen(chuoi))/2,3);
cprintf("%s\n\n",chuoi);
}

int nhapn(int &n)
{
printf("\n\nNhap vao chieu cao cau tam giac (3 ->15):");scanf("%d",&n);
return n;
}

void insaoa()
{
printf("\n");
for (i=0; i<n; i++)
{
for (j=0; j<=i; j++)
printf("*");
printf("\n");
}
}

void insaob()
{
printf("\n");
for (i=0; i<n; i++)
{
for (j=n-1; j>=i; j--)
printf("*");
printf("\n");
}

}
void insaoc()
{
printf("\n");
for (i=0; i<n; i++)
{
for (j=n-1; j>i; j--)
printf(" ");
for (j=0; j<=i; j++)
printf("*");
printf("\n");
}
}

void insaod()
{
printf("\n");
for (i=0; i<n; i++)
{
for (j=0; j<i; j++)
printf(" ");
for (j=n-1; j>=i; j--)
printf("*");
printf("\n");
}
}

int luachon(int &x)
{
printf("\n\nNhap vao lua chon cua ban: ");scanf("%d",&x);
return x;
}
void main()
{
clrscr();
char chon;
do
{
clrscr();
gioithieu();

printf("\n\n* *** * ***\n** ** ** **\n*** * *** *\n\n 1 2 3 4");
nhapn(n);
luachon(x);
switch(x)
{
case 1:insaoa();break;
case 2:insaob();break;
case 3:insaoc();break;
case 4:insaod();break;
case 5:insaoa();insaob();insaoc();insaod();break;
default: printf("\n\nVui long nhap lai");
}
printf("\n\nBan muon tiep tuc khong? (Y/N)");
chon=getche();
}while(chon=='Y'||chon=='y');
}

anhhungnup
08-12-2006, 03:24 PM
* *** *** *
** ** ** **
*** * * ***
(a) (b) (c) (d)

Mình đã in ra được a,b,c,d nhưng chỉ được từng cái một thôi, nếu in hết bốn cái thì nó hiện theo hàng dọc, mình mong anh em thỉnh giáo chỉ mình cách một lần in bốn cái theo ngang. Giả sử chọn 1 và 8 thì in hình a, có chiều cao bằng 8. Nếu chọn 5 thì in all.

Và chỉ xử dụng vòng lặp thôi nha các bạn, không xài mảng.

Và mìnḥ sẽ vô cùng biết ơn các anh em nếu giúp mình ̣ hòan thành bài này.
Cái này để ở đây có vẻ hợp lý hơn là tạo topic mới. (shinichi_haha)

PoPoPoPo
10-12-2006, 03:57 PM
Muốn in đúng vị trí thì dùng gotoxy() coi!

Kevin Hoang
10-12-2006, 06:45 PM
Mấy hôm nay Dreaminess có việc bận nên chắc không ngồi viết được nhưng Dreaminess thấy thế này:
- Nhìn kỹ chút là thấy cái điều kỳ diệu ngay đó là: Tổng số ký tự * trên một hàng là bằng nhau đó. (Cứ thử kiểm tra xem có đúng không nhé)
- Không cần dùng gotoxy cũng có thể viết được đó. Thử xem?

Chúc may mắn. Hi vọng là câu trả lời không bị trễ. he he

kidkid
10-12-2006, 09:44 PM
hèm giờ nếu mình muốn làm 1 ngôi sao nhấp nháy thì sao nhỉ , mọi người giúp cái coi vì mình không biết lắm về đồ họa

Xcross87
11-12-2006, 01:48 PM
Sao nhấp nháy ... tại điểm (x,y)



void BlinkStar(int x, int y)
{
do {
goto(x.y); putchar(' ');
goto(x.y); putchar('*');
sleep(100); // nháy 1 s
if (kbhit()) (char)key = getch();
} while ( key != 27 );
}

Xcross87
11-12-2006, 01:49 PM
Sao nhấp nháy ... tại điểm (x,y)



void BlinkStar(int x, int y)
{
do {
goto(x.y); putchar(' ');
goto(x.y); putchar('*');
sleep(100); // nháy 1 s
if (kbhit()) (char)key = getch();
} while ( key != 27 );
}

anhhungnup
11-12-2006, 06:13 PM
Sao khi nghiên cứu thì mình đã làm ra rồi cám ơn các bạn đã giúp mình.

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

void gioithieu();
int nhapn(int &n);
void insaoa(int n);
void insaob(int n);
void insaoc(int n);
void insaod(int n);
void inhet(int n);
void luachon(int &x,int n);

void gioithieu()
{
char chuoi[] = "C H U O N G T R I N H T A M G I A C";
textcolor(YELLOW);
gotoxy((80-strlen(chuoi))/2,3);
cprintf("%s\n\n",chuoi);
printf("\n* *** *** *\n** ** ** ** 5.In tat ca\n*** * * ***\n\n 1. 2. 3. 4.");
}

int nhapn(int &n)
{
printf("\n\nNhap vao chieu cao cua tam giac (2 -> 19):");scanf("%d",&n);
return n;
}

void insaoa(int n)
{
int dong,sao;
printf("\n");
for (dong=1; dong<=n;dong++)
{
for (sao=1; sao<=dong; sao++)printf("*");
printf("\n");
}
}

void insaob(int n)
{
int dong,sao;
printf("\n");
for (dong=1; dong<=n; dong++)
{
for (sao=n; sao>=dong; sao--)printf("*");
printf("\n");
}
}

void insaoc(int n)
{
int dong,sao,trang;
printf("\n");
for (dong=1; dong<=n; dong++)
{
for(trang=1; trang<=dong;trang++)printf(" ");
for (sao=n; sao>=dong; sao--)printf("*");
printf("\n");
}

}

void insaod(int n)
{
int dong,sao,trang;
printf("\n");
for (dong=1; dong<=n; dong++)
{
for (trang=n; trang>dong; trang--)printf(" ");
for (sao=1; sao<=dong; sao++)printf("*");
printf("\n");
}
}

void inhet(int n)
{
int dong,sao,trang;
printf("\n");
for(dong=1; dong<=n; dong++)
{
for(sao=1; sao<=dong; sao++)printf("*");
for(trang=n-dong+1; trang>=1; trang--)printf(" ");
for(sao=n; sao>=dong; sao--)printf("*");
for(trang=1; trang<=dong; trang++)printf(" ");
for(trang=1; trang<dong; trang++)printf(" ");
for(sao=n-dong+1; sao>=1; sao--)printf("*");
for(trang=n-dong+1; trang>=1; trang--)printf(" ");
for(sao=1; sao<=dong; sao++)printf("*");
printf("\n");
}
}

void luachon(int &x,int n)
{
printf("\n\nNhap vao hinh dang cua tam giac can in ra man hinh: ");scanf("%d",&x);
switch(x)
{
case 1:insaoa(n);break;
case 2:insaob(n);break;
case 3:insaoc(n);break;
case 4:insaod(n);break;
case 5:inhet(n);break;
default: printf("\n\nVui long nhap lai.");
}
}

void main()
{
clrscr();
char chon;
int n,x;
do
{
clrscr();
gioithieu();
nhapn(n);
luachon(x,n);
printf("\n\nBan muon tiep tuc khong? (Y/N)");
chon=getche();
}while(chon=='Y'||chon=='y');
}

kidkid
13-12-2006, 01:29 PM
pete giải thích mình cái này coi

sleep(100); // nháy 1 s
if (kbhit()) (char)key = getch();

hèm ....khó hiêu cái kbhit quá , với lại (char)key

Xcross87
13-12-2006, 09:30 PM
sleep(100) : dừng lại 0.1 s
kbhit() : nhận sự kiện bàn phím .. check xem có phím bấm không.

kidkid
15-12-2006, 02:36 PM
thế nếu mình muốn dừng lại 0.2s thì sleep(200) hả

olala
16-12-2006, 07:14 PM
đơn vị ở đây là ms đó bạn ( 1/1000 giây )
do vậy bạn thích dừng bao nhiêu tùy bạn:
sleep(100): dừng 0.1s
sleep(200): dừng 0.2s
sleep(500): dừng 0.5s
...

huynguyen
22-12-2006, 01:48 AM
* *** *** *
** ** ** **
*** * * ***
(a) (b) (c) (d)

Mình đã in ra được a,b,c,d nhưng chỉ được từng cái một thôi, nếu in hết bốn cái thì nó hiện theo hàng dọc, mình mong anh em thỉnh giáo chỉ mình cách một lần in bốn cái theo ngang. Giả sử chọn 1 và 8 thì in hình a, có chiều cao bằng 8. Nếu chọn 5 thì in all.

Và chỉ xử dụng vòng lặp thôi nha các bạn, không xài mảng.

Và mìnḥ sẽ vô cùng biết ơn các anh em nếu giúp mình ̣ hòan thành bài này.
Cái này để ở đây có vẻ hợp lý hơn là tạo topic mới. (shinichi_haha)
Đề bài là vẽ tam giác những mình chuyển ý tưởng thành vẽ 1 cái hình vuông với 1 nửa là tam giác * và 1 nửa là tam giác khoảng trắng (cái này ko cấm :D) Về thì xuất theo hàng ngang sẽ có dạng là (b là ký tự koảng trắng)


*bb [tab] *** [tab] *** [tab] bb*
**b [tab] b** [tab] **b [tab] b**
*** [tab] bb* [tab] *bb [tab] ***