Δημιουργία λέξεων(συνδιασμοί) απο έναν αριθμό  Το θέμα επιλύθηκε

...ασύγχρονα μαθήματα γλώσσας C

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό andreask16 » 11 Νοέμ 2011, 20:49

Σε ευχαριστώ πολύ για την άμεση απάντηση!

Νομίζω το λάθος είναι ότι χρησιμοποίησα int. Λογικά θα πρέπει να χρησιμοποιήσω float;

Κοίτα σε παρακαλώ τον κώδικα και πες μου αν είναι σωστός:

Κώδικας: Επιλογή όλων
#include <stdio.h>
main()
{
float count,dig;
do {

printf("Enter the 6 digits:\n");
scanf("%f", &dig);

}
while (dig>=100000 && dig<=999999);
}


Κάνω κάπου λάθος; Γιατί αν εισάγω έναν 2ψήφιο πάλι μου τον δέχεται
andreask16
babeTUX
babeTUX
 
Δημοσιεύσεις: 4
Εγγραφή: 10 Νοέμ 2011, 19:11
Εκτύπωση

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό migf1 » 11 Νοέμ 2011, 21:05

Αν μιλάμε για ακεραίους, ο σωστός τύπος είναι ο long int ;)

Τώρα για τη συνθήκη, είναι εσφαλμένη διότι λέει στο do-while να επαναλαμβάνεται όσο ο αριθμός που διαβάζει είναι μέσα στο επιθυμητό εύρος. Το σωστό είναι να επαναλαμβάνεται όσο ο αριθμός που διαβάζει είναι έξω από το επιθυμητό εύρος, ελέγχεις δηλαδή το ανάποδο από αυτό που πραγματικά θέλεις :)

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

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό linuxs » 11 Νοέμ 2011, 21:11

andreask16 έγραψε:Σε ευχαριστώ πολύ για την άμεση απάντηση!

Νομίζω το λάθος είναι ότι χρησιμοποίησα int. Λογικά θα πρέπει να χρησιμοποιήσω float;

Κοίτα σε παρακαλώ τον κώδικα και πες μου αν είναι σωστός:

Κώδικας: Επιλογή όλων
#include <stdio.h>
main()
{
float count,dig;
do {

printf("Enter the 6 digits:\n");
scanf("%f", &dig);

}
while (dig>=100000 && dig<=999999);
}


Κάνω κάπου λάθος; Γιατί αν εισάγω έναν 2ψήφιο πάλι μου τον δέχεται


Όπως καταλαβαίνεις παρακάτω αν δώσεις 6 ψηφία το δέχεται.
Κώδικας: Επιλογή όλων

dragon@Dragon:~/Desktop$ ./a.out
Enter the 6 digits:
785463
Enter the 6 digits:
125498
Enter the 6 digits:
563217
Enter the 6 digits:
563
dragon@Dragon:~/Desktop$

με την μεταβλητή count τι κάνεις? Δεν την χρησιμοποιείς... :/ Επίσης στον κώδικα σου θα εκτελείται το μπλόκ εντολών όσο δίνεις 6 ψηφία. Εσύ μάλλον θές το ανάποδο! Πρέπει να προσθέσεις ένα if () μέσα στο loop. Με άλλα λόγια,

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

#include <stdio.h>

int main(void) {
int dig;
while(1){ // loop forever
printf("Enter the 6 digits:\n");
scanf("%d", &dig);

if(dig>100000 && dig<999999) { // if 6 digits
printf("You gave a right number!\n");
break; // exit loop else read another number
}
}
return 0;
}
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό andreask16 » 11 Νοέμ 2011, 21:23

Το count είναι για επόμενο ερώτημα, συγγνώμη αν μπέρδεψα!

Καλά είσαι φοβερός! Επιτέλους δούλεψε σωστά!! Σε ευχαριστώ πάρα πολύ!

Μια απορία: δίπλα στο while γιατί βάλαμε αυτό: (1) ;;
andreask16
babeTUX
babeTUX
 
Δημοσιεύσεις: 4
Εγγραφή: 10 Νοέμ 2011, 19:11
Εκτύπωση

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό linuxs » 11 Νοέμ 2011, 21:25

Δίπλα στο while γτ γράφω loop for ever? :P Η λογική είναι γιατί, θα τρέχει για πάντα το loop δλδ θα διαβάζει για πάντα αριθμούς. Μόλις δώσεις 6-ψήφιο βγαίνεις απο το loop και είσαι κομπλέ.

1 = TRUE δλδ η συνθήκη είναι TRUE οπότε θα τρέχει για πάντα κάθως το μπλόκ των εντολών εκτελείται όταν η συνθήκη είναι TRUE...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό migf1 » 11 Νοέμ 2011, 21:29

Φίλε linuxs νομίζω το 'κανες πολύπλοκο με τον κώδικα που του έγραψες. Μια χαρά ήταν ο κώδικάς του, το μόνο που χρειαζόταν να αλλάξει ήταν ο τύπος του digs και η συνθήκη του do-while loop.

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

long int digs=0; /* ορισμός & αρχικοποίηση σε 0 */

do {

printf("Enter a 6-digit integer: ");
scanf("%ld", &digs );

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

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό andreask16 » 12 Νοέμ 2011, 02:32

Σας ευχαριστώ πολύ παιδιά! Φίλε migf1 ο κώδικας είναι πολύ απλός και στα πρότυπα του δικού μου! Απλώς δεν χρειάζεται αρχικοποίηση με 0. Το δοκίμασα και λειτουργεί σωστά.
andreask16
babeTUX
babeTUX
 
Δημοσιεύσεις: 4
Εγγραφή: 10 Νοέμ 2011, 19:11
Εκτύπωση

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό migf1 » 12 Νοέμ 2011, 11:11

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

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό linuxs » 12 Νοέμ 2011, 11:37

αυτό εξαρτάται. πολύπλοκο είναι και το hello world για κάποιον που δεν ξέρει. προφανώς δεν ξλερω το επίπεδο του φίλου μας οπότε αυτό που έγγραψα ήλπιζα να είναι σαφές. :/

migf1 έγραψε:Φίλε linuxs νομίζω το 'κανες πολύπλοκο με τον κώδικα που του έγραψες. Μια χαρά ήταν ο κώδικάς του, το μόνο που χρειαζόταν να αλλάξει ήταν ο τύπος του digs και η συνθήκη του do-while loop.

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

long int digs=0; /* ορισμός & αρχικοποίηση σε 0 */

do {

printf("Enter a 6-digit integer: ");
scanf("%ld", &digs );

} while( digs < 100000 || digs > 999999 );
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγραμματισμός C - Ασκηση

Δημοσίευσηαπό migf1 » 12 Νοέμ 2011, 11:41

linuxs έγραψε:αυτό εξαρτάται. πολύπλοκο είναι και το hello world για κάποιον που δεν ξέρει. προφανώς δεν ξλερω το επίπεδο του φίλου μας οπότε αυτό που έγγραψα ήλπιζα να είναι σαφές. :/

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

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

Επιστροφή στο Μαθήματα C