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

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

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

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

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

Ilias95 έγραψε:
Ναι το παρατήρησα και το διάβασα και στο βιβλίο ότι είναι συνήθεια πολλών προγραμματιστών.
Βέβαια να πω την αλήθεια δεν μου αρέσει το οπτικό αποτέλεσμα, αλλά μάλλον το τίμημα θα είναι μεγαλύτερο αν δεν το υιοθετήσω.

Εγώ ακόμα δεν το 'χω συνηθίσει, τα μισά τα γράφω έτσι και τα μισά αλλιώς :lol:

έγραψε:(btw, ο interpreter της python δίνει syntax error αν δοκιμάσεις να κάνεις εκχώρηση όταν γίνεται έλεγχος για συνθήκη)

Στη C οι σύγχρονοι compilers το πιάνουν και το δίνουν ως warning (για αυτό να κάνεις πάντα compile με τα flags gcc -W -Wextra -Wall). Παλιότερα δεν το έπιαναν και έπρεπε να χρησιμοποιούμε εξωτερικά εργαλεία "static analysis tools" (το lint ήταν αυτό που άνοιξε τον δρόμο).

έγραψε:Και σε ευχαριστώ κιόλας για τον χρόνο και κόπο σου, το εκτιμώ.

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

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

Δημοσίευσηαπό Ilias95 » 06 Μαρ 2012, 17:40

Ορίστε και η άσκηση με τα μαγικά τετράγωνα σε δισδιάστατο πίνακα:

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

int main(void)
{
int size;
printf("Enter size of magic square (odd 1-99): ");
scanf("%d", &size);

if (size < 1 || size % 2 == 0) {
printf("Size must be an odd integer between 1 and 99.");
return 0;
}

int row = 0, col = size/2, sizesize = size*size, square[size][size];
memset(square, 0, sizeof(square)); // init table to 0
square[row][col] = 1;

for (int i = 2; i < sizesize + 1; i++) {
int uprow = row == 0 ? size - 1 : row - 1;
int rtcol = col == size - 1 ? 0 : col + 1;

if (square[uprow][rtcol])
row = row == size - 1 ? 0 : row + 1;
else {
row = uprow;
col = rtcol;
}

square[row][col] = i;
}

putchar('\n'); // print table
for (row = 0; row < size; row++) {
for (col = 0; col < size; col++)
printf("%5d", square[row][col]);
putchar('\n');
}

return 0;
}

Δεν χρησιμοποίησα καθόλου macros και νομίζω ο κώδικας έγινε πιο ευανάγνωστος.
Τελευταία επεξεργασία από Ilias95 και 07 Μαρ 2012, 00:04, έχει επεξεργασθεί 2 φορά/ες συνολικά
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 06 Μαρ 2012, 22:25

ΕΠ! Τι κάνουμε? :D
Γνώσεις ⇛ 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 » 08 Μαρ 2012, 05:29

Σελιδα 54 2 γραμμές απο το τελος εκει που λεει πως στην C89 αναθεώρηση η τιμή του 9%7 θα ειναι ειτε -2 ειτε 5 οκ το -2 το 5 που ακριβως το βρισκει? :p
Γνώσεις ⇛ 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

Δημοσίευσηαπό Ilias95 » 08 Μαρ 2012, 16:40

Star_Light έγραψε:Σελιδα 54 2 γραμμές απο το τελος εκει που λεει πως στην C89 αναθεώρηση η τιμή του 9%7 θα ειναι ειτε -2 ειτε 5 οκ το -2 το 5 που ακριβως το βρισκει? :p

Μάλλον εννοείς -9 % 7.

Κατ' αρχήν από την wikipedia σχετικά με τον modulo operator:
έγραψε:"When either a or n is negative, this naive definition breaks down and programming languages differ in how these values are defined."


Συνήθως υπολογίζεται έτσι όταν ο διαιρετέος μόνο είναι αρνητικός:
Παίρνουμε ένα πολλαπλάσιο του διαιρέτη που είναι μεγαλύτερο ή ίσο κατά απόλυτη τιμή απ' τον διαιρετέο και το προσθέτουμε στον διαιρετέο. Αυτό θα είναι το υπόλοιπο.
Προσοχή! Δεν είμαι 100% σίγουρος για τον παραπάνω ορισμό!

Δηλαδή στο συγκεκριμένο παράδειγμα. Ένα πολλαπλάσιο του 7 που είναι μεγαλύτερο κατ' απόλυτη τιμή απ' το -9 είναι το 14.
Άρα θα έχουμε: -9 + 14 = 5.

Δες και άλλα παραδείγματα στον interpreter της python για να καταλάβεις:
Κώδικας: Επιλογή όλων
>>> -9 % 2 #το πολλαπλάσιο είναι το 10, οπότε -9 + 10 = 1
1
>>> -9 % 3 #το πολλαπλάσιο είναι το 9 οπότε -9 + 9 = 0
0
>>>

Δεν είμαι σίγουρος τι παίζει με τα πρόσημα όταν και οι δύο είναι αρνητικοί:
Κώδικας: Επιλογή όλων

>>> -9 % -2 #το πολλαπλάσιο είναι το -10
-1
>>>


ΥΓ. Καλύτερα προχώρα, έχει πιο ενδιαφέροντα πράγματα... :P
Τελευταία επεξεργασία από Ilias95 και 08 Μαρ 2012, 20:30, έχει επεξεργασθεί 1 φορά/ες συνολικά
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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

Ilias95 έγραψε:
Star_Light έγραψε:Σελιδα 54 2 γραμμές απο το τελος εκει που λεει πως στην C89 αναθεώρηση η τιμή του 9%7 θα ειναι ειτε -2 ειτε 5 οκ το -2 το 5 που ακριβως το βρισκει? :p

Μάλλον εννοείς -9 % 7.

Κατ' αρχήν από την wikipedia σχετικά με τον modulo operator:
έγραψε:"When either a or n is negative, this naive definition breaks down and programming languages differ in how these values are defined."


Συνήθως υπολογίζεται έτσι όταν ο διαιρετέος μόνο είναι αρνητικός:
Παίρνουμε ένα πολλαπλάσιο του διαιρέτη που είναι μεγαλύτερο ή ίσο κατά απόλυτη τιμή απ' τον διαιρέτη και το προσθέτουμε στον διαιρετέο. Αυτό θα είναι το υπόλοιπο.
Προσοχή! Δεν είμαι 100% σίγουρος για τον παραπάνω ορισμό!

Δηλαδή στο συγκεκριμένο παράδειγμα. Ένα πολλαπλάσιο του 7 που είναι μεγαλύτερο κατ' απόλυτη τιμή απ' το -9 είναι το 14.
Άρα θα έχουμε: -9 + 14 = 5.

Δες και άλλα παραδείγματα στον interpreter της python για να καταλάβεις:
Κώδικας: Επιλογή όλων
>>> -9 % 2 #το πολλαπλάσιο είναι το 10, οπότε -9 + 10 = 1
1
>>> -9 % 3 #το πολλαπλάσιο είναι το 9 οπότε -9 + 9 = 0
0
>>>

Δεν είμαι σίγουρος τι παίζει με τα πρόσημα όταν και οι δύο είναι αρνητικοί:
Κώδικας: Επιλογή όλων

>>> -9 % -2 #το πολλαπλάσιο είναι το -10
-1
>>>


ΥΓ. Καλύτερα προχώρα, έχει πιο ενδιαφέροντα πράγματα... :P


Απο τον διαιρετέο εννοείς :P

Ευχαριστω... το ξερω οτι εχει πολυ πιο ενδιαφεροντα πραγματα απλα το παω σιγα και σταθερα ;)
Γνώσεις ⇛ 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 » 08 Μαρ 2012, 20:16

Ηλία θυμάσαι που λέγαμε πότε μας συμφέρει να χρησιμοποιήσουμε macros και πότε συναρτήσεις; Πόσταρα πριν λίγο στο νήμα του HexView ένα απόσπασμα από τον κώδικα, από την διαχείριση των skins (συγκεκριμένα εδώ: http://forum.ubuntu-gr.org/viewtopic.ph ... 51#p234351 ).

Στη συνάρτηση που φτιάχνει το μαύρο skin, θα δεις πως όλη η δουλειά γίνεται με ένα macro, το CONOUT_CPYCLR( dst, src) το οποίο αντιγράφει το 2ο όρισμά του στο 1ο (αντιγράφει δηλαδή το χρώμα src στο χρώμα dst).

Επειδή τα χρώματα σε Windows είναι unsigned 32μπιτά int, αλλά σε ANSI mode είναι c-strings (πίνακες χαρακτήρων) τότε ή πρέπει να φτιαχτούν 2 διαφορετικές συναρτήσεις για το κάθε mode ή θα το κάνουμε με macro, το οποίο θα το καλούμε όπου κι όποτε θέλουμε, ανεξάρτητα από το σε ποιο mode βρισκόμαστε (μια 3η επιλογή είναι χρησιμοποιήσουμε union).

Ο κώδικας του εν λόγω macro είναι ο παρακάτω (είναι λίγο διαφορετικά στο HexView, γιατί είναι σε ξεχωριστό header-file, από μα συλλογή με macros για cross-platform χρωματισμούς σε κονσόλα, που είχα φτιάξει παλαιότερα)...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#if defined( CON_COLOR_WIN32 )
#define CONOUT_CPYCLR( dst, src ) \
( (dst) = (src) )

#elif defined(CON_COLOR_ANSI)
#define CONOUT_CPYCLR( dst, src ) \
memmove( (dst), (src), ( 1 + strlen((src)) ) * sizeof(char) )

#else
#define CONOUT_CPYCLR( dst, src ) /* void macro */
#endif

Γίνεται και με συναρτήσεις, αλλά θέλει (αρκετή έως πολύ) περισσότερη δουλειά.

ΥΓ. Πόσταρα και screen-shots από 4 skins στο νήμα του HexView :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Star_Light έγραψε:Απο τον διαιρετέο εννοείς

Ναι έχεις δίκιο. Διαιρετέο εννοούσα, το διόρθωσα.
Αφού όμως είναι language και implementation dependent, ενδιαφέρον έχει να δούμε πως υπολογίζεται στα ίδια τα μαθηματικά. :)
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 08 Μαρ 2012, 20:36

Ilias95 έγραψε:
Ναι έχεις δίκιο. Διαιρετέο εννοούσα, το διόρθωσα.
Αφού όμως είναι language και implementation dependent, ενδιαφέρον έχει να δούμε πως υπολογίζεται στα ίδια τα μαθηματικά. :)


Ναι απο οσο ειδα και στην Wikipedia λεει οτι εξαρτάται απο την κάθε γλωσσα!!!!!!!
Γνώσεις ⇛ 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 » 08 Μαρ 2012, 21:31

Ilias95 έγραψε:
Ναι έχεις δίκιο. Διαιρετέο εννοούσα, το διόρθωσα.
Αφού όμως είναι language και implementation dependent, ενδιαφέρον έχει να δούμε πως υπολογίζεται στα ίδια τα μαθηματικά. :)


http://en.wikipedia.org/wiki/Modular_arithmetic

Πιστευω την απάντηση θα την βρούμε στην Modular αριθμητική.

Το μονο μου προβλημα ειναι τα "αγγλικα" καθως σε αυτο το λημμα έχω αρκετες άγνωστες λέξεις.
Γνώσεις ⇛ 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
Εκτύπωση

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

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