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

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

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

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

Δημοσίευσηαπό migf1 » 28 Αύγ 2011, 15:09

Star_Light έγραψε:ααα οκ. Δηλαδη πρωτα κανουμε την δουλεια με την for και μετα τα εκτυπωνουμε ολα μαζι.
Αν εχει σημασια απαντησε κιολας στο τι προβλημα ακριβως δημιουργουσε η printf μεσα στον βρογχο.

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

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

Δημοσίευσηαπό Star_Light » 28 Αύγ 2011, 15:20

migf1 έγραψε:Για τον φίλο Star_Light που από ότι κατάλαβα θέλει να μάθει πως διαχειρίζονται οι δυαδικοί αριθμοί με τη C, παραθέτω έναν απλό κώδικα που αρχικοποιεί ένα (unsigned) byte με την τιμή 2 ( = 00000010), το τυπώνει, ανάβει το 8ο bit και ξανατυπώνει τον αριθμό και τέλος σβήνει το 8ο bit ανάβει το 6ο και ξανατυπώνει τον αριθμό.

Η συνάρτηση void print_byte( const Byte byte ) τυπώνει το byte σε δυαδική, δεκαδική, δεκαεξαδική και οκταδική μορφή.
Η συνάρτηση char *s_byte2binary( char *s, const Byte byte ) μετατρέπει το byte σε δυαδικά ψηφία και τα αποθηκεύει στο s

Ως Byte έχω ορίσει ένα unsigned char, με το σχετικό typedef στην αρχή. Τα bitmasks BIT1, BIT2, ..., ΒΙΤ8 είναι οι δυνάμεις του 2 που αντιστοιχούν στο κάθε bit ενός byte: 2^0, 2^1, ... 2^7

Κάνοντας ένα byte | (OR) με ένα bitmask ανάβουμε το αντίστοιχο bit στο byte. Κάνοντας ένα byte & (AND) με το ~ (NOT) ενός bitmask, σβήνουμε το αντίστοιχο bit στο byte.

Οι τελεστές << και >> μετακινούν όλα τα bits του byte κατά μια θέση προς τα αριστερά και δεξιά, αντίστοιχα (π.χ. αν byte = 2, δλδ 00000010 τότε το: byte <<= 1; μετακινεί όλα τα bits μια θέση προς τα αριστερά, οπότε το byte θα γίνει ίσο με 4, δλδ 00000100)

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

#include <stdio.h>

// Bitmasks

#define BIT1 1 // (1 << 0)
#define BIT2 2 // (1 << 1)
#define BIT3 4 // (1 << 2)
#define BIT4 8 // (1 << 3)
#define BIT5 16 // (1 << 4)
#define BIT6 32 // (1 << 5)
#define BIT7 64 // (1 << 6)
#define BIT8 128 // (1 << 7)

// Custom Types

typedef unsigned char Byte;

// ----------------------------------------------------------------------------------
char *s_byte2binary( char *s, const Byte byte )
{
if ( !s )
return NULL;

int z;
char *cp;
for (z=BIT8, cp=s; z > 0; z >>= 1, cp++)
*cp = (byte & z) == z ? '1' : '0';
*cp = '\0';

return s;
}
// ----------------------------------------------------------------------------------
void print_byte( const Byte byte )
{
char bin[8+1] = {0};

printf( "Bin: %s\t\tDec: %-3d\tHex: %-3x\tOct: %-3o\n",
s_byte2binary(bin, byte), byte, byte, byte );

return;
}
// ----------------------------------------------------------------------------------
int main( void )
{
Byte byte = 2; // αρχικοποίηση

print_byte( byte ); // τύπωμα αριθμού

byte |= BIT8; // άναμμα 8ου bit
print_byte( byte ); // τύπωμα αριθμού

byte &= ~BIT8; // σβήσιμο 8ου bit
byte |= BIT6; // άναμμα 6ου bit
print_byte( byte ); // τύπωμα αριθμού
return 0;
}


1.α ωραιοτατα. Ευχαριστω. Το 2 το δινεις ετσι 00000010 αλλα και ολα τα μηδενικα να βγαλεις απο αριστερα παλι 2 θα μεινει λογω προσθηκης στα λιγοτερο σημαντικα bit απο αριστερα. Για 1 δευτερολεπτο μπερδευτηκα αλλα μονο για 1 :P . Λοιπον θα δω αυτο τον κωδικα... προ λιγου καπου πηρε το ματι μου και τον αλγοριθμο του καισαρα που ουσιαστικα αναλογα με το κλειδι κανεις μετατοπισεις μεσα στον πινακα πχ αν το κλειδι ειναι 3 τοτε ο αρχικος χαρακτηρας (1ος) στο κρυπτοκειμενο θα ειναι ο 4ος του αρχικου απλου κειμενου κ.ο.κ . Αφου διαβασω αυτα που εδωσες θα κοιταξω να φτιαξω και καναν καισαρα μετα να χαρω λιγο.

2. (Λιγο ασχετη απορια) αλλα αν σε εναν hex editor οπου τα data αντιπροσωπευονται απο 16-δικες τιμες και ομαδοποιούνται σε 4 groups των 4 bytes τοτε απο αυτα τα 4 καθε φορα παιρων 2 χαρακτηρες? ΕΦοσον 1 char δινει 8 bytes.
Γνώσεις ⇛ 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 » 28 Αύγ 2011, 15:49

Το
Κώδικας: Επιλογή όλων
? c : *s;
στο rot13 τι κάνει ακριβώς;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 28 Αύγ 2011, 19:29

stamatiou έγραψε:Το
Κώδικας: Επιλογή όλων
? c : *s;
στο rot13 τι κάνει ακριβώς;

Νομίζω με έχεις ξαναρωτήσει, είναι ισοδύναμο του if (?) else (:)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 28 Αύγ 2011, 19:34

Star_Light έγραψε:
1.α ωραιοτατα. Ευχαριστω. Το 2 το δινεις ετσι 00000010 αλλα και ολα τα μηδενικα να βγαλεις απο αριστερα παλι 2 θα μεινει λογω προσθηκης στα λιγοτερο σημαντικα bit απο αριστερα. Για 1 δευτερολεπτο μπερδευτηκα αλλα μονο για 1

Δεν δίνω πουθενά το 2 στην δυαδική μορφή του. Στη C δεν υπάρχει built-in data type για δυαδικές μεταβλητές.

έγραψε::P . Λοιπον θα δω αυτο τον κωδικα... προ λιγου καπου πηρε το ματι μου και τον αλγοριθμο του καισαρα που ουσιαστικα αναλογα με το κλειδι κανεις μετατοπισεις μεσα στον πινακα πχ αν το κλειδι ειναι 3 τοτε ο αρχικος χαρακτηρας (1ος) στο κρυπτοκειμενο θα ειναι ο 4ος του αρχικου απλου κειμενου κ.ο.κ . Αφου διαβασω αυτα που εδωσες θα κοιταξω να φτιαξω και καναν καισαρα μετα να χαρω λιγο.

Έχω δώσει link για το ROT13 που είναι παραλλαγή του Καίσσρα ;)

έγραψε:2. (Λιγο ασχετη απορια) αλλα αν σε εναν hex editor οπου τα data αντιπροσωπευονται απο 16-δικες τιμες και ομαδοποιούνται σε 4 groups των 4 bytes τοτε απο αυτα τα 4 καθε φορα παιρων 2 χαρακτηρες? ΕΦοσον 1 char δινει 8 bytes.

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

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

Δημοσίευσηαπό migf1 » 28 Αύγ 2011, 19:38

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

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

Δημοσίευσηαπό stamatiou » 28 Αύγ 2011, 19:39

migf1 έγραψε:
stamatiou έγραψε:Το
Κώδικας: Επιλογή όλων
? c : *s;
στο rot13 τι κάνει ακριβώς;

Νομίζω με έχεις ξαναρωτήσει, είναι ισοδύναμο του if (?) else (:)

Δλδ είναι κάτι σαν:
Κώδικας: Επιλογή όλων

if((c=c_rot13(*s, ALPHA, ALPHA13)) != '\0') {
*s = c;
}else {
*s = *s;
}

:problem:
Edit: @migf1 Πότε φύγαμε από τα strings;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 28 Αύγ 2011, 19:40

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

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

Δημοσίευσηαπό Star_Light » 28 Αύγ 2011, 19:41

migf1 έγραψε:Πάντως πιστεύω έχετε αρχίσει πάλι να αφήνετε μισοτελειωμένα πράγματα και να πηγαίνετε σε επόμενα. Έχω την εντύπωση πως υπάρχουν ακόμα πολλά κενά στα strings που χρειάζεται να καλυφθούν πριν καταπιαστεί κανείς με κρυπτογράφηση και δυαδικές διαχειρίσεις.


Ωραια. Τοτε ας μεινουμε μονο στα strings. Eχεις δικιο γιατι θα παιδευτουμε χωρις λογο και θα παιδεψουμε και σενα.
Επομενως προτεινε εσυ που ξερεις και αριστα το αντικειμενο
απλα δοκιμασα να σκεφτω να μπλεξουμε strings μαζι με κρυπτογραφηση
ουσιαστικα ασκησεις των strings οι οποιες θα προσφερουν κρυπτογραφηση.

Π.Σ σταματιου εχεις πηξει στο διαβασμα ε? χαχαχαχχα
Τελευταία επεξεργασία από Star_Light και 28 Αύγ 2011, 19:44, έχει επεξεργασθεί 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++

Δημοσίευσηαπό migf1 » 28 Αύγ 2011, 19:43

stamatiou έγραψε:Edit: @migf1 Πότε φύγαμε από τα strings;

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

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

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