Δημοσιεύτηκε: 08 Ιούλ 2011, 03:19
Απλοϊκό πρόγραμμα δημιουργίας και απεικόνισης γραφήματος μιας συνάρτησης: f(x) = a*x + b

- Κώδικας: Επιλογή όλων
/* -----------------------------------------------------------------------
* Από: 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 );
}
