ΔημητρηςΦου Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 Να υλοποιήσετε ένα πρόγραμμα που θα διαβάζει από τον χρήστη μία πρόταση και να την εμφανίζει στην οθόνη με όλα τα γράμματα της κεφαλαία και περιβαλλόμενα από τον χαρακτήρα «*». Η πρόταση που θα εισάγει ο χρήστης θα πρέπει να περιέχει μόνο τους λατινικούς χαρακτήρες από Α-Ζ (κεφαλαία ή πεζά) και το κενό. Σε περίπτωση που περιέχει κάποιον άλλο χαρακτήρα θα πρέπει να εμφανίζεται μήνυμα ότι η είσοδος δεν είναι αποδεκτή και θα ζητείται από τον χρήστη να εισάγει ξανά νέα πρόταση. Έτσι για παράδειγμα αν ο χρήστης εισάγει την πρόταση «Welcome to Samos» το πρόγραμμα θα πρέπει να εμφανίζει: ********************************************************************* * W * E * L * C * O * M * E * * T * O * * S * A * M * O * S * ********************************************************************* Η διαδικασία αυτή θα επαναλαμβάνεται μέχρι ο χρήστης να εισάγει την πρόταση «THIS IS THE END» *) μεταξύ του * και κάθε γράμματος υπάρχει κενό!! Μήπως έχουμε καμία ιδέα?
imitheos Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 Που είναι η δυσκολία σου ? Διάβασε είσοδο από το χρήστη. Αν έχει δώσει μόνο λατινικούς χαρακτήρες, πάρ' τους σβάρνα και τύπωνε αστερίσκο, γράμμα, αστερίσκο για κάθε χαρακτήρα. Για να γίνει κεφαλαίο το γράμμα υπάρχει έτοιμη συνάρτηση που το κάνει. Με λίγα λόγια ένας απλός βρόχος που ελέγχει δύο-τρία πράγματα για την είσοδο που έλαβε. 1
migf1 Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 ... Μήπως έχουμε καμία ιδέα? Θα χρειαστείς συναρτήσεις από τη στάνταρ βιβλιοθήκη της C, με header file το ctype.h. Δικές μου απορίες: 1. Έχετε μάθει δείκτες & strings; 2. Έχετε μιλήσει για interactive input από τη γραμμή εντολών; 3. Έχετε μάθει να κάνετε δυναμική δέσμευση/αποδέσμευση μνήμης; 1
ΔημητρηςΦου Δημοσ. 23 Νοεμβρίου 2013 Μέλος Δημοσ. 23 Νοεμβρίου 2013 το πρώτο και το δεύτερο ναι....το τρίτο ακόμα όχι. Που είναι η δυσκολία σου ? Διάβασε είσοδο από το χρήστη. Αν έχει δώσει μόνο λατινικούς χαρακτήρες, πάρ' τους σβάρνα και τύπωνε αστερίσκο, γράμμα, αστερίσκο για κάθε χαρακτήρα. Για να γίνει κεφαλαίο το γράμμα υπάρχει έτοιμη συνάρτηση που το κάνει. Με λίγα λόγια ένας απλός βρόχος που ελέγχει δύο-τρία πράγματα για την είσοδο που έλαβε. Δεν μπορώ να βρω τον τρόπο για να ελέγχω εάν είναι με λατινικούς χαρακτήρες.
migf1 Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 το πρώτο και το δεύτερο ναι....το τρίτο ακόμα όχι. Οπότε η άσκηση συνειδητά δεν θέτει περιορισμό στο μέγιστο πλήθος χαρακτήρων που μπορείς να διαβάσεις από τη γραμμή εντολών; Θέλει να δεσμεύσεις δυναμικά τη μνήμη χωρίς να κάνεις εκ των προτέρων πρόβλεψη για μέγιστο πλήθος χαρακτήρων; Δεν μπορώ να βρω τον τρόπο για να ελέγχω εάν είναι με λατινικούς χαρακτήρες. Τις συναρτήσεις της βιβλιοθήκης που σου υπέδειξα τις είδες καθόλου ή... μπα; EDIT: Άκυρη η 1η μου ερώτηση, νόμιζα πως είπες πως έχετε κάνει και δέσμευση μνήμης. 1
παπι Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 Σε γενικες γραμμες, εαν ο χαρακτηρας ειναι κατω απο 127, τοτε ειναι "λατινικος" αν ειναι απανω παο 127 τοτε ειναι... οτι εχεις βαλει στο OS ως δευτερη γλωσσα. 1
migf1 Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 Οπότε η άσκηση συνειδητά δεν θέτει περιορισμό στο μέγιστο πλήθος χαρακτήρων που μπορείς να διαβάσεις από τη γραμμή εντολών; Θέλει να δεσμεύσεις δυναμικά τη μνήμη χωρίς να κάνεις εκ των προτέρων πρόβλεψη για μέγιστο πλήθος χαρακτήρων; ... Σόρυ, άκυρο ! Νόμιζα πως είπες πως έχετε κάνει το 1ο και το 3ο, ενώ είπες το 1ο και το 2ο, οπότε είναι άκυρη η ερώτησή μου (και άρα πολύ ευκολότερη η άσκηση ) 1
Χάρης Μυλωνίδης Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 Αν και δεν ξέρω απο C# σου βρήκα έναν οδηγό εδώ. Τον έλεγχο υποθέτω ότι θα τον κάνεις μέσω while χρησιμοποιώντας των κώδικα ascii που θα τον βρεις εδώ. Περισσότερες λεπτομέρειές θα σου πουν τα παιδιά που ξέρουν. 1
ΔημητρηςΦου Δημοσ. 23 Νοεμβρίου 2013 Μέλος Δημοσ. 23 Νοεμβρίου 2013 Αν και δεν ξέρω απο C# σου βρήκα έναν οδηγό εδώ. Τον έλεγχο υποθέτω ότι θα τον κάνεις μέσω while χρησιμοποιώντας των κώδικα ascii που θα τον βρεις εδώ. Περισσότερες λεπτομέρειές θα σου πουν τα παιδιά που ξέρουν. σε ευχαριστώ εκ των πρωτέρων Οπότε η άσκηση συνειδητά δεν θέτει περιορισμό στο μέγιστο πλήθος χαρακτήρων που μπορείς να διαβάσεις από τη γραμμή εντολών; Θέλει να δεσμεύσεις δυναμικά τη μνήμη χωρίς να κάνεις εκ των προτέρων πρόβλεψη για μέγιστο πλήθος χαρακτήρων; Τις συναρτήσεις της βιβλιοθήκης που σου υπέδειξα τις είδες καθόλου ή... μπα; EDIT: Άκυρη η 1η μου ερώτηση, νόμιζα πως είπες πως έχετε κάνει και δέσμευση μνήμης. αυτήν την στιγμή τις διαβάζω.
migf1 Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 αυτήν την στιγμή τις διαβάζω. Το 80% της άσκησής σου λύνεται με χρήση συναρτήσεων από εκεί.
imitheos Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 το πρώτο και το δεύτερο ναι....το τρίτο ακόμα όχι. Δεν μπορώ να βρω τον τρόπο για να ελέγχω εάν είναι με λατινικούς χαρακτήρες. Από ό,τι φαίνεται από την εκφώνηση, η άσκηση μπήκε για να σας δείξει τις συναρτήσεις που ανέφερα και για τις οποίες σου έδωσε link ο migf1. Ξέχνα όμως για ένα λεπτό ότι υπάρχουν τέτοιες συναρτήσεις. Λες δεν μπορείς να ελέγξεις αν είναι λατινικοί. Δεν είναι πυρηνική φυσική, απλά βάλε λίγο το μυαλό σου να δουλέψει. Θέλω να μας πεις όταν λες ότι θέλεις τους λατινικούς χαρακτήρες ποιοι είναι αυτοί ? Το σύνολο των χαρακτήρων που πρέπει να απαρτίζουν τη φράση ποιο είναι ?
ΔημητρηςΦου Δημοσ. 23 Νοεμβρίου 2013 Μέλος Δημοσ. 23 Νοεμβρίου 2013 #include<stdio.h> #include<string.h> #include<ctype.h> main() { int i,j,k,metritis,d=0; char prot[200],prot1[200]; printf("dwse mia protasi :\n"); gets(prot); while(stricmp(prot,"END OF PROGRAM")!=0){ if(stricmp(prot,"END OF PROGRAM")==0) return 0; else for(i=0;i<strlen(prot);i++){ if((prot[i]>=97)&&(prot[i]<=122)) prot1[i]=prot[i]-'a' + 'A'; else prot1[i]=prot[i]; } metritis=strlen(prot); for(j=0;j<metritis;j++){ if(prot1[j]!=32){ for(k=0;k<4;k++){ printf("*");}} else { for(k=0;k<3;k++){ printf("*"); }//edw tha einai i proti grammi// }} printf("*"); printf("\n"); for(i=0;i<metritis;i++) { printf("*"); if(prot1[i]!=32){ printf("%c",prot1[i]); } else printf("%c",prot1[i]); if(i==metritis-1) printf("*"); } printf("\n"); for(j=0;j<metritis;j++){ if(prot1[j]!=32) { for(k=0;k<4;k++) { printf("*"); } } else{ for(k=0;k<3;k++) printf("*"); }//triti grammi// } printf("*"); metritis++; printf("dwse mia protasi :\n"); gets(prot); } return 0; } δεν μου βγαίνει παιδιά η άσκηση.... Από ό,τι φαίνεται από την εκφώνηση, η άσκηση μπήκε για να σας δείξει τις συναρτήσεις που ανέφερα και για τις οποίες σου έδωσε link ο migf1. Ξέχνα όμως για ένα λεπτό ότι υπάρχουν τέτοιες συναρτήσεις. Λες δεν μπορείς να ελέγξεις αν είναι λατινικοί. Δεν είναι πυρηνική φυσική, απλά βάλε λίγο το μυαλό σου να δουλέψει. Θέλω να μας πεις όταν λες ότι θέλεις τους λατινικούς χαρακτήρες ποιοι είναι αυτοί ? Το σύνολο των χαρακτήρων που πρέπει να απαρτίζουν τη φράση ποιο είναι ? είναι το κάθε γράμμα της πρότασης.Δηλαδή να ανήκει 'A'-'Z' και 'a'-'z'.
imitheos Δημοσ. 23 Νοεμβρίου 2013 Δημοσ. 23 Νοεμβρίου 2013 είναι το κάθε γράμμα της πρότασης.Δηλαδή να ανήκει 'A'-'Z' και 'a'-'z'. Άρα ο κάθε χαρακτήρας πρέπει να είναι μεγαλύτερος από 'A' και μικρότερος από 'Z' ή αντίστοιχα για τα μικρά. Που ήταν η δυσκολία ? Θεωρητικά κανείς δεν σου εγγυάται ότι τα γράμματα θα είναι συνεχόμενα οπότε πρέπει να χρησιμοποιήσεις τις συναρτήσεις που είναι για αυτή τη δουλειά και που σου έδειξε ο migf1. Στο πλαίσιο μιας άσκησης σχολής όμως μπορούμε να δεχτούμε ότι παντού υλοποιείται το ascii οπότε τα γράμματα είναι συνεχόμενα. Όσον αφορά τον κώδικα, παραβλέπω την χρήση της stricmp και βλέπω 15 if, for, else το ένα μέσα στο άλλο. Δεν κοίταξα να δω τι φταίει αλλά σίγουρα είναι πολύ περισσότερο πολύπλοκο από ό,τι χρειάζεται. Ξέχνα την C και γράψε μας με λόγια τι βήματα πρέπει να κάνεις. Το παν είναι να σκέφτεσαι τι πρέπει να κάνεις, όχι να γράφεις στο κουτουρού κώδικα μήπως παίξει. Για παράδειγμα το παρακάτω γιατί το έγραψες έτσι ? Για να σε βοηθήσω, πες μας τι κάνει η γραμμή με την return. if(stricmp(prot,"END OF PROGRAM")==0) return 0; else blah blah; 1
Moderators Praetorian Δημοσ. 23 Νοεμβρίου 2013 Moderators Δημοσ. 23 Νοεμβρίου 2013 #include<stdio.h> #include<string.h> #include<ctype.h> main() { int i,j,k,metritis,d=0; char prot[200],prot1[200]; printf("dwse mia protasi :\n"); gets(prot); while(stricmp(prot,"END OF PROGRAM")!=0){ if(stricmp(prot,"END OF PROGRAM")==0) // Γιατί κάνεις τον έλεγχο και εδώ; return 0; else for(i=0;i<strlen(prot);i++){ if((prot[i]>=97)&&(prot[i]<=122)) //Αυτό γενικά μπορεί να γίνει πιο ευανάγνωστο με τις isalpha(), islower(), toupper() prot1[i]=prot[i]-'a' + 'A'; else prot1[i]=prot[i]; } metritis=strlen(prot); for(j=0;j<metritis;j++){ if(prot1[j]!=32){ for(k=0;k<4;k++){ // Γιατί όχι ένα printf("****"); printf("*");}} else { for(k=0;k<3;k++){ // Γιατί όχι ένα printf("***"); printf("*"); }//edw tha einai i proti grammi// } } printf("*"); printf("\n"); for(i=0;i<metritis;i++) { printf("*"); if(prot1[i]!=32){ // το if και το else σου κάνουν το ίδιο πράγμα printf("%c",prot1[i]); } else printf("%c",prot1[i]); if(i==metritis-1) printf("*"); } printf("\n"); for(j=0;j<metritis;j++){ // επαναλαμβάνεις κώδικα. (για την "πρώτη γραμμή"). Φτιάξε μια συνάρτηση. if(prot1[j]!=32) { for(k=0;k<4;k++) { printf("*"); } } else{ for(k=0;k<3;k++) printf("*"); }//triti grammi// } printf("*\n"); // <-- Χρειαζόσουν ένα new line εδώ. metritis++; // <-- Γιατί; printf("dwse mia protasi :\n"); gets(prot); } return 0; } δεν μου βγαίνει παιδιά η άσκηση.... Σε c λογικά δεν θα κάνει compile το παραπάνω, γιατί δεν θα βρει την stricmp(). Είτε απλοποίησε τη συνθήκη τερματισμού, είτε χρησιμοποίησε τον κώδικα που ήδη έχεις για να μετατρέψεις μια πρόταση σε κεφαλαία και κάνε ένα strcmp() με τα κεφαλαία. Κατά τα άλλα έχεις πολλά θέματα στον κώδικά σου που πρέπει να προσέξεις. Προσπάθησα να επισημάνω μερικά. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα