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

Ασκηση C


programmer

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

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
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για ταυτόχρονη εκτύπωση του εκάστοτε ανατιθέμενου στοιχείου δεν χρειάζεται ούτε έξτρα μεταβλητή, ούτε έξτρα 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 δεν μαθαίνει κανείς ούτε καλό (μη επαγγελματικό) προγραμματισμό, ούτε αλγοριθμική σκέψη, εγώ πάω να βάλω σε βαζάκι τα λουλουδάκια που μάζεψα σήμερα το πρωί... κρίμα είναι να μαραθούν τα καημένα από τώρα.

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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