Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 06 Σεπ 2011, 19:53

Ωραίος !!! :)

Υπάρχει άλλη μια περίπτωση, όταν ο χρήστης σου δώσει νούμερο που δεν υπάρχει μέσα στον πίνακα, οπότε η num_find_position() επιστρέφει -1, άρα και εκείνο το nums[ pos-1 ] στην printf ισοδυναμεί με nums[ -2 ] ;)

Ορίστε ο κώδικας διορθωμένος...

Κώδικας: Επιλογή όλων

#include <stdio.h>
#define MAXNUMS 5
// -------------------------------------------------------------------------
int num_find_position( int *nums, int n )
{
int i = 0;

for (i=0; i < MAXNUMS; i++ )
if ( nums[ i ] == n )
return i;

return -1;
}
// -------------------------------------------------------------------------
int main( void )
{
int nums[ MAXNUMS ] = { 10, 20, 30, 40, 50 };
int n, pos;

printf("Dwste enan arithmo na sas pw poios einai dipla toy apo aristera ston pinaka: ");
scanf( "%d", &n);

pos = num_find_position( nums, n );
if ( pos == -1 )
printf("Den yparxei arithmos %d ston pinaka\n", n);
else if (pos == 0)
printf("Den yparxei arithmos aristera toy %d\n", nums[ 0 ] );
else
printf("O arithmos poy brisketai aristera apo ton %d einai o %d\n", n, nums[ pos-1 ] );

return 0;
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 06 Σεπ 2011, 20:05

Kυριλέ!

Λοιπον ημουν ετοιμος να γκρινιάξω για μια while που δεν μου έβγαινε σε θέμα δεικτών αλλα
με υπομονή ξεκινησα απο την for που ηδη ξερω καπως καλυτερα πιο συγκεκριμενα παραθετω κωδικα ο οποιος
πρσδιοριζει και την βασικη τεχνικη του migf1 για [Ν+1] μεσα σε εναν πινακα :D πραγματικα πολυ καλη τεχνικη


Spoiler: show
Κώδικας: Επιλογή όλων

#include<stdio.h>
int main(void)
{
int x1[10]={0};
int x2[3+1]={1,1,2,0};
int i;
int *p_x2;
p_x2=&x2[0];

while(i!=10)
{
printf("%d",x1[i]);
i++;
}

//My first step
/*for(p_x2=&x2[0]; *p_x2<&x2[4]; p_x2++)
printf("\n%d",*p_x2);

//MY second step
for(p_x2; *p_x2!=0; p_x2++)
printf("\n%d", *p_x2);
*/
//And my finally step now appears into a while loop

while(*p_x2!=0)
{
printf("\n%d",*p_x2);
p_x2++;
}


return 0;
}


;)

Π.Σ Μια ερωτηση... στην προηγουμενη συνάρτηση εχεις βαλει να επιστρέφει το i , αλλα δεν το εχεις βαλει να εμφανιζεται σε κανενα σημειο της main... εκτος και αν δεν εχω δει καλα....
Τελευταία επεξεργασία από Star_Light και 06 Σεπ 2011, 20:20, έχει επεξεργασθεί 1 φορά/ες συνολικά
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 06 Σεπ 2011, 20:18

btw σε συγκριση με τα παραπανω και αυτο δουλευει

Κώδικας: Επιλογή όλων

while(*p_x2)
{
printf("\n%d",*p_x2);
p_x2++;
}
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό logari81 » 06 Σεπ 2011, 20:21

Off topic:
παιδιά βλέπω ότι έχετε συμπληρώσει πάνω απο 100 σελίδες σε αυτό το θέμα, φυσικά δεν μπορώ να τις δώ όλες για να γνωρίζω με τί ακριβώς έχετε ασχοληθεί αλλά βλέπω ότι το επίπεδο είναι αρκετά υψηλό. Δεν θα σας ενδιέφερε να ασχοληθείτε με πιο πρακτικά παραδείγματα όπως το OpenInventor πρωτόκολλο http://en.wikipedia.org/wiki/Open_Inventor και συγκεκριμένα η Coin3D-Qt υλοποιησή του http://www.coin3d.org/coin3d_news/coin3 ... -tutorial/ ; Καποιος που θα ασχοληθεί μπορεί ακόμα και να δημιουργήσει επαγγελματικές εφαρμογές όπως οι παρακάτω http://www.coin3d.org/usage για λογαριασμό ελληνικών (λέμε τώρα) ή ξένων εταιρειών.
http://opensourceecology.org/


Λειτουργικό: Ubuntu 10.04 lucid 64-bitΠροδιαγραφές: 4x Intel Core i5 CPU M 450 2.40GHz ‖ RAM 3696 MiB ‖ Lenovo KL3 - LENOVO IdeaPad Y560
Κάρτα γραφικών: ATI Device [1002:68c0]Ασύρματο: wlan0: Atheros Inc. AR928X Wireless Network Adapter (PCI-Express) [168c:002a] (rev 01)
logari81
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 6074
Εγγραφή: 14 Μάιος 2008, 10:40
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 06 Σεπ 2011, 20:34

Και στον ηδη υπάρχοντα κωδικα έφτιαξα εναν απλοικο αλγοριθμο που ελέγχει αν ειναι ίσα τα 2 στοιχεια ενος πίνακα το 1ο δηλαδη με το αμεσως επομενό του... φυσικα μέτρησα με τον στυλο και στο χαρτι τις συγκρίσεις για αυτο τις εχω βάλει έτοιμες :/

Κώδικας: Επιλογή όλων

while(i!=3)
{
if(x1[i]==x2[i+1])
printf("\nWe are equal\t");
else
printf("\tWe are not equal");
i++;

}
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 06 Σεπ 2011, 20:40

logari81 έγραψε:Off topic:
παιδιά βλέπω ότι έχετε συμπληρώσει πάνω απο 100 σελίδες σε αυτό το θέμα, φυσικά δεν μπορώ να τις δώ όλες για να γνωρίζω με τί ακριβώς έχετε ασχοληθεί αλλά βλέπω ότι το επίπεδο είναι αρκετά υψηλό. Δεν θα σας ενδιέφερε να ασχοληθείτε με πιο πρακτικά παραδείγματα όπως το OpenInventor πρωτόκολλο http://en.wikipedia.org/wiki/Open_Inventor και συγκεκριμένα η Coin3D-Qt υλοποιησή του http://www.coin3d.org/coin3d_news/coin3 ... -tutorial/ ; Καποιος που θα ασχοληθεί μπορεί ακόμα και να δημιουργήσει επαγγελματικές εφαρμογές όπως οι παρακάτω http://www.coin3d.org/usage για λογαριασμό ελληνικών (λέμε τώρα) ή ξένων εταιρειών.

Αυτή τη στιγμή ο migf1 παίζει ένα ρόλο δασκάλου ( :lol: ) και κάνουμε μια γενική επανάληψη μιας και εχουμε αρκετά κενά, για αυτό καλύτερα να μείνουμε σε αυτά προς το παρόν αλλά σίγουρα πιστέυω θα κοιτάξουμε και τα λινκ σου! :D
Star_Light έγραψε:Και στον ηδη υπάρχοντα κωδικα έφτιαξα εναν απλοικο αλγοριθμο που ελέγχει αν ειναι ίσα τα 2 στοιχεια ενος πίνακα το 1ο δηλαδη με το αμεσως επομενό του... φυσικα μέτρησα με τον στυλο και στο χαρτι τις συγκρίσεις για αυτο τις εχω βάλει έτοιμες :/

Κώδικας: Επιλογή όλων

while(i!=3)
{
if(x1[i]==x2[i+1])
printf("\nWe are equal\t");
else
printf("\tWe are not equal");
i++;

}

Αυτό έχει σχέση με buffer overflow?
Τελευταία επεξεργασία από stamatiou και 06 Σεπ 2011, 21:28, έχει επεξεργασθεί 1 φορά/ες συνολικά
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 06 Σεπ 2011, 20:41

Εγώ παιδιά δεν το κατάλαβα το τελυταίο γιατί γίνεται υπερχείλιση όταν το n είναι δέκα... Επίσης δεν κατάλαβα την κάτω υπερχείλιση. Τέλος επειδή δεν έχω παρακολουθήσει από την αρχή τη κουβέντα, μήπως υπάρχει κανένα έμπιστο link για να μη σας παιδεύω και εσάς;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 06 Σεπ 2011, 20:45

logari81 έγραψε:Off topic:
παιδιά βλέπω ότι έχετε συμπληρώσει πάνω απο 100 σελίδες σε αυτό το θέμα, φυσικά δεν μπορώ να τις δώ όλες για να γνωρίζω με τί ακριβώς έχετε ασχοληθεί αλλά βλέπω ότι το επίπεδο είναι αρκετά υψηλό. Δεν θα σας ενδιέφερε να ασχοληθείτε με πιο πρακτικά παραδείγματα όπως το OpenInventor πρωτόκολλο http://en.wikipedia.org/wiki/Open_Inventor και συγκεκριμένα η Coin3D-Qt υλοποιησή του http://www.coin3d.org/coin3d_news/coin3 ... -tutorial/ ; Καποιος που θα ασχοληθεί μπορεί ακόμα και να δημιουργήσει επαγγελματικές εφαρμογές όπως οι παρακάτω http://www.coin3d.org/usage για λογαριασμό ελληνικών (λέμε τώρα) ή ξένων εταιρειών.


Off topic:
:lol: :lol: ευχαριστω για τα καλα σου λογια αν μεσα στο υψηλο επιπεδο εννοεις και εμενα... αλλα θελω δουλεια ακομη εγω στην C . O migf1 ναι ειναι αρκετα μπροστα και πιστευω μπορει να ασχοληθει με το οτιδηποτε στην πληροφορικη με ακριβεια και ευστοχια :P και δεν το λεω ουτε για να τον καλοπιασω ουτε τιποτα ειναι απλα η γνωμη μου και η αληθεια. Οποιος ξέρει σοβαρη πληροφορικη τα καταλαβαινει αυτα :P δεν κρυβονται αλλο που ο ανθρωπος δεν κοκορευεται ουτε επειδη απαντησε σε 2 αποριες σου θα γυρισει να σου πει "ξερεις σε βοηθησα και ησουν αχαριστος" γιατι το ειχαμε ακουσει και αυτο παλιοτερα εδω μεσα... καποιος να σου διορθωνει απλα ενα ερωτηματικο στον κωδικα και μετα να λεει πως εισαι αχαριστος και εγω σε βοηθησα... φυσικα δεν ηταν υποχρεωμενος ουτε και για αυτο το ερωτηματικο αλλα ελεος.... δηλαδη ο migf1 που προσπαθει να μας μαθει τωρα 3-4 μηνες τι πρεπει να πει? :D γενικα απο μερικους ακους πολλα.... απλα επειδη δεν ηθελα να δωσω συνεχεια τοτε να ξερουν καποιοι πως εγω το συγγνωμη τοτε το ζητησα απο την ΚΟΙΝΟΤΗΤΑ και οχι μεμονομενα απο εκεινο το ατομο ;) οχι τιποτα αλλο για να μην μοντελοποιειται η δικη μου συμπεριφορα με patterns και μπουρδες οπως ειχε γραφτει τοτε. Γιατι μιλαμε για ανθρωπους και οχι για μηχανες αλλα δεν ηθελα να απαντησω αλλο τοτε για να μην δωσω εκταση ;)
Τελευταία επεξεργασία από Star_Light και 06 Σεπ 2011, 20:55, έχει επεξεργασθεί 3 φορά/ες συνολικά
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 06 Σεπ 2011, 20:46

stamatiou έγραψε:
Αυτό έχει σχέση με buffer overflow?


δεν εχει σχεση αυτο με καμια υπερχειλιση. ;)

stamatiou έγραψε:Εγώ παιδιά δεν το κατάλαβα το τελυταίο γιατί γίνεται υπερχείλιση όταν το n είναι δέκα... Επίσης δεν κατάλαβα την κάτω υπερχείλιση. Τέλος επειδή δεν έχω παρακολουθήσει από την αρχή τη κουβέντα, μήπως υπάρχει κανένα έμπιστο link για να μη σας παιδεύω και εσάς;


Στην άνω υπερχείλιση αν έχεις ορίσει εναν πίνακα

Κώδικας: Επιλογή όλων
int x2[3]={0,1,2}


τοτε αν πας να προσπελασεις το 4ο του στοιχειο τοτε έχεις ανω υπερχειλιση γιατι οπως εχουμε πει
ανω υπερχειλιση εχεις οταν προσπαθεις να διαχειριστεις καποιο στοιχειο που βρισκεται μετα το τελος του πινακα σου...
αρα παθαινεις overflow .
και εδωσα και ενα απλο loopaki που το δειχνει αυτο.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 06 Σεπ 2011, 20:57

Star_Light έγραψε:Kυριλέ!

Λοιπον ημουν ετοιμος να γκρινιάξω για μια while που δεν μου έβγαινε σε θέμα δεικτών αλλα
με υπομονή ξεκινησα απο την for που ηδη ξερω καπως καλυτερα πιο συγκεκριμενα παραθετω κωδικα ο οποιος
πρσδιοριζει και την βασικη τεχνικη του migf1 για [Ν+1] μεσα σε εναν πινακα :D πραγματικα πολυ καλη τεχνικη


Spoiler: show
Κώδικας: Επιλογή όλων

#include<stdio.h>
int main(void)
{
int x1[10]={0};
int x2[3+1]={1,1,2,0};
int i;
int *p_x2;
p_x2=&x2[0];

while(i!=10)
{
printf("%d",x1[i]);
i++;
}

//My first step
/*for(p_x2=&x2[0]; *p_x2<&x2[4]; p_x2++)
printf("\n%d",*p_x2);

//MY second step
for(p_x2; *p_x2!=0; p_x2++)
printf("\n%d", *p_x2);
*/
//And my finally step now appears into a while loop

while(*p_x2!=0)
{
printf("\n%d",*p_x2);
p_x2++;
}


return 0;
}


;)

Η τεχνική με το +1 είναι περισσότερο για strings, για το μηδενικό χαρακτήρα στο τέλος, αλλά ΟΚ μπορείς να την υιοθετήσεις και σε άλλους τύπους δεδομένων, με την προϋπόθεση πως θα χρησιμοποιείς μια τιμή ως σηματοδότη του τέλους του πίνακα, ή για να σηματοδοτείς κενά κελιά. Π.χ. σε πίνακα φυσικών αριθμών μπορείς να χρησιμοποιήσεις έναν αρνητικό αριθμό ως σηματοδότη.

Σου πρόσθεσα το σωστό for στον κώδικά σου, και άλλαξα τα ονόματα των μεταβλητών ώστε να είναι (πολύ) πιο ευανάγνωστος ο κώδικάς. Επίσης, αρχικοποιήσα το i που δεν το αρχικοποιούσες όταν το όριζες, με αποτέλεσμα να κρασάρει στην while, αφού μόνο ο Θεός ξέρει με ποια τιμή ξεκινάει όταν δεν το αρχικοποιείς :lol:

Spoiler: show
Κώδικας: Επιλογή όλων

#include <stdio.h>
int main( void )
{
int array1[ 10 ] = { 0 };
int array2[ 3+1 ] = { 1, 1, 2, 0 };
int i=0, *p = array2;

while (i != 10 )
printf( "%d", array1[ i++ ] );

/*** DISABLED start
//My first step
for (p = &array2[0]; *p < &array2[4]; p++)
printf("\n%d", *p);

//MY second step
for (p; *p != 0; p++)
printf("\n%d", *p);

// migf1: CORRECT for-loop
for (p=array2; *p != 0; p++ )
printf("%d", *p);
putchar('\n');
DISABLED end ***/

//And my finally step now appears into a while loop
while ( *p != 0 )
printf("%d\n", *p++);

return 0;
}


btw, ένα από τα πλεονεκτήματα του for έναντι των while και do-while ότι η σύνταξή της σε προτρέπει να βάλεις αρχική τιμή στον μετρητή σου πριν ξεκινήσει.
έγραψε:
Π.Σ Μια ερωτηση... στην προηγουμενη συνάρτηση εχεις βαλει να επιστρέφει το i , αλλα δεν το εχεις βαλει να εμφανιζεται σε κανενα σημειο της main... εκτος και αν δεν εχω δει καλα....

Η συνάρτηση επιστρέφει τη θέση του n μέσα στον nums αλλιώς -1 αν το n δεν υπάρχει στο nums. Στη main() την καλώ όταν αναθέτω την τιμή επιστροφή της στη μεταβλητή pos.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι