Προς το περιεχόμενο

Πρόβλημα στην C


sarakinos

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παιδιά...μπήκε μια ιδέα στο μυαλό μου και σκέφτηκα να δώ αν μπορώ να την υλοποιήσω..γνωρίζω τα βασικά στην C αλλά είμαι σχετικά νέος στον χώρο..

Το προγραμματάκι που κάνω κάνει τα εξής:

Εμφανίζει ένα μενού με 2 επιλογές (τριγονο,έξοδος).ο χρηστης επιλέγει μια από τις 2 επιλογές δίνοντας τον αντίστοιχο αριθμό και έπειτα έχουμε μια switch με τις 2 cases.Επιλέγοντας 1 θα του ζητάται η πλευρά του τριγώνου και μετά θα σχηματίζει ένα τρίγωνο στην οθόνη (ένα σύνολο από * δηλαδή σε σχήμα τριγώνου).

Το θέμα είναι πως έχω κολήσει και δεν μπορώ να φανταστώ πως μπορεί να γίνει αυτό.Πχ αν ορίσουμε πλευρά 3 , το σχήμα θα αποτελείται απο 9 αστεράκια (*) σε διάταξη:

----*

--* * *

* * * * *

Δοκιμάζω με διάφορους τρόπους όπως με πίνακες,με for αλλά δεν καταφέρνω να το κάνω.

Αν έχει κάποιο παιδί την διάθεση να ασχοληθεί θα το εκτιμούσα γιατι κόλησα :(

Δημοσ.

Προτίμησε το τετράγωνο (το τρίγωνο δεν σχηματίζεται καλά), οπότε ένα nested loop, δηλαδή μία for μέσα σε μία άλλη θα σου κάνουν αυτό που θες πολύ εύκολα.

Δημοσ.

δεν γίνεται αυτό που περιγράφεις

γίνεται αυτό που σου γράφει ο PCharon

 

πρόσεξε το σχήμα σου

ορίσουμε πλευρά 3

γίνεται τρίγωνο με 3 σειρές, όχι 3 πλευρές

.

Δημοσ.

Μια πολύ γρήγορη λύση σε ANSI-C είναι η εκμετάλλευση των δυνατοτήτων στοίχισης που μας προσφέρει η ρουτίνα printf (και φυσικά η αδελφή της η sprintf).

 

Με την βοήθεια της μπορούμε να σχεδιάσουμε ένα τρίγωνο στην κονσόλα εύκολα, εκτυπώνοντας τους χαρακτήρες (που αυξάνονται X+=2 σε κάθε νέα γραμμή Y) κεντραρισμένους είτε αριστερά (%40s) είτε δεξιά (%s), δημιουργώντας ένα οπτικό εφφέ τριγώνου (καθρέφτης) –για περισσότερες λεπτομέρειες συμβουλέψου το source-code μου.

 

Ο παρακάτω κώδικα επιδεικνύει αυτό το τέχνασμα, απαιτεί κονσόλα με ρυθμό χαρακτήρων (mode) 80x25.

 

>
//-Τρίγωνο με ASCII (c)Directx.----------------------------------------------

#include <stdio.h>
#include <string.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif

//---------------------------------------------------------------------------
void _DrawT(int nRow);

#ifdef __BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
_DrawT(10);

getchar();
return 0;
}
//---------------------------------------------------------------------------
void _DrawT(int nRow)
{
/*
 * Directx: Σχεδίασε ένα τρίγωνο με την ANSI-C
 *			Για ρυθμό κειμένου 80x25.
 */
int	Y, X;
char szBuf[bUFSIZ] = "";

/* Εκτύπωση κάθε γραμμής μέχρι nRow */
for(Y = 0, X = 1; Y < nRow; Y++)
 {
	/* Καθαρισμός szBuf */
	memset(&szBuf, 0, sizeof(szBuf));
	/* Γέμησε το szBuf με '*' για Χ φορές */
	memset(&szBuf, '*', X);

	/*
	 * Τρικ: %40s στοίχισε στο κέντρο προς τα αριστερά το szBuf
	 *		 %s στοίχισε στο κέντρο προς τα δεξία το szBuf
	 *		 (δημιουργούμε έναν καθρέφτη -mirror)
	 */
	printf("%40s%s\n", szBuf, szBuf);

	/* Αύξηση των χαρακτήρων προς εκτύπωση στην νέα γραμμή */
	X+=2;
 }
}

 

Το αποτέλεσμα στην κονσόλα είναι:

 

>
                                      **
                                    ******
                                  **********
                                **************
                              ******************
                            **********************
                          **************************
                        ******************************
                      **********************************
                    **************************************

 

* Ο κώδικας αυτός προϋποθέτει ότι γνωρίζεις εκ των προτέρων το κέντρο της γραμμής του πρώτου χαρακτήρα με βάση τις διαστάσεις της κονσόλας σου.

 

* Μια πιο πολύπλοκη λύση (ώστε να έχεις το ποθητό αποτέλεσμα που περιγράφεις) είναι η ανάπτυξη μιας ρουτίνας που θα κάνει αυτόματα την στοίχιση κάθε χαρακτήρα στο buffer (πχ μετακινώντας κατά ανάλογες θέσεις τα ‘*’ και προσθέτοντας κενά –μια insert δηλαδή..) ώστε να δημιουργείται το ανάλογο κεντραρισμένο τρίγωνο (μιας και από ότι κατάλαβα θες κάτι τέτοιο –διαφορετικά η λύση είναι πολύ πιο απλή).

 

Αυτά από εμένα, αν σε ενδιαφέρει η σχεδίαση ANSI τετραγώνου, ψάξε σε παλαιότερα posts μου στο παρόν φόρουμ.

 

Καλή συνέχεια!

 

Υ.Γ.

Ο κώδικας αναπτύχθηκε ως ANSI - C σε CodeGear C++ Builder για κονσόλα 80x25 των Windows XP, φυσικά μπορεί να περιέχει bugs ή άλλες αβλεψίες.

Δημοσ.

Μια πρόχειρη (περίπλοκη?) λύση είναι κι αυτό (αν και το παραπάνω είναι υπερβολικά πιο εύκολο)

 

>#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>
#include <termios.h> 
#include <unistd.h>

int mygetch(void);
void gotoxy(int x, int y);
void clearscr(int x);

void gotoxy(int x, int y)
{
printf("%c[%d;%df",0x1B,y,x);
}

void clearscr(int x)
{
int i;

gotoxy(1, 1);
for (i=0; i<x; i++)
{
	printf("\n");
}
}

int mygetch(void)
{
struct termios oldt, newt;
int ch;

tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );

return ch;
}


int main()
{
int choice,i ,j, z;
char side[3];

choice = 0;
clearscr(50);
while (choice != '2')
{
	gotoxy(1, 1); printf("1. Eisagwgi pleyras                                             ");
	gotoxy(1, 2); printf("2. Eksodos                                                      ");
	gotoxy(1, 3); printf("Epilogi :                                                       ");
	choice = mygetch();
	
	if (choice == '1')
	{
		gotoxy(1, 4); printf("Pleyra trigwnou :                                           ");
		scanf("%s", &side);

		clearscr(50);
		z = 0;
		for (i=atoi(side); i>0; i--)
		{
			z++;
			gotoxy(z, i);
			for (j=0; j<((i*2)-1); j++)
			{
				printf("*");
			}
		}
		mygetch();
		mygetch();
		clearscr(50);
	}
	else if (choice != '2')
	{
		gotoxy(1, 1); printf("Lathos epilogi. Dwse ksana.                                 ");
		gotoxy(1, 2); printf("                                                            ");
	}
}

return (0);
}

 

Δοκιμασμένο σε Cygwin / GCC.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...