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

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

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

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

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

migf1 έγραψε:
Star_Light έγραψε:Λοιπον πρωτα εκατσα να ξαναθυμηθω την XOR . Και πηγα να την υλοποιησω προχειρα στον κωδικα
αλλα δεν μου βγαζει ας πουμε καλα αποτελεσματα.... μου βγαζει απο αριστερα δεκαδικη τιμη και απο δεξια δυαδικη κατι παιζει
με την μορφοποιηση μεσα στην printf :/

Spoiler: show
Κώδικας: Επιλογή όλων
#include<stdio.h>
int main()
{
int x=01001101;
int y=11010001;
int z;
int i;

// Pairnoume to z
for(i=0; i<8; i++)
{
z=x^y;
printf(" %d XOR %d dinei %d \n ",x,y,z);
}

printf("\n========================================================\n");
// Pairnoume to y me x XOR z

for(i=0; i<8; i++)
{
y=x^z;
printf(" %d XOR %d dinei %d \n ",x,z,y);
}


return 0;
}


γιατι? :S τα 0 και 1 τι μορφοποιητη θελουν πχ για να εκτυπωθουν?

Π.Σ αμα απο το XOR του x με το y έχεις βγαλει ενα z τοτε μετα αν πχ πας να κανεις XOR το x με το z παιρνεις το y κτλπ! Αυτο για οσους θελουν να ξαναθυμηθουν τα XORakia

Άσε τα δίκτυα και πιάσε την C από την αρχή, γιατί μου φαίνεται ότι παρα-αποτοξίνώθηκες στις διακοπές :lol: :lol:

Πέρα από την πλάκα, τι κάνεις βρε συ στον κώδικα αυτόν; Δηλώνεις τα x και y ως δεκαδικούς ακέραιους και μετά προσπαθείς να τα επεξεργαστείς μέσα σε ένα loop σαν να ήταν δυαδικοί, χωρίς μάλιστα καν να ασχολείσαι στο loop με το κάθε (υποτιθέμενο) δυαδικό ψηφίο ξεχωριστά.

Στη C δεν υπάρχει τύπος δεδομένων για να δηλώνεις μεταβλητές ως δυαδικούς αριθμούς (μπορείς βέβαια να διαχειριστείς binary bits σε οποιονδήποτε αριθμό με bit shifts και bit operators, αλλά δεν χρειάζεται τίποτα από όλα αυτά εδώ πέρα).

Κάνε απλά XOR τον κάθε χαρακτήρα του s με μια οποιαδήποτε τιμή. Κατόπιν ξανά κάνε τους XOR με την ίδια τιμή και θα επανέλθουν.

Btw, ορίστε νέος κώδικας χρησιμοποιεί και τους 2 τρόπους cipher (XOR και ROT13) που πόσταρα ξεχωριστά σε προηγούμενα posts. Μόνο που τώρα το ROT13 το έκανα να δουλεύει και με ελληνικά γράμματα (μόνο τα άτονα όμως)... και μιλάω πάντα για 8-μπιτες γραμματοσειρές (όχι Unicode).

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

#include <stdio.h>

#define XOR_KEY 0x13

#define ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω"

#define ALPHA13 "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm\
ΝΞΟΠΡΣΤΥΦΧΨΩΑΒΓΔΕΖΗΘΙΚΛΜνξοπρστυφχψωαβγδεζηθικλμ"

//--------------------------------------------------------------------------------------
char c_rot13( const char c, const char *alpha, const char *alpha13 )
{
register int i;

for ( i=0; alpha[i]; i++ )
if ( c == alpha[i] )
return alpha13[i];

return '\0';
}
//--------------------------------------------------------------------------------------
char *s_rot13( char *s )
{
if ( !s )
return NULL;

char c, *cp = s;
for(; *s; s++ )
*s = (c=c_rot13(*s, ALPHA, ALPHA13)) != '\0' ? c : *s;

return cp;
}
//--------------------------------------------------------------------------------------
char *s_xor( char *s, const int key )
{
if ( !s )
return NULL;

char *cp = s;
while( *s )
*s++ ^= key;

return cp;
}
//--------------------------------------------------------------------------------------
void print_header( const char *title, const char *text )
{
printf("%74s\n", title);
puts("--------------------------------------------------------------------------");
puts( text );
puts("--------------------------------------------------------------------------\n");

return;
}
//--------------------------------------------------------------------------------------
int main( void )
{
unsigned char x = 0b10;

char s[] = "This is a test for (dummy) ciphering. / Παράδειγμα (χαζής) κρυπτογράφησης.";

puts("D U M M Y C I P H E R\n");

print_header( "U s i n g X O R", s );
printf("C I P H E R E D:\n%s\n\n", s_xor( s, XOR_KEY ) ); // cipher & print
printf("D E C I P H E R E D:\n%s\n\n", s_xor( s, XOR_KEY ) ); // decipher & print

print_header( "U s i n g R O T 1 3", s );
printf("C I P H E R E D:\n%s\n\n", s_rot13( s ) ); // cipher & print
printf("D E C I P H E R E D:\n%s\n\n", s_rot13( s ) ); // decipher & print

return 0;
}


Ε όχι και να αφήσει τα δίκτυα! :lol:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

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

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

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

migf1 έγραψε:
Star_Light έγραψε:Λοιπον πρωτα εκατσα να ξαναθυμηθω την XOR . Και πηγα να την υλοποιησω προχειρα στον κωδικα
αλλα δεν μου βγαζει ας πουμε καλα αποτελεσματα.... μου βγαζει απο αριστερα δεκαδικη τιμη και απο δεξια δυαδικη κατι παιζει
με την μορφοποιηση μεσα στην printf :/

Spoiler: show
Κώδικας: Επιλογή όλων
#include<stdio.h>
int main()
{
int x=01001101;
int y=11010001;
int z;
int i;

// Pairnoume to z
for(i=0; i<8; i++)
{
z=x^y;
printf(" %d XOR %d dinei %d \n ",x,y,z);
}

printf("\n========================================================\n");
// Pairnoume to y me x XOR z

for(i=0; i<8; i++)
{
y=x^z;
printf(" %d XOR %d dinei %d \n ",x,z,y);
}


return 0;
}


γιατι? :S τα 0 και 1 τι μορφοποιητη θελουν πχ για να εκτυπωθουν?

Π.Σ αμα απο το XOR του x με το y έχεις βγαλει ενα z τοτε μετα αν πχ πας να κανεις XOR το x με το z παιρνεις το y κτλπ! Αυτο για οσους θελουν να ξαναθυμηθουν τα XORakia

Άσε τα δίκτυα και πιάσε την C από την αρχή, γιατί μου φαίνεται ότι παρα-αποτοξίνώθηκες στις διακοπές :lol: :lol:

Πέρα από την πλάκα, τι κάνεις βρε συ στον κώδικα αυτόν; Δηλώνεις τα x και y ως δεκαδικούς ακέραιους και μετά προσπαθείς να τα επεξεργαστείς μέσα σε ένα loop σαν να ήταν δυαδικοί, χωρίς μάλιστα καν να ασχολείσαι στο loop με το κάθε (υποτιθέμενο) δυαδικό ψηφίο ξεχωριστά.

Στη C δεν υπάρχει τύπος δεδομένων για να δηλώνεις μεταβλητές ως δυαδικούς αριθμούς (μπορείς βέβαια να διαχειριστείς binary bits σε οποιονδήποτε αριθμό με bit shifts και bit operators, αλλά δεν χρειάζεται τίποτα από όλα αυτά εδώ πέρα).

Κάνε απλά XOR τον κάθε χαρακτήρα του s με μια οποιαδήποτε τιμή. Κατόπιν ξανά κάνε τους XOR με την ίδια τιμή και θα επανέλθουν.

Btw, ορίστε νέος κώδικας χρησιμοποιεί και τους 2 τρόπους cipher (XOR και ROT13) που πόσταρα ξεχωριστά σε προηγούμενα posts. Μόνο που τώρα το ROT13 το έκανα να δουλεύει και με ελληνικά γράμματα (μόνο τα άτονα όμως)... και μιλάω πάντα για 8-μπιτες γραμματοσειρές (όχι Unicode).

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

#include <stdio.h>

#define XOR_KEY 0x13

#define ALPHA "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψω"

#define ALPHA13 "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm\
ΝΞΟΠΡΣΤΥΦΧΨΩΑΒΓΔΕΖΗΘΙΚΛΜνξοπρστυφχψωαβγδεζηθικλμ"

//--------------------------------------------------------------------------------------
char c_rot13( const char c, const char *alpha, const char *alpha13 )
{
register int i;

for ( i=0; alpha[i]; i++ )
if ( c == alpha[i] )
return alpha13[i];

return '\0';
}
//--------------------------------------------------------------------------------------
char *s_rot13( char *s )
{
if ( !s )
return NULL;

char c, *cp = s;
for(; *s; s++ )
*s = (c=c_rot13(*s, ALPHA, ALPHA13)) != '\0' ? c : *s;

return cp;
}
//--------------------------------------------------------------------------------------
char *s_xor( char *s, const int key )
{
if ( !s )
return NULL;

char *cp = s;
while( *s )
*s++ ^= key;

return cp;
}
//--------------------------------------------------------------------------------------
void print_header( const char *title, const char *text )
{
printf("%74s\n", title);
puts("--------------------------------------------------------------------------");
puts( text );
puts("--------------------------------------------------------------------------\n");

return;
}
//--------------------------------------------------------------------------------------
int main( void )
{
unsigned char x = 0b10;

char s[] = "This is a test for (dummy) ciphering. / Παράδειγμα (χαζής) κρυπτογράφησης.";

puts("D U M M Y C I P H E R\n");

print_header( "U s i n g X O R", s );
printf("C I P H E R E D:\n%s\n\n", s_xor( s, XOR_KEY ) ); // cipher & print
printf("D E C I P H E R E D:\n%s\n\n", s_xor( s, XOR_KEY ) ); // decipher & print

print_header( "U s i n g R O T 1 3", s );
printf("C I P H E R E D:\n%s\n\n", s_rot13( s ) ); // cipher & print
printf("D E C I P H E R E D:\n%s\n\n", s_rot13( s ) ); // decipher & print

return 0;
}



Ναι βασικα δεν ειχε λογικη αυτο που εκανα... :P

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

#include<stdio.h>
int main()
{
int x,y,z,i;

// Pairnoume to z
for(i=0; i<8; i++)
{
printf("Dwse 2 bits (0,1)");
scanf("%d%d",&x,&y);
if(x>1&&y>1)
break;
z=x^y;
printf(" %d XOR %d dinei %d \n ",x,y,z);
}

printf("\nLathos times ksanadokimase\n");


κοιτα θελω να ξεκινησω πρωτα απο το XOR σε ακεραιους και μετα να παω και στα strings. Βεβαια και αυτος εδω ο κωδικας που δινω ειναι λιγο ρημαδιό λολ.
Γνώσεις ⇛ 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 » 27 Αύγ 2011, 19:52

Έφτιαξα και μια συνάρτηση που κάνει την κρυπτογράφηση που ζήτησε ο φίλος Star_Light αρχικά, δλδ με αντιμετάθεση χαρακτήρων ανά ζευγάρια..

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

//--------------------------------------------------------------------------------------
char *s_ciphswap( char *s )
{
if ( !s )
return NULL;
if ( !*s || !s[1] )
return s;

int i; char c;
for (i=1; s[i-1] && s[i]; i+=2) {
c = s[i-1];
s[i-1] = s[i];
s[i] = c;
}

return s;
}
//--------------------------------------------------------------------------------------
int main( void )
{
char s[] = "This is a test for (dummy) ciphering. / Παράδειγμα (χαζής) κρυπτογράφησης.";
...
print_header( "U s i n g S W A P", s );
printf("C I P H E R E D:\n%s\n\n", s_ciphswap( s ) ); // cipher & print
printf("D E C I P H E R E D:\n%s\n\n", s_ciphswap( s ) ); // decipher & print

return 0;
}
Τελευταία επεξεργασία από migf1 και 28 Αύγ 2011, 01:06, έχει επεξεργασθεί 2 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Καλα και τα δικτυα να αφηνα εχω και πτυχιακη ακομη να τελειωσω... εχω και τα αγγλικα που δινω τον δεκεβριο... δηλαδη δεν σωζομαι! Μακαρι να ειχαμε απλετο χρονο για C αλλα που.... τελοςπαντων migf1 αμα πονοκεφαλιαστηκες με αυτα που εγραψα θα κοιταξω τους κωδικες που δινεις
αλλα ηθελα να ξεκινησω πχ απο ακεραια μπιτακια... δοκιμασα να τα βαλω και σε εναν πινακα... αλλα εγινε ροιδο που λες και εσυ :lol: :lol: :lol:

ελεγα στο χρηστη να δωσει αρχικα 7 μπιτ τα οποια αποθηκευοντουσαν μεσα σε εναν array1
μμετα αλλα 7 για τον array2 και τελος εκανα XOR τα στοιχεια των πινακων μεταξυ τους μεσα στην for
και εκχωρουσα το αποτελεσμα σε εναν array3 και προσπαθουσα μετα να το εκτυπωσω απο την πριντφ αλλα μπουρδες δεν καταφερα και πολλα. :problem:
Τελευταία επεξεργασία από Star_Light και 27 Αύγ 2011, 19:57, έχει επεξεργασθεί 2 φορά/ες συνολικά
Γνώσεις ⇛ 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 » 27 Αύγ 2011, 19:56

Star_Light έγραψε:
κοιτα θελω να ξεκινησω πρωτα απο το XOR σε ακεραιους και μετα να παω και στα strings.

Μα δεν χρειάζεσαι strings !!! Αφού σου εξήγησα αναλυτικά τι πρέπει να κάνεις !!!

έγραψε:Βεβαια και αυτος εδω ο κωδικας που δινω ειναι λιγο ρημαδιό λολ.

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

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

Δημοσίευσηαπό migf1 » 27 Αύγ 2011, 20:03

Star_Light έγραψε:ελεγα στο χρηστη να δωσει αρχικα 7 μπιτ τα οποια αποθηκευοντουσαν μεσα σε εναν array1
μμετα αλλα 7 για τον array2 και τελος εκανα XOR τα στοιχεια των πινακων μεταξυ τους μεσα στην for
και εκχωρουσα το αποτελεσμα σε εναν array3 και προσπαθουσα μετα να το εκτυπωσω απο την πριντφ αλλα μπουρδες δεν καταφερα και πολλα. :problem:

Δεν χρειάζονται όλα αυτά !!!!!!!!!!!

Πιάσε από την αρχή το s και για κάθε χαρακτήρα του κάνε ένα απλό:
Κώδικας: Επιλογή όλων

s[i] = s[i] ^ μια_οποιαδήποτε_τιμή_εδώ // s[i] ^= μια_οποιαδήποτε_τιμή_εδώ
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

κατσε γιατι μπλοκαρα :/ αυτο πως το βλεπεις?

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

#include<stdio.h>
#include<stdlib.h>
#define N 8

int main()
{
char s[N];
char c;
int i;


// Pairnoume to z
for(i=0; s[i]; i++)
{
printf("Dwse 8 xaraktires");
sscanf(s,"%c",&c);
s[i]=s[i]^1;
printf(" %c\n ",s[i]);
}

printf("\nLathos times ksanadokimase\n");


το & γιατι το βαζεις μεσα στην for ας πουμε? Τι κανει αυτο??? ξεχασα :/
Γνώσεις ⇛ 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 » 27 Αύγ 2011, 20:29

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

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

Δημοσίευσηαπό migf1 » 27 Αύγ 2011, 20:44

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

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

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