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

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

Δημοσ.

Διαβάζω αυτό τον καιρό για τις τρισδιάστατες διατάξεις στην C.Το πρόβλημα μου είναι ότι σε μία απλή 2στατη μπορώ να καταλάβω πως αποθηκεύονται τα στοιχεία(γραμμές-στήλες) αλλά στην 3στατη πως γίνεται;Μπορεί κάποιος να μου δώσει να καταλάβω με κάποιο τρόπο;

Δημοσ.

Σκέψου μια στοίβα με χαρτιά (κόλλες Α4 αν σε βολεύει). Κάθε ένα από αυτά τα φύλλα είναι μια 2d διάταξη. Όταν τα βάλεις όμως τα φύλλα το ένα πάνω στο άλλο δημιουργείς και μια τρίτη διάσταση, η οποία στην προκειμένη είναι το index της κόλλας.

 

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

 

Κάπως έτσι λειτουργούν οι 3d διατάξεις γενικότερα, όχι μόνο στην c. Ελπίζω να ήταν αρκετά απλό το παράδειγμα και να μην σε μπέρδεψα περισσότερο :P

Δημοσ.

Επίσης, μπορεί να σε βοηθήσει αν το σκεφτείς στον χώρο. Οι 2 διαστάσεις (μήκος και πλάτος) ορίζουν ένα επίπεδο, ενώ όταν προστεθεί και 3η διάσταση (ύψος) ορίζεται χώρος.

 

Ένα απλό παράδειγμα είναι ας πούμε ένα ράφι. Με 2 διαστάσεις (μήκος, πλάτος) είναι σαν το βλέπεις μόνο από πάνω (ή από κάτω). Αν το δεις υπό γωνία, έχει και 3η διάσταση, πάχος (ύψος).

Δημοσ.

Γιατί συγκεκριμένα Rubik?

 

Αυτός μου ήρθε στο μυαλό όταν διάβασα το topic. :-D

Να και κάτι που δεν είναι Rubik.

 

Screenshot-Cubes3D-4.png

Δημοσ.

γιατι μαλλον ειναι ο πιο γνωστος :P

 

Εσύ μόλις ακούς κύβο δηλαδή σου έρχεται ο Rubik στο μυαλό και όχι το σχήμα γενικότερα;! :P

 

Το λέω γιατί το σκέφτηκα και εγώ στην αρχή να αναφερθώ στον κύβο του rubik αλλά δεν μπορείς να εξηγήσεις εύκολα την έννοια της τρίτης διάστασης εκεί. Ο κύβος πχ που έβαλε από πάνω ο zanyf είναι ένα πολύ καλό παράδειγμα (αρκεί να μην βαριέσαι να φτιάξεις το σχήμα :P)

  • 1 μήνα μετά...
Δημοσ.

Θέτω μια ερώτηση που με έχει δυσκολέψει αρκετά εως τώρα.Όταν αναφερόμαστε σε 3d διατάξεις με int,float κλπ.οι διατάξεις ορίζονται ως π.χ.array[table][row][column],δηλαδή μια διάταξη τριών πινάκων,τάδε γραμμών και τάδε στηλών.Για αλφαρηθμητικά όμως(κ μόνο σε αυτή την περίπτωση),μια δήλωση του τύπου array[3][5][80] δηλώνει μία διάταξη με τρεις λίστες(?),κάθε μία απο τις οποίες αποθηκεύει 5 αλφαρηθμητικά,καθένα απο τα οποία δέχεται έως 80 χαρακτήρες,σωστά;

 

Υ.Γ.Δεν ξέρω αν έγινα απόλυτα κατανοητός.

Δημοσ.

Θέτω μια ερώτηση που με έχει δυσκολέψει αρκετά εως τώρα.Όταν αναφερόμαστε σε 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

Δημοσ.

>#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κλπ.Ποιο το λάθος μου(εγώ προσωπικά δεν βρίσκω τπτ);

Δημοσ.

Στη γραμμή

>if((k%3)==0)printf("\n");

αλλαξε το

>k%3

σε

>κ==2

 

Αυτό διότι το k παίρνει τιμές από 0 μέχρι 2 ... δεν υπάρχει λοιπόν λόγος να κάνεις modulus (%) και επίσης θέλεις να εμφανιστεί το newline μετά το τελευταίο στοιχείο..

Δημοσ.

Στη γραμμή

>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 θα αλλάζει γραμμή.

Δημοσ.

Είναι λίγο 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');
	}
...

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

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

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

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

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

Σύνδεση

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

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