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

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

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

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

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

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

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

Δημοσίευσηαπό stamatiou » 25 Αύγ 2011, 17:23

migf1 έγραψε:Έβαλες το '\0' στο τέλος της αρχικοποίησης του s στην is_vowel?

Ναι, να ο κώδικας:
Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int is_vowel(char c) {
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 0;
}
}
return 1;
}

int is_consonant(char c) {
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 0;
}
}
return 1;
}

int main(void) {
int i,i2 = 0,i3 = 0,i4 = 0,len;
char inbuf[256];
char vowel[255];
char consonant[255];
char other[255];
fgets(inbuf,256,stdin);
len = strlen(inbuf);
for(i=0;i<len;i++) {
if(is_consonant(inbuf[i]) == 0) {
consonant[i2++] = inbuf[i];
}else if(is_vowel(inbuf[i]) == 0) {
vowel[i3++] = inbuf[i];
}else {
if(inbuf[i] > 31 && inbuf[i] <= 64) {
other[i4++] = inbuf[i];
}
}
}
for(i=0;i<strlen(inbuf);i++) inbuf[i] = 0;
strcat(inbuf,vowel);
strcat(inbuf,other);
strcat(inbuf,consonant);
for(i=0;i<strlen(inbuf);i++) printf("%c",inbuf[i]);
putchar('\n');
return 0;
}
Επίσης προσπάθησα να κάνω και in place αλλά δεν ξέρω πώς να το κάνω να τα βάζει με τη σειρά (δλδ πρώτα τα φωνήεντα κλπ.) και μερικές φορές μου τα βγάζει λάθος, δλδ ανάμεσα στα φωνήεντα πετά και ένα σύμφωνο... :problem:
Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int is_vowel(char c) {
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 0;
}
}
return 1;
}

int is_consonant(char c) {
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 0;
}
}
return 1;
}
int main(void) {
int i,vowelnum = 0,othernum = 0,consnum = 0,len;
char inbuf[256],temp;
fgets(inbuf,256,stdin);
len = strlen(inbuf);
for(i=0;i<len;i++) {
if(is_vowel(inbuf[i]) == 0) {
temp = inbuf[vowelnum];
inbuf[vowelnum++] = inbuf[i];
inbuf[i] = temp;
}else if(is_consonant(inbuf[i]) == 0) {
temp = inbuf[consnum];
inbuf[consnum++] = inbuf[i];
inbuf[i] = temp;
}else if(isprint(inbuf[i])) {
temp = inbuf[othernum];
inbuf[othernum++] = inbuf[i];
inbuf[i] = temp;
}
temp = 0;
}
len = strlen(inbuf);
for(i=0;i<len;i++) putchar(inbuf[i]);
putchar('\n');
return 0;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 25 Αύγ 2011, 17:51

Το in-place δεν είναι και πολύ εύκολο (ούτε και πολύ δύσκολο όμως). Πάλεψέ το με ησυχία και καθαρό μυαλό και θα το βγάλεις :) (δεν υπάρχει λόγος βιασύνης).

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

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

Δημοσίευσηαπό stamatiou » 25 Αύγ 2011, 17:58

Οκ, και συγνώμη για τον κώδικα αλλά όταν λες τον αραιώνεις εννοείς τις αγκύλες και αυτά;
(να και το screenshot)
http://imageshack.us/photo/my-images/231/screenshotxzh.png/
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Για το αραίωμα του κώδικα, παραθέτω πως αραίωσα τον τελευταίο σου για να δω τι κάνει. Βέβαια εκτός από το αραίωμα έκανα και καμιά 100αριά ακόμα αλλαγές :lol: Βασικά έτσι όπως τον έκανα κάνει ακριβώς ότι και ο δικός σου, αλλά άλλαξα ονόματα μεταβλητών, σου έβαλα εναλλακτικές υλοποιήσεις του δικού σου κώδικα (αφήνοντας μέσα σε /*** ... ***/ τις δικές σου υλοποιήσεις) κι έβαλα σχόλια που εξηγούν τι κάνει ο κώδικάς σου. Ειδικά στη main() τα σχόλια ελπίζω να σε βοηθήσουν να καταλάβεις γιατί δεν δουλεύει σωστά το πρόγραμμά σου (είναι αλγοριθμικά εσφαλμένο).

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*** DISABLED
#include <ctype.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
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'};
int i;

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

return 0;
***/
}

// ---------------------------------------------------------------------------------
int main( void )
{
int i, vsum=0, osum=0, csum=0, slen; // vowels-sum, others-sum, consonants-sum
char s[256], c;

fgets(s, 256, stdin);
slen = strlen( s );
for (i=0; i < slen; i++)
{
// αν βρεις φωνήεν ενάλλαξέ το με το προηγούμενο φωνήεν που έχεις βρει
if ( is_vowel( s[i] ) ) {
c = s[ vsum ];
s[ vsum++ ] = s[ i ];
s[i] = c;
}
// αν βρεις σύμφωνο ενάλλαξέ το με το προηγούμενο σύμφωνο που έχεις βρει
else if ( is_consonant( s[i] ) ) {
c = s[ csum ];
s[ csum++ ] = s[i];
s[ i ] = c;
}
// αν βρεις άλλο ενάλλαξέ το με το προηγούμενο ομοειδές που έχεις βρει
/*** else if( isprint( s[i] ) ) { ***/
else {
c = s[ osum ];
s[ osum++ ] = s[i];
s[ i ] = c;
}
/*** c = 0; ***/
}

/*** DISABLED
slen = strlen(s);
for (i=0; i < slen; i++)
putchar( s[i] );
putchar('\n');
***/
puts( s );

return 0;
}
btw, στη C αποτελεί κοινή πρακτική μεταβλητές που αναφέρονται σε strings να ονομάζονται s ή t, μεταβλητές που αναφέρονται σε χαρακτήρα να ονομάζονται c, μεταβλητές που αναφέρονται σε μετρητές να ονομάζονται i, j, k, ακέραιοι να ονομάζονται n,m,l, πραγματικοί να ονομάζονται x,y,z ... έχει κι άλλα, αλλά θα τελειώσω... αύριο :lol:
Για την εικόνα, πρέπει να αραιώσω ξανά τον κώδικα που της αντιστοιχεί και κυρίως να βρω σε ποιον από όλους τους κώδικες που έχεις ποστάρει αντιστοιχεί :lol:
Τελευταία επεξεργασία από migf1 και 26 Αύγ 2011, 12:40, έχει επεξεργασθεί 3 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

migf1 έγραψε:Για το αραίωμα του κώδικα, παραθέτω πως αραίωσα τον τελευταίο σου για να δω τι κάνει. Βέβαια εκτός από το αραίωμα έκανα και καμιά 100αριά ακόμα αλλαγές :lol: Βασικά έτσι όπως τον έκανα κάνει ακριβώς ότι και ο δικός σου, αλλά άλλαξα ονόματα μεταβλητών, σου έβαλα εναλλακτικές υλοποιήσεις του δικού σου κώδικα (αφήνοντας μέσα σε /*** ... ***/ τις δικές σου υλοποιήσεις) κι έβαλα σχόλια που εξηγούν τι κάνει ο κώδικάς σου. Ειδικά στη main() τα σχόλια ελπίζω να σε βοηθήσουν να καταλάβεις γιατί δεν δουλεύει σωστά το πρόγραμμά σου (είναι αλγοριθμικά εσφαλμένο).

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*** DISABLED
#include <ctype.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
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'};
int i;

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

return 0;
***/
}

// ---------------------------------------------------------------------------------
int main( void )
{
int i, vsum=0, osum=0, csum=0, slen; // vowels-sum, others-sum, consonants-sum
char s[256], c;

fgets(s, 256, stdin);
slen = strlen( s );
for (i=0; i < slen; i++)
{
// αν βρεις φωνήεν ενάλλαξέ το με το προηγούμενο φωνήεν που έχεις βρει
if ( is_vowel( s[i] ) ) {
c = s[ vsum ];
s[ vsum++ ] = s[ i ];
s[i] = c;
}
// αν βρεις σύμφωνο ενάλλαξέ το με το προηγούμενο σύμφωνο που έχεις βρει
else if ( is_consonant( s[i] ) ) {
c = s[ csum ];
s[ csum++ ] = s[i];
s[ i ] = c;
}
// αν βρεις άλλο ενάλλαξέ το με το προηγούμενο ομοειδές που έχεις βρει
/*** else if( isprint( s[i] ) ) { ***/
else {
c = s[ osum ];
s[ osum++ ] = s[i];
s[ i ] = c;
}
/*** c = 0; ***/
}

/*** DISABLED
slen = strlen(s);
for (i=0; i < slen; i++)
putchar( s[i] );
putchar('\n');
***/
puts( s );

return 0;
}

Για την εικόνα, πρέπει να αραιώσω ξανά τον κώδικα που της αντιστοιχεί και κυρίως να βρω σε ποιον από όλους τους κώδικες που έχεις ποστάρει αντιστοιχεί :lol:

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

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

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

Δηλαδή σε αυτόν που πόσταρα πριν από 1 λεπτό;

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

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

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

migf1 έγραψε:Δηλαδή σε αυτόν που πόσταρα πριν από 1 λεπτό;

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

Σε αυτόν που πόσταρες απλά είναι λάθος η σειρά σε αυτόν που πόσταρα πριν δλδ αυτόν εδώ:
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int is_vowel(char c) {
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 0;
}
}
return 1;
}

int is_consonant(char c) {
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 0;
}
}
return 1;
}

int main(void) {
int i,i2 = 0,i3 = 0,i4 = 0,len;
char inbuf[256];
char vowel[255];
char consonant[255];
char other[255];
fgets(inbuf,256,stdin);
len = strlen(inbuf);
for(i=0;i<len;i++) {
if(is_consonant(inbuf[i]) == 0) {
consonant[i2++] = inbuf[i];
}else if(is_vowel(inbuf[i]) == 0) {
vowel[i3++] = inbuf[i];
}else {
if(inbuf[i] > 31 && inbuf[i] <= 64) {
other[i4++] = inbuf[i];
}
}
}
for(i=0;i<strlen(inbuf);i++) inbuf[i] = 0;
strcat(inbuf,vowel);
strcat(inbuf,other);
strcat(inbuf,consonant);
for(i=0;i<strlen(inbuf);i++) printf("%c",inbuf[i]);
putchar('\n');
return 0;
}

Βγάζει εκείνο το screenshot.
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

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

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

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

Γιατί στο if το αλλάζει με αυτό που έχει βρει; Με το vsum++ δεν πάει το vsum μια θέση μπροστά;
Edit: Επίσης γιατί να στο τελευτάιο else το αλλάζει με το ομοειδές του;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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