Δημοσιεύτηκε: 12 Αύγ 2011, 18:34
από giannosfor
Qdata έγραψε:Επιτέλους το βρήκα! :mrgreen:
Με πέδεψε πάρα πολύ αλλά με βοήθησε αφού μέχρι να την λύσω χρησιμοποίησα δείκτες,συναρτήσεις κτλ.Τελικά το μόνο που χρειαζόταν ήταν σκέψη στον τρόπο και όχι στον κώδικα!Να και η λύση:
Spoiler: show
Κώδικας: Επιλογή όλων
/* ------------------------------------------------------
* Από: Qdata
*
* Άσκηση: Γράψτε μια συνάρτηση που θα παίρνει ως ορίσματα δυο strings και
* θα ελέγχει για το αν το ένα είναι αναγραμματισμός του άλλου.
* Θα επιστρέφει TRUE αν είναι, FALSE αν δεν είναι (ή 1 και 0, αντίστοιχα).
*
* Παραδείγματα:
*
* "abcd", "dbca" δίνει TRUE
* "helle", "hollo" δίνει FALSE
* "z", "zzz" δίνει FALSE
* "zzz", "z" δίνει FALSE
* "z", "z" δίνει TRUE
* -----------------------------------------------------
*/

#include <stdio.h>
#include <string.h> /* για strlen() */

/*-------------------- Main Fuction --------------------*/

main()
{
int len,result;
char first_word[100],second_word[100];
printf("Δώστε την πρώτη λέξη: ");
gets(first_word);
printf("Δώστε την δεύτερη λέξη: ");
gets(second_word);
len = strlen(first_word);
result = strcheck(len,first_word,second_word);
if(result == 1)
printf("Οι πρώτη λέξη είναι αναγραμματισμός της άλλης.\n");
else
printf("Καμία από τις λέξεις δεν είναι αναγραμματισμός της άλλης.\n");
}

/*-------------------- String Check --------------------*/

int strcheck(int len_from_main,char str_one[100], char str_two[100])
{
int i,j; /*για for loop*/
int len,count;
len = len_from_main;
count = 0;
for(i=0,j=(len-1);i != (len+1), j != 0;++i,j=j-1)
{
if(str_one[i] == str_two[j])
++count;
}
++count;
if(count == len)
return 1;
else
return 0;
}

/*------------------- End of program -------------------*/

(Συγνώμη που δεν χρησιμοποίησα πολλά σχόλια.Θα προσπαθήσω να κάνω πιο ευανάγνωστο τον κώδικα.)
Επίσης ξέρω πως η γραμμή:
Spoiler: show
Κώδικας: Επιλογή όλων

if(str_one[i] == str_two[j])
Δεν είναι ότι το καλύτερο για να συγκρίνω την θέση του πίνακα αλλά όταν χρησιμοποιούσα κάτι άλλο που έβγαζε σφάλματα. :problem:
@migf1 Πολύ ωραία η άσκηση! :thumbup: :)

Προσπάθησα να τρέξω το κώδικα αλλά έβγαζε λάθος για πολλές τιμές.
Απ'ότι είδα αυτό συμβαίνει γιατί δεν ελέγχεις το μήκος των λέξεων να είναι ίδιο,σαν αποτέλεσμα δίνει σωστό αποτέλεσμα ακόμα και όταν οι λέξεις είναι διαφορετικές.Αν δοκιμάσεις aaa και aaasdfgsgfrt θα σου βγάλει ότι είναι σωστό.Ακόμα αν βάλεις ένα γράμμα σαν πρώτη λέξη ότι και να βάλεις στη δεύτερη θα στο πάρει σωστό ακόμα και αν αφήσεις κενή τη λέξη.Αυτό έχει να κάνει μάλλον με τα loops και τις δομές ελέγχου που έχεις βάλει.
Έφτιαξα αυτό φαίνεται να δουλεύει.
Κώδικας: Επιλογή όλων
#define bool int
#define TRUE 1
#define FALSE 0

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

int compare(char *s,char *st,int i)
{
if ( i > -1 )
{
if ( *s != *st)
return FALSE;
return compare(++s,--st,--i);
}
return TRUE;
}

void check_arg(char *arg[] )
{
if (arg[1] == NULL)
{
printf("Δέν έχει δωθεί όρισμα.\n");
exit(EXIT_FAILURE);
}
if (arg[2] == NULL)
{
printf("Δέν έχει δωθεί δεύτερο όρισμα.\n");
exit(EXIT_FAILURE);
}
if ( strlen(arg[1]) != strlen(arg[2]) )
{
printf("Οι λέξεις δέν έχουν το ίδιο μήκος.\n");
exit(EXIT_FAILURE);
}

}

int main(int argc, char *argv[])
{
int len;
bool cmp;

check_arg(argv);
len = strlen(argv[1]) -1;
cmp = compare( argv[1], argv[2] + len, len);
if ( cmp )
printf("Οι λέξεις είναι αντιστραμένες.\n");
else
printf("Δέν είναι αντιστραμένες.\n");

exit(EXIT_SUCCESS);
}


Υ.Γ. Ξέρω οτι δεν ήταν αυτό το ζητούμενο της άσκησης.