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

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

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

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

Δημοσίευσηαπό stamatiou » 23 Μαρ 2012, 13:40

Προσπάθησα να φτιάξω ένα πρόγραμμα που υλοποιεί τον insertion sort αλλά όταν δοκιμάζω να το κάνω με dynamic memory allocation μου βγάζει έξοδο ένα τεράστιο νούμερο :/
Κώδικας: Επιλογή όλων


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

int main(void) {
int i,j,key,size,*array;
do {
printf("Enter size: ");
scanf("%d",&size);
} while (size <= 0);
if(!(array = (int *) malloc(size * sizeof(int)))) {
printf("FAILED TO ALLOCATE MEMORY...\nEXITING...\n");
return 1;
}

for(i = 0; i < size; i++) {
scanf("%d",&array[i]);
}

for(j = 2; j < size; j++) {
i = j - 1;
key = array[j];
while(i >= 0 && array[i] > key) {
array[i + 1] = array[i];
i--;
}
array[i + 1] = key;
}
for(i = 0; i < 9; i++) {
printf("%d",array[i]);
}
putchar('\n');
return 0;
}
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 23 Μαρ 2012, 13:45

@stamatiou δεν εχει καμια σχεση ο αλγοριθμος οπως τον ειδες στην wikipedia με τον αλγοριθμο σε C.
Ο καθε αλγοριθμος ειναι ανεξαρτητος της καθε γλωσσας.

Οταν τον μαθαινεις στο χαρτι τον μαθαινεις στο χαρτι. Οταν τον μαθαινεις στη C τον μαθαινεις σε C.
Γιατι δεν καθεσαι να τον δοκιμασεις πρωτα στο χαρτι να δεις πως δουλευει και μετα να τον δεις και στη C?

Δοκιμασε να τον μαθεις οπως σε βολευει εσενα καλυτερα.
Τελευταία επεξεργασία από Star_Light και 23 Μαρ 2012, 14:24, έχει επεξεργασθεί 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

Δημοσίευσηαπό Star_Light » 23 Μαρ 2012, 13:51

Πως θα καταλαβεις τι εντολες πρεπει να γραψεις σε C αμα δεν εχεις καταλαβει πρωτυτερα πως δουλευει ο αλγοριθμος?

Δοκιμασε τον στο χαρτι πρωτα. Διαφορετικα καλυτερα κανε οτι βολευει εσενα

και οπου εχεις σκαλωμα ρωτα ;)

p.s Καλυτερα να ξεκινησεις με τον bubble sort ωστε να καταλαβεις αρχικα πως δουλευει η ταξινομηση και μετα να πας σε πιο βελτιωμενες εκδοσεις ταξινομησης ως προς την πολυπλοκοτητα .
Γνώσεις ⇛ 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

Δημοσίευσηαπό stamatiou » 23 Μαρ 2012, 14:31

Star_Light έγραψε:@stamatiou δεν εχει καμια σχεση ο αλγοριθμος οπως τον ειδες στην wikipedia με τον αλγοριθμο σε C.
Ο καθε αλγοριθμος ειναι ανεξαρτητος της καθε γλωσσας.

Οταν τον μαθαινεις στο χαρτι τον μαθαινεις στο χαρτι. Οταν τον μαθαινεις στη C τον μαθαινεις σε C.
Γιατι δεν καθεσαι να τον δοκιμασεις πρωτα στο χαρτι να δεις πως δουλευει και μετα να τον δεις και στη C?

Δοκιμασε να τον μαθεις οπως σε βολευει εσενα καλυτερα.

Τον αλγόριθμο τον έχω καταλάβει πως λειτουργεί, και έχω κάνει την υλοποίηση σε C:
Κώδικας: Επιλογή όλων

#include <stdio.h>

int main(void) {
int i,j,key,array[9] = {2,4,6,8,9,1,5,3,7};
for(i = 0; i < 9; i++) {
printf("%d",array[i]);
}
putchar('\n');

for(j = 2; j < 9; j++) {
i = j - 1;
key = array[j];
while(i >= 0 && array[i] > key) {
array[i + 1] = array[i];
i--;
}
array[i + 1] = key;
}
for(i = 0; i < 9; i++) {
printf("%d",array[i]);
}
putchar('\n');
return 0;
}

Απλά για κάποιο λόγο δεν δουλεύει με δυναμική κατανομή :/
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 23 Μαρ 2012, 19:42

Κοιτα οπως πολυ σωστα σου εχει επισημανει και ο migf1 μην πας στους αλγοριθμους αν δεν εχεις
τελειωσει με το βιβλιο της C. Μην τα μπλεκεις δηλαδη μεταξυ τους... κρατα μια σειρα...για να δημιουργησεις βασεις.
Δικια μου γνωμη ειναι να μην βιαστεις καθολου να τελειωσεις το βιβλιο.... σιγα σιγα συνηθιζει το μυαλο να εξοικειωνεται με αυτα.
Ακομη και αν σου παρει 1 χρονο το βιβλιο μεινε εκει. Δεν υπαρχει προβλημα... για μενα παντα. Αλλα μην πεταγεσαι απο το ενα θεμα στο αλλο...
δηλαδη καταλαβες τον αλγοριθμο? θεωρητικα? Οκ τελος εκει.. τον αφηνεις καπου στην ακρη και δεν πας να τον υλοποιησεις σε C αν πχ στην C
εχεις μεινει στο κεφαλαιο με τα loops. Καταρχην εισαι σιγουρος οτι ξερεις πως δουλευει ενα loop? (απλο) οχι ένθετο

Πως πας ξαφνικα πχ στην δυναμικη δεσμευση μνημης?

Τσεκαρε την σελ.111 στον King εχει ενα πολυ καλο παραδειγμα για loops.
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 23 Μαρ 2012, 19:50

Το βιβλιο του King δεν χρησιμοποιει διαγράμματα ροης (flowcharts) οταν εξηγει την for δεν ξερω αν αυτο ενοχλει ή δεν ενοχλει καποιον.
Εγω διαβασα την for εκτος απο το βιβλιο του King και σε ενα που μας εδωσαν στο πανεπιστημιο και τα συνδυασα και την καταλαβα καλα. Πρεπει να βρεις
ενα διαγραμμα ροης. Βεβαια εξηγει και μεσα στο βιβλιο του King. Δοκιμασε να δεις μια for με 3 διαφορετικες εκφρασεις μεσα της (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

Δημοσίευσηαπό migf1 » 23 Μαρ 2012, 19:51

stamatiou έγραψε:
Απλά για κάποιο λόγο δεν δουλεύει με δυναμική κατανομή :/

Τι σφάλματα ή/και προειδοποιήσεις σου βγάζει ο compiler; Επίσης, όταν λες δεν δουλεύει τι εννοείς; Κρασάρει; Δεν τυπώνει τίποτα; Τυπώνει αλλά είναι λάθος; ...
Από gdb το πέρασες;

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

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

#define MAXELEMS 9
#define ERR_INTERNAL() printf( "*** %s(): internal error!\n", __func__ )

/* ----------------------------------------------------------- */
void arr_sort_insertion( int *arr, int nelems )
{
int i,j, key;

/* sanity check */
if ( !arr || nelems < 2 || nelems > MAXELEMS ) {
ERR_INTERNAL();
return;
}

/* do the sorting */
for (j=2; j < nelems; j++)
{
i = j - 1;
key = arr[ j ];
while (i >= 0 && arr[i] > key) {
arr[ i+1 ] = arr[ i ];
i--;
}
arr[ i+1 ] = key;
}

}
/* ----------------------------------------------------------- */
void arr_print( const int *arr, int nelems )
{
/* sanity check */
if ( !arr || nelems > MAXELEMS ) {
ERR_INTERNAL();
return;
}

/* do the printing */
for (int i=0; i < nelems; i++)
printf( "%d", arr[i] );
putchar('\n');

return;
}
/* ----------------------------------------------------------- */
int main( void )
{
int array[ MAXELEMS ] = {2,4,6,8,9,1,5,3,7};

arr_print( array, MAXELEMS );
arr_sort_insertion( array, MAXELEMS );
arr_print( array, MAXELEMS );

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

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

Δημοσίευσηαπό Ilias95 » 23 Μαρ 2012, 20:29

Μια ακόμα απορία.

Έχω το παρακάτω sample:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
char *x[] = {"abc", "def", "ghi"}, **p;
p = &x[1];
printf("%s\n", *p);

//char y[][10] = {"abc", "def", "ghi"}, *z;
//z = &y[1][0]; // ή char **z; και z = &y[1];
//printf("%s\n", *z);

return 0;
}

Αυτό που θέλω να κάνω είναι να εκτυπώσω το 2ο στοιχείο της κάθε array χρησιμοποιώντας pointer.
Στην πρώτη περίπτωση παίρνω το επιθυμητό αποτέλεσμα. Στην δεύτερη (αυτή με τα σχόλια) Segmentation fault.

Δεν νομίζω να έχει να κάνει με αυτό που λέγαμε χθες για read-only περιοχές μνήμης γιατί δεν προσπαθώ να τροποποιήσω κάτι.
Πως θα γραφτεί σωστά η δεύτερη περίπτωση;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 23 Μαρ 2012, 20:48

Κάνεις λάθος αναθέσεις στη 2η περίπτωση... βασικά προσπάθησε οι μεταβλητές σου να έχουν χαρακτηριστικά ονόματα, για να είναι πιο εύκολο να βγάζεις άκρη (θα σε βοηθήσει να βρίσκεις πιο γρήγορα τα λάθη σου).

Νομίζω πως θες να κάνεις κάτι σαν το παρακάτω...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
#if 0
char *sarr[] = {"abc", "def", "ghi"}; /* string array */
char **sp = NULL; /* string pointer */

sp = &sarr[1];
printf("%s\n", *sp);
#else
char sarr[][10] = {"abc", "def", "ghi"}; /* string array */
char *cp = NULL; /* char pointer */

cp = sarr[1];
printf("%s\n", cp);
#endif

system("pause"); /* windows only */
return 0;
}

Όπως είναι δουλεύει η 2η περίπτωση, για να δουλέψει η 1η άλλαξε το 0 του #if σε 1 (και κάνε re-compile).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 23 Μαρ 2012, 20:51

Ή μήπως προσπαθούσες να κάνεις αυτό;

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
char sarr[][10] = {"abc", "def", "ghi"}; /* string array */
char *cp = NULL; /* char pointer */

cp = &sarr[1][0];
printf("%s\n", cp);

system("pause"); /* windows only */
return 0;
}

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

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

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