Jump to content



Βοηθεια για C


ARVAS

Recommended Posts

Αρχική απάντηση από D.J.AleXXX_gr [03-05-2006 22:44]

int main(void)

καταρχάς αυτό δεν γίνετε

void main()

είναι κανονικά.

Άσχετο με το θέμα, αλλά η main επιστρέφει int. Η σωστή δήλωση είναι:

int main (char ** argv, int argc)

όπου argc ο αριθμός των ορισμάτων που δόθηκαν στη γραμμή εντολών και argv[x] τα ορισματα.

Αν δεν μας ενδιαφέρουν τα ορίσματα ή η επιστροφή κωδικών λάθους, τότε μπορουμε να την δηλώσουμε σαν:

void main (void)

int main(void)

void main(char** argv, int argc)

Κάποιοι compilers ενδέχεται να έχουν warnings για τις παραπάνω δηλώσεις.

Σχετικά με το θέμα, εγώ ακόμη δεν έχω καταλάβει αν το παλικάρι ζητά να γράψει εξαρχής μια γεννήτρια τυχαίων αριθμών από χ έως ψ (δεν είναι και τόσο δύσκολο...), ή να κάνει μια εφαρμογή των rand()/srand() που διαθέτει η standard βιβλιοθήκη της C.

-K.

Link to comment
Share on other sites

  • Replies 43
  • Created
  • Last Reply

ARVAS εψαξα λιγο και βρηκα αυτο ελπιζω να σε βοηθησει και γενηκα πολα απο εδω μπορουν να σου φερουν ιδεες

(το σκεπτικο ειναι να παρεις τα δευτερολεπτα ή τα κλασματα δευτερολεπτων και να τα χρησιμοποιησεις ως τυχαιους αριθμους ....τη συγκεκριμενη τακτικη τη χρησιμοποιει η pascal αλλα μπορεις να το κανεις και σε C)

Link to comment
Share on other sites

@bold Δεν ειναι κακο αν και δεν ξερω αν μπορω να χρησημοποιησω βιβλιοθηκες ωρας μιας και δεν την εχουμε χρησημοποιησει ποτε.το seed που αναφερει τι ειναι;

@frap μια γενητρια 1000 αριθμων που να τους αποθηκευει σε πινακα.

Link to comment
Share on other sites

Αρχική απάντηση από D.J.AleXXX_gr

//Program returns a random number

#include <iostream&rt;

#include <cstdlib&rt;

using namespace std;

int main()

{

cout<<rand();

cout<<rand()%6; //Number between 0 and 5

}

Αυτό είναι c++, όχι c.


#include <stdio.h>
#include <stdlib.h>
#define N 1000 /*tuxaioi ari8moi*/
#define U 100 /*anw orio*/
#define L 10 /*katw orio*/
int main() {
int Ci[N];/*pinakas apo8hkeushs*/
int i,j; /*metrhths*/
for ( i = 0 ; i < N ; i++ ) {
j = rand() % (N+1);/*ari8mos sigoura mikroteros-isos N*/
if ( j < L )
Ci[i] = j + L;/*an mikroteros tou L...*/
else
Ci[i] = j;
}
for ( i = 0 ; i < N ; i++ ) {/*tupwnei pinaka*/
printf ("%d ",Ci[i]);
}
printf("\n");
}

Link to comment
Share on other sites

Μπορείς και να τον απορρίψεις, αλλά όταν το έγραψα το θεώρησα βλακεία να γίνει έτσι γιατί θα θέλει νέα λούπα για να μη χαλάσει ο μετρητής i.

Link to comment
Share on other sites

Αρχική απάντηση από trendy [Σήμερα, στις 06:21]

Μπορείς και να τον απορρίψεις, αλλά όταν το έγραψα το θεώρησα βλακεία να γίνει έτσι γιατί θα θέλει νέα λούπα για να μη χαλάσει ο μετρητής i.

Υπάρχει και σοβαρότερος λόγος.

Στη rand() (αν και εξαρτάται από την υλοποίηση του κάθε vendor, μερικές είναι πολύ άσχημες) θεωρητικά όλοι οι αριθμοί που μπορεί να δώσει έχουν την ίδια πιθανότητα. Αν τραβήξεις δηλαδή ένα πολύυυυ μεγάλο πλήθος αριθμών δεν θα δείς κάποιον να επαναλαμβάνεται ιδιαίτερα περισσότερο από κάποιον άλλο (ομοιόμορφη κατανομή).

Αποδεικνύεται πως αν απλά απορρίπτεις αριθμούς για τον επόμενο που "σου κάνει", οι αριθμοί που τελικά παίρνεις δεν έχουν την ίδια πιθανότητα να αναδειχθούν (αν θυμάμαι καλά υπάρχει πρόβλημα στα όρια του διαστήματος...). Ενώ αν τους χρησιμοποιείς όλους μετατρέποντάς τους οι αριθμοί που προκύπτουν έχουν επίσης ομοιόμορφη κατανομή.

-Κ.

Link to comment
Share on other sites

Αρχική απάντηση από trendy [Σήμερα, στις 04:34]


j = rand() % (N+1);/*ari8mos sigoura mikroteros-isos N*/
if ( j < L )
Ci[i] = j + L;/*an mikroteros tou L...*/
else
Ci[i] = j;

Σε αντικατάσταση αυτού θα πρότεινα:


Ci[i] = rand() % (U-L + 1) + L

... που νομίζω πως δίνει ακριβώς το ζητούμενο.

Επίσης πριν το for(;;) θα μπορούσε να μπεί ένα srand() με όρισμα που να δίνεται από το χρήστη κάθε φορά (getch(), scanf() ). Έτσι θα μπορούμε να δίνουμε κάθε φορά διαφορετικό seed στη γεννήτρια τυχαίων αριθμών ώστε να έχουμε εντελώς διαφορετικές ακολουθίες τυχαίων αριθμών από την rand() σε κάθε εκτέλεση του προγράμματος.

-Κ.

Link to comment
Share on other sites

1)frap: δυστυχως αυτη την αντικατασταση που εκανες δεν μπορω να την χρησημοποιησω γιατι δεν εχουμε διδαχθει κατι παρομοιο "(% (U-L + 1) + L) αρα "δεν υπαρχει"..

2)αυτο που ειπες για το srand θα ηθελα πολυ να το δω γιατι συμφωνα με τις οδηγιες μαλλον πρεπει να χρησημοποιηθει(αν θημαμαι καλα για αρχικοποιηση)

Ευχαριστω..

Link to comment
Share on other sites

ρε arvas παρακολουθω απο την αρχη αυτη τη συζητηση και δεν μπορω να καταλαβω τι σκ*τα σπουδαζεις

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

περιμενεις να σου διδαξουν να προσθαφαιρεις τα ορια ενος διαστηματος για να βρεις μια τιμη μεσα σε ενα διαστημα?? τι λες?

αυτο που θα σε διδασκουν ,αλλα δε θα το εχεις παρει χαμπαρι,ειναι να σκεφτεσαι αλγοριθμικα και να προσπαθεις να μετατρεπεις αυτα που θες σε απλες λογικες σχεσεις...

και εμενα μου ηταν δυκολος ο προγραμματισμος αλλα εσυ τα περιμενεις ολα ετοιμα

συν αθηνα και χειρα κινει μεγαλε

ρωτα κανα φιλαρακι σου συμφοιτητη να σου πει δυο πραγματα, δεν ειναι τιποτα σπουδαιο

Link to comment
Share on other sites

1)Ξερω να σκεφτομαι "αλγοριθμικα" οπως λες και ειμαι σιγουρος για αυτο αλλα δεν εχω ιδεα πως χρησημοποιουνται 2 εντολες(rand srand) οποτε δεν μπορω να συνταξω τον απαιτουμενο αλγοριθμο..

2)Δεν ειμαι απο τους ανθρωπους που τα περιμενει ολα ετοιμα.Αρχικα εβγαλα τα ματια μου πανω στο βιβλιο μηπως βρω λυση και μετα ρωτησα συμφοιτητες μου οι οποιοι η δεν μου εδωσαν καθολου απαντηση η οι απαντησεις ηταν πολυ συγκεχυμενες και αοριστες.δεν εβγαλα ακρη.

3)Σπουδαζω φυσικος

4)δεν ειναι αναγκη να εισαι τοσο επιθετικος.

@frap:ενταξει η λουπα για τον ελεγχο εφτιαξα δικια μου αλλα αυτο το srand τι γινεται;;;

Link to comment
Share on other sites

Βάλ'την πριν τη "λούπα" ... έχεις καταλάβει τι κάνει η srand() ? Δες τι έγραψα παραπάνω...

Επίσης πριν το for() θα μπορούσε να μπεί ένα srand() με όρισμα που να δίνεται από το χρήστη κάθε φορά (getch(), scanf() ). Έτσι θα μπορούμε να δίνουμε κάθε φορά διαφορετικό seed στη γεννήτρια τυχαίων αριθμών ώστε να έχουμε εντελώς διαφορετικές ακολουθίες τυχαίων αριθμών από την rand() σε κάθε εκτέλεση του προγράμματος.

Link to comment
Share on other sites

ΔΕΝ ειμαι επιθετικος

υμαρτον

απλα μου θυμιζεις τον παλιο εαυτο μου...στο πρωτο εξαμηνο που εκανα οτι κανεις και εσυ...

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

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

μην το παιρνεις ετσι..., απλα ειναι κατι το οποιο στο εχουν πει με τουλαχιστον 2 τροπους εδω μεσα και δεν εννοεις να το σουλουπωσεις και να το φερεις στα μετρα σου(σε αυτο που θες δηλαδη για τελικο αποτελεσμα)

Link to comment
Share on other sites

Θα σε απογοητευσω δυστυχως αλλα δεν καταλαβα τι κανει. Μπορεις να δωσεις αν δε σου κανει κοπο ενα συντομο παραδειγμα;;

Link to comment
Share on other sites

Αρχική απάντηση από ARVAS [Σήμερα, στις 18:51]

1)frap: δυστυχως αυτη την αντικατασταση που εκανες δεν μπορω να την χρησημοποιησω γιατι δεν εχουμε διδαχθει κατι παρομοιο "(% (U-L + 1) + L) αρα "δεν υπαρχει"..

Δεν έχετε διδαχθεί τον τελεστή % (modulo - ακέραιο υπόλοιπο διαίρεσης);

Την πρόσθεση ;

Τη χρήση παρενθέσεων;

Αν σε μπέρδεψαν τα U και L χρησιμοποίησα τις μεταβλητές του trendy στον κώδικα που έδωσε.

Αν δεν κατάλαβες τι κάνω, η πράξη αναλυτικότερα είναι να:

- να πάρουμε το αποτέλεσμα της rand() <- τυχαίος αριθμός.

- να παρουμε το ακέραιο υπόλοιπο της διαιρέσης με τη διαφορά του ανω και κάτω ορίου συν 1

- το παραπάνω αποτέλεσμα θα είναι ένας αριθμός από 0 έως και U-L (γι'αυτό βάλαμε συν 1 επάνω).

- προσθέτουμε το παραπάνω στο κάτω όριο, έτσι τελικά ο αριθμός που προκύπτει θα είναι από L+0=L έως και L+(U -L)=U

... που επειδή προέρχεται από την rand(), είναι και αυτός τυχαίος αλλά μέσα στα όρια που θέσαμε.

Link to comment
Share on other sites

Το % εννοουσα αλλα ετσι οπως τα λες μαλλον θα μπορω να το χρησημοποιησω..Αυτο με την αρχικοποιηση για το srand δεν μπορω να καταλαβω αλλα αφου λογικα θα βγαινει και ετσι γιατι να χρησημοποιηθει;;

edit: μαλλον θα εννοεις %->ακεραιο αποτελεσμα η υπολοιπο διαιρεσης γιατι ακεραιο υπολοιπο λιγο δυσκολο να εναι

Link to comment
Share on other sites

Αρχική απάντηση από ARVAS [Σήμερα, στις 21:26]

Θα σε απογοητευσω δυστυχως αλλα δεν καταλαβα τι κανει. Μπορεις να δωσεις αν δε σου κανει κοπο ενα συντομο παραδειγμα;;

οκ.

κάνε το ακόλουθο πρόγραμμα:

#include <stdio.h>

#include <stdlib.h>

int main() {

int i,j;

srand(10);

for ( i = 0 ; i < 10; i++ ) {

j = rand();

printf ("%d \n",j);

}

}

Compile και run. 10 τυχαίοι αριθμοί. Τέλεια.

Run ξανά. 10 τυχαίοι αριθμοί πάλι... αλλά οι ίδιοι με τους προηγούμενους μήπως???

Μα καλά, τι στο καλό τυχαίοι είναι τότε; Κάθε φορά οι ίδιοι;

’λλαξε το srand(10) σε srand(11). Compile & run ... παρατηρείς κάτι;

’λλαξε το srand(11) σε srand(12). Compile & run ... παρατηρείς κάτι;

’λλαξε το srand(12) σε srand(10). Compile & run ... παρατηρείς κάτι;

Συμπέρασμα: η rand() είναι γεννήτρια τυχαίων αριθμών. Η γεννήτρια αρχικοποιήται με την srand.

Για την ίδια αρχικοποίηση, η rand() δίνει ΑΚΡΙΒΩΣ την ίδια ακολουθία αριθμών. Οι αριθμοί είναι "τυχαίοι" μεταξύ τους. Αλλά δεν είναι καθόλου τυχαίοι σε κάθε διαδοχική εκτέλεση του προγράμματος.

Εάν θα θέλαμε σε κάθε εκτέλεση διαφορετική ακολουθία, πρέπει να φροντίσουμε ώστε να καλούμε την srand() μια φορά στην αρχή του προγράμματός μας με όρισμα που θα καθορίζεται από κάποιο εξωτερικό παράγοντα... το δευτερόλεπτο της ώρας σε εκατοστά πχ. .. η κάποιο πλήκτρο που θα πατήσει ο χρήστης.

Υπάρχουν πολλές περιπτώσεις που εκμεταλλευόμαστε την δυνατότητα να τρέχουμε το πρόγραμμά μας με την ίδια αρχικοποίηση στις γεννήτριες τυχαίων αριθμών. Για παράδειγμα σε κάποιο πρόγραμμα προσομοίωσης που γίνεται χρήση τυχαίων αριθμών (πααααάρα πολύ συνηθισμένο), προκειμένου να βελτιστοποιήσουμε τον κώδικα, τρέχουμε την βελτιστοποιημένη έκδοση με ίδιο seed για τη γεννήτρια και συγκρίνουμε τα αποτελέσματα με αυτά του αρχικού κώδικα (που φυσικά θεωρούμε ότι είναι bug-free).

-Κ.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.