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

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

Δημοσ.

Γράφε απλά και λιτά βάζοντας pointers και γράφοντας έτσαι κώδικα δεν θα καταλάβεις εσύ τι κάνει για αρχή γράψτο όσο ποιο κατανοητά μπορείς.

 

Όσο για τον Κώδικα δες τις Αλλαγές:

#include<stdio.h>
int main(void)
{
    int i;
    int N = 5;
    int A[]={2,8,4,1,3};
    int B[N];
    int *p = &A[0];
    int *q = &B[N-1];
    /*  θέλω να κάνω copy όλα τα στοιχεία του A στον πίνακα Β
       με ανάστροφη σειρά με την χρήση δείκτη.
       Αρχικά έχω την παρακάτω κατάσταση:
       A[2][8][4][1][3]
       B[ ][ ][ ][ ][ ]
       
      
    */
    
 for (i=0;i<N;i++)
 { 
     *(q+i) = *(p+(N-i-1)); //des edw  
 }
 
 
 for(i=0;i<N;i++)
 {
     
     printf("%d \\ %d\n",A[i],*(q+i));//Printing Row
     
 }            
            
    //system("pause");//Uncomment gia na deis se win
    return 0;
}

ρέπει να κατανοήσεις σχέση Πίνακα kκαι Pointer.

Σε έναν Πίνακα το όνομά του μόνο είναι Pointer στο πρώτο στοιχείο έτσι το i-στό στοιχείο θα είναι στην θέση μνήμης <όνομα Πίνακα>+i έτσι μπορείς να μεταβείς σε οποιαδήποτε θέση του πίνακα έτσι απλά.

 

Στο παράδειγμά εδώ απλά χρησιμοποιώ τους pointers p και q αντί για τα ονόματα των πινάκων.

 

 

Και για να μην σου ωσω απ' ευθείας μασημένη τροφή μελέτησε το σημείο poy είναι Όλη η ουσία:

 *(q+i) = *(p+(N-i-1)); //des edw  

Για να σε βοηθήσω καλύτερα δές το σαν:

 *(q+i) = *(p+( (N-1)-i)); //des edw  

Καλό είναι να κάνεις τον πίνακα με κουτάκια για να τον μελετήσεις καλύτερα.

  • Απαντ. 60
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.
  Στις 4/5/2014 στις 8:47 ΜΜ, PC_MAGAS είπε

Γράφε απλά και λιτά βάζοντας pointers και γράφοντας έτσαι κώδικα δεν θα καταλάβεις εσύ τι κάνει για αρχή γράψτο όσο ποιο κατανοητά μπορείς.

 

Όσο για τον Κώδικα δες τις Αλλαγές:

  Εμφάνιση κρυμμένου περιεχομένου

Πρέπει να κατανοήσεις σχέση Πίνακα kκαι Pointer.

Σε έναν Πίνακα το όνομά του μόνο είναι Pointer στο πρώτο στοιχείο έτσι το i-στό στοιχείο θα είναι στην θέση μνήμης <όνομα Πίνακα>+i έτσι μπορείς να μεταβείς σε οποιαδήποτε θέση του πίνακα έτσι απλά.

 

Στο παράδειγμά εδώ απλά χρησιμοποιώ τους pointers p και q αντί για τα ονόματα των πινάκων.

 

 

Και για να μην σου ωσω απ' ευθείας μασημένη τροφή μελέτησε το σημείο poy είναι Όλη η ουσία:

 *(q+i) = *(p+(N-i-1)); //des edw  

Για να σε βοηθήσω καλύτερα δές το σαν:

 *(q+i) = *(p+( (N-1)-i)); //des edw  

Καλό είναι να κάνεις τον πίνακα με κουτάκια για να τον μελετήσεις καλύτερα.

 

Έχω την υπόνοια ότι κάτι δε δουλεύει σωστά εδώ.

 

Έχεις ευκαιρία για edit.

 

EDIT: (Κερδίζω ευκαιρία για edit)

Τώρα που το κοίταξα, κανονικά πρέπει να τρέξει μια χαρά. Δεν καταλαβαίνω γιατί δε δουλεύει στο ideone.

Δημοσ.
  Στις 4/5/2014 στις 9:52 ΜΜ, Aztec είπε

To q δεν είναι pointer στο τελευταίο στοιχείο του B και στη συνέχεια το αυξάνει ;

 

Όντως. Απλά το πρόβλημα δε φαίνεται επειδή δεν εκτυπώνει τον πίνακα B στο τέλος (στον gcc). Πάει και αναθέτει κανονικά εκτός πίνακα. Έτσι εκτυπώνοντας το *(q+i), στον gcc εκτυπώνει τα στοιχεία που όντως ανέθεσε εκεί. Στο ideone φαίνεται η απροσεξία.

 

Θα δουλέψει σωστά με αρχικοποίηση του q στην αρχή του B.

Δημοσ.
  Στις 4/5/2014 στις 8:47 ΜΜ, PC_MAGAS είπε

Γράφε απλά και λιτά βάζοντας pointers και γράφοντας έτσαι κώδικα δεν θα καταλάβεις εσύ τι κάνει για αρχή γράψτο όσο ποιο κατανοητά μπορείς.

 

 for (i=0;i<N;i++)
 { 
     *(q+i) = *(p+(N-i-1)); //des edw  
 }
Και για να μην σου ωσω απ' ευθείας μασημένη τροφή μελέτησε το σημείο poy είναι Όλη η ουσία:

 *(q+i) = *(p+(N-i-1)); //des edw  
Για να σε βοηθήσω καλύτερα δές το σαν:

 *(q+i) = *(p+( (N-1)-i)); //des edw  
Καλό είναι να κάνεις τον πίνακα με κουτάκια για να τον μελετήσεις καλύτερα.

 

Αγνοώντας ότι τα 2 for μπορούν να ενσωματωθούν σε ένα, ο παραπάνω τρόπος με N,i,κτλ δεν είναι άσκοπα περίπλοκος ? Κάτι σαν το παρακάτω δεν θα ήταν πιο κατανοητό ?

#include <stdio.h>

#define N 5

int main(void)
{
	int A[N] = { 2, 8, 4, 1, 3 };
	int B[N];

	int *p = &A[N];
	int *q = &B[0];

	while (p > A) {
		--p;
		*q = *p;
		q++;
	}

	return 0;
}
Παρατηρήσεις:

 

1) Το &Α[N] το έβαλα σκόπιμα. Μπορεί μεν να ξεπερνά κατά μία θέση το όριο του πίνακα αλλά εφόσον δεν προσπελαύνουμε την διεύθυνση δεν αποτελεί αοριστία.

 

2) Η αύξηση και μείωση των δύο δεικτών θα μπορούσε να συμπτυχθεί σε λιγότερες δηλώσεις αλλά το έβαλα έτσι για να είναι πιο ξεκάθαρο - κατανοητό. Ξεκινάμε από το τέλος του ενός πίνακα και την αρχή του άλλου και αντιγράφουμε τις τιμές μειώνοντας-αυξάνοντας παράλληλα τους δείκτες.

 

Ίσως να είναι nitpick αλλά την μορφή *(τάδε + i) που χρησιμοποίησες την έχω στο μυαλό μου ταυτόσημη με την μορφή τάδε δηλαδή το λεγόμενο "array indexing". Όταν διαβάζω να ζητάνε "να χρησιμοποιηθεί pointer indexing", "να γίνει με δείκτες", κτλ πιστεύω πως εννοούν να γίνει με την μορφή με το while και το τάδε++.

 

Edit: Αυτό βέβαια στο πλαίσιο μιας άσκησης και τι θέλει να σου μάθει αυτή. Το αποτέλεσμα φυσικά είναι το ίδιο και με τις δύο μορφές.

Δημοσ.
  Στις 4/5/2014 στις 6:41 ΜΜ, defacer είπε

Τα διδακτικά μέσα στα οποία αναφέρεσαι διδάσκουν θεωρία αλγορίθμων, όχι "αλγοριθμική σκέψη".

Δεν γνωρίζω να υφίσταται τέτοιου είδους διαχωρισμός!

 

Για να σου δώσω όμως το benefit of the doubt, I just googled: "definition of algorithmic thinking" με τα εξής αποτελέσματα από ενδεικτικές πηγές που αξιολογώ ως αξιόπιστες (feel free να διαβάσεις ολόκληρα τα άρθρα, εγώ βάζω μόνο τα αποσπάσματα στα οποία εξηγούν τι είναι Αλγοριθμική Σκέψη):

 

Committee of Logic Education

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Vienna University of Technology (Gerald Futschek)

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Standford University (Stephen Cooper)

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Johns Hopkins University: 600.106 Pre-programming (Algorithmic Thinking)

 

  Εμφάνιση κρυμμένου περιεχομένου

 

academia.edu: FROM THE ALGORITHMIC THINKING TO THE CONCEPT OF PROJECT

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Όπως ίσως διαπίστωσες, η "αλγοριθμική αποδοτικότητα" είναι πανταχού παρούσα στην "αλγοριθμική σκέψη"... ομοίως και οι δομές.

 

  Στις 4/5/2014 στις 6:41 ΜΜ, defacer είπε

Αν δεν κάνω λάθος, συνιστάς στους νέους να μαθαίνουν pointers.

Λάθος κάνεις. Συνιστώ στους νέους που θέλουν να ασχοληθούν σοβαρά (και κυρίως επαγγελματικά) με προγραμματισμό να μάθουν pointers. Διότι κατά την άποψή μου, έτσι θα διευρύνουν και τους ορίζοντές τους και το πεδίο δράσης τους. Και είναι καλύτερα να τους μάθουν με άνεση φοιτητικού χρόνου παρά κάτω από επαγγελματική πίεση.

 

  Αναφορά σε κείμενο

Υπάρχει κάποια περίπτωση (κάποια γλώσσα που γνωρίζεις δηλαδή) στην οποία χρησιμοποιούνται pointers αλλά μπορείς να αποφύγεις όλα αυτά τα δεινά που αναφέρεις; Αν υπάρχει, ποιά είναι; Αν δεν υπάρχει, πώς συμβιβάζονται αυτά τα δύο πράγματα;

Αν και η ερώτηση σου αυτή βασίζεται στην λανθασμένη αρχική σου διαπίστωση, ακόμα και στη C (η οποία πάει χέρι-χέρι με τους pointers) δεν είσαι υποχρεωμένος να γράψεις low level υλοποιήσεις. Υπάρχουν άπειρες, έτοιμες high-level βιβλιοθήκες τις οποίες μπορείς να άνετα να χρησιμοποιήσεις. Αν θέλεις να ασχοληθείς επαγγελματικά όμως, καλό θα σου κάνει κατά την άποψή μου να έχεις γράψει χειροκίνητα έστω και μια απλή συνδεδεμένη λίστα, έστω και μια φορά στη ζωή σου.

 

  Αναφορά σε κείμενο

Επίσης όμως "δύναται" και να κάνει ακριβώς το αντίθετο από το να διευκολύνει. Αν το "δύναται" το εννοείς με την έννοια του λεξικού "υπάρχει non-zero chance να συμβεί" τότε νομίζω ότι αυτή η τοποθέτηση απέχει πάρα πολύ από το να χαρακτηριστεί πειστικό επιχείρημα. Αν το εννοείς με άλλη έννοια, ποιά είναι αυτή;

 

Επίσης, δεν ξέρω πώς εννοείς το "έξτρα" αλλά επειδή μιλάμε για τη C, νομίζω πως όλοι σ' αυτό το thread συμφωνούμε πως οι pointers είναι κάθε άλλο παρά έξτρα με το οποίο αν θες δεν ασχολείσαι.

switch(playerName) {
    case "mitsos": // που να στα λέω τώρα...
}

 

Δες παραπάνω.

EDIT:

 

ΥΓ. Είναι απλά ιδέα μου η σε επίπεδο κώδικα της αρχικής ερώτησης η 4η σελίδα του νήματος αναμασάει απλώς όσα έχουν ήδη γραφτεί στην 1η σελίδα;

  • Like 1
Δημοσ.
  Στις 5/5/2014 στις 8:35 ΠΜ, migf1 είπε

...ακόμα και στη C (η οποία πάει χέρι-χέρι με τους pointers) δεν είσαι υποχρεωμένος να γράψεις low level υλοποιήσεις. Υπάρχουν άπειρες, έτοιμες high-level βιβλιοθήκες τις οποίες μπορείς να άνετα να χρησιμοποιήσεις. Αν θέλεις να ασχοληθείς επαγγελματικά όμως, καλό θα σου κάνει κατά την άποψή μου να έχεις γράψει χειροκίνητα έστω και μια απλή συνδεδεμένη λίστα, έστω και μια φορά στη ζωή σου.

 

Αυτο.

Δημοσ.
  Στις 5/5/2014 στις 8:35 ΠΜ, migf1 είπε

EDIT:

 

ΥΓ. Είναι απλά ιδέα μου η σε επίπεδο κώδικα της αρχικής ερώτησης η 4η σελίδα του νήματος αναμασάει απλώς όσα έχουν ήδη γραφτεί στην 1η σελίδα;

Υποθέτω πως εννοείς εμένα. Κοιτώντας την 1η σελίδα, ο κώδικάς μου είναι όντως τραγικά ίδιος με αυτόν που έδωσες στο μήνυμα #6. Ζητώ συγγνώμη. Προς υπεράσπισην μου, όταν διάβασα το νήμα πρόσεχα μόνο την θεωρητική συζήτηση που είχατε και τώρα που έγραψα τον κώδικα για να απαντήσω στον pc_maga δεν σκέφτηκα να κοιτάξω αν έχει δωθεί παρόμοιος.

Δημοσ.

Η ζωή είναι γεμάτη εκπλήξεις. Κάθε φορά που πιστεύω ότι έχω δει το άκρον άωτον του non-answer διαψεύδομαι.

 

Και κάπου εδώ τελειώνει άδοξα η συμμετοχή μου σ' αυτό το thread.


  Στις 5/5/2014 στις 8:39 ΠΜ, geomagas είπε

Αυτο.

 

Εννοείς το πρώτο μέρος που απλά αποφεύγει την ερώτηση (υπάρχει καμιά βιβλιοθήκη που θα κάνει το switch να δουλέψει ή που θα με γλυτώσει από το manual memory management?) ή το δεύτερο μέρος που είπα το ίδιο πριν 3 σελίδες αλλά για κάποιο λόγο δεν άρεσε σε όσους φαίνεται τώρα να αρέσει;

Δημοσ.
  Στις 5/5/2014 στις 11:03 ΠΜ, defacer είπε

Η ζωή είναι γεμάτη εκπλήξεις. Κάθε φορά που πιστεύω ότι έχω δει το άκρον άωτον του non-answer διαψεύδομαι.

 

Και κάπου εδώ τελειώνει άδοξα η συμμετοχή μου σ' αυτό το thread.

 

Εννοείς το πρώτο μέρος που απλά αποφεύγει την ερώτηση (υπάρχει καμιά βιβλιοθήκη που θα κάνει το switch να δουλέψει ή που θα με γλυτώσει από το manual memory management?) ή το δεύτερο μέρος που είπα το ίδιο πριν 3 σελίδες αλλά για κάποιο λόγο δεν άρεσε σε όσους φαίνεται τώρα να αρέσει;

 

Θελεις να σου απαντησω; Φοβαμαι οτι αν το κανω, δεν θα "τελειωσει η συμμετοχη σου σε αυτό το thread".

 

Εκτός κι αν το μετάνιωσες και θέλεις να βρεις έναν τρόπο να τελειώσει "ένδοξα"...

  • Like 1
Δημοσ.
  Στις 5/5/2014 στις 11:18 ΠΜ, geomagas είπε

Θελεις να σου απαντησω; Φοβαμαι οτι αν το κανω, δεν θα "τελειωσει η συμμετοχη σου σε αυτό το thread".

 

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

Δημοσ.
  Στις 5/5/2014 στις 8:45 ΠΜ, imitheos είπε

Υποθέτω πως εννοείς εμένα.

...

Δεν εννοούσα συγκεκριμένα εσένα. Μου έκανε εντύπωση που στη σελίδα 4 καταπιαστήκατε 3-4 με κώδικα που είχε ήδη επιλυθεί στην σελίδα 1.

 

  Στις 4/5/2014 στις 8:47 ΜΜ, PC_MAGAS είπε

Γράφε απλά και λιτά βάζοντας pointers και γράφοντας έτσαι κώδικα δεν θα καταλάβεις εσύ τι κάνει για αρχή γράψτο όσο ποιο κατανοητά μπορείς...

Για να πούμε του στραβού το δίκιο, ο κώδικας που έδωσες δεν χαρακτηρίζεται άμεσα ούτε απλός, ούτε λιτός, ούτε κατανοητός.

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Δημοσ.
  Στις 5/5/2014 στις 11:39 ΠΜ, defacer είπε

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

 

Ok then!

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

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

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

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

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

Σύνδεση

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

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