Off topic:
Γίνε και εσύ hacker!!!!!! Έριξα απίστευτο γέλιο...http://triple-click.blogspot.com/2010/12/hacker_11.html
Star_Light έγραψε:Μετα τις λιστες του migf1 εγω θα αρχισω να ασχολουμαι και με κρυπτογραφηση παντως σε C ή τον αλγοριθμο CRC .
Με ενδιαφερει αρκετα και η ασφαλεια!!!!!
/* -----------------------------------------------------------------------------------
* Από: migf1
*
* Διάβασμα ενός string από τον χρήστη και μετατροπή του σε πραγματικό αριθμό.
*
* Το πρόγραμμα παρουσιάζει τον πλέον συμβατό και ασφαλή τρόπο να διαβάζει
* κανείς μεταβλητές οποιουδήποτε τύπου στη C, χωρίς να εξαρτάται από εν δυνάμει
* προβληματικές συναρτήσεις, όπως είναι η στάνταρ scanf().
*
* Στην προκειμένη περίπτωση το string μετατρέπεται σε double, αλλά μπορεί εξίσου
* εύκολα να μετατραπεί σε οποινδήποτε άλλον τύπο, με χρήση της στάνταρ βιβλιοθήκης
* stdlib ( #include <stdlib.h> ).
*
* Η προτεινόμενη συνάρτηση είναι η strtod() η οποία δίνει πολλές δυνατότητας ελέγχου
* αποτυχίας της μετατροπής, με χρήση της καθολικής μεταβλητής errno (#include <errno.h)
* αλλά και του δείκτη: char *dummy στο 2ο όρισμά της. Εδώ παρουσιάζω μονάχα μερικές
* από αυτές τις δυνατότητες (για περισσότερες πληροφορίες, διαβάστε την τεκμηρίωση
* της συνάρτησης, στο manual της).
*
* Ως ευκολότερη λύση για την μετατροπή, αλλά χωρίς δυνατότητα ελέγχου ενδεχόμενης
* αποτυχίας, παρουσιάζω και την συνάρτηση: atof() ( επίσης στη βιβλιοθήκη: stdlib) ).
*
* -----------------------------------------------------------------------------------
*/
#include <stdio.h>
#include <errno.h> // για έλεγχο του errno
#include <stdlib.h> // για τις atof(), strtod() και exit()
#define MAX_LINE 255+1 // μέγιστο μήκος της γραμμής εισόδου
// -----------------------------------------------------------------------------------
// Ανάγνωση του string s από την κύρια είσοδο μέχρι να πατηθεί ENTER ή να συμπληρωθούν
// maxlen-1 χαρακτήρες. Επιστρέφει το αναγνωσμένο s με μηδενισμένο τον τελικό του
// χαρακτήρα (αντικαθιστώντας το ENTER, αν ήταν αυτό ο τελικός χαρακτήρας). Σε
// περίπτωση σφάλματος επιστρέφει NULL.
// ΣΗΜΑΝΤΙΚΟ:
// το s πρέπει να είναι ήδη δημιουργημένο και να έχει χώρο για τουλάχιστον maxlen
// χαρακτήρες!
//
char *s_get(char s[], int maxlen)
{
register int i;
for (i=0; (s[i]=getchar()) != '\n' && i < maxlen-1; i++)
; // for-loop με κενό σώμα
s[i] = '\0'; // μηδενισμός του τελικού χαρακτήρα
return s;
}
// -----------------------------------------------------------------------------------
int main( void )
{
extern int errno; // defined in <errno.h>
char line[MAX_LINE]; // η γραμμή ειδόδου (string)
char *dummy; // για την strtod()
double num = 0.0; // το αποτέλεσμα της μετατροπής
printf("Enter any real number: ");
s_get( line, MAX_LINE);
printf("You entered the string: %s\n", line);
// μετατροπή με την atof()
num = atof( line );
printf("\nConverted to double with atof() it gives: %g\n", num);
// μετατροπή με την strtod()
errno = 0;
num = strtod( line, &dummy );
// έλεγχος αποτυχίας
printf("\nConverted to double with strtod() it gives: %g\n", num);
if (errno == ERANGE)
puts("\t*** error: number too big or too small");
if ( *dummy != '\0')
printf("\t*** info: \"%s\" was invalid so it was ignored\n", dummy);
exit( EXIT_SUCCESS );
}
Πρώτα απο όλα πρέπει να υπάρχει ένα bug! Πολλές φορές όταν πατάω Παράθεση μου κόβει λέξεις...
migf1 έγραψε:Διάβασμα ενός string και μετατροπή του σε πραγματικό αριθμό (περισσότερες πληροφορίες στα σχόλια του κώδικα)
- Κώδικας: Επιλογή όλων
/* -----------------------------------------------------------------------------------
* Από: migf1
*
* Διάβασμα ενός string από τον χρήστη και μετατροπή του σε πραγματικό αριθμό.
*
* Το πρόγραμμα παρουσιάζει τον πλέον συμβατό και ασφαλή τρόπο να διαβάζει
* κανείς μεταβλητές οποιουδήποτε τύπου στη C, χωρίς να εξαρτάται από εν δυνάμει
* προβληματικές συναρτήσεις, όπως είναι η στάνταρ scanf().
*
* Στην προκειμένη περίπτωση το string μετατρέπεται σε double, αλλά μπορεί εξίσου
* εύκολα να μετατρταπεί σε οποινδήποτε άλλον τύπο, με χρήση της στάνταρ βιβλιοθήκης
* stdlib ( #include <stdlib.h> ).
*
* Η προτεινόμενη συνάρτηση είναι η strtod() η οποία δίνει πολλές δυνατότητας ελέγχου
* αποτυχίας της μετατροπής, με χρήση της καθολικής μεταβλητής errno (#include <errno.h)
* αλλά και του δείκτη: char *dummy στο 2ο όρισμά της. Εδώ παρουσιάζω μονάχα μερικές
* από αυτές τις δυνατότητες (για περισσότερες πληροφορίες, διαβάστε την τεκμηρίωση
* της συνάρτησης, στο manual της ).
*
* Ως ευκολότερη λύση για την μετατροπή, αλλά χωρίς δυνατότητα ελέγχου ενδεχόμενης
* αποτυχίας, παρουσιάζω και την συνάρτηση: atof() ( επίσης στη βιβλιοθήκη: stdlib) ).
*
* -----------------------------------------------------------------------------------
*/
#include <stdio.h>
#include <errno.h> // για έλεγχο του errno
#include <stdlib.h> // για τις atof(), strtod() και exit()
#define MAX_LINE 255+1 // μέγιστο μήκος της γραμμής εισόδου
// -----------------------------------------------------------------------------------
// Ανάγνωση του string s από την κύρια είσοδο μέχρι να πατηθεί ENTER ή να συμπληρωθούν
// malen-1 χαρακτήρες.
// Επιστρέφει το αναγνωσμένο s με μηδενισμένο τον τελικό του χαρακτήρα (αντικαθιστώντας
// το ENTER, αν ήταν αυτό ο τελικός χαρακτήρας). Σε περίπτωση σφάλματος επιστρέφει NULL.
// ΣΗΜΑΝΤΙΚΟ:
// το s πρέπει να είναι ήδη δημιουργημένο και να έχει χώρο για τουλάχιστον maxlen
// χαρακτήρες!
//
char *s_get(char s[], int maxlen)
{
register int i;
for (i=0; (s[i]=getchar()) != '\n' && i < maxlen-1; i++)
; // for-loop με κενό σώμα
s[i] = '\0'; // μηδενισμός του τελικού χαρακτήρα
return s;
}
// -----------------------------------------------------------------------------------
int main( void )
{
extern int errno; // defined in <errno.h>
char line[MAX_LINE]; // η γραμμή ειδόδου (string)
char *dummy; // για την strtod()
double num = 0.0; // το αποτέλεσμα της μεταροπής
printf("Enter any real number: ");
s_get( line, MAX_LINE);
printf("You entered the string: %s\n", line);
// μετατροπή με την atof()
num = atof( line );
printf("\nConverted to double with atof() it gives: %g\n", num);
// μετατροπή με την strtod()
errno = 0;
num = strtod( line, &dummy );
// έλεγχος αποτυχίας
printf("\nConverted to double with strtod() it gives: %g\n", num);
if (errno == ERANGE)
puts("\t*** error: number too big or too small");
if ( *dummy != '\0')
printf("\t*** info: \"%s\" was invalid so it was ignored\n", dummy);
exit( EXIT_SUCCESS );
}
linuxs έγραψε:
[snip]
Off topic:
migf1, μιας και έχεις μεγαλύτερη εμπειρία...με την C σαν γλώσσα τι μπορώ να κάνω? Σίγουρα η πρώτη απάντηση είναι: "Πολλά!!!" το καταλαβαίνω αυτό απλά εκτός απο τα παραδείγματα και τις ασκήσεις που όπως συνήθως έχω κάνει και εγώ μπορέις να μου πείς 2-3 παραδείγματα που αν καταφέρω να τα υλοποιήσω θα είναι πραγματικά χρήσιμα είτε σε ένα webpage είτε στον υπολογιστή μου. :/ Απλά, εδώ και καιρό κάνω τα turorials κάποια προγράμματα κτλ αλλα ποτέ δεν έχω δεί κάτι ΧΡΗΣΙΜΟ. Να πω ωραία κατάφερα και υλοποίησα αυτό(ίσως και με βοήθεια άλλου) θα το βάλω στην άκρη να το χρησιμοποιήσω κάπου. + οτι θα μπορύσα να το ανεβάσω στο net για χρήση απο όποιον ενδιαφέρεται...
ελπίζω να κατάλαβες τις αποριούλες μου...
linuxs έγραψε:Μπορείς να μου κάτι πιο συγκεκριμένο μέτριας δυσκολίας()? Τι στο καλό πιστευω να το καταφέρω...σορρυ αν σε ταλαιπορώ(θα έχεις και δουλεια...)
/* -----------------------------------------------------------------------
* Από: migf1
*
* Πολύ απλοϊκό παράδειγμα προγράμματος κονσόλας που παράγει το γράφημα μιας
* συνάρτησης: f(x) = a*x + b στο πρώτο τεταρτημόριο του καρτεσιανού επιπέδου.
*
* Μπορείτε να αλλάξετε την συνάρτηση, αλλά σημειώστε πως το πρόγραμμα απεικονίζει
* μονάχα όσα σημεία παράγονται στην περιοχή: (0,0) ... (74,22)
* -----------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXCOLS 75 // μέγιστο πλάτος της οθόνης μας
#define MAXROWS 23 // μέγιστο ύψος της οθόνης μας
#define PIXEL_ON '#' // χαρακτήρας απεικόνισης "αναμμένων" pixels
#define PIXEL_OFF '.' // χαρακτήρας απεικόνισης "σβησμένων" pixels
#define VALIDPIXEL(x,y, w,h) ( (y) > -1 && (y) < (h) && (x) > -1 && (x) < (w) )
#define REVAXIS(y,h) (h) - (y) - 1 // αλλάζει την συντεταγμένη y ώστε το σημείο
// στο οποίο αντιστοιχεί να απεικονιστεί στην
// αντεστραμμένη φορά του άξονά (χρήσιμο για τον
// άξονα Υ που τον θέλουμε να μετράει από κάτω
// προς τα πάνω)
typedef struct screen {
int nrows; // τρέχον πλάτος της οθόνης μας
int ncols; // τρέχον ύψος της οθόνης μας
char pixel[MAXROWS][MAXCOLS]; // όλα τα pixels της οθόνης μας
} Screen;
// ------------------------------------------------------------------------------------
// Η συνάρτηση που παράγει το γράφημα (δοκιμάστε και με άλλες τιμές)
//
int f( int x )
{
return x/3+1;
}
// ------------------------------------------------------------------------------------
// "Ανάβει" το pixel (x,y) ώστε να εμφανιστεί αναμένο όταν αργότερα τυπωθεί η οθόνη
// μέσω της συνάρτησης: draw_screen()
//
void set_pixel( Screen *screen, int x, int y )
{
if ( !VALIDPIXEL(x,y, screen->ncols, screen->nrows ) )
return;
y = REVAXIS(y, screen->nrows); // make y-axis to start from bottom to top
screen->pixel[y][x] = PIXEL_ON;
return;
}
// ------------------------------------------------------------------------------------
// "Σβήνει" όλα τα pixels της οθόνης, ώστε να εμφανιστούν σβησμένα όταν αργότερα
// τυπωθεί η οθόνη μέσω της συνάρτησης: draw_screen()
//
void clear_screen( Screen *screen )
{
register int x,y;
for (y=0; y < screen->nrows; y++)
for (x=0; x < screen->ncols; x++)
screen->pixel[y][x] = PIXEL_OFF;
return;
}
// ------------------------------------------------------------------------------------
// Τυπώνει όλα τα pixels της οθόνης μας (αναμμένα και σβηστά) καθώς και την αρίθμηση
// των αξόνων Χ και Υ
//
void draw_screen( Screen screen )
{
register int x, y;
for (y=0; y < screen.nrows; y++)
{
// display value-labels to the left of y-axis
int ylab = y;
printf("%3d ", REVAXIS(ylab, screen.nrows) );
// display yth row of pixels
for (x=0; x < screen.ncols; x++)
putchar( screen.pixel[y][x] );
putchar('\n');
}
// display value-labels under x-axis
printf("Y/X ");
for (x=0; x < screen.ncols; x++)
printf("%d", x%10);
putchar('\n');
return;
}
// ------------------------------------------------------------------------------------
int main( void )
{
register int x=0;
Screen screen = { .ncols = MAXCOLS, .nrows = MAXROWS };
clear_screen( &screen ); // σβήσιμο όλων των pixels
for (x=0; x < screen.ncols; x++) // άναμμα μόνο όσων pixels...
set_pixel( &screen, x, f(x) ); // ... υπολογιζει η συνάρτηση f(x)
draw_screen( screen ); // τύπωμα όλων των pixels
exit( EXIT_SUCCESS );
}