kostasdi Δημοσ. 20 Νοεμβρίου 2015 Δημοσ. 20 Νοεμβρίου 2015 Είμαι αρχάριος σε ότι αφορά τον προγραμματισμό.Μας έχουν βάλει λοιπόν μια εργασία που μέσα στα ερωτήματα είναι να βρούμε και την υποακολουθία ενός αριθμού.Ο αριθμός αυτός δεν είναι κάποιος συγκεκριμένος απλά έχουμε κάνει ένα #define 1000000 και έχουμε ένα counter σε for.Μπορεί κάποιος να μου εξηγήσει τι ακριβώς κάνει αυτός ο αλγόριθμος.(είναι δωσμένος από τον καθηγητή.) #include <stdio.h> #define MAXNUMB 1000000 int main (void){ int i,num=MAXNUMB,mult=1,mask,sub=0,tempnum,combs=1; tempnum=MAXNUMB; while(tempnum!=0) { tempnum/=10; combs+=combs; } for (i=1;i<combs-1;i++) mask=i; mult=1; sub=0; num=MAXNUMB; while (num!=0) { if (mask%2==1) { sub+=(num%10)*mult; mult*=10; } num/=10; mask/=2; }
sundance_kid Δημοσ. 20 Νοεμβρίου 2015 Δημοσ. 20 Νοεμβρίου 2015 #include <stdio.h> #define MAXNUMB 1000000 int main (void){ int i,num=MAXNUMB,mult=1,mask,sub=0,tempnum,combs=1; tempnum=MAXNUMB; while(tempnum!=0) { tempnum/=10; combs+=combs; printf("tempnum=%d - - combs=%d \n",tempnum,combs); } for (i=1;i<combs-1;i++) mask=i; mult=1; sub=0; num=MAXNUMB; while (num!=0) { if (mask%2==1) { sub+=(num%10)*mult; printf("sub=%d\n",sub); mult*=10; printf("mult=%d\n",mult); } num/=10; mask/=2; printf("num=%d - - mask=%d \n",num,mask); } } Τρέξ'το τώρα και θα κάταλάβεις καλύτερα. Άν βλέπεις τις μεταβλητές τυπωμένες, θα σε βοηθήσει πάρα πολυ. tempnum=100000 - - combs=2 tempnum=10000 - - combs=4 tempnum=1000 - - combs=8 tempnum=100 - - combs=16 tempnum=10 - - combs=32 tempnum=1 - - combs=64 tempnum=0 - - combs=128 num=100000 - - mask=63 sub=0 mult=10 num=10000 - - mask=31 sub=0 mult=100 num=1000 - - mask=15 sub=0 mult=1000 num=100 - - mask=7 sub=0 mult=10000 num=10 - - mask=3 sub=0 mult=100000 num=1 - - mask=1 sub=100000 mult=1000000 num=0 - - mask=0
kaliakman Δημοσ. 20 Νοεμβρίου 2015 Δημοσ. 20 Νοεμβρίου 2015 (επεξεργασμένο) Είμαι αρχάριος σε ότι αφορά τον προγραμματισμό.Μας έχουν βάλει λοιπόν μια εργασία που μέσα στα ερωτήματα είναι να βρούμε και την υποακολουθία ενός αριθμού.Ο αριθμός αυτός δεν είναι κάποιος συγκεκριμένος απλά έχουμε κάνει ένα #define 1000000 και έχουμε ένα counter σε for.Μπορεί κάποιος να μου εξηγήσει τι ακριβώς κάνει αυτός ο αλγόριθμος.(είναι δωσμένος από τον καθηγητή.) #include <stdio.h> #define MAXNUMB 1000000 int main (void){ int i,num=MAXNUMB,mult=1,mask,sub=0,tempnum,combs=1; tempnum=MAXNUMB; while(tempnum!=0) { tempnum/=10; combs+=combs; } for (i=1;i<combs-1;i++) mask=i; mult=1; sub=0; num=MAXNUMB; while (num!=0) { if (mask%2==1) { sub+=(num%10)*mult; mult*=10; } num/=10; mask/=2; } Δηλαδή θες να πεις ότι ο καθηγητής έχει γράψει αυτό τον κώδικα?? Δεν νομίζω Τάκη(pun intended) Τέλος πάντων άκου για να καταλάβεις: Αυτό που κάνεις εδώ while(tempnum!=0) { tempnum/=10; combs+=combs; } Δεν νομίζω οτι βοηθάει και πολύ... Όπως λέει και ο καθηγητής σου λοιπόν όλα τα πιθανά masks είναι από (1,2^d-1) όπου d τα ψηφία του εκάστοτε αριθμού. Πάμε τώρα παρακάτω: Σκέψου οτί το mask είναι ενας αριθμός στην δυαδική του αναπαράσταση (δηλαδη πχ 00010101)!(Στην πραγματικότητα απλά κοιτάει αν το ψηφίο είναι ζυγό ή όχι.) Εσύ για να βρεις την υπακολουθία πρέπει να βάλεις (στο μυαλό σου) το NUMBER ακριβως από πάνω απο την δυαδική! πχ έστω οτί το νούμερο ειναι 4356977 και το mask είναι 0001010 Έχουμε: 4356977 0001010 Εσύ πρέπει να δείς ποια ψηφία του NUMBER αντιστοιχούν σε '1'(Είπαμε δεν είναι '1' αλλά μονοί) στον απο κάτω και να τα κρατήσεις.. Αυτή είναι η υπακολουθία σου. Αυτό το "ψάξιμο" γίνεται εδώ: while (num!=0) { if (mask%2==1) { sub+=(num%10)*mult; mult*=10; } num/=10; mask/=2; Εδώ πχ η υπακολουθία που παράγεται είναι το 67 Όπως καταλαβαίνεις το mask όσο ανεβαίνει παίρνει όλους τους πιθανούς συνδιασμούς των υπακολουθιών. Τώρα αν δεν καταλαβαίνεις πως λειτουργούν βάλε νούμερα και 'τρέξτα' στο μυαλό σου και αν και πάλι δεν καταλαβαίνεις πες μου να σου εξηγησω αργότερα που θα ξαναμπώ Επεξ/σία 20 Νοεμβρίου 2015 από kaliakman
defacer Δημοσ. 20 Νοεμβρίου 2015 Δημοσ. 20 Νοεμβρίου 2015 Σίγουρα αν αυτό είναι του καθηγητή τότε κλαίω για τα παιδιά που υποτίθεται ότι θα μάθουν από αυτό... αλλά ακόμα κι έτσι for (i=1;i<combs-1;i++) mask=i; What. The. Fuck.
kaliakman Δημοσ. 20 Νοεμβρίου 2015 Δημοσ. 20 Νοεμβρίου 2015 http://lists.di.uoa.gr/showthread.php?t=3068Αυτό είναι του καθηγητή (και δεν εχει δώσει πουθενά κώδικα)
kostasdi Δημοσ. 21 Νοεμβρίου 2015 Μέλος Δημοσ. 21 Νοεμβρίου 2015 http://lists.di.uoa.gr/showthread.php?t=3068Αυτό είναι του καθηγητή (και δεν εχει δώσει πουθενά κώδικα Τον έκανε στο εργαστήριο εχθές (το ηλεκτρονικό)
kostasdi Δημοσ. 21 Νοεμβρίου 2015 Μέλος Δημοσ. 21 Νοεμβρίου 2015 Δηλαδή θες να πεις ότι ο καθηγητής έχει γράψει αυτό τον κώδικα?? Δεν νομίζω Τάκη(pun intended) Τέλος πάντων άκου για να καταλάβεις: Αυτό που κάνεις εδώ while(tempnum!=0) { tempnum/=10; combs+=combs; } Δεν νομίζω οτι βοηθάει και πολύ... Όπως λέει και ο καθηγητής σου λοιπόν όλα τα πιθανά masks είναι από (1,2^d-1) όπου d τα ψηφία του εκάστοτε αριθμού. Πάμε τώρα παρακάτω: Σκέψου οτί το mask είναι ενας αριθμός στην δυαδική του αναπαράσταση (δηλαδη πχ 00010101)!(Στην πραγματικότητα απλά κοιτάει αν το ψηφίο είναι ζυγό ή όχι.) Εσύ για να βρεις την υπακολουθία πρέπει να βάλεις (στο μυαλό σου) το NUMBER ακριβως από πάνω απο την δυαδική! πχ έστω οτί το νούμερο ειναι 4356977 και το mask είναι 0001010 Έχουμε: 4356977 0001010 Εσύ πρέπει να δείς ποια ψηφία του NUMBER αντιστοιχούν σε '1'(Είπαμε δεν είναι '1' αλλά μονοί) στον απο κάτω και να τα κρατήσεις.. Αυτή είναι η υπακολουθία σου. Αυτό το "ψάξιμο" γίνεται εδώ: while (num!=0) { if (mask%2==1) { sub+=(num%10)*mult; mult*=10; } num/=10; mask/=2; Εδώ πχ η υπακολουθία που παράγεται είναι το 67 Όπως καταλαβαίνεις το mask όσο ανεβαίνει παίρνει όλους τους πιθανούς συνδιασμούς των υπακολουθιών. Τώρα αν δεν καταλαβαίνεις πως λειτουργούν βάλε νούμερα και 'τρέξτα' στο μυαλό σου και αν και πάλι δεν καταλαβαίνεις πες μου να σου εξηγησω αργότερα που θα ξαναμπώ Ναι απλά αυτο που προσπαθώ να καταλάβω είναι ξέρουμε ότι ένας αριθμός μπορεί να έχει παραπάνω από μία υποακολουθία..αυτό το βρίσκουμε ψάχνοντας διαφορετικά mask η κάθε αριθμός έχει μόνο ένα mask;;
kaliakman Δημοσ. 21 Νοεμβρίου 2015 Δημοσ. 21 Νοεμβρίου 2015 Ναι απλά αυτο που προσπαθώ να καταλάβω είναι ξέρουμε ότι ένας αριθμός μπορεί να έχει παραπάνω από μία υποακολουθία..αυτό το βρίσκουμε ψάχνοντας διαφορετικά mask η κάθε αριθμός έχει μόνο ένα mask;; Στο είπα και πριν. Το mask δεν είναι τίποτα άλλο παρά ένα νούμερο που αυξάνεται και το χρησιμοποιούμε ως σημείο αναφοράς για να πάρουμε την υπακολουθία. Οπότε κάθε αριθμός έχει (2^d) -1 διαφορετικά mask όπου d τα ψηφία του αριθμού Σίγουρα αν αυτό είναι του καθηγητή τότε κλαίω για τα παιδιά που υποτίθεται ότι θα μάθουν από αυτό... αλλά ακόμα κι έτσι for (i=1;i<combs-1;i++) mask=i; What. The. Fuck. Αν δεις(Που λογικό είναι να μην δεις έτσι όπως είναι γραμμένο) το mask το πειράζει μέσα στο σώμα οπότε δεν μπορεί να χρησιμοποιήσει το i αντί του mask
defacer Δημοσ. 21 Νοεμβρίου 2015 Δημοσ. 21 Νοεμβρίου 2015 Αν δεις(Που λογικό είναι να μην δεις έτσι όπως είναι γραμμένο) το mask το πειράζει μέσα στο σώμα οπότε δεν μπορεί να χρησιμοποιήσει το i αντί του mask Εκείνο το for δεν έχει braces. Θα εκτελεστεί μόνο για μια γραμμή το loop. 1
kaliakman Δημοσ. 21 Νοεμβρίου 2015 Δημοσ. 21 Νοεμβρίου 2015 Εκείνο το for δεν έχει braces. Θα εκτελεστεί μόνο για μια γραμμή το loop. Α καλά.. Δεν κοίταξα καν συναντικά γιατί είναι απλά πολλά...Επιμένω οτί αυτός ο κώδικας δεν είναι αλλουνού αλλά δικός του.. Τα braces γενικά είναι ότι να ναι είναι σαν να τα έβαλε απλά για να έχει μερικά @op no offense
kostasdi Δημοσ. 21 Νοεμβρίου 2015 Μέλος Δημοσ. 21 Νοεμβρίου 2015 Α καλά.. Δεν κοίταξα καν συναντικά γιατί είναι απλά πολλά...Επιμένω οτί αυτός ο κώδικας δεν είναι αλλουνού αλλά δικός του.. Τα braces γενικά είναι ότι να ναι είναι σαν να τα έβαλε απλά για να έχει μερικά @op no offense Για να λύσουμε αυτό το θέμα το συγκεκριμένο παράδειγμα έγινε από έναν βοηθό του μαθήματος.Τώρα αν ο βοηθός έγραφε άσχετα η εγώ δεν αντέγραψα σώστα δεν ξέρω.Όσο για τα braces τώρα μαθαίνω,άμα τα ήξερα όλα από την αρχή δεν χρειαζόταν να ρωτήσω εδώ!
the other one Δημοσ. 21 Νοεμβρίου 2015 Δημοσ. 21 Νοεμβρίου 2015 Οι θέσεις των braces δεν έχουν καμία σημασία και σε μια γραμμή να το γράψεις όλο θα τρέξει. Αυτά είναι καθαρά για λόγους αναγνωσιμότητας θες να είναι όσο πιο καθαρογραμμένο γίνεται.
kaliakman Δημοσ. 21 Νοεμβρίου 2015 Δημοσ. 21 Νοεμβρίου 2015 Η θέση των braces παίζει ρόλο όπως έγραψε και ο defacer.. Τώρα... Επιμένω για τον κώδικα.. Ο συγκεκριμένος δεν τρέχει καν.. Πως ακριβώς σας τον έδωσε?
defacer Δημοσ. 21 Νοεμβρίου 2015 Δημοσ. 21 Νοεμβρίου 2015 @theotherone η θέση των braces (σε σχέση με whitespace δηλαδή) δεν παίζει ρόλο. Η παρουσία ή απουσία των braces παίζει όμως τεράστιο ρόλο. 1
kostasdi Δημοσ. 21 Νοεμβρίου 2015 Μέλος Δημοσ. 21 Νοεμβρίου 2015 Η θέση των braces παίζει ρόλο όπως έγραψε και ο defacer.. Τώρα... Επιμένω για τον κώδικα.. Ο συγκεκριμένος δεν τρέχει καν.. Πως ακριβώς σας τον έδωσε? Ο κώδικας όπως τον αντέγραψα #include <stdio.h> #define NUMBER 154 int main (void) { int i,num=NUMBER,mult=1,mask,sub=0,tempnum,combs=1; tempnum=NUMBER; while (tempnum!=0){ tempnum/=10; combst=combos; } for (i=1;i<combs-1;i++) mask=i; mult=1; sub=0; num=NUMBER; while (num!=0){ if (mask%2==1){ sub+=(num%10)*mult; mult*=10; } num/=10; mask/=2; } printf ("%d \n",sub); } @theotherone η θέση των braces (σε σχέση με whitespace δηλαδή) δεν παίζει ρόλο. Η παρουσία ή απουσία των braces παίζει όμως τεράστιο ρόλο. ναι δεν είναι το θέμα τα braces αυτά άμα τρέξεις τον κώδικα και σου βγάλει λάθος αποτέλεσμα η δεν τρέξει καθόλου καταλαβαίνεις λίγο πολύ ότι κάπου έχεις κάνει λάθος.Το θέμα είναι ότι προσπαθώ να βάλω σε μια τάξη το όλο θέμα γιατί πρέπει να βγάλω αν οι υποακολουθίες ενός αριθμού είναι πρώτοι αριθμοί ή όχι.Αλλά για να το βγάλω αυτό πρέπει να καταλάβω πως ακριβώς λειτουργούν οι υποακολουθίες μέσα στον κώδικα
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα