capoelo Δημοσ. 19 Μαΐου 2012 Δημοσ. 19 Μαΐου 2012 Διαβάζω αυτό τον καιρό για τις τρισδιάστατες διατάξεις στην C.Το πρόβλημα μου είναι ότι σε μία απλή 2στατη μπορώ να καταλάβω πως αποθηκεύονται τα στοιχεία(γραμμές-στήλες) αλλά στην 3στατη πως γίνεται;Μπορεί κάποιος να μου δώσει να καταλάβω με κάποιο τρόπο;
computeras13 Δημοσ. 19 Μαΐου 2012 Δημοσ. 19 Μαΐου 2012 Σκέψου μια στοίβα με χαρτιά (κόλλες Α4 αν σε βολεύει). Κάθε ένα από αυτά τα φύλλα είναι μια 2d διάταξη. Όταν τα βάλεις όμως τα φύλλα το ένα πάνω στο άλλο δημιουργείς και μια τρίτη διάσταση, η οποία στην προκειμένη είναι το index της κόλλας. Για παράδειγμα αν οι κόλλες σου είχαν και κουτάκια (πως ήταν εκείνα τα τετράδια που γράφαμε στο δημοτικό μαθηματικά αν θυμάμαι καλά) και έχεις την στοίβα με τα φύλλα σου, για να βρεις ένα κουτάκι, θα πρέπει να δώσεις 3 στοιχεία. Την στήλη που βρίσκεται, την σειρά και σε ποια κόλλα. Κάπως έτσι λειτουργούν οι 3d διατάξεις γενικότερα, όχι μόνο στην c. Ελπίζω να ήταν αρκετά απλό το παράδειγμα και να μην σε μπέρδεψα περισσότερο
migf1 Δημοσ. 19 Μαΐου 2012 Δημοσ. 19 Μαΐου 2012 Επίσης, μπορεί να σε βοηθήσει αν το σκεφτείς στον χώρο. Οι 2 διαστάσεις (μήκος και πλάτος) ορίζουν ένα επίπεδο, ενώ όταν προστεθεί και 3η διάσταση (ύψος) ορίζεται χώρος. Ένα απλό παράδειγμα είναι ας πούμε ένα ράφι. Με 2 διαστάσεις (μήκος, πλάτος) είναι σαν το βλέπεις μόνο από πάνω (ή από κάτω). Αν το δεις υπό γωνία, έχει και 3η διάσταση, πάχος (ύψος).
Moderators Spect~ Δημοσ. 19 Μαΐου 2012 Moderators Δημοσ. 19 Μαΐου 2012 γιατι μαλλον ειναι ο πιο γνωστος
zynif Δημοσ. 19 Μαΐου 2012 Δημοσ. 19 Μαΐου 2012 Γιατί συγκεκριμένα Rubik? Αυτός μου ήρθε στο μυαλό όταν διάβασα το topic. Να και κάτι που δεν είναι Rubik.
computeras13 Δημοσ. 19 Μαΐου 2012 Δημοσ. 19 Μαΐου 2012 γιατι μαλλον ειναι ο πιο γνωστος Εσύ μόλις ακούς κύβο δηλαδή σου έρχεται ο Rubik στο μυαλό και όχι το σχήμα γενικότερα;! Το λέω γιατί το σκέφτηκα και εγώ στην αρχή να αναφερθώ στον κύβο του rubik αλλά δεν μπορείς να εξηγήσεις εύκολα την έννοια της τρίτης διάστασης εκεί. Ο κύβος πχ που έβαλε από πάνω ο zanyf είναι ένα πολύ καλό παράδειγμα (αρκεί να μην βαριέσαι να φτιάξεις το σχήμα )
capoelo Δημοσ. 27 Ιουνίου 2012 Μέλος Δημοσ. 27 Ιουνίου 2012 Θέτω μια ερώτηση που με έχει δυσκολέψει αρκετά εως τώρα.Όταν αναφερόμαστε σε 3d διατάξεις με int,float κλπ.οι διατάξεις ορίζονται ως π.χ.array[table][row][column],δηλαδή μια διάταξη τριών πινάκων,τάδε γραμμών και τάδε στηλών.Για αλφαρηθμητικά όμως(κ μόνο σε αυτή την περίπτωση),μια δήλωση του τύπου array[3][5][80] δηλώνει μία διάταξη με τρεις λίστες(?),κάθε μία απο τις οποίες αποθηκεύει 5 αλφαρηθμητικά,καθένα απο τα οποία δέχεται έως 80 χαρακτήρες,σωστά; Υ.Γ.Δεν ξέρω αν έγινα απόλυτα κατανοητός.
migf1 Δημοσ. 27 Ιουνίου 2012 Δημοσ. 27 Ιουνίου 2012 Θέτω μια ερώτηση που με έχει δυσκολέψει αρκετά εως τώρα.Όταν αναφερόμαστε σε 3d διατάξεις με int,float κλπ.οι διατάξεις ορίζονται ως π.χ.array[table][row][column],δηλαδή μια διάταξη τριών πινάκων,τάδε γραμμών και τάδε στηλών.Για αλφαρηθμητικά όμως(κ μόνο σε αυτή την περίπτωση),μια δήλωση του τύπου array[3][5][80] δηλώνει μία διάταξη με τρεις λίστες(?),κάθε μία απο τις οποίες αποθηκεύει 5 αλφαρηθμητικά,καθένα απο τα οποία δέχεται έως 80 χαρακτήρες,σωστά; Υ.Γ.Δεν ξέρω αν έγινα απόλυτα κατανοητός. Σωστά! > #include <stdio.h> #include <stdlib.h> // ------------------------------------------------------------- int main( void ) { char tabstr[3][5][80] = { // array of string-lists /* 1st list */ { "l0s0", "l0s1", "l0s2", "l0s3", "l0s4" }, /* 2nd list */ { "l1s0", "l1s1", "l1s2", "l1s3", "l1s4" }, /* 3rd list */ { "l2s0", "l2s1", "l2s2", "l2s3", "l2s4" } }; for (int i=0; i < 3; i++) { for (int j=0; j < 5; j++) printf( "list %d, str %d: %s\n", i,j, tabstr[i][j] ); putchar('\n'); } exit(0); } Έξοδος: > list 0, str 0: l0s0 list 0, str 1: l0s1 list 0, str 2: l0s2 list 0, str 3: l0s3 list 0, str 4: l0s4 list 1, str 0: l1s0 list 1, str 1: l1s1 list 1, str 2: l1s2 list 1, str 3: l1s3 list 1, str 4: l1s4 list 2, str 0: l2s0 list 2, str 1: l2s1 list 2, str 2: l2s2 list 2, str 3: l2s3 list 2, str 4: l2s4
capoelo Δημοσ. 27 Ιουνίου 2012 Μέλος Δημοσ. 27 Ιουνίου 2012 >#include<stdio.h> #include<stdlib.h> int main(void) { int array[3][3][3],i,j,k,x=1; for(i=0;i<3;i++) for(j=0;j<3;j++) for(k=0;k<3;k++) { array[i][j][k]=x; x++; } for(i=0;i<3;i++) for(j=0;j<3;j++) for(k=0;k<3;k++) { printf("%d\t",array[i][j][k]); if((k%3)==0)printf("\n"); } printf("\n"); system("Pause"); return 0; } Ο κώδικας που έχω παραθέσει,δημιουργεί μία διάταξη 3x3x3,περνά στα στοιχεία τις τιμές 1-27 και στη συνέχεια τις εμφανίζει.Το ερώτημα μου είναι απλά "εμφανισιακό".Το αποτέλεσμα είναι της μορφής 1-234-567κλπ. αλλα εγώ θέλω να εμφανίζει 123-456κλπ.Ποιο το λάθος μου(εγώ προσωπικά δεν βρίσκω τπτ);
krakkhed Δημοσ. 27 Ιουνίου 2012 Δημοσ. 27 Ιουνίου 2012 Στη γραμμή >if((k%3)==0)printf("\n"); αλλαξε το >k%3 σε >κ==2 Αυτό διότι το k παίρνει τιμές από 0 μέχρι 2 ... δεν υπάρχει λοιπόν λόγος να κάνεις modulus (%) και επίσης θέλεις να εμφανιστεί το newline μετά το τελευταίο στοιχείο..
imitheos Δημοσ. 27 Ιουνίου 2012 Δημοσ. 27 Ιουνίου 2012 Στη γραμμή >if((k%3)==0)printf("\n"); αλλαξε το >k%3 σε >κ==2 Αυτό διότι το k παίρνει τιμές από 0 μέχρι 2 ... δεν υπάρχει λοιπόν λόγος να κάνεις modulus (%) και επίσης θέλεις να εμφανιστεί το newline μετά το τελευταίο στοιχείο.. Ούτε ο έλεγχος k==2 χρειάζεται μια και ουσιαστικά σημαίνει "τέλος του εσωτερικού for". Μπορεί να γίνει ο κώδικας > for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) { for (k = 0; k < 3; k++) printf("%d\t", array[i][j][k]); printf("\n"); } oπότε όταν τυπώνει τα 3 νούμερα και τελειώνει το for-k θα αλλάζει γραμμή.
migf1 Δημοσ. 27 Ιουνίου 2012 Δημοσ. 27 Ιουνίου 2012 Είναι λίγο off-topic, αλλά αν δεν το υπαγορεύει η εκφώνηση της άσκησης, τότε δεν υπάρχει λόγος να καθυστερεί η εκτέλεση με 2 διαφορετικά 3πλο-φωλιασμένα loops για την ανάθεση και το τύπωμα. Μπορούν να γίνονται ταυτόχρονα, δίνοντάς μας σημαντικό κέρδος σε ταχύτητα... > ... int array[3][3][3] = {0}; // near initialization int x=1; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) printf("%d\t", (array[i][j][k] = x++) ); putchar('\n'); } ...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα