black_rose Δημοσ. 7 Φεβρουαρίου 2012 Δημοσ. 7 Φεβρουαρίου 2012 Timonandpumpa, αν καταλαβα καλα αυτο που λες ειναι σε καθε κελι να παρουμε για παραδειγμα ενα αθροισμα το οποιο θα αποτελειται απο τη τιμη που δινει ο καθε αισθητηρας που βλεπει σε ενα κελι συγκεκριμενο που θελουμε προς τα συνολικα κελια που "βλεπει". Εχω την εντυπωση λιγο που το ψαξα ετσι(αν το εξηγω καλα -τετοια ωρα -αλλα θελει και αλλη επαληθευση,5 6 κελια δε φτανουν) αν στο πινακα που θα φτιαξεις το κελι χρειαζεται να ειναι μαυρο το πανω αθροισμα θα μου δινει καποια τιμη μεγαλυτερη ή ιση του 1,ενω αν ειναι κενο θα μου δινει καποια τιμη στο 0.κατι... ή ειμαι τόσο κουρασμενη πλεον που σκεφτομαι οτι να ναι... αυριο παλι...
virxen75 Δημοσ. 7 Φεβρουαρίου 2012 Δημοσ. 7 Φεβρουαρίου 2012 (επεξεργασμένο) > ...... void readFile(char *,int *,int *,int **,int **,int **,int **); void printPinakas(char **,int ,int); ....... int main(){ ...... int M,N; int *seira1,*seira2,*seira3,*seira4; ......... printf("\nM=%d N=%d\n",M,N); char **pinakas=(char **)malloc(M*sizeof (char *));//δυναμικός 2d πίνακας (ο ζητούμενος) for (int i=0;i<M;i++)//Μ γραμμές pinakas[i]=(char *)malloc(N*sizeof (char ));//Ν στήλες for (int i=0;i<M;i++) for (int j=0;j<N;j++) pinakas[i][j]='0';//μηδενίζω τον πίνακα ............ printPinakas(pinakas,M,N);//εμφανίζω τον πίνακα στην οθόνη ............ }//end main void readFile(char * fileName,int *M,int*N,int **seira1,int **seira2,int **seira3,int **seira4){//διαβάζει το αρχείο σε πίνακες FILE *fp=fopen(fileName,"r"); if (!fp){ printf("\nfilename error!\npress enter to exit.\n"); getchar(); exit(1); } fscanf(fp,"%d %d",M,N); int *Seira1=(int*)malloc(*M*sizeof(int)); if (!Seira1){ printf("\nerror allocating memory!\npress enter to exit."); getchar(); exit(1); } int *Seira2=(int*)malloc((*M+*N-1)*sizeof(int)); if (!Seira2){ printf("\nerror allocating memory!\npress enter to exit."); getchar(); exit(1); } int *Seira3=(int*)malloc(*N*sizeof(int)); if (!Seira3){ printf("\nerror allocating memory!\npress enter to exit."); getchar(); exit(1); } int *Seira4=(int*)malloc((*M+*N-1)*sizeof(int)); if (!Seira4){ printf("\nerror allocating memory!\npress enter to exit."); getchar(); exit(1); } //seira1 for (int i=0;i<*M;i++) fscanf(fp,"%d",&Seira1[i]); *seira1=Seira1; //seira 2 for (int i=0;i<*M+*N-1;i++) fscanf(fp,"%d",&Seira2[i]); *seira2=Seira2; //seira 3 for (int i=0;i<*N;i++) fscanf(fp,"%d",&Seira3[i]); *seira3=Seira3; //seira 4 for (int i=0;i<*M+*N-1;i++) fscanf(fp,"%d",&Seira4[i]); *seira4=Seira4; fclose(fp); } void printPinakas(char ** pinakas,int M,int N){//εμφανίζει τον πίνακα στην οθόνη printf("\nB O A R D !!!!\n"); for (int i=0;i<M;i++){ for (int j=0;j<N;j++) printf("%c ",pinakas[i][j]); printf("\n"); } } όσο για τον αλγόριθμο μπορείς να κάνεις π.χ. ΕΠΑΝΕΛΑΒΕ ΟΣΟ ΒΡΙΣΚΕΙΣ ΑΛΛΑΓΕΣ { -για την σειρά 1: =================== -ΑΝ βρεις τιμή == με Ν(εδώ 15) ΤΟΤΕ γέμισε όλη την αντίστοιχη γραμμή του πίνακα με '#' -ΑΝ βρεις τιμή == με 0 ΤΟΤΕ γέμισε όλη την αντίστοιχη γραμμή με '.' -ΑΝ βρεις τιμή == με το πλήθος των '0'+πλήθος των '#' ΤΟΤΕ αλλαξε τα '0' σε '#' στην γραμμη που ελέγχεις -ΑΝ βρεις τιμή == με το πλήθος των '#' άλλαξε όλα τα '0' σε '.' στην γραμμη που ελέγχεις -για την σειρά 3: ================== -ΑΝ βρεις τιμή == με Μ(εδώ 10) ΤΟΤΕ γέμισε όλη την αντίστοιχη στήλη του πίνακα με '#' -ΑΝ βρεις τιμή == με 0 ΤΟΤΕ γέμισε όλη την αντίστοιχη στήλη με '.' -ΑΝ βρεις τιμή == με το πλήθος των '0'+πλήθος των '#' ΤΟΤΕ αλλαξε τα '0' σε '#' στην στήλη που ελέγχεις -ΑΝ βρεις τιμή == με το πλήθος των '#' άλλαξε όλα τα '0' σε '.' στην στήλη που ελέγχεις -για τις σειρές 2-4: ================== -ΑΝ βρεις τιμή == 0 ΤΟΤΕ γέμισε την διαγώνιο από το κελί που ελέγχεις με '.' -ΑΝ βρεις τιμή == με τον αριθμό κελιών της διαγωνίου ΤΟΤΕ γέμισε όλη την διαγώνιο με '#' -ΑΝ βρεις τιμή == με το πλήθος των '0' +το πλήθος των '#' ΤΟΤΕ αλλαξε όλα τα '0' σε '#' EDIT: -ΑΝ βρεις τιμή==με το πλήθος των '#' ΤΟΤΕ άλλαξε όλα τα '0' σε '.' }ΤΕΛΟΣ ΕΠΑΝΑΛΗΨΗΣ ΕΛΕΓΧΕΙΣ ΤΟΝ ΠΙΝΑΚΑ να δεις αν υπάρχει έστω και 1 '0' που σημαίνει ότι δεν λύθηκε το πρόβλημα υπολογιστικά με βάση τα δεδομένα. ΑΡΧΙΖΕΙΣ ΔΟΚΙΜΕΣ με τιμές στα κελιά του πίνακα που δεν λύθηκαν και ελέγχεις τις συνθηκες να ικανοποιούνται ΤΕΛΕΙΩΝΕΙΣ όταν δεν υπάρχουν πια '0' στον πίνακα άντε και καλή αρχή! Υ.Γ. επίσης στέλνω σε excel ένα κύκλο της πιο πάνω επανάληψης που περιγράφω μαζα.zip Επεξ/σία 8 Φεβρουαρίου 2012 από virxen75
Timonkaipumpa Δημοσ. 7 Φεβρουαρίου 2012 Δημοσ. 7 Φεβρουαρίου 2012 Virxen, στον αλγόριθμο που έχει δεν περιλαμβάνεις και τις καμπύλες που σχηματίζονται στο σχήμα. Δεν ζητούνται βέβαια από την άσκηση
virxen75 Δημοσ. 7 Φεβρουαρίου 2012 Δημοσ. 7 Φεβρουαρίου 2012 Virxen, στον αλγόριθμο που έχει δεν περιλαμβάνεις και τις καμπύλες που σχηματίζονται στο σχήμα. Δεν ζητούνται βέβαια από την άσκηση ασε να κάνουμε και κάτι στο μεταπτυχιακό τους! χεχε!
bubblegum Δημοσ. 7 Φεβρουαρίου 2012 Μέλος Δημοσ. 7 Φεβρουαρίου 2012 Μπορώ να πω πως κάτι είχα κάνει κι εγώ τελικά. Thank God, νόμιζα ότι έκανα βλακείες. Virxen(είσαι και δικός μας,ε? Κρητικός!, Όφη κιόλας χοχο), σ ευχαριστώ πολύ από μέρους μου για την ανάλυση που έχεις κάνει. Εγώ μόνη δε θα το τελείωνα. Έχω κάποιες απορίες όμως: 1) Εμάς μας είπαν να χρησιμοποιήσουμε μόνο malloc(κι εγώ αυτή είχα βάλει στο κώδικά μου για να είμαι ειλικρινής) και όχι calloc ή κάποια άλλη. Υπάρχει κάποιο πρόβλημα με αυτό? Δηλαδή λες αν βάλω malloc να υπάρξει θέμα? 2) Το αρχείο μετά το άνοιγμα δε θέλει έλεγχο? Μας είπαν να κάνουμε(εγώ έκανα). 3) Γιατί χρησιμοποιείς διπλά αστεράκια(**)? Δε γνωρίζω τι είναι αυτά και δε τα έχω διδαχθεί. Ξέρω πως το ένα(*) είναι pointer αλλά τα διπλά? Για την ακρίβεια αυτό εδώ: void printPinakas(char **,int ,int), αναφέρομαι στο εντός παρενθέσεως, τι ακριβώς είναι? 4) Η μεταβλητή temp τύπου integer που έχεις δηλώσει στη function readFile, που χρησιμεύει? 5)η readFile γιατί δεν εμφανίζεται μέσα στη main? και 6)οι τελείτσες ....... τι ρόλο βαράνε? (είπα να τα ρωτήσω όλα να μη μείνω με απορίες )
Timonkaipumpa Δημοσ. 7 Φεβρουαρίου 2012 Δημοσ. 7 Φεβρουαρίου 2012 Το διπλό αστεράκι είναι δείκτης σε δείκτη. Εντός των άλλων, χρησιμεύει για να δημιουργεί κανείς πίνακες από ό,τι δείχνει ο πρώτος δείκτης. Επίσης, εάν θέλει κανείς να αλλάξει την τιμή μίας μεταβλητής μέσα σε μία συνάρτηση, θα πρέπει να "περάσει" την μεταβλητή αυτή ως αναφορά και όχι ως τιμή. Δηλαδή, ως δείκτη. Έτσι, αντί να χρησιμοποιήσει foo[][], χρησιμοποίησε **foo. Φαντάσου το ως ένα πίνακα από πίνακες διανύσματα. Δηλαδή, ένα πίνακα της μορφής NxM, ο οποίος αποτελείται από N πίνακες της μορφής 1xM. malloc, calloc, realloc... στο επίπεδο που είναι η άσκηση μπορείς να τις θεωρήσεις ίδιες. Αλλάζουν λίγο τα ορίσματα, εάν θυμάμαι καλά.
virxen75 Δημοσ. 7 Φεβρουαρίου 2012 Δημοσ. 7 Φεβρουαρίου 2012 1) Εμάς μας είπαν να χρησιμοποιήσουμε μόνο malloc(κι εγώ αυτή είχα βάλει στο κώδικά μου για να είμαι ειλικρινής) και όχι calloc ή κάποια άλλη. Υπάρχει κάποιο πρόβλημα με αυτό? Δηλαδή λες αν βάλω malloc να υπάρξει θέμα? 2) Το αρχείο μετά το άνοιγμα δε θέλει έλεγχο? Μας είπαν να κάνουμε(εγώ έκανα). 3) Γιατί χρησιμοποιείς διπλά αστεράκια(**)? Δε γνωρίζω τι είναι αυτά και δε τα έχω διδαχθεί. Ξέρω πως το ένα(*) είναι pointer αλλά τα διπλά? Για την ακρίβεια αυτό εδώ: void printPinakas(char **,int ,int), αναφέρομαι στο εντός παρενθέσεως, τι ακριβώς είναι? 4) Η μεταβλητή temp τύπου integer που έχεις δηλώσει στη function readFile, που χρησιμεύει? 5)η readFile γιατί δεν εμφανίζεται μέσα στη main? και 6)οι τελείτσες ....... τι ρόλο βαράνε? (είπα να τα ρωτήσω όλα να μη μείνω με απορίες ) 1) βάλε malloc (κάνε και τον έλεγχο για την δέσμευση μνήμης) Link 2) κάνε έλεγχο (εγώ απλά το έκανα βιαστικά για να σας δείξω πως να ξεκινήσετε) 4)πουθενά απλά έμεινε μετά από κάποιες αλλαγές 5-6) εμφανίζεται απλά είναι στο σημείο με τις τελίτσες! .........= υπάρχει κώδικας που για ευνόητους λόγους δεν σας έδωσα! 3) pass by reference αν ήταν ένας αριθμός --->1 * εδώ πίνακας και γι αυτό --->2 * Link Link Link
virxen75 Δημοσ. 8 Φεβρουαρίου 2012 Δημοσ. 8 Φεβρουαρίου 2012 το εκτελέσιμο με εμφάνιση βήμα βήμα της δημιουργίας του πινακα bubblegum.zip
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα