Δημοσιεύτηκε: 06 Μαρ 2012, 14:08
από migf1
Ilias95 έγραψε:
...
Πάντως και με τον προηγούμενο κώδικα δοκίμασα πολλές περιπτώσεις με την 1η λέξη μεγαλύτερη απ' την δεύτερη και δεν κράσαρε.

Έχεις δίκιο Ηλία! Στα Windows κλείνει αμέσως το παράθυρο της κονσόλας μόλις τελειώσει το πρόγραμμα ή αν κρασάρει πριν τελειώσει. Ενώ λοιπόν είχα προσθέσει ένα system("pause") πριν από το τελευταίο return, είχα ξεχάσει να το βάλω πριν από το προτελευταίο σου return. Οπότε μου έκλεινε το παράθυρο και νόμιζα πως είχε κρασάρει το πρόγραμμα.

Λοιπόν, κοίταξα σήμερα τον κώδικά σου. Το for-loop που φωλιάζεις μέσα στο loop ανάγνωσης της κάθε λέξης, επιβαρύνει αχρείαστα το execution speed του προγράμματος (συν ότι κάνει τη διαίρεση του NUM_ARR σε κάθε επιτυχημένο γράμμα). Δεν το χρειάζεσαι καθόλου το for-loop, μπορείς να κάνεις απευθείας indexing το αναγνωσμένο γράμμα μέσα στον πίνακα:

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
string[ ch - 'a' ]++;
...
string[ ch - 'a' ]--;
...

Παραθέτω μια βελτιωμένη εκδοχή του κώδικά σου που βελτιώνει το παραπάνω, καθώς επίσης μετράει και τυπώνει στο αποτέλεσμα πόσους μη-έγκυρους χαρακτήρες έχει απορρίψει συνολικά κι από τις 2 λέξεις. Επίσης, αναγνωρίζει και απορρίπτει κενές λέξεις (π.χ. όσες περιέχουν μονάχα μη-έγκυρους χαρακτήρες ή σε όσες ο χρήστης πατήσεις σκέτο ENTER)...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <ctype.h> // isalpha(), tolower()
#include <stdbool.h> // bool, true, false

#define ABLEN 26 // alphabet length (lower latin)
#define CHR2ABi(c) ( tolower((c)) - 'a' ) // char to lower alpahabet index

int main( void )
{
int c, hgram[ ABLEN ] = {0}; // hgram: letters' histogram
int noalpha = 0; // non-letter chars counter
bool arenot = false;
bool w1empty = true, w2empty = true; // was either word given empty?

printf("Enter first word: ");
while ( (c = getchar()) != '\n' ) {
if ( isalpha( c ) ) {
hgram[ CHR2ABi(c) ]++; // increase char's histo-sum by 1
w1empty = false;
}
else noalpha++;
}

printf("Enter second word: ");
while ( (c = getchar()) != '\n') {
if ( isalpha(c) ) {
hgram[ CHR2ABi(c) ]--; // decrease char's histo-sum by 1
w2empty = false;
}
else noalpha++;
}

if ( w1empty || w2empty )
goto empty_exit;

for (int i=0; i < ABLEN; i++) {
if ( hgram[i] != 0 ) {
arenot = true; // are not anagrams
break;
}
}

if ( noalpha != 0 ) // 1 or both words had non-letters
printf( "(%d non-letter chars ignored from both words)\n", noalpha );

printf("The words are %sanagrams\n", arenot ? "not " : "\0");

return 0;

empty_exit:
puts("*** one or both empty words, no result!");
return 0;
}

ΥΓ. Γίνομαι ιδιαίτερα αναλυτικός, ενδεχομένως και σπαστικός, όχι για να το παίξω έξυπνος αλλά για να σε βάλω στο πνεύμα του C programming, όπου η προσοχή στη λεπτομέρεια κάνει μεγάλη διαφορά. Είναι από τα χαρακτηριστικά που ξεχωρίζουν τους καλούς προγραμματιστές από τους λιγότερους καλούς, σε όλες τις γλώσσες (απλά στη C τα κέρδη/ζημιές είναι μεγαλύτερα, λόγω της low-level αμεσότητάς της).

EDIT:
Έκανα μια μικρο-αλλαγή στον κώδικα, πέρασα το tolower() μέσα στον ορισμό του macro: CHR2ABi()