Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Να υλοποιήσετε ένα πρόγραμμα που θα διαβάζει από τον χρήστη μία πρόταση και να την εμφανίζει στην οθόνη με όλα τα γράμματα της κεφαλαία και περιβαλλόμενα από τον χαρακτήρα «*». Η πρόταση που θα εισάγει ο χρήστης θα πρέπει να περιέχει μόνο τους λατινικούς χαρακτήρες από Α-Ζ (κεφαλαία ή πεζά) και το κενό. Σε περίπτωση που περιέχει κάποιον άλλο χαρακτήρα θα πρέπει να εμφανίζεται μήνυμα ότι η είσοδος δεν είναι αποδεκτή και θα ζητείται από τον χρήστη να εισάγει ξανά νέα πρόταση.

Έτσι για παράδειγμα αν ο χρήστης εισάγει την πρόταση «Welcome to Samos» το πρόγραμμα θα πρέπει να εμφανίζει:

*********************************************************************

* W * E * L * C * O * M * E * * T * O * * S * A * M * O * S *

*********************************************************************

Η διαδικασία αυτή θα επαναλαμβάνεται μέχρι ο χρήστης να εισάγει την πρόταση «THIS IS THE END»

 

*) μεταξύ του * και κάθε γράμματος υπάρχει κενό!!

 

Μήπως έχουμε καμία ιδέα?

  • Απαντ. 46
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Που είναι η δυσκολία σου ?

 

Διάβασε είσοδο από το χρήστη. Αν έχει δώσει μόνο λατινικούς χαρακτήρες, πάρ' τους σβάρνα και τύπωνε αστερίσκο, γράμμα, αστερίσκο για κάθε χαρακτήρα. Για να γίνει κεφαλαίο το γράμμα υπάρχει έτοιμη συνάρτηση που το κάνει.

 

Με λίγα λόγια ένας απλός βρόχος που ελέγχει δύο-τρία πράγματα για την είσοδο που έλαβε.

  • Like 1
Δημοσ.

...

Μήπως έχουμε καμία ιδέα?

 

Θα χρειαστείς συναρτήσεις από τη στάνταρ βιβλιοθήκη της C, με header file το ctype.h.

 

Δικές μου απορίες:

1. Έχετε μάθει δείκτες & strings;

2. Έχετε μιλήσει για interactive input από τη γραμμή εντολών;

3. Έχετε μάθει να κάνετε δυναμική δέσμευση/αποδέσμευση μνήμης;

  • Like 1
Δημοσ.

το πρώτο και το δεύτερο ναι....το τρίτο ακόμα όχι.

Που είναι η δυσκολία σου ?

 

Διάβασε είσοδο από το χρήστη. Αν έχει δώσει μόνο λατινικούς χαρακτήρες, πάρ' τους σβάρνα και τύπωνε αστερίσκο, γράμμα, αστερίσκο για κάθε χαρακτήρα. Για να γίνει κεφαλαίο το γράμμα υπάρχει έτοιμη συνάρτηση που το κάνει.

 

Με λίγα λόγια ένας απλός βρόχος που ελέγχει δύο-τρία πράγματα για την είσοδο που έλαβε.

Δεν μπορώ να βρω τον τρόπο για να ελέγχω εάν είναι με λατινικούς χαρακτήρες.

Δημοσ.

το πρώτο και το δεύτερο ναι....το τρίτο ακόμα όχι.

Οπότε η άσκηση συνειδητά δεν θέτει περιορισμό στο μέγιστο πλήθος χαρακτήρων που μπορείς να διαβάσεις από τη γραμμή εντολών; Θέλει να δεσμεύσεις δυναμικά τη μνήμη χωρίς να κάνεις εκ των προτέρων πρόβλεψη για μέγιστο πλήθος χαρακτήρων;

 

Δεν μπορώ να βρω τον τρόπο για να ελέγχω εάν είναι με λατινικούς χαρακτήρες.

Τις συναρτήσεις της βιβλιοθήκης που σου υπέδειξα τις είδες καθόλου ή... μπα; :P

 

EDIT: Άκυρη η 1η μου ερώτηση, νόμιζα πως είπες πως έχετε κάνει και δέσμευση μνήμης.

  • Like 1
Δημοσ.

Σε γενικες γραμμες, εαν ο χαρακτηρας ειναι κατω απο 127, τοτε ειναι "λατινικος" αν ειναι απανω παο 127 τοτε ειναι... οτι εχεις βαλει στο OS ως δευτερη γλωσσα.

  • Like 1
Δημοσ.

Οπότε η άσκηση συνειδητά δεν θέτει περιορισμό στο μέγιστο πλήθος χαρακτήρων που μπορείς να διαβάσεις από τη γραμμή εντολών; Θέλει να δεσμεύσεις δυναμικά τη μνήμη χωρίς να κάνεις εκ των προτέρων πρόβλεψη για μέγιστο πλήθος χαρακτήρων;

...

Σόρυ, άκυρο ! Νόμιζα πως είπες πως έχετε κάνει το 1ο και το 3ο, ενώ είπες το 1ο και το 2ο, οπότε είναι άκυρη η ερώτησή μου (και άρα πολύ ευκολότερη η άσκηση ;) )

  • Like 1
Δημοσ.

Αν και δεν ξέρω απο C# σου βρήκα έναν οδηγό εδώ.

Τον έλεγχο υποθέτω ότι θα τον κάνεις μέσω while χρησιμοποιώντας των κώδικα ascii που θα τον βρεις εδώ.

Περισσότερες λεπτομέρειές θα σου πουν τα παιδιά που ξέρουν.

  • Like 1
Δημοσ.

Αν και δεν ξέρω απο C# σου βρήκα έναν οδηγό εδώ.

Τον έλεγχο υποθέτω ότι θα τον κάνεις μέσω while χρησιμοποιώντας των κώδικα ascii που θα τον βρεις εδώ.

Περισσότερες λεπτομέρειές θα σου πουν τα παιδιά που ξέρουν.

σε ευχαριστώ εκ των πρωτέρων :)

Οπότε η άσκηση συνειδητά δεν θέτει περιορισμό στο μέγιστο πλήθος χαρακτήρων που μπορείς να διαβάσεις από τη γραμμή εντολών; Θέλει να δεσμεύσεις δυναμικά τη μνήμη χωρίς να κάνεις εκ των προτέρων πρόβλεψη για μέγιστο πλήθος χαρακτήρων;

 

 

Τις συναρτήσεις της βιβλιοθήκης που σου υπέδειξα τις είδες καθόλου ή... μπα; :P

 

EDIT: Άκυρη η 1η μου ερώτηση, νόμιζα πως είπες πως έχετε κάνει και δέσμευση μνήμης.

αυτήν την στιγμή τις διαβάζω.
Δημοσ.

το πρώτο και το δεύτερο ναι....το τρίτο ακόμα όχι.

 

Δεν μπορώ να βρω τον τρόπο για να ελέγχω εάν είναι με λατινικούς χαρακτήρες.

Από ό,τι φαίνεται από την εκφώνηση, η άσκηση μπήκε για να σας δείξει τις συναρτήσεις που ανέφερα και για τις οποίες σου έδωσε link ο migf1.

 

Ξέχνα όμως για ένα λεπτό ότι υπάρχουν τέτοιες συναρτήσεις. Λες δεν μπορείς να ελέγξεις αν είναι λατινικοί. Δεν είναι πυρηνική φυσική, απλά βάλε λίγο το μυαλό σου να δουλέψει.

 

Θέλω να μας πεις όταν λες ότι θέλεις τους λατινικούς χαρακτήρες ποιοι είναι αυτοί ? Το σύνολο των χαρακτήρων που πρέπει να απαρτίζουν τη φράση ποιο είναι ?

Δημοσ.

#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'.
Δημοσ.

είναι το κάθε γράμμα της πρότασης.Δηλαδή να ανήκει '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;

 

  • Like 1
  • Moderators
Δημοσ.
#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() με τα κεφαλαία.

 

Κατά τα άλλα έχεις πολλά θέματα στον κώδικά σου που πρέπει να προσέξεις. Προσπάθησα να επισημάνω μερικά.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...