Δημοσιεύτηκε: 25 Φεβ 2012, 16:19
Ilias95 έγραψε:migf1 έγραψε:ΥΓ. Δεν το βρίσκω το upc.c πρόγραμμα στην ενότητα 4.1 που λέει.
Σελ. 57
Αχα, thanks!
Από ότι βλέπω, κάνει πράξεις κατόπιν με τα ψηφία (digits). Οπότε αν τα διαβάζεις ως χαρακτήρες, θα πρέπει πρώτα να τα μετατρέψεις σε αντίστοιχα int... βασικά ο τύπος char στη C είναι υποσύνολο του int. Ο κάθε χαρακτήρας αντιστοιχεί στον ακέραιο αριθμό του ASCII table.
Οπότε για παράδειγμα, ο χαρακτήρας '0' αντιστοιχεί στον ακέραιο 48 (σύμφωνα με το ASCII table), ο 'A' αντιστοιχεί στον ακέραιο 65, και πάει λέγοντας. Επειδή ο τύπος char είναι ορισμένος fixed σε 1 byte μνήμης, το εύρος των έγκυρων τιμών του είναι από 0 έως 255 αν πρόκειται για unsigned char ή από -128 έως 127 αν πρόκειται για signed char (σημείωση: το σκέτο char δεν γνωρίζουμε αν είναι signed ή unsigned ... το στάνταρ το αφήνει στην κρίση του κάθε compiler, συνήθως είναι signed αλλά δεν μπορούμε να το θεωρήσουμε δεδομένο για όλους τους compilers).
Άρα λοιπόν, στη C (και σε πολλές άλλες γλώσσες) μπορούμε να διαβάσουμε μια μεταβλητή ως char και να την τυπώσουμε ως int. Δες για παράδειγμα τον παρακάτω κώδικα:
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
#include <stdio.h>
#include "myextras.h"
int main( void )
{
char ch;
printf( "Enter a character: " );
mySCANF( "%c", &ch );
printf( "print as char: %c\n", ch );
printf( "print as int : %d\n", ch );
return 0;
}
Διαβάζει τη μεταβλητή ch ορισμένη ως char και κατόπιν την τυπώνει και ως char αλλά και ως int (το ASCII code του ch δηλαδή).
Μπορείς να κάνεις και το ανάποδο, να διαβάσεις δηλαδή μια μεταβλητή int και κατόπιν να την τυπώσεις σαν char αλλά αν ο χρήστης σου δώσει ως int στην είσοδο τιμή μεγαλύτερη ή μικρότερη από το εύρος τιμών που μπορεί να χωρέσει σε char, τότε ο χαρακτήρας αυτό που θα τυπωθεί θα είναι λάθος, δεν θα αντιστοιχεί δηλαδή στον int που διάβασες από την είσοδο!
Τώρα, εφόσον οι χαρακτήρες είναι επί της ουσίας πολύ μικροί int μπορούμε κάνουμε πράξεις πάνω τους (και μάλιστα μπορούμε να τους δηλώνουμε και σαν int αν θέλουμε).
Ο παρακάτω κώδικας διαβάζει έναν χαρακτήρα από την κύρια είσοδο και τυπώνει αν ήταν αριθμητικό ψηφίο ή όχι...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
#include <stdio.h>
#include "myextras.h"
int main( void )
{
char ch;
mySCANF( "%c", &ch );
if ( ch < '0' || ch > '9' )
printf( "%c is NOT a digit\n", ch );
else
printf( "%c is a digit\n", ch );
return 0;
}
Αν βεβαιωθείς πως ένας χαρακτήρας είναι ψηφίο, τότε είναι πολύ εύκολο να τον χρησιμοποιήσεις ως αριθμο σε πράξεις. Δες για παράδειγμα τον παρακάτω κώδικα που διαβάζει ένα-ένα 3 ψηφία ως χαρακτήρες και τα μετατρέπει σε ενιάιο ακέραιο αριθμό, τον οποίο και τυπώνει...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
#include <stdio.h>
#include "myextras.h"
#define ISDIGIT( ch ) ( (ch) >= '0' && (ch) <= '9' )
int main( void )
{
char c1, c2, c3;
int n;
mySCANF( "%c%c%c", &c1, &c2, &c3 ); /* ανάγνωση 3 χαρακτήρων, ένας για κάθε ψηφίο */
if ( !ISDIGIT(c1) )
c1 = '0';
if ( !ISDIGIT(c2) )
c2 = '0';
if ( !ISDIGIT(c3) )
c3 = '0';
n = (c1 - '0') * 100 + (c2 - '0') * 10 + (c3 - '0');
printf( "Print as a whole integer: %d\n", n );
return 0;
}
Αν κάποιος από τους χαρακτήρες c1, c2, c3 δοθεί στην είσοδο ως μη ψηφίο (π.χ. ως γράμμα ή ως σημείο στίξης, κλπ) μετατρέπεται από το αντίστοιχο if στον χαρακτήρα '0' (που έχει ASCII code 48).
Στις πράξεις τώρα, για να βρούμε όχι το ASCII code αλλά ποιον αριθμό από 0 έως 9 απεικονίζει ο κάθε χαρακτήρας c?, τον αφαιρούμε από τον χαρακτήρα '0' (αυτός είναι ο 1ος αριθμητικός χαρακτήρας στον πίνακα ASCII.
Δηλαδή αν π.χ. ο c1 δοθεί ως '7' τότε το ('7' - '0') μεταφράζεται από τον compiler σε (55 - 48) = 7 ... 55 είναι το ASCII code του χαρακτήρα '7' και 48 είναι το ASCII code του χαρακτήρα '0'.
Οπότε το n υπολογίζεται σωστά
Με λίγα λόγια, στη C μπορούμε να διαχειριστούμε τα char σαν είναι int αρκεί να φροντίζουμε οι τιμές τους να βρίσκονται μέσα στο εύρος τιμών του τύπου char