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

Στοιχεία σε πίνακα - C


johnykim

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

Δημοσ.

Γεια σας παιδιά :-)

 

Θα ήθελα μια βοήθεια ,σχετικά με καταχωρίσεις τιμών σε έναν πίνακα δυο διαστάσεων.

 

Θέλω ανάλογα με τις γραμμές του πίνακα , να καταχωρούνται ανάλογες τιμές.Για παράδειγμα στην δεύτερη γραμμή, να καταχωρούνται δυο στοιχεία.,στην τρίτη τρία..Εδώ έχω μια ερώτηση, δηλαδή στην δεύτερη γραμμή που θα καταχωρούνται δυο στοιχεία ,λογικά δεν θα πρέπει να έχει και δυο στήλες ,όπου στις δυο αυτές στήλες θα μπαίνουν τα δυο στοιχεία; Δηλαδή θα έχω pinakas[1][1],pinakas[2][2],pinakas[3][3], κάθε φορά.Όμως αφού θα βάζω κάθε στοιχείο σε κάθε στήλη, θα έχω για πίνακα μέχρι pinakas[5][5], 15 στοιχεία.

 

Παρακάτω φαίνεται ο κώδικας :

 

>#include <stdio.h>
#include <stdlib.h>

main()
{
int pinakas[5][5];
int tyxaios[15],i,j=0,t;
int p=1;

for(t=0;t<15;t++)
{            
    tyxaios[t]=1000+rand()%9999;     
    printf("O %dos tyxaios einai: %d\n",p,tyxaios[t]);  
    p++;
}  

for(i=0;i<5;i++);
{
              
if(i==0)
{
      pinakas[i][j]=tyxaios[t];    
}
else if(i==1)
{
    pinakas[i][j]=tyxaios[t+1];
    pinakas[i][j]=tyxaios[t+2];       
}

printf("\n%d\n",pinakas[i][j]); 

j++;

}  


printf("\n");  
 system("PAUSE");	
 return 0;
}

 

Θα ήθελα να βάλω τους τυχαίους αυτούς αριθμούς στον πίνακα.Νομίζω στα διαστήματα pinakas[j]=tyxaios[t]; δεν είναι σωστός ο κώδικας.Και μετά που καταχωρώ περισσότερα στοιχεία(αφού υπάρχουν και περισσότερες στήλες j) :

pinakas[j]=tyxaios[t+1];

pinakas[j]=tyxaios[t+2];

Δημοσ.

Έχεις μπερδέψει κάποια πράγματα ή είσαι έτοιμος να το πάθεις.

 

Κλασσικά ένας πίνακας είναι ορθογωνικός. Δηλ. είναι n x m : έχει n γραμμές και m στήλες, πλήρεις.

Ο πίνακας pinakas[5][5] όπως τον ορίζεις έχει 5 x 5 = 25 στοιχεία.

Εσύ από αυτόν θέλεις να "γεμίσεις" k στοιχεία στην k γραμμή, δηλ. 1+2+3+4+5=15

Τα υπόλοιπα θα έχουν τυχαίες τιμές από την δέσμευση μνήμης (γι' αυτό τα μηδενίζουμε).

Να το προγραμματάκι σου που το κάνει αυτό διορθωμένο :

 

 

>
#include <stdio.h>
#include <stdlib.h>

int main()
{
int pinakas[5][5];
int tyxaios[15],i,j,t;

for(t=0;t<15;t++)
{            
    tyxaios[t]=1000+rand()%9999;     
    printf("O %dos tyxaios einai: %d\n",t,tyxaios[t]);  
}  


t=0;
for(i=0;i<5;++i)
  for(j=0;j<5;++j)
  {
     pinakas[i][j]=0;

     if(j<=i)
       pinakas[i][j]=tyxaios[t++];    
  }


for(i=0;i<5;i++)
{  
  printf("\n");

  for(j=0;j<5;j++)
  {  printf("%12d",pinakas[i][j]); }
}

printf("\n OK\n");  
 return 0;
}

 

Mπορεί να φτιαχτεί "πίνακας" όπου η πρώτη γραμμή του να έχει 1 στήλη, η δεύτερη δύο στήλες κλπ μέχρι όπου η πέμπτη γραμμή να έχει 5 στήλες.

(Δεν μπορεί να θεωρηθεί ως πίνακας με την κλασσική έννοια διότι στην άλγεβρα ένας πίνακας είναι πάντα ορθογωνική διάταξη στοιχείων).

Αυτός θα είναι τότε ένας πίνακας δεικτών προς 5 μονοδιάστατους πίνακες όπου ο καθένας τους θα έχει χωρητικότητα 1,2,3...5 στοιχεία.

Αλλά άστο καλύτερα προς το παρόν...

 

Τέλος, σου προτείνω να αγοράσεις ένα καλό βιβλίο για C++. Αυτά που ρωτάς εξηγούνται λεπτομερώς σε βιβλία.

Δημοσ.

Ευχαριστώ πολύ :-)

Η αλήθεια είναι ότι δεν έχω ξεκαθαρίσει κάποια πράγματα με τους πίνακες..

 

Αν και έπεσα αρκετά έξω..η λογική μου είχε κάποιο νόημα ,έτσι; :P

 

Για βιβλίο ,έχω το "Η γλώσσα προγραμματισμού C"(Brian W.Kernighan-Dennis M.Ritghie).Δεν με έχει βοηθήσει πάρα πολύ, αλλά θα το ξανά πιάσω να το δω.

Δημοσ.

Αν ψαχνεις για καλό βιβλίο σε προγραμματισμο να προτιμάς βιβλία των εκδόσεων Γκιουρδα...ειναι λιγο ακριβά αλλα αξίζουν...

Δημοσ.

Επειδή βλέπω ότι ενδιαφέρεσαι και ασχολείσαι, από την προσωπική μου εμπειρία έχω να σου πω το εξής.

 

Εφόσον είσαι ερασιτέχνης, κάνεις άσχημα που ασχολείσαι με C. Είναι απλώς χάσιμο χρόνου.

Το βιβλίο αυτό που αναφέρεις θεωρείται κλασσικό και το "αλφαβητάριο της C" αλλά θα σου είναι

περισσότερο πηγή συσκότισης παρά βοήθειας - στοιχηματίζω ότι ελάχιστα πράγματα έχεις μάθει από αυτό.

 

Είναι ασύγκριτα καλύτερα να μάθεις απευθείας C++ χωρίς την C ως προαπαιτούμενο.

Στην C ακόμα και στοιχειώδη πράγματα είναι δύσκολο να γίνουν, θα παιδεύεσαι πάντα και κάποια

στιγμή που θα θελήσεις να ξεκινήσεις την C++ θα διαπιστώσεις ότι ελάχιστα σε βοηθά η γνώση της C.

 

Yπάρχουν πολλά καλά βιβλία που διδάσκουν κατευθείαν την C++ χωρίς καμιά γνώση της C.

Σου προτείνω με κλειστά μάτια το "Object-Oriented Programming in C++" του R. Lafore που υπάρχει και μεταφρασμένο

στα ελληνικά - από τις καλύτερες εισαγωγές που έχω δει (μόνο κονσόλα). Έχει όλες τις έννοιες της C++ και θα σου είναι προσιτό.

Επίσης, υπάρχουν βιβλία που διδάσκουν C++ και ταυτόχρονα χρησιμοποιούν-εξηγούν την χρήση της STL με την οποία ευκολύνονται

πολλά προβλήματα (πχ. έχουν έτοιμες κλάσσεις για πίνακες, διανύσματα κλπ).

Υπάρχουν βιβλία που διδάσκουν την C++ και ταυτόχρονα χρησιμοποιούν γραφικό περιβάλλον. Ένα τέτοιο είναι το

"Ivor Horton's Beginning Visual C++ 2008" που δουλεύει σε visual studio και από τη μέση και έπειτα εισάγει το παραθυρικό περιβάλλον (forms σε windows).

Tέλος υπάρχουν βιβλία που είναι κάτι σαν συνταγολόγια (cookbooks) και έχουν λύσεις σε προβλήματα του στυλ "πώς κάνω ένα string αριθμό ; κλπ" - πολύ

χρήσιμα και με πρακτικό προσανατολισμό.

 

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

ακόμα κι αν σου φανεί ακριβό.

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

και κάνε ότι σου είπα αλλιώς παιδεύεσαι και χάνεις την ώρα σου.

Το μόνο που χρειάζεται να ξέρεις για την C είναι οι συντακτικές διαφορές της από την C++...

Δημοσ.

Μερικές πληροφορίες για κάποιες ειδικές κατηγορίες "πινάκων", όπως ο τριγωνικός (που σε ενδιαφέρει),ο αραιός, ο τριδιαγώνιος, κλπ...

 

Ειδικές μορφές πινάκων

Συμμετρικός (Symmetric):Aij == Aij

Τριγωνικός (Triangular):Aij == 0 όταν i > j

Τριδιαγώνιος (Tridiagonal):Aij != 0 μόνο όταν i == j ή i - j = j ή j - i == 1

Αραιός (Sparse): μεγάλο ποσοστό των στοιχείων είναι 0.

πηγή: http://dmst.aueb.gr/dds/c2/array/indexw.htm

Δημοσ.

Ευχαριστώ για τις προτάσεις :-)

 

@V.I.Smirnov, ασχολούμαι με C επειδή υπάρχει μάθημα της σχολής.Λύνω μικρά προβληματάκια με την βοήθεια σημειώσεων που μας δίνουν.Όντως από το βιβλίο που ανέφερα δεν έχω μάθει πολλά, και ότι ξέρω, το ξέρω από τις σημειώσεις.

 

Γενικά ,θα ήθελα να γνωρίζω καλά μια γλώσσα που θα την αξιοποιήσω αρκετά στον τομέα του hardware.Προγραμματισμός στα τσιπάκια κτλ.Δεν έχω ιδέα ποιες γλώσσες είναι αυτές, αλλά αν βοηθάει εκεί η C++ ,ευχαρίστως να εξασκηθώ και εκτός σχολής.Ευχαριστώ για το βιβλίο, θα το έχω υπόψη μου.

 

Πάντως, σε μια συζήτηση με τον καθηγητή ,θυμάμαι ότι μου έλεγε "άμα ξέρεις C ,ξέρεις και C++" και επίσης σχετικά για την java ,"άμα ξέρεις C,ξέρεις ουσιαστικά και java".Ενώ εσύ μου λες ότι η C είναι άχρηστη..:P

 

Αυτό που έχω καταλάβει πάντως,από τις ελάχιστες γνώσεις μου στην Pascal,Basic και C, είναι ότι το μόνο που αλλάζει στις γλώσσες, είναι ουσιαστικά το συντακτικό.Ο προγραμματιστικός τρόπος σκέψης ,είναι ακριβώς ίδιος!

 

 

 

 

Ευχαριστώ και πάλι παιδιά :-)

Δημοσ.

Aν πρόκειται για μάθημα στη σχολή σου αλλάζει το πράγμα.

Επίσης αλλάζει αν πρόκειται για προγραμματισμό σε πολύ χαμηλό επίπεδο (αν και εκεί άλλες γλώσσες είναι κατά περίπτωση καταλληλότερες.)

 

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

"άμα ξέρεις C ,ξέρεις και C++". Το ανάποδο είναι το σωστό.

Πχ. η αντικειμενοστρεφής οργάνωση δεν μαθαίνεται από την C και απαιτεί

τελείως διαφορετικό τρόπο σκέψης. Εξάλλου η C++ είναι υπερσύνολο της C.

"άμα ξέρεις C,ξέρεις ουσιαστικά και java" Αυτό ισχύει για την C++ κι όχι για την C.

H java είναι κατεξοχήν αντικειμενοστρεφής όπως η C++ και δεν έχει σχεδόν καμιά σχέση με τη C.

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

 

Tέλος, το να λέμε ότι ο προγραμματιστικός τρόπος σκέψης δεν αλλάζει είναι γενικά σωστό αλλά από κάποιο (όχι και τόσο μακρυνό) σημείο κι έπειτα δεν ισχύει.

Η προγραμματιστική νοοτροπία επηρεάζεται ισχυρά από το πώς μπορείς να εκφράσεις την ιδέα, δηλ. να γράψεις το πρόγραμμα.

Και όταν οι διαφορές στον τρόπο δόμησης του προγράμματος από την μια γλώσσα στην άλλη είναι σημαντικές μάλλον δυσκολεύει η μετάβαση

παρά διευκολύνεται. (επειδή εθίζεσαι σε ένα συγκεκριμένο μοντέλο σκέψης)

Δημοσ.
Aν πρόκειται για μάθημα στη σχολή σου αλλάζει το πράγμα.

Επίσης αλλάζει αν πρόκειται για προγραμματισμό σε πολύ χαμηλό επίπεδο (αν και εκεί άλλες γλώσσες είναι κατά περίπτωση καταλληλότερες.)

 

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

"άμα ξέρεις C ,ξέρεις και C++". Το ανάποδο είναι το σωστό.

Πχ. η αντικειμενοστρεφής οργάνωση δεν μαθαίνεται από την C και απαιτεί

τελείως διαφορετικό τρόπο σκέψης. Εξάλλου η C++ είναι υπερσύνολο της C.

"άμα ξέρεις C,ξέρεις ουσιαστικά και java" Αυτό ισχύει για την C++ κι όχι για την C.

H java είναι κατεξοχήν αντικειμενοστρεφής όπως η C++ και δεν έχει σχεδόν καμιά σχέση με τη C.

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

 

Tέλος, το να λέμε ότι ο προγραμματιστικός τρόπος σκέψης δεν αλλάζει είναι γενικά σωστό αλλά από κάποιο (όχι και τόσο μακρυνό) σημείο κι έπειτα δεν ισχύει.

Η προγραμματιστική νοοτροπία επηρεάζεται ισχυρά από το πώς μπορείς να εκφράσεις την ιδέα, δηλ. να γράψεις το πρόγραμμα.

Και όταν οι διαφορές στον τρόπο δόμησης του προγράμματος από την μια γλώσσα στην άλλη είναι σημαντικές μάλλον δυσκολεύει η μετάβαση

παρά διευκολύνεται. (επειδή εθίζεσαι σε ένα συγκεκριμένο μοντέλο σκέψης)

 

Μάλλον έχεις δίκιο γιατί στο πανεπιστήμιο μου πρώτο έτος έχουμε C και δεύτερο C++. Java καθόλου....δεν θα έβαζαν δύο "ίδιες" γλώσσες σε δύο διαφορετικά εξάμηνα...άρα C, C++ έχουν αρκετές διαφορές...

 

ελπίζω στα αρχικά στάδια να είναι παρόμοιες...γιατί δεν αντέχω άλλο...

smirnov έπειδή πρέπει να τις ξέρεις και τις δυο σου είναι εύκολο να με καθοδηγήσεις λίγο...στο πως και τι να κάνω για να τα πάω καλά? δλδ που να δώσω βάση, τι πρέπει οπωςδήποτε να ξέρω...και όποια πληροφορία νομίζεις πως θα μου είναι χρήσιμη...

Δημοσ.

@linuxs

 

Ευχαριστώ για την εμπιστοσύνη σου.

Δεν έχω κάποια ακαδημαϊκή εκπαίδευση στην C++, είμαι αυτοδίδακτος.

 

Η C είναι χαμηλότερου επιπέδου από την C++ και εκεί ακόμη και απλά πράγματα (πίνακες, τύπωμα τιμών, χειρισμός αρχείων κλπ) είναι γενικά δύσκολο να γίνουν.

Στην C++ η κατάσταση είναι πολύ καλύτερη διότι λόγω της αντικειμενοστρέφειας υπάρχουν πολλές βιβλιοθήκες (STL, Boost κ.α.) που απλοποιούν σημαντικά αυτές

τις καθημερινές εργασίες.

 

Η C++ είναι υπερσύνολο της C, δηλ. είναι η C με μια σειρά βελτιώσεις και προσθήκες που κυρίως αφορούν την αντικειμενοστρεφή δόμηση του προγράμματος.

Το ότι έχετε τις C και C++ σε διαφορετικά εξάμηνα δηλώνει προφανώς ότι στο πρώτο καταρχήν μαθαίνετε τον διαδικαστικό τρόπο σκέψης με την C ενώ

στο άλλο διδάσκεστε την αντικειμενοστρεφή προσσέγγιση.

Αυτή είναι μια κακή γενικά προσέγγιση - ιδίως για ερασιτέχνες όπως εγώ - διότι μπορούσατε να μάθετε κατευθείαν την C++ και απλώς να τονιστούν οι συντακτικές

διαφορές της από την C. Τον δε χρόνο που θα κερδίζατε, να τον διαθέσετε αλλού.

Τα βιβλία που διδάσκουν άμεσα την C++ (δίχως να προαπαιτούν C ) είναι περισσότερα από αυτά για καθαρή C , πράγμα που επιβεβαιώνει την άποψή μου.

Από την σκοπιά ενός ερασιτέχνη, η εκμάθηση της C είναι γενικά χάσιμο χρόνου και ελάχιστα προσφέρει.

 

Όμως σε ένα ακαδημαϊκό πρόγραμμα οι ανάγκες που απαιτείται να καλυφθούν μπορεί είναι διαφορετικές.

Πχ. σε εφαρμογές-προγραμματισμό χαμηλού επιπέδου (hardware κλπ) συνήθως εφαρμόζεται η "καθαρή" C και από αυτή την άποψη μπορεί να είναι χρήσιμη.

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

Και κάποια πράγματα που είναι χρήσιμα διδάσκονται από παράδοση στην C όπως οι τελεστές για bits κ.α. ενώ στην C++ συνήθως αναφέρονται με συντομία ή καθόλου.

 

Την C ποτέ δεν την ασχολήθηκα αποκλειστικά. Όταν έβρισκα ρουτίνες σ' αυτήν τις αντιμετώπιζα ως C++ και έψαχνα τις συντακτικές διαφορές τους

για να δουλέψουν ως C++ (έχουν κάποιες διαφορές στην σύνταξη αλλά πολύ μικρές).

 

Για την C++ υπάρχουν πολλά εξαιρετικά βιβλία με διάφορες προσεγγίσεις και για διάφορα γνωστικά επίπεδα.

Εγώ ήδη έχω κάποια, "χάρτινα" και ηλεκτρονικά, και κοιτάζω ότι και όποτε μου χρειάζεται κάτι.

Κοίτα στη βιβλιοθήκη της σχολής σου να δεις τι υπάρχει εκεί.

Όταν θελήσεις να μελετήσεις C++ , πες μου να σου στείλω ηλεκτρονικά ένα-δυό...

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

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

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