johnny21a Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 Πως μπορω με ενα "for" loop να φτιαξω 2 στηλες με τις εγγραφες που βρισκονται σε ενα array η μια μετα την αλλη, δηλαδη : 1 2 3 4 5 6 7... κοκ δυστυχως οταν οι εγγραφες ειναι ζυγος σταματαει το loop πριν γραψει την τιμη για την τελευταια εγγραφη, δηλαδη αν ειναι 9 δειχνει μονο τις 8. Δεν δινω κωδικα ή γλωσσα γιατι απλα με ενδιαφερει η λογικη του loop και οχι να δω πως θα ειναι ετοιμο...
bxenos Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 > size_t i,n; int A[...]; for (i=0,n=sizeof(A)/sizeof(A[0]);i<n;i++){ printf("%d ",A[i]); if(i&1 || i == n-1)//ή if((i % 2) || i == n-1)//στα μονά και στο τέλος, αλλαξε γραμμη printf("\n"); }
johnny21a Δημοσ. 30 Ιουλίου 2009 Μέλος Δημοσ. 30 Ιουλίου 2009 Ευχαριστω πολυ για την απαντηση, μηπως θα μπορουσες να με βοηθησεις στην εξης περιπτωση : δημιουργω ενα html table, που σε καθε στηλη εχει φωτογραφειες, ταurl των φωτογραφιων ειναι περασμενα σε ενα array, ετσι στο loop φτιαχνω στην αρχη ενα row μετα ενα cell για καθε φωτογραφεια στο καθενα απο τα οποια προσθετω ενα url καθε φορα, το προβλημα ειναι αυτο που ανεφερα και πριν, οτι αν ειναι μονος αριθμος παραλειπει την τελευταια photo, να και ο κωδικας σε C# for (int i = 0; i < imagefiles.Length-1 ; i = i + 2) { TableRow ImagesRow = new TableRow(); ImagesTable.Rows.Add(ImagesRow); TableCell ImagesCell = new TableCell(); TableCell ImagesCell2 = new TableCell(); Image newimage = new Image(); newimage.ImageUrl = path + Convert.ToString(Path.GetFileName(imagefiles)); ImagesCell.Controls.Add(newimage); ImagesRow.Controls.Add(ImagesCell); Image newimage2 = new Image(); newimage2.ImageUrl = path + Convert.ToString(Path.GetFileName(imagefiles[i+1])); ImagesCell2.Controls.Add(newimage2); ImagesRow.Controls.Add(ImagesCell2); }
Directx Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 Πως μπορω με ενα "for" loop να φτιαξω 2 στηλες με τις εγγραφες που βρισκονται σε ενα array η μια μετα την αλλη, δηλαδη : 1 2 3 4 5 6 7... κοκ δυστυχως οταν οι εγγραφες ειναι ζυγος σταματαει το loop πριν γραψει την τιμη για την τελευταια εγγραφη, δηλαδη αν ειναι 9 δειχνει μονο τις 8. Δεν δινω κωδικα ή γλωσσα γιατι απλα με ενδιαφερει η λογικη του loop και οχι να δω πως θα ειναι ετοιμο... Δεν διαθέτω αυτή την στιγμή .NET/C# δες μήπως όμως σε βοηθά κάτι τέτοιο: > int i, L = 9; for (i = 1; i <= L ; i += 2) printf("%d - %d\n", i, i + 1); Έξοδος: > 1 - 2 3 - 4 5 - 6 7 - 8 9 - 10 Υ.Γ. Αν μετράς από το μηδέν άλλαξε το i = 1 -> i = 0, οπότε: > 0 - 1 2 - 3 4 - 5 6 - 7 8 - 9
virxen75 Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 για δοκίμασε να τυπώσεις το imagefiles.Length πριν το loop θεωρητικά με αυτά που λες πρέπει να είναι πάντα ζυγός αριθμός είναι?
Evgenios1 Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 Βαλε μια If μεσα στο loop > static void Main(string[] args) { string[] str = new string[12]; for (int i = 0; i < str.Length; i++) str[i] = string.Format("String Index:{0}", i); for (int i = 0; i < str.Length; i+=2) { //to do Console.WriteLine(str[i]); //to do [color="Red"] if(i<str.Length)[/color] Console.WriteLine(str[i+1]); } Console.Read(); } Ή αν θες μπορεις πρωτα να βαλεις τα μονα και μετα τα ζυγα > static void Main(string[] args) { string[] str = new string[12]; for (int i = 0; i < str.Length; i++) str[i] = string.Format("String Index:{0}", i); foreach (var item in mona(str)) //mona Console.WriteLine(item); foreach (var item in zyga(str)) //zyga Console.WriteLine(item); Console.Read(); } static IEnumerable<string> mona(string[] s) { for (int i = 0; i < s.Length; i++) if (i % 2 == 0) yield return s[i]; } static IEnumerable<string> zyga(string[] s) { for (int i = 0; i < s.Length; i++) if (i % 2 != 0) yield return s[i]; }
virxen75 Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 φίλε Evgenios1 αν βάλεις string[] str = new string[13]; δουλεύει?
Evgenios1 Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 φίλε Evgenios1 αν βάλεις string[] str = new string[13]; δουλεύει? Εχει δικαιο θελει > if (i < str.Length-1)
virxen75 Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 επομένως φίλε Evgenios1 ο κώδικας του φίλου δουλεύει το πρόβλημα είναι στο Array του φίλου αυτό που θέλει προϋποθέτει ζεύγη π.χ. τιμές Array (p1,p2),(v1,v2),(g1,g2) θέσεις 0 1 2 3 4 5 σύνολο 6 θέσεις προφανώς κάπου στον κώδικα του χάνει το μισό ζευγος και έχει τιμές Array (p1,p2),(v1,v2),(g1) θέσεις 0 1 2 3 4 σύνολο 5 θέσεις άρα δεν υπάρχει το image i+1 που χρειάζεται στον κώδικα του
bxenos Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 Δεν έχω ασχοληθεί με C#, αλλά δες λίγο μήπως σε βολέψει η παρακάτω αλλαγή: > //αρχη αλλαγων int n = ((imagefiles.Length-1) + 1) / 2; //το n δηλαδη είναι το μέγεθος της λίστας αν ειναι αρτιος ή ο αμέσως επόμενος του //αριθμος (π.χ. μεγεθος λίστας 4=>n==4, μέγεθος 5=>n==6) for (int j = 0; j < n; j++) { int i = j * 2; //τελος αλλαγων TableRow ImagesRow = new TableRow(); ImagesTable.Rows.Add(ImagesRow); TableCell ImagesCell = new TableCell(); TableCell ImagesCell2 = new TableCell(); Image newimage = new Image(); newimage.ImageUrl = path + Convert.ToString(Path.GetFileName(imagefiles[i])); ImagesCell.Controls.Add(newimage); ImagesRow.Controls.Add(ImagesCell); //αρχη αλλαγων if(i<imagefiles.Length-1){ //τε΄λος αλλαγων Image newimage2 = new Image(); newimage2.ImageUrl = path + Convert.ToString(Path.GetFileName(imagefiles[i+1])); ImagesCell2.Controls.Add(newimage2); ImagesRow.Controls.Add(ImagesCell2); //αρχη αλλαγων } //τελος αλλαγων } ---------- Το μήνυμα προστέθηκε στις 14:26 ---------- Φυσικά μπορείς να αφήσεις τον κώδικα ως έχει και να προσθέσεις έλεγχο για το αν "ξέμεινε" κάτι απ'εξω > if( (imagefiles.Length-1) % 2 ){//είναι περιττος αριθμος εικόνων //κανε κατι με το τελευταιο που πρέπει να μπεί μονο του }
johnny21a Δημοσ. 30 Ιουλίου 2009 Μέλος Δημοσ. 30 Ιουλίου 2009 Παιδια ευχαριστω πολυ για ολες τις απαντησεις, δεν ειχα χρονο να δοκιμασω ακομα αλλα μολις μπορεσω θα σας πω αν δουλευει καποια σωστα, το αρχικο προβλημα παντως ηταν οτι αν το array πχ ειχε μεγεθος 9, τοτε το imagefiles.Length = 9, ομως imagefiles[9] δεν υπαρχει και πεταει exception αφου αρχιζει και μετραει απο το μηδεν, ετσι πρεπει να προσαρμοσω το loop για i < imagefiles.Length - 1, και εκει ειναι που χανει το τελευταιο, θα μπορουσα να βαλω μια control μεταβλητη μεσα στο loop ανεξαρτητη απο το i, δεν το δοκιμασα ακομα, η οπως ειπε ο bxenos να εχω εναν ξεχωριστο ελεγχο για τους περιττους αριθμους. θα παιξω με οτι μου στειλατε και θα δω τι δουλευει σωστα. Ευχαριστω ολους για τον χρονο σας ---------- Το μήνυμα προστέθηκε στις 15:58 ---------- Οπως ηταν αναμενομενο δουλευει μια χαρα με το να τσεκαρω για περιττους και να κανω οτι θελω με αυτο που περισσευει στο τελος, thanks φιλε bxenos που με ξεκολησες και επισης αποφασισα να μην γραφω κωδικα ξημερωματα γιατι δεν λειτουργω Βεβαια εξακολουθω να θελω να βρω πως μπορει να γινει η ολη διαδικασια μεσα στο loop χωρις extra ελεγχο για περιττους, μου φαινεται οτι ειναι πιο "σωστη" λυση... Οτι δουλεψει θα σας ενημερωσω
bxenos Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 Σου έχω γράψει διορθώσεις στον κώδικα σου που δεν ασχολείται με περιττους και άρτιους και ανέφερα και την απλή ιδέα με τους περιττούς. Δες στο loop που σου έδωσα, φροντίζει μόνο η ακέραια διαίρεση με το 2 (για να υπολογίσει το n στην αρχή), να μην έχει σφάλμα στρογγυλέματος. Δεν μπορείς να αποφύγεις τους επιπλέον ελέγχους που έβαλα στο loop διότι: α) Αν κάνεις διαίρεση με το 2 (ή προχωράς με βήμα +2), υπάρχει περίπτωση στρογγυλοποίησης/υπερπήδησης του τελευταίου element, αρα χάνεις την τελευταια θεση β) Αν δεν κάνεις ελεγχο για το αν η θέση i+1 είναι εντός του πίνακα θα έχεις προσπαθήσει να προσπελάσεις μη αποδεκτή μνήμη (segmentation fault) (οπότε υποθέτω δεν θα σε αφήσει η C# διότι είναι unsafe)
johnny21a Δημοσ. 30 Ιουλίου 2009 Μέλος Δημοσ. 30 Ιουλίου 2009 Ναι τις εχω δει απλα δεν προλαβα ακομα να τις εφαρμοσω αλλα για δες λιγο το παρακατω που εγραψες : int n = ((imagefiles.Length-1) + 1) / 2; //το n δηλαδη είναι το μέγεθος της λίστας αν ειναι αρτιος ή ο αμέσως επόμενος του //αριθμος (π.χ. μεγεθος λίστας 4=>n==4, μέγεθος 5=>n==6) με τον κωδικα που δινεις το n δεν παιρνει τις τιμες του μεγεθους της λιστας, αλλα τις μισες Δε θα επρεπε να ειναι ετσι ? : if ((imagefiles.Length % 2) == 0) then { n = imagefiles.Length } else { n = imagefiles.Length + 1} εκτος αν δεν καταλαβα τι θες να κανεις
bxenos Δημοσ. 30 Ιουλίου 2009 Δημοσ. 30 Ιουλίου 2009 το (k+1) / 2 σαν ακέραια διαίρεση είναι τυπική προγραμματιστική τεχνική για να βγάζει στρογγυλοποιημένο το ακέραιο πηλίκο με το 2. Δηλαδή α) έστω πίνακας με 4 στοιχεία, τα μισά του είναι 2 β) έστω πίνακας με 5 στοιχεία. Αν έχεις ακέραια διαίρεση τα μισά είναι 2. Αν έχεις διαίρεση με πραγματικούς τα μισά είναι 2,5 και με στρογγυλοποίηση έχεις 3. Ενω με ακέραιες διαιρέσεις (4+1)/2 πέρνεις πάλι 2, με το (5+1)/2 πέρνεις 3. Το (k+1)/2 κάνει αυτό ακριβώς, σου δίνει στρογγυλοποίηση όπως στους πραγματικούς (αν έχεις πάνω απο 0,5 στρογγυλοποιεί στην επόμενη μονάδα). Με τον τρόπο αυτό δεν χάνεις το τελευταίο element που έχανες στον κώδικα σου. ---------- Το μήνυμα προστέθηκε στις 16:49 ---------- Μπορείς να κάνεις και το παρακάτω αν μπερδεύεσαι: > i = 0; while(i < imagefiles.length-1){ κάνε κάτι με το image[i] i++ if(i<imagefiles.length-1){ κάνε κάτι με το image[i] (βάλτο δεξιά απο το προηγούμενο) i++ } //else θα τελειωσει το loop τωρα }
johnny21a Δημοσ. 30 Ιουλίου 2009 Μέλος Δημοσ. 30 Ιουλίου 2009 Ναι καταλαβαινω γιατι το κανεις απλα εσυ ειπες πριν : //το n δηλαδη είναι το μέγεθος της λίστας αν ειναι αρτιος ή ο αμέσως επόμενος του //αριθμος (π.χ. μεγεθος λίστας 4=>n==4, μέγεθος 5=>n==6) πραγμα που δεν ισχυει με τον κωδικα που εδωσες
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.