migf1 Δημοσ. 30 Οκτωβρίου 2011 Δημοσ. 30 Οκτωβρίου 2011 δεν μπορώ να καταλάβω πως ενώ θα πρέπει να χρησιμοποιήσω πίνακα, θα πρέπει να διαβάζεται από το πληκτρολόγιο ο αριθμός n των λέξεων... Με δομές δεν μπορώ να το λύσω γιατί δεν έχουμε κάνει Μήπως η άσκηση μπορεί να λύθεί χωρίς πίνακα;;; Αν σας επιτρέπεται να χρησιμοποιήσετε χαρακτηριστικά της αναθεώρησης C99, τότε είναι πολύ απλό: > ... int n = 0; printf("Poses lejeis? "); scanf("%d", &n ); char words[ n ][ WORDSIZE ]; int i=0; for (i=0; i < n; i++) { // διάβασε εδώ την words[ i ] λέξη } ... Αν δεν επιτρέπεται χρήση της αναθεώρησης C99, τότε θα πρέπει να χρησιμοποιήσεις δείκτη για τον words[][] και να τον διαχειριστείς δυναμικά (calloc(), free(), κλπ)... τα έχετε μάθει αυτά;
nik324 Δημοσ. 30 Οκτωβρίου 2011 Μέλος Δημοσ. 30 Οκτωβρίου 2011 Δεν έοχυμε κάνει δυναμικη διαχείρηση μνήμης..ακόμα και στους δείκτες έχουμε κάνει μια απλή εισαγωγή...οι δύο επόμενες διαλέξεις θα είναι πάνω στους δείκτες...Τί ειναι το C99??
migf1 Δημοσ. 31 Οκτωβρίου 2011 Δημοσ. 31 Οκτωβρίου 2011 C99 είναι η τελευταία αναθεώρηση της γλώσσας. Όσο για την άσκηση, εφόσον έχετε ξεκινήσει δείκτες και είναι και οι επόμενες 2 διαλέξεις, μάλλον έτσι θα θέλει να τη λύσετε (δηλαδή με δυναμική διαχείριση μνήμης για τον πίνακα των strings). Φρόντισε να παρακολουθήσεις με μεγάλη προσοχή τις διαλέξεις αυτές, γιατί οι δείκτες και η δυναμική διαχείριση μνήμης είναι έννοιες κλειδιά στη C ! Για την ιστορία... > #include <stdio.h> #include <stdlib.h> #include <string.h> #define LINESIZE (255+1) #define WORDSIZE (100+1) int main( void ) { char line[ LINESIZE ] = {'\0'}; char *wordlist[ WORDSIZE ]; int nwords = 0; register int i = 0; /* get max length of the words list from user */ printf("Poses lejeis? "); fgets( line, LINESIZE, stdin ); nwords = atoi( line ); /* allocate memory for nwords, each one of size WORDSIZE */ wordlist = calloc( nwords, WORDSIZE ); if ( !wordlist ) { puts("*** error: out of memory, aborting..."); exit( EXIT_FAILURE ); } /* fill in the words list with user-input */ for (i=0; i < nwords; i++) { fgets( line, LINESIZE, stdin ); line[ strlen(line) - 1 ] = '\0'; /* remove trailing '\n' */ strncpy( wordlist[ i ], line, WORDSIZE-1 ); /* copy user-input into current position of wordlist */ ... } ... /* free allocated memory & exit */ free( wordlist ); exit( EXIT_SUCCESS ); }
nik324 Δημοσ. 31 Οκτωβρίου 2011 Μέλος Δημοσ. 31 Οκτωβρίου 2011 Οι δείκτες που κάναμε από ότι φαίνεται είναι σε εντελώς αρχικό σταδιο και δεν πλησιάζουν καθόλου το επίπεδο της λύσης που έδωσες παραπάνω....Δεν μπορώ να καταλάβω καθόλου τι κάνει...Ευχαριστώ πολύ πάντως για τον κόπο σου
nik324 Δημοσ. 31 Οκτωβρίου 2011 Μέλος Δημοσ. 31 Οκτωβρίου 2011 #include<stdio.h> #include<ctype.h> #include<string.h> int checkPalindrome( char *s ); int main ( void ) { int i = 0; int ch; char s[100]; while ((ch = getchar()) != '\n') { if (isalpha(ch)) { s = ch; i++; } } if ( checkPalindrome(s) == 1) { printf("Yes, is a palindrome.\n"); } else { printf("No, not a palindrome.\n"); } return 0; } int checkPalindrome( char *s ) { int i = strlen(s)-1; int j = 0; while (j<=i) { if(s[j] != s) { return 0; } i--; j++; } return 1; } Αυτός ο κώδικας είναι για να βρίσκει αν μια λέξη είναι παλίδρομο η όχι...Κάποτε δούλεyε άψογα...Τώρα που το τρέχω σε διαφορετικό υπολογιστή δεν δουλεύει καλα...δεν ξέρω αν η αλλαγή υπολογιστή έχει σημασία...Ο ροηγούμενς ήταν 32bit και αυτός 64bit...Xρειάζομαι μια απάντηση γιατί οι ασκήσεις πρέπει να παραδοθούν
migf1 Δημοσ. 31 Οκτωβρίου 2011 Δημοσ. 31 Οκτωβρίου 2011 Βάλε τον κώδικα σε [ code ] .. [ /code ] tags (χωρίς τα κενά) στο ποστ σου για να μπορούμε να το διαβάσουμε σαν άνθρωποι, και σε καμιά ωρίτσα που θα είμαι σπίτι αν δεν με έχει προλάβει άλλος θα το κοιτάξω
nik324 Δημοσ. 31 Οκτωβρίου 2011 Μέλος Δημοσ. 31 Οκτωβρίου 2011 οκ φίλε σε ευχαιστώ πολύ > #include<stdio.h> #include<ctype.h> #include<string.h> int checkPalindrome( char *s ); int main ( void ) { int i = 0; int ch; char s[100]; while ((ch = getchar()) != '\n') { if (isalpha(ch)) { s[i] = ch; i++; } } if ( checkPalindrome(s) == 1) { printf("Yes, is a palindrome.\n"); } else { printf("No, not a palindrome.\n"); } return 0; } int checkPalindrome( char *s ) { int i = strlen(s)-1; int j = 0; while (j<=i) { if(s[j] != s[i]) { return 0; } i--; j++; } return 1; }
migf1 Δημοσ. 31 Οκτωβρίου 2011 Δημοσ. 31 Οκτωβρίου 2011 Έλα με πρόλαβες πριν φύγω, μια χαρά μου φαίνεται ο αλγόριθμος της checkPalindrome() ! ΥΓ. Στο 1ο while-loop που διαβάζεις το s, πρόσθεσε μια συνθήκη να μη διαβάζει πάνω από 99 χαρακτήρες, γιατί έτσι άμα σου γράψουν λέξη με πάνω από 99 γράμματα θα κρασάρει το πρόγραμμά σου! Και τον τελικό χαρακτήρα του s (ο 100στός στη χειρότερη περίπτωση) πρέπει να τον κάνεις '\0'
nik324 Δημοσ. 31 Οκτωβρίου 2011 Μέλος Δημοσ. 31 Οκτωβρίου 2011 μπορώ στο ίδιο while loop να βάλω και δευτερη συνθήκη η να πρσθέσω και ένα δεύτερο while;
migf1 Δημοσ. 31 Οκτωβρίου 2011 Δημοσ. 31 Οκτωβρίου 2011 Σου είπα ήδη: δεν βλέπω κάποιο λάθος στην checkPalindrome().
migf1 Δημοσ. 31 Οκτωβρίου 2011 Δημοσ. 31 Οκτωβρίου 2011 χτες έτρεχε...σήμερα δεν τρέχει.... Λοιπόν, άλλαξε το... > while (j<=i) { if(s[j] != s[i]) { return 0; } i--; j++; } σε... > while ( j <= i && s[j] == s[i] ) { i--; j++; }
nik324 Δημοσ. 31 Οκτωβρίου 2011 Μέλος Δημοσ. 31 Οκτωβρίου 2011 αν βάλω την λέξη anna den δουλεύει...με την λέξη ana δουλεύει κανονικα μισό να το τσεκάρω Undeclared identifier 'j' αυτό βγάζει και το τμημα κώδικα είναι το παρακάτω > while ( j <= i && s[j] == s[i] ) { if (isalpha(ch)) { i--; j++; } }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα