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

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

Δημοσ.

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 = *p;
     
     
 }
 for(i=0;i<N;i++)
 {
     
     printf("%d\ %d\n",A,*q);
     
 }            
            
    system("pause");
    return 0;
}

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

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

Δημοσ.

Και που σου «σκάει» το πρόγραμμα; 

 

Μερικες παρατηρήσεις:

 

Στο 

 

int *p = &A[0];

δηλώνεις οτι το *p θα ειναι πάντα &A[0] αρα δεν θα αλλάξει οτι i κι αν δοκιμάσεις

Ομοίως και το *q γιατί N=5 άρα &B[N-1] ===> &B[4]

 

Επισης στο 

 

for (i=0;*i<N;i++)

γιατί καλείς το i με δείκτη;

 

offtopic

 

 

Το nick programmer το διάλεξες τυχαία ή συνειδητά;

 

 

Δημοσ.

συνειδητα το διαλεξα τωρα ξεκιναω να μαθαινω καλα προγραμματισμο στην C  στους πινακες

ενταξει κανενας δεν εμαθε προγραμματισμο αμεσως ...λογικα ειναι τα λαθη..αν δεν κανεις λαθος δεν μαθαινεις..

Δημοσ.

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

Δημοσ.

Με βάση αυτά που είπε ο/η arc, πρέπει σε κάθε επανάληψη να πηγαίνεις στο επόμενο στοιχείο των πινάκων.

 

Κάτι σαν αυτό δηλαδή:

for (i = 0; i < N; i++)
        *q-- = *p++;

...

Δημοσ.

...

   /*  θέλω να κάνω copy όλα τα στοιχεία του A στον πίνακα Β

       με ανάστροφη σειρά με την χρήση δείκτη.

       Αρχικά έχω την παρακάτω κατάσταση:

       A[2][8][4][1][3]

       B[ ][ ][ ][ ][ ]

    */

 

Προσωπικά διαβάζοντας "με χρήστη δεικτών" θεώρησα πως δεν πρέπει να χρησιμοποιηθούν array indexers (δηλαδή το i). Η άσκηση είναι πολύ απλή "entry level" για δείκτες.

 

Μια κοινή υλοποίηση είναι να βάλεις τον p να δείχνει στο τέλος + 1 του A, τον q να δείχνει στην αρχή του B και να χρησιμοποιήσεις ένα apl;o "μονόγραμμο" loop.

 

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

 

 

 

...
#define N 5
int main( void )
{
	int A[N] = {2,8,4,1,3};
	int B[N] = {0};
	int *p = &A[N], *q = B;

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

	return 0;
}

 

  • Like 2
Δημοσ.

Επισης για εκτύπωση μαζι : 

 
#include<stdio.h>
#define N 5
int main( void )
{
    int A[N] = {2,8,4,1,3};
    int B[N] = {0};
    int *p = &A[N], *q = B;
 
while ( p > A ) {
        int i=0;
        *q++ = *--p;
        printf("%d" , p[i++]);
}
 
return 0;
}
 
Δημοσ.

 

Επισης για εκτύπωση μαζι : 

 
#include<stdio.h>
#define N 5
int main( void )
{
    int A[N] = {2,8,4,1,3};
    int B[N] = {0};
    int *p = &A[N], *q = B;
 
while ( p > A ) {
        int i=0;
        *q++ = *--p;
        printf("%d" , p[i++]);
}
 
return 0;
}
 

Μήπως εννοείς:

printf("%d" , *(q-1));

Στο q πάει το αποτέλεσμα, όχι στο p.

  • Like 1
Δημοσ.

Αρχικά εκανα λάθος στο σύμβολο ναι αλλα  δεν καταλαβαινω τώρα γιατι και το q[i++] δινει απροσδιοριστη συμπεριφορά στην έξοδο. Το κοιτάζω τωρα. 

 

To δικο σου πάντως ειναι προτιμότερο αφου δεν θέλει καν να δηλώσεις έναν περιττό μετρητή. 

 

YΓ. Το βρήκα. Εντάξει γελάει ο κοσμος. Οτι να ναι. Το i καταρχην πρεπει να πάει εκτος loop. 

 

Edit : Θεματοθέτη καλύτερα κράτησε τον τροπο που παρέθεσε ο gon αν θες να εκτυπώνεις τα στοιχεια του πίνακα που έφτιαξε το loop γιατι αυτο που πήγα να κάνω εγω δεν θα δουλέψει δεδομένου οτι ο δεικτης ειναι ήδη αυξημένος απο πριν κατα μια θέση μπροστά. Για παράδειγμα το q[i++] οταν το i ειναι 0 ουσιαστικά σημαινει οτι εκει που ήδη δειχνει ο δεικτης ενω αν ηταν q[1] εκει που δειχνει ηδη ο δεικτης + μια θέση ακομα. 1 * sizeof(data_array).

Δημοσ.

[offtopic]

Και αυτός ακριβώς είναι ο λόγος που κάποιοι λέμε "μη μάθεις προγραμματισμό με C": αντί να μάθεις να σκέφτεσαι αλγοριθμικά "θα κάνω ένα loop από 1 ως Ν το οποίο...." ασχολείσαι με το πού δείχνει ο pointer και πόσο είναι το sizeof.

[/offtopic]

  • Like 2
Δημοσ.

@defacer έχει πολυ δύσκολο αλγόριθμο η άσκηση. 

 

Γέμισε τον πίνακα Β με τα στοιχεια του Α ξεκινώντας απο το τέλος του. 

Δημοσ.

Για ταυτόχρονη εκτύπωση του εκάστοτε ανατιθέμενου στοιχείου δεν χρειάζεται ούτε έξτρα μεταβλητή, ούτε έξτρα pointer-arithmetic...

	while ( p > A ) {
		*q++ = *--p;
		printf( "%d ", *p );
	}

 

[offtopic]

Και αυτός ακριβώς είναι ο λόγος που κάποιοι λέμε "μη μάθεις προγραμματισμό με C": αντί να μάθεις να σκέφτεσαι αλγοριθμικά "θα κάνω ένα loop από 1 ως Ν το οποίο...." ασχολείσαι με το πού δείχνει ο pointer και πόσο είναι το sizeof.

[/offtopic]

Και στην C το loop από 1 ως Ν μαθαίνεις πρώτα, οι δείκτες είναι μεταγενέστερο έξτρα. Άρα με τη C μαθαίνεις ΚΑΙ αλγοριθμική σκέψη ΚΑΙ internal representation. Ακριβώς για αυτόν τον λόγο κάποιοι από μας λέμε "αν θες να ασχοληθείς επαγγελματικά με τον προγραμματισμό, η C θα σου δώσει πολλά και σοβαρά εφόδια".

  • Like 2
Δημοσ.

Πάμε δυνατά να κλειδώσει και αυτο το θρέντ. :P

 

@migf1 αυτο που έβαλες τώρα το βάλαμε εξαρχής απλα αντι για το *p ηταν με σημειογραφία πίνακα ο δεικτης. Τι νοημα έχει ομως αυτο? αφου οι αλλαγές γινονται στον άλλον πίνακα. Αρα δεν πρεπει να τον εκτυπώσουμε ωστε να δούμε τις αλλαγές του? 

 

ΥΓ Δεν χρησιμοποιήσαμε έξτρα δεικτη αλλα αυτον που έχεις βάλει να δειχνει στην αρχή του Β. 

Δημοσ.

Και στην C το loop από 1 ως Ν μαθαίνεις πρώτα, οι δείκτες είναι μεταγενέστερο έξτρα. Άρα με τη C μαθαίνεις ΚΑΙ αλγοριθμική σκέψη ΚΑΙ internal representation. Ακριβώς για αυτόν τον λόγο κάποιοι από μας λέμε "αν θες να ασχοληθείς επαγγελματικά με τον προγραμματισμό, η C θα σου δώσει πολλά και σοβαρά εφόδια".

 

Οι δείκτες δεν προσφέρουν τίποτα όσον αφορά την αλγοριθμική σκέψη. Οπότε αν θες να ασχοληθείς επαγγελματικά (όπως λες εσύ) με τον προγραμματισμό, τότε μάθε C για να πάρεις εφόδια. Αν θές να αρχίσεις να μαθαίνεις προγραμματισμό (όπως είπα αρχικά εγώ) τότε καλύτερα μάθε μια γλώσσα όπου ασχολείσαι περισσότερο με το why και λιγότερο με το how.

  • Like 1
Δημοσ.

@migf1 αυτο που έβαλες τώρα το βάλαμε εξαρχής απλα αντι για το *p ηταν με σημειογραφία πίνακα ο δεικτης. Τι νοημα έχει ομως αυτο? αφου οι αλλαγές γινονται στον άλλον πίνακα. Αρα δεν πρεπει να τον εκτυπώσουμε ωστε να δούμε τις αλλαγές του? 

 

ΥΓ Δεν χρησιμοποιήσαμε έξτρα δεικτη αλλα αυτον που έχεις βάλει να δειχνει στην αρχή του Β.

Συγκριτικά με τον αρχικό (δικό μου) κώδικα, στο δικό σου (λανθασμένο) παράδειγμα χρησιμοποίησες και έξτρα μεταβλητή (δλδ: int i=0;) και έξτρα pointer-arithmetic (δλδ: p[i++] ). Ο gon σε διόρθωσε χρησιμοποιώντας έξτρα pointer-arithmetic (δλδ: *(q-1) ).

 

Αναφορικά με την ερώτηση "... αφου οι αλλαγές γινονται στον άλλον πίνακα"...

 

Αφενός, το σύνηθες δεν είναι να τυπώνουμε ταυτόχρονα με την ανάθεση, αλλά να έχουμε ξεχωριστή συνάρτηση για την εκτύπωση του πίνακα όσες φορές θέλουμε και οπουδήποτε το θελήσουμε μέσα στον κώδικά μας. Το δεδομένο της ταυτόχρονης εκτύπωσης το εισήγαγες εσύ φίλε star-light, δεν υπήρχε ως αρχική απαίτηση.

 

Aφετέρου, στην προκειμένη (απλοϊκότατη) περίπτωση αυτής της άσκησης, δεν έχει απολύτως καμιά διαφορά το αν θα τυπώσεις το επεξεργασμένο (ανατιθέμενο) στοιχείο από τον source (p) ή από τον destination (q) πίνακα. Το να το θέλουμε σώνει και ντε από τον destination πίνακα, είναι ακόμα ένα εμβόλιμο δεδομένο που δεν υπήρχε ως απαίτηση εξαρχής (και που θα ήταν και άχρηστο αν υπήρχε σε αυτή την άσκηση).

 

 

 

@defacer: Εντάξει, αφού με τη C δεν μαθαίνει κανείς ούτε καλό (μη επαγγελματικό) προγραμματισμό, ούτε αλγοριθμική σκέψη, εγώ πάω να βάλω σε βαζάκι τα λουλουδάκια που μάζεψα σήμερα το πρωί... κρίμα είναι να μαραθούν τα καημένα από τώρα.

 

 

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

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

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

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

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

Σύνδεση

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

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