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

Array σε στηλες


johnny21a

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

Δημοσ.

Πως μπορω με ενα "for" loop να φτιαξω 2 στηλες με τις εγγραφες που βρισκονται σε ενα array η μια μετα την αλλη, δηλαδη :

 

1 2

3 4

5 6

7...

 

κοκ

 

δυστυχως οταν οι εγγραφες ειναι ζυγος σταματαει το loop πριν γραψει την τιμη για την τελευταια εγγραφη, δηλαδη αν ειναι 9 δειχνει μονο τις 8.

 

Δεν δινω κωδικα ή γλωσσα γιατι απλα με ενδιαφερει η λογικη του loop και οχι να δω πως θα ειναι ετοιμο...

Δημοσ.
>
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");
}

Δημοσ.

Ευχαριστω πολυ για την απαντηση, μηπως θα μπορουσες να με βοηθησεις στην εξης περιπτωση :

δημιουργω ενα 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);

}

Δημοσ.
Πως μπορω με ενα "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

Δημοσ.

για δοκίμασε να τυπώσεις το imagefiles.Length πριν το loop

θεωρητικά με αυτά που λες πρέπει να είναι πάντα ζυγός αριθμός

είναι?

Δημοσ.

Βαλε μια 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];
       }

Δημοσ.

επομένως φίλε 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 που χρειάζεται στον κώδικα του

Δημοσ.

Δεν έχω ασχοληθεί με 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 ){//είναι περιττος αριθμος εικόνων
   //κανε κατι με το τελευταιο που πρέπει να μπεί μονο του
}

Δημοσ.

Παιδια ευχαριστω πολυ για ολες τις απαντησεις, δεν ειχα χρονο να δοκιμασω ακομα αλλα μολις μπορεσω θα σας πω αν δουλευει καποια σωστα, το αρχικο προβλημα παντως ηταν οτι αν το array πχ ειχε μεγεθος 9, τοτε το imagefiles.Length = 9, ομως imagefiles[9] δεν υπαρχει και πεταει exception αφου αρχιζει και μετραει απο το μηδεν, ετσι πρεπει να προσαρμοσω το loop για i < imagefiles.Length - 1, και εκει ειναι που χανει το τελευταιο, θα μπορουσα να βαλω μια control μεταβλητη μεσα στο loop ανεξαρτητη απο το i, δεν το δοκιμασα ακομα, η οπως ειπε ο bxenos να εχω εναν ξεχωριστο ελεγχο για τους περιττους αριθμους. θα παιξω με οτι μου στειλατε και θα δω τι δουλευει σωστα.

Ευχαριστω ολους για τον χρονο σας

 

---------- Το μήνυμα προστέθηκε στις 15:58 ----------

 

Οπως ηταν αναμενομενο δουλευει μια χαρα με το να τσεκαρω για περιττους και να κανω οτι θελω με αυτο που περισσευει στο τελος, thanks φιλε bxenos που με ξεκολησες και επισης αποφασισα να μην γραφω κωδικα ξημερωματα γιατι δεν λειτουργω :P

Βεβαια εξακολουθω να θελω να βρω πως μπορει να γινει η ολη διαδικασια μεσα στο loop χωρις extra ελεγχο για περιττους, μου φαινεται οτι ειναι πιο "σωστη" λυση...

Οτι δουλεψει θα σας ενημερωσω

Δημοσ.

Σου έχω γράψει διορθώσεις στον κώδικα σου που δεν ασχολείται με περιττους και άρτιους και ανέφερα και την απλή ιδέα με τους περιττούς.

Δες στο loop που σου έδωσα, φροντίζει μόνο η ακέραια διαίρεση με το 2 (για να υπολογίσει το n στην αρχή), να μην έχει σφάλμα στρογγυλέματος.

 

Δεν μπορείς να αποφύγεις τους επιπλέον ελέγχους που έβαλα στο loop διότι:

α) Αν κάνεις διαίρεση με το 2 (ή προχωράς με βήμα +2), υπάρχει περίπτωση στρογγυλοποίησης/υπερπήδησης του τελευταίου element, αρα χάνεις την τελευταια θεση

β) Αν δεν κάνεις ελεγχο για το αν η θέση i+1 είναι εντός του πίνακα θα έχεις προσπαθήσει να προσπελάσεις μη αποδεκτή μνήμη (segmentation fault) (οπότε υποθέτω δεν θα σε αφήσει η C# διότι είναι unsafe)

Δημοσ.

Ναι τις εχω δει απλα δεν προλαβα ακομα να τις εφαρμοσω αλλα για δες λιγο το παρακατω που εγραψες :

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}

 

εκτος αν δεν καταλαβα τι θες να κανεις

Δημοσ.

το (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 τωρα
}

Δημοσ.

Ναι καταλαβαινω γιατι το κανεις απλα εσυ ειπες πριν :

 

//το n δηλαδη είναι το μέγεθος της λίστας αν ειναι αρτιος ή ο αμέσως επόμενος του

//αριθμος (π.χ. μεγεθος λίστας 4=>n==4, μέγεθος 5=>n==6)

 

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

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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