Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 25 Ιούλ 2011, 15:16

stamatiou έγραψε:Εννοείς να κάνω ένα for loop πριν αυτό που έχω τώρα;

Φίλε stamatiou θα πρότεινα να ξεκινήσεις με πιο απλές ασκήσεις.

Π.χ... Γράψτε ένα πρόγραμμα που θα ζητάει έναν ακέραιο n και θα τυπώνει ένα δέντρο από αστερίσκους με ύψος n και πλάτος 2n-1. Για παράδειγμα, για n=6 θα τυπώνει το παρακάτω:

Κώδικας: Επιλογή όλων

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

Η προτελευταία γραμμή έχει ένα ακόμα space στην αρχή της, αλλά δεν το εμφανίζει εδώ στο code tag (δεν ξέρω γιατί).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 25 Ιούλ 2011, 16:41

Έχω σπάσει το κεφάλι μου! Έχω φτάσει μέχρι εδώ, και το μόνο που κάνει είναι να τυπώνει input x input+1.
Κώδικας: Επιλογή όλων
#include <stdio.h>

int asterisks_print(int num)
{
int i,j,k;
for(i = 0;i<=num;i++)
{
for(j = 0;j<=num;j++)
{
putchar('*');
}
putchar('\n');
}
return 0;
}

int main(void)
{
int i;
printf("How many rows should your pyramid have?\n");
scanf("%d",&i);
asterisks_print(i);
return 0;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 25 Ιούλ 2011, 18:29

Κώδικας: Επιλογή όλων


#include<stdio.h>

int main()

{
int n;
int i;
int j;

printf("Dwse to n: \n");
scanf("%d",&n);

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

}
}
return 0;
}


πιστευω πως αυτη ειναι μια λυση. ΑΝ και δεν τα βγαζει σαν δεντρο :/
απλα αν δωσω n=3 βγαζει 9 αστερακια... που αν τα βαλεις σε μορφοποιηση δεντρου ειναι ιδια στο πληθος
τους με αυτα που έχει και ο migf1 οπως επισης και αν δωσω n=4 τοτε δινει 16 αστερακια και αυτο που εδωσε πιο πανω ο migf1 ειναι 6 επομενως 6χ6=36 ειναι ουσιαστικα δυναμεις αριθμων αλλα με αλλο τροπο!!! εχω αδικο??? Και βγαινει και με αναδρομικη συναρτηση!

τωρα βεβαια αν κολλαει στο οτι πρεπει οπωσδηποτε να μορφοποιηθει σαν δεντρο και αυτη ειναι η ουσια της ολης ασκησης
ειμαστε τελειως λαθος :P
Τελευταία επεξεργασία από Star_Light και 25 Ιούλ 2011, 18:31, έχει επεξεργασθεί 1 φορά/ες συνολικά
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Qdata » 25 Ιούλ 2011, 18:32

Star_Light έγραψε:τωρα βεβαια αν κολλαει στο οτι πρεπει οπωσδηποτε να μορφοποιηθει σαν δεντρο και αυτη ειναι η ουσια της ολης ασκησης
ειμαστε τελειως λαθος :P


Φυσικά και πρέπει να την κάνεις σαν δέντρο!Εκεί είναι που λίγο δυσκολεύει.Θα παραθέσω και την δική μου λύση σε λίγο(να το βρω πρώτα). :)
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 25 Ιούλ 2011, 18:34

Star_Light έγραψε:
Κώδικας: Επιλογή όλων


#include<stdio.h>

int main()

{
int n;
int i;
int j;

printf("Dwse to n: \n");
scanf("%d",&n);

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

}
}
return 0;
}


πιστευω πως αυτη ειναι μια λυση. ΑΝ και δεν τα βγαζει σαν δεντρο :/
απλα αν δωσω n=3 βγαζει 9 αστερακια... που αν τα βαλεις σε μορφοποιηση δεντρου ειναι ιδια στο πληθος
τους με αυτα που έχει και ο migf1 οπως επισης και αν δωσω n=4 τοτε δινει 16 αστερακια και αυτο που εδωσε πιο πανω ο migf1 ειναι 6 επομενως 6χ6=36 ειναι ουσιαστικα δυναμεις αριθμων αλλα με αλλο τροπο!!! εχω αδικο??? Και βγαινει και με αναδρομικη συναρτηση!

Πάντως αν βάλεις το putchar('\n') έξω από το δεύτερο for loop και το πας στο πρώτο γίνεται πύργος :lol:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 25 Ιούλ 2011, 18:35

stamatiou έγραψε:Έχω σπάσει το κεφάλι μου! Έχω φτάσει μέχρι εδώ, και το μόνο που κάνει είναι να τυπώνει input x input+1.
Κώδικας: Επιλογή όλων
#include <stdio.h>

int asterisks_print(int num)
{
int i,j,k;
for(i = 0;i<=num;i++)
{
for(j = 0;j<=num;j++)
{
putchar('*');
}
putchar('\n');
}
return 0;
}

int main(void)
{
int i;
printf("How many rows should your pyramid have?\n");
scanf("%d",&i);
asterisks_print(i);
return 0;
}


βγαλε το "=" απο τις for.
Qdata έγραψε:
Star_Light έγραψε:τωρα βεβαια αν κολλαει στο οτι πρεπει οπωσδηποτε να μορφοποιηθει σαν δεντρο και αυτη ειναι η ουσια της ολης ασκησης
ειμαστε τελειως λαθος :P


Φυσικά και πρέπει να την κάνεις σαν δέντρο!Εκεί είναι που λίγο δυσκολεύει.Θα παραθέσω και την δική μου λύση σε λίγο(να το βρω πρώτα). :)


lol!!! Σωστα. Δεν θα δω την λυση σου ομως :P θα προσπαθησω να την βγαλω μονος μου.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 25 Ιούλ 2011, 18:49

Εγώ πάντως έφτιαξα έναν πύργο!
Κώδικας: Επιλογή όλων
#include <stdio.h>

int asterisks_print(int num)
{
int i,j,k;
for(i = 0;i<=num - 1;i++)
{
for(j = 0;j<=num - 1;j++)
{
putchar('*');
}
putchar('\n');
}
return 0;
}

int main(void)
{
int i;
printf("How many rows should your pyramid have?\n");
scanf("%d",&i);
asterisks_print(i);
return 0;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 25 Ιούλ 2011, 18:59

migf1 μην μας δωσεις την λυση για 2 μερες :P ασε να τριφτει λιγο το μυαλο μας!!!!
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 25 Ιούλ 2011, 21:54

οκ :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Qdata » 25 Ιούλ 2011, 23:40

migf1 έγραψε:
Qdata έγραψε:
Spoiler: show
Κώδικας: Επιλογή όλων
/*Άσκηση:
* Να γραφεί συνάρτηση η οποία να εμφανίζει στην οθόνη ένα πλαίσιο το οποίο θα δημιουργείται
από έναν χαρακτήρα και θα έχει συγκεκριμένο πλάτος (σε χαρακτήρες) και ύψος (σε
γραμμές). Το ύψος, το πλάτος και ο χαρακτήρας θα μεταβιβάζονται ως παράμετροι στη
συνάρτηση. Η συνάρτηση θα πρέπει να έχει μια επί πλέον παράμετρο η οποία στη περί-
πτωση που έχει τιμή 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() κάνω έλεγχο για όλες τις εισόδους που δίνει ο χρήστης (πλην του χαρακτήρα) και δεν τον αφήνω να προχωρήσει αν δεν δώσει τιμές μέσα στο εύρος που του ζητάω.

Spoiler: show
Κώδικας: Επιλογή όλων


/*** Άσκηση:
Να γραφεί συνάρτηση η οποία να εμφανίζει στην οθόνη ένα πλαίσιο το οποίο θα δημιουργείται
από έναν χαρακτήρα και θα έχει συγκεκριμένο πλάτος (σε χαρακτήρες) και ύψος (σε
γραμμές). Το ύψος, το πλάτος και ο χαρακτήρας θα μεταβιβάζονται ως παράμετροι στη
συνάρτηση. Η συνάρτηση θα πρέπει να έχει μια επί πλέον παράμετρο η οποία στη περί-
πτωση που έχει τιμή 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, οπότε είναι σαν να γράφουμε το σώμα τους απευθείας μέσα στον κώδικα).


:thumbup: :bow: :thumbup:
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι