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

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

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

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

Δημοσίευσηαπό Star_Light » 24 Ιούλ 2011, 22:08

Μην βάζεις πολύπλοκες εκφράσεις μέσα στην for σταματίου αν δεν εισαι εξοικιωμένος πρωτα με αλλα πραγματα...

φιλικη συμβουλη :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 » 24 Ιούλ 2011, 22:11

Qdata έγραψε:
[snip]
Εγώ θέλω να πω:
Κώδικας: Επιλογή όλων
ΑΝ(η fill ΔΕΝ είναι ίση με 0 ή 1) ΤΌΤΕ τύπωσε "Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!" και κλείσε το πρόγραμμα.

Δεν διάβασα τον κώδικα, αλλά αν απλά χρειάζεσαι το παραπάνω, ο κώδικας είναι ως εξής:

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

if ( fill != 0 && fill != 1) {
puts("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!");
exit(1);
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 24 Ιούλ 2011, 22:13

Star_Light έγραψε:Μην βάζεις πολύπλοκες εκφράσεις μέσα στην for σταματίου αν δεν εισαι εξοικιωμένος πρωτα με αλλα πραγματα...

φιλικη συμβουλη :P

Δεν τις βάζω εγώ, οι K&R τις βάζουν! :lol:
Πάντως το συγκεκυμένο βιβλίο δεν θα το πρότεινα σε κανένα. Σου πετά πράγματα από το 2ο κεφάλαιο τα οποία αναφέρονται και αναλύονται σε περεταίρο κεφάλαια!
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Qdata » 24 Ιούλ 2011, 22:20

migf1 έγραψε:
Qdata έγραψε:
[snip]
Εγώ θέλω να πω:
Κώδικας: Επιλογή όλων
ΑΝ(η fill ΔΕΝ είναι ίση με 0 ή 1) ΤΌΤΕ τύπωσε "Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!" και κλείσε το πρόγραμμα.

Δεν διάβασα τον κώδικα, αλλά αν απλά χρειάζεσαι το παραπάνω, ο κώδικας είναι ως εξής:

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

if ( fill != 0 && fill != 1) {
puts("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!");
exit(1);
}


Ευχαριστώ πολύ!Πρέπει να είμαι πιο προσεκτικός!
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 » 24 Ιούλ 2011, 22:22

Qdata έγραψε:
migf1 έγραψε:
Qdata έγραψε:
[snip]
Εγώ θέλω να πω:
Κώδικας: Επιλογή όλων
ΑΝ(η fill ΔΕΝ είναι ίση με 0 ή 1) ΤΌΤΕ τύπωσε "Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!" και κλείσε το πρόγραμμα.

Δεν διάβασα τον κώδικα, αλλά αν απλά χρειάζεσαι το παραπάνω, ο κώδικας είναι ως εξής:

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

if ( fill != 0 && fill != 1) {
puts("Η τιμή του γεμίσματος πρέπει να είναι μια επιλογή μεταξύ 0 και 1!");
exit(1);
}


Ευχαριστώ πολύ!Πρέπει να είμαι πιο προσεκτικός!

Και εγώ!
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

stamatiou έγραψε:
Star_Light έγραψε:Μην βάζεις πολύπλοκες εκφράσεις μέσα στην for σταματίου αν δεν εισαι εξοικιωμένος πρωτα με αλλα πραγματα...

φιλικη συμβουλη :P

Δεν τις βάζω εγώ, οι K&R τις βάζουν! :lol:
Πάντως το συγκεκυμένο βιβλίο δεν θα το πρότεινα σε κανένα. Σου πετά πράγματα από το 2ο κεφάλαιο τα οποία αναφέρονται και αναλύονται σε περεταίρο κεφάλαια!


Πριν κοιταξεις τις περιπλοκες εκφρασεις με την for θα χρησιμοποιησουμε τον κωδικα του παραδειγματος για το memory layout που μου εδωσε ο migf1 στο νημα με τα ασυγχρονα μαθηματα και τα προγραμματα περι C/C++ (ΤΟΥς ΚΩΔικες δηλαδη που βαζει οποιος θελει.)
λοιπον ο κωδικας ειναι ο εξης :

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

#include<stdio.h>
static int arr[] = { 1, 10, 4, 5, 6, 7 };
static int sum;
static const int n = sizeof(arr) / sizeof(arr[0]);


int main()
{
int i;

for (i = 0; i < n; i++)
sum += arr[i];

return 0;
}



1. Ποια η έξοδος?

2. Παραμετροποιησε τον κωδικα καταλληλα (κανοντας χρηση εμφολιασμενης for) ωστε η εξοδος πλεον να ειναι
(αν Ο η αρχική) τοτε η νέα Ο'= 3 * Ο

:D
Γνώσεις ⇛ 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, 00:52

Star_Light έγραψε:
stamatiou έγραψε:
Star_Light έγραψε:Μην βάζεις πολύπλοκες εκφράσεις μέσα στην for σταματίου αν δεν εισαι εξοικιωμένος πρωτα με αλλα πραγματα...

φιλικη συμβουλη :P

Δεν τις βάζω εγώ, οι K&R τις βάζουν! :lol:
Πάντως το συγκεκυμένο βιβλίο δεν θα το πρότεινα σε κανένα. Σου πετά πράγματα από το 2ο κεφάλαιο τα οποία αναφέρονται και αναλύονται σε περεταίρο κεφάλαια!


Πριν κοιταξεις τις περιπλοκες εκφρασεις με την for θα χρησιμοποιησουμε τον κωδικα του παραδειγματος για το memory layout που μου εδωσε ο migf1 στο νημα με τα ασυγχρονα μαθηματα και τα προγραμματα περι C/C++ (ΤΟΥς ΚΩΔικες δηλαδη που βαζει οποιος θελει.)
λοιπον ο κωδικας ειναι ο εξης :

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

#include<stdio.h>
static int arr[] = { 1, 10, 4, 5, 6, 7 };
static int sum;
static const int n = sizeof(arr) / sizeof(arr[0]);


int main()
{
int i;

for (i = 0; i < n; i++)
sum += arr[i];

return 0;
}



1. Ποια η έξοδος?

2. Παραμετροποιησε τον κωδικα καταλληλα (κανοντας χρηση εμφολιασμενης for) ωστε η εξοδος πλεον να ειναι
(αν Ο η αρχική) τοτε η νέα Ο'= 3 * Ο

:D

Δεν κατάλαβα, αυτό είναι κάτι σαν άσκηση; Και το O κάπου το έχω ξαναδει και έχει να κάνει με την ταχήτυτα του προγράμματός μας νομίζω, σωστά;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Nαι ειναι μια ασκησουλα.... σχετικα απλη και ωραια.

Οχι μην μπερδευεις το Ο με το συμβολο της πολυπλοκοτητας.

Το Ο εδω δηλωνει εξοδο. I/O <=> Input/Output

Απλα βρες αρχικα την εισοδο και μετα φτιαξε ενα εμφωλιασμενο loop στον ηδη δοθεντα κωδικα που θα
τριπλασιαζει την αρχικη εξοδο (πριν τον εμφωλιασμο δηλαδη.
Γνώσεις ⇛ 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, 12:47

Star_Light έγραψε:Nαι ειναι μια ασκησουλα.... σχετικα απλη και ωραια.

Οχι μην μπερδευεις το Ο με το συμβολο της πολυπλοκοτητας.

Το Ο εδω δηλωνει εξοδο. I/O <=> Input/Output

Απλα βρες αρχικα την εισοδο και μετα φτιαξε ενα εμφωλιασμενο loop στον ηδη δοθεντα κωδικα που θα
τριπλασιαζει την αρχικη εξοδο (πριν τον εμφωλιασμο δηλαδη.

Εννοείς να κάνω ένα for loop πριν αυτό που έχω τώρα;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

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, οπότε είναι σαν να γράφουμε το σώμα τους απευθείας μέσα στον κώδικα).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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