Δημοσιεύτηκε: 08 Αύγ 2011, 04:18
από migf1
migf1 έγραψε:
/* ------------------------------------------------------
* Άσκηση: Γράψτε μια συνάρτηση που θα παίρνει ως ορίσματα δυο strings και
* θα ελέγχει για το αν το ένα είναι αναγραμματισμός του άλλου.
* Θα επιστρέφει TRUE αν είναι, FALSE αν δεν είναι (ή 1 και 0, αντίστοιχα).
*
* Παραδείγματα:
*
* "abcd", "dbca" δίνει TRUE
* "helle", "hollo" δίνει FALSE
* "z", "zzz" δίνει FALSE
* "zzz", "z" δίνει FALSE
* "z", "z" δίνει TRUE
* -----------------------------------------------------
*/

Λύση 1η (με χρήση των στάνταρ συναρτήσεων: strchr & strlen)
Spoiler: show
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <string.h>
// --------------------------------------------------------------
int isanagram( char *s, char *t )
{
int i;
for (i=0; s[i] != '\0' && strchr(t, s[i]) != NULL; i++)
;
return i == strlen(t) ? 1 : 0;

/*** ΕΝΑΛΛΑΚΤΙΚΟΣ ΚΩΔΙΚΑΣ ΜΕ ΔΕΙΚΤΕΣ
int i=0;
for (; *s && strchr(t, *s++); i++)
;
return i == strlen(t) ? 1 : 0;
***/
}
// --------------------------------------------------------------
int main( void )
{
char s1[] = "abcd", s2[] = "cdab"; // 1 TRUE
char s3[] = "helle", s4[] = "hollo"; // 0 FALSE
char s5[] = "z", s6[] = "zzz"; // 0 FALSE
char s7[] = "zzz", s8[] = "z"; // 0 FALSE
char s9[] = "z", s10[] = "z"; // 1 FALSE

printf("%d\n", isanagram(s1, s2) );
printf("%d\n", isanagram(s3, s4) );
printf("%d\n", isanagram(s5, s6) );
printf("%d\n", isanagram(s7, s8) );
printf("%d\n", isanagram(s9, s10) );

return 0;
}

Λύση 2η (με χαρτογράφηση όλου του πίνακα ASCII στη μεταβλητή-πίνακα: map)
Spoiler: show
Κώδικας: Επιλογή όλων

#include <stdio.h>
// --------------------------------------------------------------------------------------
int isanagram(char *s, char*t)
{
int map[256] = {0}; // αρχικοποίηση όλων των στοιχείων σε 0
int val; // προσωρινή για τιμές στοιχείων του map

int i = 0;
while ( s[i] || t[i] ) // γέμισμα του map...
{ // για κάθε γράμμα του s αυξάνουμε
if ( s[i] ) // κατά 1 την τιμή του στοιχείου που
map[ s[i] ]++; // του αντιστοιχεί στον πίνακα map
if ( t[i] ' ) // (για κάθε γράμμα του t μειώνουμε κατά
map[ t[i] ]--; // 1 το στοιχείο που αντιστοιχεί στο map)
i++;
}

i = 0; // εξέταση του map για το
while (s[i] && t[i] && (val=map[ s[i] ]) == 0) // πρώτο MH μηδενικό στοιχείο
i++; // ή έως να τελειώσουν τα γράμματα στο s ή στο t

return val || t[i] ? 0 : 1; // είναι το val ή το t[i] != 0 ? FALSE : TRUE

/*** ΕΝΑΛΛΑΚΤΙΚΟΣ ΚΩΔΙΚΑΣ ΜΕ ΔΕΙΚΤΕΣ

int val, map[256] = {0};
char *cp1 = s, *cp2 = *t;

for (; *s || *t ;) {
if ( *s )
map[*s++]++;
if ( *t )
map[*t++]--;
}

while(*cp1 && *cp2++ && !(val=map[*cp1++]) )
;

return val || *cp2 ? 0 : 1;

***/
}
// --------------------------------------------------------------------------------------
int main( void )
{
char s1[] = "abcd", s2[] = "cdab"; // 1 TRUE
char s3[] = "helle", s4[] = "hollo"; // 0 FALSE
char s5[] = "z", s6[] = "zzz"; // 0 FALSE
char s7[] = "zzz", s8[] = "z"; // 0 FALSE
char s9[] = "z", s10[] = "z"; // 1 FALSE

printf("%d\n", isanagram(s1, s2) );
printf("%d\n", isanagram(s3, s4) );
printf("%d\n", isanagram(s5, s6) );
printf("%d\n", isanagram(s7, s8) );
printf("%d\n", isanagram(s9, s10) );

return 0;
}

Λύση 3η (με ταξινόμηση των strings και κατόπιν έλεγχο για ισότητα των γραμμάτων τους ένα προς ένα)
Spoiler: show
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <string.h> // για strlen(), strcmp()
#include <stdlib.h> // για qsort()
// -----------------------------------------------------------------------
int isanagram( char *s, char *t )
{
size_t slen = strlen(s);
size_t tlen = strlen(t);

if (slen != tlen)
return 0;

qsort(s, slen, sizeof(char), strcmp );
qsort(t, tlen, sizeof(char), strcmp );

while (*s && *s++ == *t++)
;
return *s == '\0';
}
// --------------------------------------------------------------------------------------
int main( void )
{
char s1[] = "abcd", s2[] = "cdab"; // 1 TRUE
char s3[] = "helle", s4[] = "hollo"; // 0 FALSE
char s5[] = "z", s6[] = "zzz"; // 0 FALSE
char s7[] = "zzz", s8[] = "z"; // 0 FALSE
char s9[] = "z", s10[] = "z"; // 1 FALSE

printf("%d\n", isanagram(s1, s2) );
printf("%d\n", isanagram(s3, s4) );
printf("%d\n", isanagram(s5, s6) );
printf("%d\n", isanagram(s7, s8) );
printf("%d\n", isanagram(s9, s10) );

return 0;
}