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

Ασκηση C


programmer

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

Γράφε απλά και λιτά βάζοντας 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
  • Δημ.
  • Τελ. απάντηση

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

Γράφε απλά και λιτά βάζοντας 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  

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

 

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

 

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

 

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

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

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

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

 

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

 

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

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

Γράφε απλά και λιτά βάζοντας 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: Αυτό βέβαια στο πλαίσιο μιας άσκησης και τι θέλει να σου μάθει αυτή. Το αποτέλεσμα φυσικά είναι το ίδιο και με τις δύο μορφές.

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

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

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

 

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

 

Committee of Logic Education

 

Algorithmic Thinking

 

Question1. Algorithms and algorithmic thinking:

a.What is meant by "algorithmic thinking"?

 

Answer:

"Algorithmic thinking" sounds like code words with a specific meaning, but we were unsure what was intended. We considered algorithmic thinking as one kind of mathematical thinking, and contrasted it with intuitive pattern recognition and analogical thinking.

We think of algorithms as objects--namely as a list or sequence of steps to be performed, possibly given by a flow chart or diagram. (See the Appendix B below for an example of an algorithm given by a flow chart.)

 

Here are some of possibilities for what "algorithmic thinking" might be or involve:

 

i) application of an algorithm

ii) development of algorithms

iii) analysis of algorithms

iv) recognition of problems that have no algorithmic solution

...

 

 

Vienna University of Technology (Gerald Futschek)

 

Algorithmic Thinking: The Key for Understanding Computer Science

...

2 What Is Algorithmic Thinking?

 

Algorithms are defined differently in literature, but for our purpose the following definition is sufficient: “An Algorithm is a method to solve a problem that consists of exactly defined instructions”. Algorithmic thinking is a term that is used very often as one of the most important competences that can be achieved by education in Informatics [3]. Algorithmic thinking is somehow a pool of abilities that are connected to constructing and understanding algorithms:

- the ability to analyze given problems

- the ability to specify a problem precisely

- the ability to find the basic actions that are adequate to the given problem

- the ability to construct a correct algorithm to a given problem using the basic actions

- the ability to think about all possible special and normal cases of a problem

- the ability to improve the efficiency of an algorithm

For me, algorithmic thinking has a strong creative aspect: the construction of new algorithms that solve given problems. If someone wants to do this he needs the ability of algorithmic thinking.

...

 

 

Standford University (Stephen Cooper)

 

Developing Algorithmic Thinking With Alice

...

What is Algorithmic Thinking?

 

Algorithmic thinking is considered to be one of the key information technology concepts that enable people to become FIT. The members of the NRC committee define algorithmic thinking. They state that the "...general concepts of algorithmic thinking, [include] functional decomposition, repetition (iteration and/or recursion), basic data organizations (record, array, list), generalization and parameterization, algorithm vs. program, top-down design, and refinement. Note also that some types of algorithmic thinking do not necessarily require the use or understanding of sophisticated mathematics." (Fluent 1999)

 

 

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

 

Όλο το περιεχόμενο του παραπάνω link

 

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

 

Όλο το περιεχόμενο του παραπάνω link

 

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

 

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

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

 

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

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

 

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

 

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

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

 

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

EDIT:

 

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

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

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

 

Αυτο.

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

EDIT:

 

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

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

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

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

 

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


Αυτο.

 

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

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

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

 

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

 

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

 

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

 

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

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

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

 

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

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

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

...

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

 

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

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

 

 

 

...

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

...

Στο καλό!

 

 

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

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

 

Ok then!

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

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

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

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

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

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

Σύνδεση

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

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