Δημοσιεύτηκε: 29 Μαρ 2012, 17:20
Ilias95 έγραψε:Ορίστε:
- Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#define ABSOLUTE_VALUE(x) ((x) >= 0 ? (x) : (-(x)))
int number_digits(int x)
{
int i;
if (!x) return 0;
x = ABSOLUTE_VALUE(x);
for (i = 0; x; x /= 10, i++);
return i;
}
int main(void)
{
int i, y, digits;
for (i = 1; i <= 30000; i++) {
digits = number_digits(i-1);
for (y = 0; y < digits; y++)
putchar('\b');
printf("%d", i);
}
return 0;
}
Την number_digits() την έγραψα αμέσως, ένα χαζό λάθος είχα στη λογική του loop που μου πήρε κάποια ώρα να το βρω.
Επίσης, νομίζω η number_digits() είναι re-usable.
Σε πάω ρε φίλε! Είσαι γάτος!
Δεν είναι η πιο efficient λύση, αλλά είναι μια ΑΞΙΟΠΡΕΠΕΣΤΑΤΗ λύση δεδομένης της απειρίας σου στη συγκεκριμένη γλώσσα (εννοώ για το ελάχιστο διάστημα που ασχολείσαι μαζί της)!
Λοιπόν, η number_digits() θα ήταν re-usable αν δεν εξαρτιόταν από το macro ABSOLUTE_VALUE(x). Δηλαδή ή θα πρέπει να την δώσεις σε κάποιον τρίτο μαζί με το macro, ή καλύτερα αντί για το macro να χρησιμοποιήσεις την στάνταρ συνάρτηση abs() (#include <stdlib.h> ).
Σε ότι αφορά τώρα την υλοποίηση αυτή κάθε αυτή, είναι πολύ πιο εύκολο και πολύ πιο γρήγορο να χρησιμοποιήσεις την τιμή επιστροφής της printf() ... αν τσεκάρεις την τεκμηρίωσή της θα δεις ότι επιστρέφει το πλήθος των χαρακτήρων που τύπωσε στην έξοδο (ή μια αρνητική τιμή σε περίπτωση σφάλματος, το οποίο θα το αγνοήσουμε μιας και είναι εξαιρετικά σπάνιο να συμβεί... αν δεν μπορεί να τυπώσει η printf θα έχουμε πολύ σοβαρότερα προβλήματα στο σύστημά μας)
Μπορείς λοιπόν να φτιάξεις μια συνάρτηση ή ένα macro που θα τυπώνει όσα '\b' του περάσεις σαν όρισμα, και όταν το καλείς να του περνάς σαν όρισμα απευθείας την printf() που χρησιμοποιείς για να τυπώσεις το νούμερο μέσα στο loop.
Δες μια πιθανή υλοποίηση...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAXINPUT (255+1)
/* console backspace ntimes */
#define NBS( ntimes ) \
do { \
int nTImeSTMp = (ntimes); \
while (nTImeSTMp--) \
putchar('\b'); \
} while(0)
/* ------------------------------------------------- */
int main( void )
{
char input[ MAXINPUT ] = {'\0'};
int uplim = 0;
short i = 0;
do {
printf( "Enter upper limit (1 - %hd): ", SHRT_MAX );
fgets( input, MAXINPUT, stdin);
uplim = atoi(input);
} while ( uplim < 1 || uplim > SHRT_MAX);
printf( "Counter: " );
for (i=0; i < uplim; i++)
NBS( printf("%hd", i) );
putchar('\n');
system("pause"); /* windows only */
return 0;
}