Qdata έγραψε:- Κώδικας: Επιλογή όλων
/*Άσκηση:
* Να γραφεί συνάρτηση η οποία να εμφανίζει στην οθόνη ένα πλαίσιο το οποίο θα δημιουργείται
από έναν χαρακτήρα και θα έχει συγκεκριμένο πλάτος (σε χαρακτήρες) και ύψος (σε
γραμμές). Το ύψος, το πλάτος και ο χαρακτήρας θα μεταβιβάζονται ως παράμετροι στη
συνάρτηση. Η συνάρτηση θα πρέπει να έχει μια επί πλέον παράμετρο η οποία στη περί-
πτωση που έχει τιμή 1 το πλαίσιο θα είναι γεμάτο με τον χαρακτήρα και στη περίπτωση
που έχει τιμή 0 θα εμφανίζεται μόνο το περίγραμμα. Επίσης, να γράψετε ένα πρόγραμμα
το οποίο να καλεί τη συγκεκριμένη συνάρτηση.
*/
#include <stdio.h>
#include <stdlib.h> /* Για exit() */
void display(char ch,int height,int width,int fill);
main()
{
int ipsos,platos,gemisma;
char xarakthras;
printf("Δώσε χαρακτήρα: ");
scanf("%c",&xarakthras);
printf("Δώσε το ύψος: ");
scanf("%d",&ipsos);
printf("Δώσε το πλάτος: ");
scanf("%d",&platos);
printf("Δώσε το γέμισμα <0 ή 1>: ");
scanf("%d",&gemisma);
display(xarakthras,ipsos,platos,gemisma);
exit(0);
}
void display(char ch,int height,int width,int fill)
{
int i,j,d;
if(fill == 1 || fill == 0);
else
{
printf("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!\n");
exit(0);
}
for(i=1;i<=width;++i)
{
printf("%c",ch);
}
putchar('\n');
for(d=1;d<=height;++d)
{
printf("%c",ch);
for(j=1;j<=(width-2);++j)
{
if(fill==1)
printf("%c",ch);
else if(fill==0)
printf(" ");
}
printf("%c",ch);
putchar('\n');
}
for(i=1;i<=width;++i)
{
printf("%c",ch);
}
putchar('\n');
}
Μου άρεσε αυτή η άσκηση, απλή και χρήσιμη!
Σου παραθέτω πως θα την έκανα εγώ, για να την αντιπαραβάλλεις με τον δικό σου κώδικα. Ακολουθώ σχεδόν την ίδια λογική με σένα, αλλά έχω προσθέσει ένα macro για να τυπώνω την 1η και την τελευταία γραμμή (το έχω ονομάσει: PUT_EDGELINE() ).
Επίσης μέσα στην put_frame() ξεκινάω ορίζοντας μια τοπική μεταβλητή για τον ενδιάμεσο χαρακτήρα, τον οποίον αρχικοποιώ σε κενό διάστημα (' ') αν η fill είναι FALSE, αλλιώς τον αρχικοποιώ σε c. Αυτό το κάνω για να αποφύγω να φωλιάσω το if-else μέσα στο for (όχι πως έχει κάποιο πρόβλημα το φώλιασμα του if-else, απλά εμένα μου φαίνεται πιο ευανάγνωστος ο κώδικας χωρίς αυτό... καθαρά υποκειμενική άποψη).
Και τέλος, στη main() κάνω έλεγχο για όλες τις εισόδους που δίνει ο χρήστης (πλην του χαρακτήρα) και δεν τον αφήνω να προχωρήσει αν δεν δώσει τιμές μέσα στο εύρος που του ζητάω.
- Κώδικας: Επιλογή όλων
/*** Άσκηση:
Να γραφεί συνάρτηση η οποία να εμφανίζει στην οθόνη ένα πλαίσιο το οποίο θα δημιουργείται
από έναν χαρακτήρα και θα έχει συγκεκριμένο πλάτος (σε χαρακτήρες) και ύψος (σε
γραμμές). Το ύψος, το πλάτος και ο χαρακτήρας θα μεταβιβάζονται ως παράμετροι στη
συνάρτηση. Η συνάρτηση θα πρέπει να έχει μια επί πλέον παράμετρο η οποία στη περί-
πτωση που έχει τιμή 1 το πλαίσιο θα είναι γεμάτο με τον χαρακτήρα και στη περίπτωση
που έχει τιμή 0 θα εμφανίζεται μόνο το περίγραμμα. Επίσης, να γράψετε ένα πρόγραμμα
το οποίο να καλεί τη συγκεκριμένη συνάρτηση.
***/
#include <stdio.h>
#include <stdlib.h> // για exit()
#define PUT_EDGELINE(c, ncols) \
do { \
int my_i_; \
for (my_i_=0; my_i_ < (ncols); my_i_++) \
putchar( (c) ); \
putchar('\n'); \
} while(0)
// -----------------------------------------------------------------------------------
void put_frame( char c, int nrows, int ncols, int fill )
{
char cinner = fill ? c : ' '; // ορισμός ενδιάμεσου χαρακτήρα
register int i, j;
PUT_EDGELINE(c, ncols); // τύπωμα 1ης γραμμής
for (i=1; i < nrows-1; i++) // τύπωμα ενδιάμεσων γραμμών
{
putchar( c ); // 1ος χαρακτήρας της γραμμής
for (j=1; j < ncols-1; j++) // ενδιάμεσοι χαρακτήρες
putchar( cinner );
printf("%c\n", c); // τελευταίος χαρακτήρας + '\n'
}
PUT_EDGELINE(c, ncols); // τύπωμα τελευταίας γραμμής
return;
}
// -----------------------------------------------------------------------------------
int main( void )
{
int ipsos, platos, gemisma;
char xarakthras;
printf("Δώσε χαρακτήρα: ");
scanf("%c", &xarakthras);
do {
printf("Ύψος (3-23); ");
scanf("%d", &ipsos);
} while( ipsos < 3 || ipsos > 23 );
do {
printf("Πλάτος (2-78); ");
scanf("%d", &platos);
} while( platos < 2 || platos > 78 );
do {
printf("Γέμισμα (0=όχι, 1=ναι); ");
scanf("%d", &gemisma);
} while( gemisma != 0 && gemisma != 1 );
put_frame(xarakthras, ipsos, platos, gemisma);
exit(0);
}
ΥΓ. Το macro PUT_EDGELINE() θα μπορούσε να γίνει και συνάρτηση, αλλά τότε η εκτέλεσή του θα ήταν πιο αργή (τα macros γίνονται expand μέσα στον κώδικα πριν ξεκινήσει το compilation, οπότε είναι σαν να γράφουμε το σώμα τους απευθείας μέσα στον κώδικα).