freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

Ελεγχος αν λενα string είναι αριθμός


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [8 Μηνύματα]      Bookmarks Tags: έλεγχοςstring Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
kostasevosm


Μέλος από: 01 Νοε 2006
Μηνύματα: 85
Περιοχή: Salonica
View users profile Send email to user
ΜήνυμαΣτις: 25 Σεπ 2008 15:30    Θέμα: Ελεγχος αν λενα string είναι αριθμός
Περιγραφή θέματος: υπάρχει τρόπος να μπορώ να δώ αν ένα string είναι αριθμός;
Απάντηση με παράθεση  Mark this post and the followings unread

Παιδιά βοήθεια
Θέλω να μάθω αν υπάρχει στην C++ συνάρτηση που να παίρνει είσοδο ένα string και να ελάγχει αν είναι ή όχι αριθμός.
μία πρώτη σκέψη είναι (ισχύει μόνο για ακέραιους) η παρακάτω αλλα εγώ θέλω και για float
int TForm1::IsNumber(AnsiString s)
{
int i,a;
for(i=1;i<=s.Length();i++)
{
if(!isdigit(s[i]))
a=0;
else a=1;
}
return a;
}
σας παρακαλώ βοήθει καίγομαι
dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 25 Σεπ 2008 16:43    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Πρίν αρχίσεις να κουράζεσαι άδικα (αφού χρησιμοποιείς c++ builder) ρίξε μια ματιά σε αυτά:
http://www.delphibasics.co.uk/RTL.asp?Name=StrToFloat
http://www.delphibasics.co.uk/RTL.asp?Name=Val
bxenos


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 26 Σεπ 2008 03:43    Θέμα: Re: Ελεγχος αν λενα string είναι αριθμός
Περιγραφή θέματος: υπάρχει τρόπος να μπορώ να δώ αν ένα string είναι αριθμός;
Απάντηση με παράθεση  Mark this post and the followings unread

kostasevosm ανέφερε:

κώδικας:

    for(i=1;i<=s.Length();i++)
    {
        if(!isdigit(s[i]))
            a=0;
        else a=1;
    }
    return a;



Δεν έχω δουλέψει ποτέ το AnsiString, αλλά ο κώδικας παραπάνω δεν μου μοιάζει να δουλεύει. Ελέγχει μόνο το τελευταίο χαρακτηρα αν είναι ψηφιο ή όχι. Και αν τύχει το string να αποτελείται απο εναν και μόνο χαρακτηρα επιστρέφει τυχαίο αποτέλεσμα.
(i=1 λαθος αρχικη τιμη) (i<=s.Length λαθος τελικη τιμη) (a=0 else a=1 χάνεις οτι τιμη ειχε ο a απο τις μεχρι τωρα συγκρισεις)

Μονο με formatter (νομίζω το FmtLoadStr είναι στην class αυτη) μπορεις να έχεις το κεφαλι σου ησυχο (φορμαρισμενη είσοδο), αλλιως πρεπει να ελένξεις οχι μονο τα τυπικα (αν εχει μια μονο υποδιαστολη) αλλα αν ειναι όλος ο αριθμος αναγνωσιμος (ή έχει πολλα δεκαδικά ή μη ψηφια και εχεις rounding).

Η λυση (χωρις formatter) ειναι να περνεις εναν χαρακτηρα τη φορα και να τον περνας μεσα σε ενα double (που εχεις περάσει ολους τους προηγουμενους). Θα πρεπει να ελέγχεις ολοι οι χαρακτηρες να ειναι ψηφια ή μεχρι μια υποδιαστολη ή ενα αρχικο προσημο ή το εκθετικο e.
Θα πρεπει να ελέγχεις αν ο αριθμος μετα την προσθηκη του τελευταιου ψηφιου ειναι μεγαλυτερος με τον προηγουμενο (πρις την εισαγωγη τελευταιου ψηφιου) εκτος αν το τελευταιο ψηφειο ειναι 0 και ειμαστε στα δεκαδικα.
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 26 Σεπ 2008 18:20    Θέμα: Re: Ελεγχος αν λενα string είναι αριθμός
Περιγραφή θέματος: υπάρχει τρόπος να μπορώ να δώ αν ένα string είναι αριθμός;
Απάντηση με παράθεση  Mark this post and the followings unread

Μια εύκολη λύση για να checkareis και floats είναι να χρησιμοποιήσεις μια κανονική έκφραση, αλλιώς μπορείς να γράψεις κάτι πιο πολύπλοκο (στην πραγματικότητα κάτι σαν μικρό αναλυτή, δηλ έναν pattern matcher) που στην ουσία έχει το ίδιο αποτέλεσμα με την ΚΕ.
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 26 Σεπ 2008 19:24    Θέμα: Re: Ελεγχος αν λενα string είναι αριθμός
Περιγραφή θέματος: υπάρχει τρόπος να μπορώ να δώ αν ένα string είναι αριθμός;
Απάντηση με παράθεση  Mark this post and the followings unread

Έγραψα ένα απλό Perl script πριν λίγο που αποδέχεται όλο το εύρος των αριθμών μέχρι πραγματικούς (IN, Z, IR), κάθετί άλλο απορρίπτεται. Δηλ. αποδέχεται απρόσημους ή προσημασμένους φυσικούς, ακέραιους, και πραγματικούς. Το PCRE regular expression, μπορεί να μεταφερθεί μέ ένα copy/paste σε C/C++ κώδικα.

κώδικας:

#!/bin/env perl

while(1) {
        print "Give me a string: ";
        $str = <STDIN>;

        if($str =~ /^[+-]?([0-9]{1,})([.,]?([0-9]{1,}))?$/) {
                print "is numeric!\n";
        } else {
                print "not numeric!\n";
        }
}


Δεν είμαι 100% σίγουρος όμως αν είνα απόλυτα σωστή από άποψη ασφάλειας, ίσως να υπάρχουν strings που μπορούν να προσπερνούν αυτό τον έλεγχο. Δοκίμασα διάφορα μοτίβα, μπορεί να τα τσέκαρα και όλα, και φαίνεται να δουλεύει καλά. Η PCRE αυτή υποτίθεται πως αποδέχεται συμβολοσειρές της μορφής <προεραιτικό πρόσημο><ακολουθία ψηφίων 0 ώς 9, τουλάχιστον ένα ψηφίο>(<προεραιτική υποδιαστολή ("." ή ",") και ακολουθία τουλάχιστον ενός ψηφίου από 0-9> (δηλ. όλους τους αριθμούς σε κανονική μορφή γραφής). Η έκφραση δεν δέχεται αριθμούς σε επισημονική γραφή, όπως επίσης δεν κάνει δεκτό δεκαδικούς της μορφής πχ .9 (δηλ 0.9).

Last edited by soteres2002 on 26 Σεπ 2008 20:13, edited 1 time in total
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 26 Σεπ 2008 19:55    Θέμα: Re: Ελεγχος αν λενα string είναι αριθμός
Περιγραφή θέματος: υπάρχει τρόπος να μπορώ να δώ αν ένα string είναι αριθμός;
Απάντηση με παράθεση  Mark this post and the followings unread

bxenos ανέφερε:
Η λυση (χωρις formatter) ειναι να περνεις εναν χαρακτηρα τη φορα και να τον περνας μεσα σε ενα double (που εχεις περάσει ολους τους προηγουμενους). Θα πρεπει να ελέγχεις ολοι οι χαρακτηρες να ειναι ψηφια ή μεχρι μια υποδιαστολη ή ενα αρχικο προσημο ή το εκθετικο e.
Θα πρεπει να ελέγχεις αν ο αριθμος μετα την προσθηκη του τελευταιου ψηφιου ειναι μεγαλυτερος με τον προηγουμενο (πρις την εισαγωγη τελευταιου ψηφιου) εκτος αν το τελευταιο ψηφειο ειναι 0 και ειμαστε στα δεκαδικα.


Bxenos, αυτή η διαδικασία που περιγράφεις δεν επικυρώνει σωστά όλα τα στίνγκς. Πχ το "11." ή το ".11" λαμβάνεται υπόψην ώς αλφαριθμητικό (υπάρχει μια τουλάχιστον υποδιαστολή όπως λες), που στην πραγματικότητα δεν είναι αλφ/κό. Οπότε μετράει και η θέση που βρίσκονται οι υποδιαστολές. Με μια κανονική έκφραση νομίζω λύνεται το πρόβλημα πολύ απλούστερα παρά με 5 ή 10 if/else...
bxenos


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 26 Σεπ 2008 23:21    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

έχει η c++ regular expressions; το 12. είναι αποδεκτός αριθμός όπως και το .33
Μην αγχώνεσαι τόσο όμως, ο ενδιαφερόμενος δεν έχει εμφανιστεί για να πεί τι γνώμη του.
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 26 Σεπ 2008 23:53    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

bxenos ανέφερε:
έχει η c++ regular expressions;

Φυσικά και ναι. Υπάρχουν τόσο εξωτερικές βιβλιοθήκες για C/C++ πχ η PCRE (που είναι εγκατεστημένη σχεδόν σε κάθε unix σύστημα και υπάρχει για windows και άλλα OS). Κάθε λειτουργικό παρέχει native regular expression λειτουργίες (για C/C++). Καμία imperative γλώσσα δεν εχει (απο μόνη της) υποστήριξη για regular expressions, παρά μόνο υλοποίηση σαν shared library, όπως και στην PHP, Python κτλ. Εκτός από την Perl που φτιάχτηκε για pattern matching (οπότε και είναι embedded στον interpreter).

bxenos ανέφερε:

το 12. είναι αποδεκτός αριθμός όπως και το .33
Μην αγχώνεσαι τόσο όμως, ο ενδιαφερόμενος δεν έχει εμφανιστεί για να πεί τι γνώμη του.


Ναι ας πει αν χρειάζεται. Δεν αγχώθηκα. Επίσης, επειδή το σχολίασες το .33 και το 12. δεν είναι αριθμός μέχρι να το ορίσεις εσύ να είναι αριθμός - είναι μια ειδική σημειογραφία και δεν αναγνωρίζεται από όλους σαν αριθμός (εκτός από προγραμματιστές και μαθηματικούς ή άλλους που έτυχε να το ξέρουν). Επίσης, η ίδια σημειογραφία μπορεί να σημαίνει πολλά για διάφορα πράγματα. Επειδή δεν προσδιόρισε κάποιου είδους γραφή, θεώρησα αρχικά αυτονόητη την κανονική μορφή που ξέρουμε όλοι από την αριθμητική.
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [8 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 29 Μαρ 2017 07:18 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos