sarakinos Δημοσ. 19 Νοεμβρίου 2008 Δημοσ. 19 Νοεμβρίου 2008 Καλησπέρα παιδιά...μπήκε μια ιδέα στο μυαλό μου και σκέφτηκα να δώ αν μπορώ να την υλοποιήσω..γνωρίζω τα βασικά στην C αλλά είμαι σχετικά νέος στον χώρο.. Το προγραμματάκι που κάνω κάνει τα εξής: Εμφανίζει ένα μενού με 2 επιλογές (τριγονο,έξοδος).ο χρηστης επιλέγει μια από τις 2 επιλογές δίνοντας τον αντίστοιχο αριθμό και έπειτα έχουμε μια switch με τις 2 cases.Επιλέγοντας 1 θα του ζητάται η πλευρά του τριγώνου και μετά θα σχηματίζει ένα τρίγωνο στην οθόνη (ένα σύνολο από * δηλαδή σε σχήμα τριγώνου). Το θέμα είναι πως έχω κολήσει και δεν μπορώ να φανταστώ πως μπορεί να γίνει αυτό.Πχ αν ορίσουμε πλευρά 3 , το σχήμα θα αποτελείται απο 9 αστεράκια (*) σε διάταξη: ----* --* * * * * * * * Δοκιμάζω με διάφορους τρόπους όπως με πίνακες,με for αλλά δεν καταφέρνω να το κάνω. Αν έχει κάποιο παιδί την διάθεση να ασχοληθεί θα το εκτιμούσα γιατι κόλησα
PCharon Δημοσ. 19 Νοεμβρίου 2008 Δημοσ. 19 Νοεμβρίου 2008 Προτίμησε το τετράγωνο (το τρίγωνο δεν σχηματίζεται καλά), οπότε ένα nested loop, δηλαδή μία for μέσα σε μία άλλη θα σου κάνουν αυτό που θες πολύ εύκολα.
gtroza Δημοσ. 19 Νοεμβρίου 2008 Δημοσ. 19 Νοεμβρίου 2008 δεν γίνεται αυτό που περιγράφεις γίνεται αυτό που σου γράφει ο PCharon πρόσεξε το σχήμα σου ορίσουμε πλευρά 3 γίνεται τρίγωνο με 3 σειρές, όχι 3 πλευρές .
Directx Δημοσ. 19 Νοεμβρίου 2008 Δημοσ. 19 Νοεμβρίου 2008 Μια πολύ γρήγορη λύση σε 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 ή άλλες αβλεψίες.
macabre_sunsets Δημοσ. 19 Νοεμβρίου 2008 Δημοσ. 19 Νοεμβρίου 2008 Μια πρόχειρη (περίπλοκη?) λύση είναι κι αυτό (αν και το παραπάνω είναι υπερβολικά πιο εύκολο) >#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.
sarakinos Δημοσ. 19 Νοεμβρίου 2008 Μέλος Δημοσ. 19 Νοεμβρίου 2008 Σασ ευχαριστώ όλους παιδιά...ν'αστε καλά
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.