Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα εδω και μερικες μερες προσπαθω να κανω την ασκηση που μας εχει δοθει απο τη σχολη μου.Με λιγα λογια η εκφωνηση:πρεπει να φτιαξουμε ενα προγραμμα 2 "λειτουργιων" που θα επιλεγουμε την καθε λειτουργια μεσω command line arguments ./programma -check/create.(πραγμα που δεν εχω καταλαβει πως ακριβως αλλα ακομα δεν εχω φτασει μεχρι εκει.)

1.Στη λειτουργια check πρεπει να ελεγξουμε αν ενας πινακας ΝχΝ (οπου το Ν εισαγεται απο εμας) ειναι πινακας markov,δηλαδη αν καθε row και καθε col εχει αθροισμα 1.(αυτο νομιζω το εχω καταφερει εκτος απο το error (iso c90)που βγαζει οταν χρησιμοποιω την εντολη compile που μας εχουν πει (gcc -ansi -pedantic -Werror) για την μεταβλητη στη θεση του δεικτη οταν δηλωνεται ο πινακας.

2.Στη λειτουργια create πρεπει να δημιουργουμε εναν τετοιο πινακα απο εναν αλγοριθμο που μας εχει δοθει.

  • Τα προβληματα που αντιμετωπιζω:(εχω φτιαξει και τα 2 σαν ξεχωριστα προγραμματα)

1.Πως στη δηλωση του πινακα θα βαλω σαν μεγεθος μεταβλητη και να το δεχτει ο compiler με τους παραμετρους που μας λενε?

2.Γιατι η rand() παραγει αριθμους οπως 6064944128.0 ενω νομιζω την εχω χρησιμοποιησει σωστα?

e= ((float)rand())/1;

3.Γιατι οταν τα "ενωσα" ετσι ωστε να δημιουργει τον πινακα και να τον ελεγχει κατευθειαν.Βαζω το N και απλα τελειωνει Instant (μου "πηδαει" ~N^4 printf)?

4.Tα arguments λογικα θα τα καταλαβω μεσω των ονλινε διαφανειων.

 

ΔΕ ΖΗΤΑΩ ΝΑ ΛΥΣΕΙ ΚΑΠΟΙΟΣ ΤΗΝ ΑΣΚΗΣΗ.ΜΠΟΡΩ ΝΑ ΠΑΡΑΘΕΣΩ ΚΩΔΙΚΑ ΟΠΟΥ ΧΡΕΙΑΣΤΕΙ.

Eυχαριστω!

Δημοσ.

1. Πρέπει να κάνεις compile με υποστήριξη C99 (-std=c99) και η μεταβλητή να έχει ήδη την τιμή που πρέπει πριν τη γραμμή δήλωσης του πίνακα.

2. Η rand() παράγει αριθμούς μεταξύ του 0 και του RAND_MAX. Μάλλον το λάθος γίνεται αλλού κι όχι εκεί.

3. Μήπως επειδή έχει κάνει κάπου λάθος στη σύνταξη των επαναλήψεων? Χωρίς κώδικα, δε ξέρω.

 

Αν δεν επιτρέπεται η C99 για οποιοδήποτε λόγο, πρέπει να χρησιμοποιήσεις malloc και free.

  • Like 1
Δημοσ.

1. Πρέπει να κάνεις compile με υποστήριξη C99 (-std=c99) και η μεταβλητή να έχει ήδη την τιμή που πρέπει πριν τη γραμμή δήλωσης του πίνακα.

2. Η rand() παράγει αριθμούς μεταξύ του 0 και του RAND_MAX. Μάλλον το λάθος γίνεται αλλού κι όχι εκεί.

3. Μήπως επειδή έχει κάνει κάπου λάθος στη σύνταξη των επαναλήψεων? Χωρίς κώδικα, δε ξέρω.

 

Αν δεν επιτρέπεται η C99 για οποιοδήποτε λόγο, πρέπει να χρησιμοποιήσεις malloc και free.

Σου στελνω κομματι που ειναι το create με προσαρμοσμενο το check για να δοκιμασω το create

Δημοσ.

Με μπέρδεψε λίγο, αλλά το βρήκα. Δες τι έχεις κάνει στη γραμμή #16:

for (j = 0; i < n; j++) {

Ελέγχεις το i αντί για το j, με αποτέλεσμα να τρέχεις πέρα από τη στοίβα και να καταστρέφεις τα δεδομένα που βρίσκονται "επάνω" από τον πίνακα, σ' αυτή τη περίπτωση μάλλον τα n, i και j.

  • Like 1
Δημοσ.

ΝΑΙ.Για καποιο λογο νομιζα οτι αν υπαρχει καποιο τετοιο λαθος θα ηταν συντακτικο και οχι λογικο.Αρα θα σταματουσε απλα οταν εκανε compile και δεν το κοιταξα σχεδον καθολου!Ευχαριστω!!Τωρα μενει να βρω γιατι αυτο

e = ((float)rand()) / (one-max);

μου δινει τιμες οπως 1088175360.0, 3153496832.0,318239168.0

btw το one=1.0

Δημοσ.

Αν το "max" είναι σχεδόν 1, τότε διαιρείς με έναν πολύ μικρό αριθμό και το αποτέλεσμα δε μπορεί να αποθηκευτεί σωστά στο float.

  • Like 1
Δημοσ. (επεξεργασμένο)

Το max ειναι μικροτεροαπο το 1.Διαιρω?Αυτο ειδα καπου οτι οριοθετει το ευρος της rand.(?)

Υποτιθεται οτι πρεπει να παραγω εναν float απο το 0 μεχρι 1 αρχικα,και στο κομματι που εβαλα απο το 0 μεχρι το 1-max.

else
create random number from 0.0 to ( 1 - M ) and place it in E
Επεξ/σία από matheostsik
Δημοσ.

Ναι αλλά η rand δεν επιστρέφει float από 0 έως 1 αλλά int από 0 έως RAND_MAX. Ο τρόπος που συνηθίζουμε να μετατρέπουμε το rand σε πραγματικό [0, 1] είναι ο εξής:

 

double randf()
{
    return rand()/(double)RAND_MAX;
}
Δημοσ.

Ναι αλλά η rand δεν επιστρέφει float από 0 έως 1 αλλά int από 0 έως RAND_MAX. Ο τρόπος που συνηθίζουμε να μετατρέπουμε το rand σε πραγματικό [0, 1] είναι ο εξής:

 

double randf()
{
    return rand()/(double)RAND_MAX;
}
Όχι αυτό δουλεύει μια χαρά,μου δίνει αυτά που θέλω (0.7 0.5 0.6 κλπ) , το θέμα είναι όταν πάω να δημιουργήσω έναν από 0μεχρι 1-max
Δημοσ.

Φυσικά διαιρείς αφού το / κάνει διαίρεση...  :)

 

 

Στην προκειμένη περίπτωση η διαίρεση απλά κανονικοποιεί το random float στο διάστημα [0, 1]. Αν θέλεις να μεταφέρεις αυτό το εύρος σε κάποιο άλλο διάστημα, είναι απλά μια γραμμική συνάρτηση. Αν θέλεις δηλαδή μια τυχαία τιμή στο διάστημα [Χ, Υ] τότε πρέπει (ξεκινώντας υποθετικά από το [0, 1]) να πολλαπλασιάσεις με (Υ - Χ) και να προσθέσεις Χ.

0 <=        r        <= 1
0 <=     r * (Y-X)   <= Y - X   (πολλαπλασιασμός)
Χ <= r * (Y - X) + X <= Y       (πρόσθεση)
  • Like 2

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...