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

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

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

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

Δημοσίευσηαπό migf1 » 26 Αύγ 2011, 14:16

Τις is_vowel() και is_consonant() τις άλλαξα να επιστρέφουν 1 αν βρουν το c και 0 αν δεν το βρουν (το είχες ανάποδα εσύ, δλδ αν π.χ. το c ήταν φωνήεν η is_vowel() επέστρεφε 0... που λογικά σημαίνει FALSE). Οπότε και τα if στην main() από == 0 που τα είχες, με την αλλαγή αυτή γίνονται == 1 ( το οποίο δεν χρειάζεται να μπει, αρκεί σκέτο is_vowel(c) και is_consonant(c) ). Στο κυρίως σώμα των if δεν άλλαξα απολύτως τίποτα (μόνο τα ονόματα των μεταβλητών άλλαξα)... στα σχόλια από πάνω τους σου έχω γράψει τι κάνει αυτός ο κώδικας που έχεις μέσα στα σώματα των if-else (που είναι λάθος ;) )

Στο τελευταίο else απλά απενεργοποίησα τον έλεγχο για printable char (δλδ το is_print(c) ) ... δεν ήταν λάθος όπως το είχες, ίσα-ίσα ένας έξτρα έλεγχος δεν βλάπτει.

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

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

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

migf1 έγραψε:
...
ΥΓ. Τον κώδικα του screenshot δεν έχω προλάβει να τον κοιτάξω ακόμα

Λοιπόν το πρόβλημα ήταν πως δεν αρχικοποιούσες τα strings vowel, other & consonant στην main(), με αποτέλεσμα να ξεκινάνε με τυχαία περιεχόμενα μέσα τους (τα αρχικοποίησα σε "", όπως και το inbuf που το άλλαξα σε s ). Αραίωσα πάλι τον κώδικά σου και του έβαλα και κάποια σχόλια (άλλαξα ελαφρώς και τα ονόματα μερικών μεταβλητών και σου άλλαξα την επικίνδυνη strcat με την ασφαλή strncat). Αλγοριθμικά δεν τον έψαξα με λεπτομέρεια, αλλά με πρώτη ματιά δείχνει σωστός :)

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

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

// ------------------------------------------------------------------------------
int is_vowel( char c )
{
char *s = "aAEeIioOUuYy"; // ορισμός του s με όλα τα φωνήεντα

while ( *s ) // όσο το *s διαφέρει του '\0'
if ( c == *s++ ) // ... αν το c βρεθεί στο s
return 1; // ... ... επέστρεψε TRUE

return 0; // επέστρεψε FALSE

/*** DISABLED
int i;
char s[] = {'a','A','E','e','I','i','o','O','U','u','Y','y','\0'};

for (i=0; i < 12; i++)
if ( c == s[i] )
return 1;

return 0;
***/
}
// ------------------------------------------------------------------------------
int is_consonant( char c )
{
// ορισμός του s με όλα τα σύμφωνα
char *s = "bBcCdDfFgGhHjJkKlLmMnNpPqQrRsStTvVwWxXzZ";

while ( *s ) // όσο το *s διαφέρει του '\0'
if ( c == *s++ ) // ... αν το c βρεθεί στο s
return 1; // ... ... επέστρεψε TRUE

return 0; // επέστρεψε FALSE

/*** DISABLED
int i;
char s[] = {'b','B','c','C','d','D','f','F','g','G','h','H','j','J','k','K','l','L','m','M','n','N','p','P','q','Q','r','R','s','S','t','T','v','V','w','W','x','X','z','Z','\0'};

for (i=0; i < 40; i++)
if ( c == s[i] )
return 1;

return 0;
***/
}
// ------------------------------------------------------------------------------
int main( void )
{
int i, i2=0, i3=0, i4=0, slen;
char s[256] = "";
char vows[255] = "", cons[255] = "", othr[255] = "";

fgets(s, 256, stdin);
slen = strlen( s );
for (i=0; i < slen; i++)
{
if ( is_consonant( s[i] ) ) {
cons[ i2++ ] = s[ i ];
}
else if ( is_vowel( s[i] ) ) {
vows[ i3++ ] = s[ i ];
}
else {
if ( s[i] > 31 && s[i] <= 64 )
othr[ i4++ ] = s[ i ];
}
}

/*** DISABLED for (i=0; i < strlen( s ); i++)
s[i] = 0;
***/
s[0] = '\0'; // σβήσιμο των περιεχομένων του s

strncat(s, vows, 255);
strncat(s, othr, 255);
strncat(s, cons, 255);

/*** DISABLED
for (i=0; i < strlen( s ); i++)
printf("%c", s[i]);
putchar('\n');
***/
puts( s ); // τύπωμα του s στην οθόνη

return 0;
}

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

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

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

migf1 έγραψε:#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// ------------------------------------------------------------------------------
int is_vowel( char c )
{
char *s = "aAEeIioOUuYy"; // ορισμός του s με όλα τα φωνήεντα

while ( *s ) // όσο το *s διαφέρει του '\0'
if ( c == *s++ ) // ... αν το c βρεθεί στο s
return 1; // ... ... επέστρεψε TRUE

return 0; // επέστρεψε FALSE

/*** DISABLED
int i;
char s[] = {'a','A','E','e','I','i','o','O','U','u','Y','y','\0'};

for (i=0; i < 12; i++)
if ( c == s[i] )
return 1;

return 0;
***/
}
// ------------------------------------------------------------------------------
int is_consonant( char c )
{
// ορισμός του s με όλα τα σύμφωνα
char *s = "bBcCdDfFgGhHjJkKlLmMnNpPqQrRsStTvVwWxXzZ";

while ( *s ) // όσο το *s διαφέρει του '\0'
if ( c == *s++ ) // ... αν το c βρεθεί στο s
return 1; // ... ... επέστρεψε TRUE

return 0; // επέστρεψε FALSE

/*** DISABLED
int i;
char s[] = {'b','B','c','C','d','D','f','F','g','G','h','H','j','J','k','K','l','L','m','M','n','N','p','P','q','Q','r','R','s','S','t','T','v','V','w','W','x','X','z','Z','\0'};

for (i=0; i < 40; i++)
if ( c == s[i] )
return 1;

return 0;
***/
}
// ------------------------------------------------------------------------------
int main( void )
{
int i, i2=0, i3=0, i4=0, slen;
char s[256] = "";
char vows[255] = "", cons[255] = "", othr[255] = "";

fgets(s, 256, stdin);
slen = strlen( s );
for (i=0; i < slen; i++)
{
if ( is_consonant( s[i] ) ) {
cons[ i2++ ] = s[ i ];
}
else if ( is_vowel( s[i] ) ) {
vows[ i3++ ] = s[ i ];
}
else {
if ( s[i] > 31 && s[i] <= 64 )
othr[ i4++ ] = s[ i ];
}
}

/*** DISABLED for (i=0; i < strlen( s ); i++)
s[i] = 0;
***/
s[0] = '\0'; // σβήσιμο των περιεχομένων του s

strncat(s, 255, vows);
strncat(s, 255, othr);
strncat(s, 255, cons);

/*** DISABLED
for (i=0; i < strlen( s ); i++)
printf("%c", s[i]);
putchar('\n');
***/
puts( s ); // τύπωμα του s στην οθόνη

return 0;
}

Εμένα μου βγάζει segmentation fault και ένα αρκετά warnings :?:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Και πολύ σωστά κάνει, αφού στην strncat() το μήκος μπαίνει 3ο όρισμα και όχι 2ο που το είχα εγώ :lol: (το άλλαξα ήδη και στο προηγούμενο post).
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, 01:44

ΕΓω στις διακοπές σκέφτηκα πως θα ήταν φοβερο να μπορέσω να φτιάξω ενα πρόγραμμα κρυπτογράφησης σε C είτε του stdin είτε κάποιου άλλου αρχείου. Μιας και τα strings τα έχουμε έτοιμα. Θα πρέπει να φτιάξω μια συναρτηση cypher η οποία θα κάνει ολη την δουλειά και να εισάγω και ένα κλειδί μέσα. Πιστευω ειναι πολυ καλη ιδέα εσεις τι λέτε? :P

Για αρχή ας πούμε μπορεί ο χρήστης να δίνει την φράση

"hello friend"

και το πρόγραμμα να τυπώνει στην οθόνη

"ehlol rfeidn" δηλαδη θα κάνει μια αντιμετάθεση των στοιχείων ενος πίνακα.
Το ενα θα μπαίνει στην θέση του άλλου (φυσικά εδω δεν χρειάζεται κλειδί)
θα σκεφτω πως μπορω να το υλοποιησω και μονος μου... σκεφτείτε να φτιάξετε ενα ωραιο δικο σας προγραμματακι σε C το οποιο θα κρυπτογραφεί ένα αρχείο κειμένου πριν το στείλετε καπου... ειναι σαν να τρως λαχανικά απο τον κήπο σου!!!!!!!!! :lol: :lol: :lol:
Τελευταία επεξεργασία από Star_Light και 27 Αύγ 2011, 01:52, έχει επεξεργασθεί 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++

Δημοσίευσηαπό clepto » 27 Αύγ 2011, 01:52

Off topic:
εγώ το κάνω σε bash, με την βοήθεια του encfs
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

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

clepto έγραψε:Off topic:
εγώ το κάνω σε bash, με την βοήθεια του encfs


εγω το θελω σε C ομως :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/C++

Δημοσίευσηαπό clepto » 27 Αύγ 2011, 01:56

έγραψε:ειναι σαν να τρως λαχανικά απο τον κήπο σου!!!!!!!!!
:lol: :lol: :lol: :lol:

καλή αρχή ;)
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

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

Καλημέρα,
την αντιμετάθεση την έχουμε κάνει ήδη, 2-3 σελίδες πιο πριν (αλλά κρατούσαμε σταθερά τον 1ο και τον τελευταίο χαρακτήρα): viewtopic.php?p=203469#p203469
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

migf1 έγραψε:Καλημέρα,
την αντιμετάθεση την έχουμε κάνει ήδη, 2-3 σελίδες πιο πριν (αλλά κρατούσαμε σταθερά τον 1ο και τον τελευταίο χαρακτήρα): viewtopic.php?p=203469#p203469

Ναι αλλά πώς θα κάνουμε την αποκρυπτογράφηση;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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