migf1 έγραψε:
/* ------------------------------------------------------
* Άσκηση: Γράψτε μια συνάρτηση που θα παίρνει ως ορίσματα δυο strings και
* θα ελέγχει για το αν το ένα είναι αναγραμματισμός του άλλου.
* Θα επιστρέφει TRUE αν είναι, FALSE αν δεν είναι (ή 1 και 0, αντίστοιχα).
*
* Παραδείγματα:
*
* "abcd", "dbca" δίνει TRUE
* "helle", "hollo" δίνει FALSE
* "z", "zzz" δίνει FALSE
* "zzz", "z" δίνει FALSE
* "z", "z" δίνει TRUE
* -----------------------------------------------------
*/
Λύση 1η (με χρήση των στάνταρ συναρτήσεων: strchr & strlen)
- Κώδικας: Επιλογή όλων
#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)
- Κώδικας: Επιλογή όλων
#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 και κατόπιν έλεγχο για ισότητα των γραμμάτων τους ένα προς ένα)
- Κώδικας: Επιλογή όλων
#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;
}