Η ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 10 - ΧΑΡΑΚΤΗΡΕΣ ΚΑΙ ΣΥΜΒΟΛΟΣΕΙΡΕΣ - ΕΦΑΡΜΟΓΗ 5

Поділитися
Вставка
  • Опубліковано 11 січ 2025

КОМЕНТАРІ • 28

  • @kalitsiadischaritos4685
    @kalitsiadischaritos4685 4 роки тому +2

    Αυτό που τελειώνουν και τα δύο ταυτόχρονα, σπανίζει γενικά...

  • @efthyvoulos_tsouderos
    @efthyvoulos_tsouderos 5 років тому +5

    Bug alert:
    Μέσα στο while loop, στο if else που συγκρίνεις για ισότητα, γράφεις (str1[i] == '\0' && str1[i] == '\0') δηλαδή βάζεις το str1 δύο φορές οπότε πάντα θα βγαίνει true.

    • @psounis
      @psounis  5 років тому +9

      Όντως ευτυχώς ή δυστυχώς όπως λέει και άλλος ένας συνάδελφος δεν επηρέασε το βρωμερό σκουλήκι την εκτέλεση που έκανα και έτσι δεν το έπιασα! Όντως στην 3η συνθήκη πρέπει το 2ο str1 να γίνει str2. Thanks!

  • @cool__name
    @cool__name 8 років тому +2

    στη συναρτηση mystrcmp στο δευτερο else if, μεσα στην συνθηκη γραφεται το διο πραγμα δυο φορες .προφανως,ξεχασατε το 1 να το αντικαταστησετε με το 2. ευτυχως ή δυστυχως, επειδη βρισκεται στην τελευταια περιπτωση δεν επηρεαζει το προγραμμα.
    Συνεχιστε κ.Δημητρη τα βοηθητικα βιντεο σας!

  • @ΚωνσταντίνοςΜπάκος-μ9γ

    Όταν υπάρχει ατερμονος βρογχος σε μια συνάρτηση, η εντολή return λειτουργεί ταυτόχρονα και σαν break?

  • @red_l6634
    @red_l6634 2 роки тому

    η mystrcmp συναρτηση χωρις τοσα πολλα if statements:
    int myStrCmpr(char **str1,char** str2) {
    int i = 0;
    while (1)
    {
    if (str1[i]>str2[i])
    {
    return 1;
    }
    else if (str1[i]strlen(str1)||i>strlen(str2))
    {
    break;
    }
    }
    return 0;
    }
    παρατηρηστε εδω οτι 0 γυρναει μονο οταν το i εχει ξεπερασει το length *τουλαχιστον μιας εκ των 2 συμβολοσειρων*. για να φτασει ως εκει και να μην εχει κανει return πιο νωρις σημαινει οτι οι χαρακτηρες μεχρι εκει ειναι ιδιοι. πχ good=good. ΑΛΛΑ choco'\0'). οταν δηλαδη φτασει στο i=5 θα εχω string1[i]='\0' ενω string2[i]='l'. ο μονος τροπος να ειναι ισα ειναι να εχουν ιδιο πληθος χαρακτηρων και να υπαρχει ταυτιση χαρακτηρα προς χαρακτηρα. σημαντικο επισης οτι η stlen παιρνει σαν μηκος συμβολοσειρας το καθαρο πληθος χαρακτηρων (δε μετραει το '\0'). αρα πχ η λεξη "ok" εχει strlen=2 kai h "choco" strlen=5 ara string[5]='\0' για το "choco". Με λιγα λογια μεσα στο while θα βρει τουλαχιστον μια φορα το '\0'!!

  • @leyterismalliopoulos3914
    @leyterismalliopoulos3914 2 роки тому

    Kαλησπέρα δάσκαλε θέλω να ρωτήσω , όταν εργαζόμαστε και αποθηκεύουμε συμβολοσειρές είναι αναγκαίο να χρησιμοποιούμε δείκτη? Γίνεται χωρίς ? ? πχ σε αυτήν την άσκηση , στο πρωτότυπο της συν/σης επιτρέπεται να αποφύγουμε το char *str?

  • @gryllias574
    @gryllias574 4 роки тому +1

    Aν στο πρωτοτυπο συναρτησης βαζαμε char str αντι για char *str τι θα γινοταν;

    • @psounis
      @psounis  4 роки тому +1

      γιατί να το κάνουμε αυτό τέκνον; αφού διοχετεύουμε συμβολοσειρές, όχι χαρακτήρες.

  • @anestispapaefthimiou5156
    @anestispapaefthimiou5156 3 роки тому

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

    • @psounis
      @psounis  3 роки тому

      Ναι θα μπορούσαμε

  • @skoptv387
    @skoptv387 5 років тому

    Καλησπέρα.Άμα το κάνουμε αντι για -1 0 1 να επιστρέφει απευθειας τα str δλδ...return str1,str2...και ποιο πανω στην main να υπαρχει ενα printf("%s 1o
    %s 2o"mystrcmp(str1,str2); ....στην return υπαρχει καποιο "κόλπο" ωστε να επιστρέφει δύο τιμες?

    • @psounis
      @psounis  5 років тому

      Καλησπέρα, για να επιστρέψεις δύο τιμές,
      1/ Είτε επιστρέφεις την μία κανονικά (με return) και την άλλη μέσω δείκτη (βλ. μάθ.8).
      2/ Είτε κατασκευάζεις μία δομή και πακετάρεις την επιστροφή δύο τιμών μέσω στιγμιοτύπου δομής (βλ. μάθ.12)
      Μελέτησε και τους δύο τρόπους είναι πολύ χρήσιμο να τους ξέρεις καλά.

  • @16bitdude36
    @16bitdude36 2 роки тому

    Είναι λάθος το να προσθέσουμε απλός όλα τα στοιχεία του και πίνακα σε μια μεταβλητή, και μετά τις δύο sum να συγκρίνουμε? Είναι ότι απλός θα βγει πιο πολύ κώδικας έτσι?

    • @psounis
      @psounis  2 роки тому

      Ενδιαφέρουσα προσέγγιση που όμως δεν είναι σωστή.
      Η αλφαβητική σύγκριση εξαρτάται πρώτα από το πρώτο γράμμα των δύο συμβολοσειρών και έπειτα από το δεύτερο κ.οκ.
      Το άθροισμα τα βάζει όλα σε έναν κουβά οπότε θα βγάλει λάθος αποτέλεσμα σε περιπτώσεις.
      Π.χ. "ac" και "ca" θα έχουν ίσο άθροισμα, ωστόσο ισχύει "ac"

    • @16bitdude36
      @16bitdude36 2 роки тому

      @@psounis Ευχαριστώ για την γρήγορη ανταποκριση

  • @alexkakoliris878
    @alexkakoliris878 2 роки тому

    καλησπέρα Δημήτρη,οφειλω να πω ότι είναι πολύ ωραίος κώδικας και προσομοιωνει τη όλη διαδικασία όπου κάνει η strcmp και έπραξες πολύ καλά που το έκανες έτσι καθώς δεν έχουμε κάνει ακόμα την χρήση της παρόλα αυτά δεν έχω κάποια απορία αλλά θα παραθέσω και τον κώδικα όπου έφτιαξα εγώ αν θελήσεις να του ρίξεις μια μάτια!
    ΥΓ.παρατηρησα όμως ότι αν βάλεις δυο λέξεις με κενό σου πετάει και πάλι το false στο δικό σου το πρόγραμμα σε αντίθεση με το δικό μου.Αυτο συμβαίνει νομίζω αν δεν κάνω λάθος διότι το κενό στον πίνακα ascii είναι εκτός Ορίων σωστα?
    int mystrcmp(char *str1, char *str2);
    main()
    {
    char str1[N],str2[N];
    int i=0;
    do{
    printf("
    Give two strings with small letters only!");
    printf("

    Give the first string: ");
    gets(str1);
    printf("Give the second string: ");
    gets(str2);
    }while(str1[i]

    • @psounis
      @psounis  2 роки тому

      Γεια σου Αλεξ:
      1/ Ναι, ο στόχος της άσκησης είναι να γράψουμε τη δική μας εκδοχή της strcmp (που τυπικά στα μαθήματα την εισάγουμε στο μάθημα 18, που μελετάμε το string.h. Τελικά εννοείται ότι θα την καλούμε και εμείς όπως το έκανες εσύ, αλλά εξασκούμαστε αλγοριθμικά με την άσκηση αυτή (και τις προγούμενες παρόμοιες ασκήσεις για άλλες συναρτήσεις του string.h)
      2/ Υπάρχουν κάποια ζητήματα στον έλεγχο της ορθότητας της εισόδου που κάνεις:
      2.1/ Πρέπει να ελέγξει κάθε χαρακτήρα, κάθε συμβολοσειράς ότι είναι στο εύρος των επιτρεπτών χαρακτήρων. Βλέπω την απόπειρα, αλλά δε βλέπω π.χ. την αύξηση του μετρητή i (μένει 0)
      2.2/ Υπάρχει θέμα αν βάλεις στο ίδιο loop τον έλεγχο. Θέλει προσοχή γιατί οι δύο συμβολοσειρές δεν έχουν κατ' ανάγκη το ίδιο μήκος.
      2.3/ Ο έλεγχος πρέπει να γίνεται και για το πάνω όριο των χαρακτήρων (δηλ ότι είναι

    • @alexkakoliris878
      @alexkakoliris878 2 роки тому

      @@psounis ευχαριστώ πολύ Δημήτρη! έχεις δίκιο.Ευχαριστω για όλο το χρόνο που αφιέρωσες!κάτι που θέλω να ρωτήσω όμως διότι το διαπίστωσα σήμερα είναι ότι αν στην συνάρτηση mystrcmp στην συνθήκη else if (str1[i]=='\0' && str2[i]=='\0') αν σβησουμε τη παρασταση και το αφησουμε απλα else : return 0; παντα οτι και να εισαγει ο χρηστης επιστρεφει 0 χωρις να αναγνωριζει καποιο απο τα προηγουμενα else if που θα επρεπε να ισχυει καποιο απο αυτα και να σταματαει ο ελεγχος εκει.Δεν ειμαι σιγουρος αλλα αυτο συμβαινει λογω του οτι ειναι μεσα στην while και ετσι ελεγχονται ολα χωρις να σταματαει στο πρωτο else if που ισχυει και μολις βρει το ξερo else επιστρεφει αυτο?Δεν μπορω να καταλαβω.Γενικα υπαρχει καποιος κανονας οταν ειναι μεσα σε while πχ να μην γραφουμε ξερα else?

    • @psounis
      @psounis  2 роки тому +1

      @@alexkakoliris878 Γενικά δεν υπάρχει κάποιος τέτοιος κανόνας. Μέσα στο while βάζουμε ότι εντολές γουστάρουμε για να λυθεί το αλγοριθμικό ζητήμα.
      Στην προκείμενη άσκηση, πράγματι θα μπορούσαμε να έχουμε ένα ξερό else στο τέλος. Ο μόνος λόγος που το έχω βάλει, είναι για λόγους αναγνωσιμότητας του κώδικα. Δηλαδή ένα θέμα που υπάρχει στον προγραμματισμό, είναι ότι μπορεί να κάνουμε κάτι πιο έξυπνο (όπως αυτό που προτείνεις) αλλά ο κώδικας χάνει την αναγνωσιμότητά του (δηλαδή ξαναδιαβάζοντας αυτόν τον κώδικα, βλέπω 3 καθαρές συνθήκες => τέλειωσαν και τα δύο, τέλειωσε το 1ο, τέλειωσε το 2ο και αυτό με βοηθάει να επανέλθω στον κώδικα πιο εύκολα, πάρα να σκεφτώ ότι αφού δεν ισχύουν οι 2 συνθήκες, έπεται ότι η 3η συνθήκη θα είναι ότι τέλειωσε το 2ο)
      Ωστόσο αυτό είναι εξαιρετικά υποκειμενικό θέμα, δηλαδή κάποιος άλλος προγραμματιστής θα πει ότι ο κώδικάς μου είναι πιο αργός (αφού κάνει δυο ελέγχους παραπάνω) και μπορεί να με πλακώσει και στο ξύλο. Και εγώ θα του πω ότι χεστήκαμε για τους δυο ελέγχους με τη σημερινή ισχύ των επεξεργαστών, αν δεν πρέπει να κάνουμε σύγκριση συμβολοσειρών με τρισεκατομμύρια χαρακτήρες. Σε τέτοια θέματα να ξέρεις ότι οι απόψεις είναι ... ψάξε τη ρήση του Clint Eastwood περί απόψεων για να μην το γράψω εδώ.

    • @alexkakoliris878
      @alexkakoliris878 2 роки тому

      @@psounis ευχαριστώ παρά πολύ Δημήτρη για την άμεση απάντηση ,να σαι καλά! Με συγχωρείς που άργησα να απαντήσω στα 2 τελευταία σχόλια Γενικά απαντάω πάντα για να ευχαριστήσω όπως και να χει!

  • @ΧΡΥΠΟΥ
    @ΧΡΥΠΟΥ 3 роки тому

    εδω και πολλη ωρα δεν μπορω να βρω το λαθος.
    στο test: μου γραφει στην οθονη οποιαδηποτε αριθμο εκτος απο 0, 1, -1.............. τι κανω λαθος;;;;

    • @psounis
      @psounis  3 роки тому

      Γράψε μου τον κώδικά σου εδώ και τι είσοδο βάζεις, με την οποία να βγαίνει λάθος έξοδος.

    • @ΧΡΥΠΟΥ
      @ΧΡΥΠΟΥ 3 роки тому +1

      @@psounis το έλεγξα , έκανα τις απαραίτητες διορθώσεις και ενώ είναι ίδιο με το δικό σου , συνεχίζει να έχει το ίδιο θέμα .
      Όταν το έφερα σε τελική μορφή όμως λειτούργησε κανονικά !
      Σε ευχαριστώ για την βοήθεια.
      Όμως δεν μπορώ να το ανεβάσω αυτή την στιγμή. Δεν έχω πρόσβαση σε υπολογιστή

  • @Makarios_Holesis
    @Makarios_Holesis 4 роки тому

    Καλησπέρα δάσκαλε, προσπαθώ να φτιάξω το πρόγραμμα με αμυντικό μηχανισμό και αντιμετωπίζω κάποια προβλήματα που με ταλαιπωρούν αρκετά. Να η προσπαθειά μου μέχρι τώρα:
    #include
    #define SIZE 50
    #define TRUE 1
    #define FALSE 0
    int string_check(char *str);
    main()
    {
    char str1[SIZE],str2[SIZE];
    int i;
    printf("Dwse thn prwth symboloseira: ");
    gets(str1);
    do
    {
    if(string_check(str1)==FALSE)
    {
    printf("Dwse ksana thn symboloseira xrhsimopooiwntas mono mikous latanikous xarakthres: ");
    gets(str1);
    string_check(str1);
    }
    else // if(string_check(str1)==TRUE)
    break;
    }
    while(string_check(str1)==FALSE);

    }
    int string_check(char *str)
    {
    int i;
    while(str[i]!='\0')
    {
    if(str[i]'z')
    {
    return FALSE;
    }
    }
    return TRUE;
    }

    • @psounis
      @psounis  4 роки тому

      Καλησπέρα τέκνον, πρόσεξε στη συνάρτηση την αρχικοποίηση i=0 και επίσης ότι πρέπει να αυξάνεις την τιμή του i στο loop