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

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

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

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

Δημοσίευσηαπό migf1 » 14 Φεβ 2012, 12:31

Star_Light έγραψε:Ολοκληρωμένος ο παραπάνω (Oχι ο Καίσαρας αυτος του σταματίου)

http://ideone.com/VkTsr

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


kostas@kostas-SSL:~/PROGRAMS$ ./dokimes
Give a string: HELLO MY FRIEND HOW ARE YOU TODAY
Give the range of the key : 5
the key is : 5

MJQQT%R^%KWNJSI%MT\%FWJ%^TZ%YTIF^ * The plaintext is * : HELLO MY FRIEND HOW ARE YOU TODAY
ckostas@kostas-SSL:~/PROGRAMS$


Ο ίδιος κώδικας με σβησμένα όλα τα περιττά, αλλά χωρίς διόρθωση των λαθών του και χωρίς τα απαραίτητα error-checks.

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

#include <stdio.h>

#define SIZE (100+1)

void encrypt( char *msg , int key );
void decrypt( char *msg , int key );

int main( void )
{
char msg[ SIZE ] = {'\0'};
int key;

printf("Give a string: ");
fgets(msg, SIZE , stdin);

printf("Give the key : ");
scanf("%d", &key);

encrypt(msg, key);
printf("Encrypted text: %s\n", msg);

decrypt(msg, key);
printf("Decrypted text: %s\n", msg);

return 0;
}

/* -------------------------------------- */
void encrypt( char *msg , int key )
{
while ( *msg != '\0' )
{
*msg += key;
msg++;
}

return;
}

/* --------------------------------------- */
void decrypt(char *msg , int key)
{
while ( *msg != '\0' )
{
*msg -= key;
msg++;
}

return ;
}



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

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

Δημοσίευσηαπό Star_Light » 14 Φεβ 2012, 17:01

Bασικά εφοσον μου δούλεψε ο κώδικας με την απλή μετατόπιση του κλειδιου λογικα θα δουλέψει
αμα το βάλω και το mod 26 στην παράσταση......

Απλα ακομη δεν εχω σκεφτει πως θα δώσω τις τιμές 0....25 στο Α....Ζ :/
αμα γινουν αυτα ο Καισαρας τελειωσε.
Γνώσεις ⇛ 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 » 14 Φεβ 2012, 17:13

Star_Light έγραψε:Bασικά εφοσον μου δούλεψε ο κώδικας με την απλή μετατόπιση του κλειδιου λογικα θα δουλέψει
αμα το βάλω και το mod 26 στην παράσταση......

Απλα ακομη δεν εχω σκεφτει πως θα δώσω τις τιμές 0....25 στο Α....Ζ :/
αμα γινουν αυτα ο Καισαρας τελειωσε.

Δεν τελείωσε, ακριβώς, γιατί είπαμε πως η αλφάβητος πρέπει να περιλαμβάνει όλους τους printable χαρακτήρες της γλώσσας στην οποία θα είναι γραμμένο το κείμενο προς κρυπτογράφηση.

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

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

Δημοσίευσηαπό migf1 » 14 Φεβ 2012, 17:15

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

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

Δημοσίευσηαπό Star_Light » 14 Φεβ 2012, 19:35

@migf1 ένα μικρό διάλλειμμα απο το αρχικο προτζεκτ για να ξαναδώ λιγο τα strings.... σήμετα έφτιαξα 2 προγράμματα
στο μεν ενα έχω προβλημα με τα ανομοια μήκη αναμεσα σε 2 strings (το οποιο θα προσπαθησω να λυσω μονος μου μιας και εχουμε πει ηδη αρκετα
πραγματα) και το αλλο έκλεισε επιτυχώς μολις.

http://ideone.com/8mfzJ

επίτηδες στην γραμμή 51 του κώδικα αρχικοποιώ έναν δείκτη *save να δείχνει στο string που δειχνει και ο s1
έτσι ώστε χρησιμοποιώντας και τους 2 τρόπους ... "%c" , "%s" να πάρω ειτε χαρακτήρα χαρακτήρα το string
μεσα απο την while είτε ολόκληρο εξω απο την while. :)

(*p.s1) Φυσικα υπάρχει το πρόβλημα με τα ανόμοια μήκη στα strings και στον παραπάνω που θα προσπαθήσω να το διορθώσω :/
τελικα ειχε δικιο ο migf1 που φώναζε για ανόμοια strings :P οταν το προγραμμα ειναι δυναμικό στο συνολο του και οχι στατικο
υπάρχει προβλημα... και ακριβως το δυναμικό προγραμμα μονο μπορεί να αποτελέσει μέρος μιας πραγματικής εφαμοργής.

(*p.s2) Μονο στον δείκτη save υπάρχει το προβλημα επειδη κάποια "κατάλοιπα" απο το προηγουμενο string του s1.
Γνώσεις ⇛ 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 » 14 Φεβ 2012, 19:50

Star_Light έγραψε:@migf1 ένα μικρό διάλλειμμα απο το αρχικο προτζεκτ για να ξαναδώ λιγο τα strings....

Πολύ καλή ιδέα ;)

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

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

Δημοσίευσηαπό migf1 » 14 Φεβ 2012, 19:57

Πήγα να δω από περιέργεια τον κώδικά σου (πριν συνεχίσω με τον Vigenere) και ...

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

...
int main(void)
{
char s1[]= {"\0"};
char s2[]= {"\0"};
...

εδώ δηλώνεις 2 ΣΤΑΤΙΚΑ c-strings με μέγεθος 1 (ΕΝΑΝ) χαρακτήρα το καθένα τους, υποτίθεται τον μηδενικό χαρακτήρα αλλά δεν είναι καν χαρακτήρας, επειδή τον έχεις σε διπλά εισαγωγικά (o compiler δεν παραπονιέται εκεί; ).

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

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

Δημοσίευσηαπό migf1 » 14 Φεβ 2012, 20:28

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

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

Δημοσίευσηαπό Star_Light » 14 Φεβ 2012, 22:02

@migf1 Σωστός ! Βασικά ηταν προβληματικό και οτι δεν έβαζα μέγεθος στον πίνακα.

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

#define SIZE 40
.......

int main()
{
char s1[SIZE]= {'\0'};
char s2[SIZE]= {'\0'};

......
}


Οσο για τα ανόμοια strings το βρήκα. Βασικά 2 ανόμοια strings ειναι ανόμοια μέχρι να φτάσουν και τα 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

Δημοσίευσηαπό migf1 » 14 Φεβ 2012, 22:22

Λοιπόν, την κάνω για σπίτι παίδες. Σας δίνω τον κώδικα του ολοκληρωμένου προγράμματος που κάνει και Caesar και Vigenere, αλλά δεν έχω προλάβει ούτε να τον τεσταρω εξαντλητικά, ούτε να βάλω παντού σχόλια.

Δείχνει να δουλεύει και κάνει και I/O checking: http://ideone.com/Uvlom

Θεωρώ σίγουρο πως θα χάσετε τη μπάλα, ρωτήστε ότι θέλετε όμως όπου κολλήσετε. Η κρυπτογράφηση/αποκρυπτογράφηση για τον κάθε αλγόριθμο γίνεται σε 2 επίπεδα... πρώτα σε επίπεδο χαρακτήρα και κατόπιν σε επίπεδο συμβολοσειράς.

Π.χ. για τον Καίσαρα, η s_encrypt_caesar() καλεί μέσα σε loop την c_encrypt_caesar()... ομοίως και η αποκρυπτογράφη (το ίδιο και για Vigenere, εκεί έχουν προφανώς επίθεμα _vigenere τα ονόματα των συναρτήσεων).
Τελευταία επεξεργασία από migf1 και 14 Φεβ 2012, 22:26, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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