Προς το περιεχόμενο

πινακασ με χρονομετρο


makiss8

Προτεινόμενες αναρτήσεις

Λοιπόν, έτσι όπως ρωτάς δεν νομίζω να υπάρχει κάποιος που να κατάλαβε τι θες...

Αν μπορείς γίνε πιο σαφείς, ώστε να σε βοηθήσει κάποιος.

Για παράδειγμα, σε ποια γλώσσα προγραμματισμού αναφέρεσαι;

Τι εννοείς να βάλεις χρονόμετρο στον πίνακα;

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

συγνωμη εχετε δικιο.. πχ σε ενα παρκινγκ περναει την εισοδο το αυτοκινητο γεμιζει ο πινακασ 1,1 μετα 1,2 1,3 κ παει λεεγοντας και ναξεκιναει χρονοσ timer σε καθε αυτοκινητο που εχει θεση κ οροφο και κατα την εξοδο να σταματαει ο χρονοσ αφου ο χρηστησ δωσει θεση κ οροφο που ηταν,,

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν, έτσι όπως ρωτάς δεν νομίζω να υπάρχει κάποιος που να κατάλαβε τι θες...

Αν μπορείς γίνε πιο σαφείς, ώστε να σε βοηθήσει κάποιος.

Για παράδειγμα, σε ποια γλώσσα προγραμματισμού αναφέρεσαι;

Τι εννοείς να βάλεις χρονόμετρο στον πίνακα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

γλωσσα c.. ειναι ενα παρκινγκ 3 οροφων με 3 θεσεις.. καθε φορα που θα μπαινει αυτοκινητο να ξεκιναει ενα timer για το ποση ωρα θα κατσει στο παργκινγ.. πωσ θα ξερω ποιο αθτοκινητο απο τον 1 οροφο πχ ποσο εκατσε? θα παιξω με τον πινακα,, εγραψα κωδικα που στην εξοδο ζηταει τον χρηστη να δωσει οροφο , θεση και να του βγαζει ποσο να πληρωσει,, αλλα σκεφτομαι πωσ να γινει πιο βελτιστο η να δινω κωδικο στον καθενα και να το εισαγει κατα την εξοδο για να ξερω πιοιοσ ειναι,,,

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά δε νομίζω να χρειάζεσαι timer. Δε χρειάζεται να κοιτάς κάθε sec αν θα γίνει κάτι.

Μια δομή που θα έχει την ώρα του συμβάντος (time), και τον τύπο του (Eisagogh-Exagogh) πιστεύω αρκεί.

Μετά θα χειρίζεσαι μια λίστα με τέτοιες δομές (σαν ιστορικό) μέσω συναρτήσεων AddCar, RemoveCar, IsFull ,....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

οποτε βαζω ωρα συστηματοσ στην εισοδο καταγραφη και κατα την εξοδο να κανει αφαιρεση τη ωρα που μπηκε με την ωρα που βγηκε και να του λεει ποσο εκατσε,,

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

οποτε βαζω ωρα συστηματοσ στην εισοδο καταγραφη και κατα την εξοδο να κανει αφαιρεση τη ωρα που μπηκε με την ωρα που βγηκε και να του λεει ποσο εκατσε,,

 

Ναι, σου έγραψα ενδεικτικό κώδικα μιας πιθανής υλοποίησης...

 

 

 

>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdbool.h>        // C99
#include <windows.h>

#define NFLOORS            3
#define NSPOTS_PER_FLOOR    3
#define NSPOTS            (NFLOORS * NSPOTS_PER_FLOOR)

#define MAXLEN_CAR_DRIVER    (35+1)
#define MAXLEN_CAR_PLATE    (15+1)

#define VALID_SPOTID(id)    ( (id) > -1 && (id) < NSPOTS )
#define VALID_FLOORID(id)    ( (id) > -1 && (id) < NFLOORS )

#define FREE(p)            \
do {                \
   if ( (p) ) {        \
       free(p);    \
       (p) = NULL;    \
   }            \
}while(0)

/* portable altenative to Windows' system("pause") ... to be used with fgets instead of scanf */
#define pressENTER()                            \
   do{                                \
       char mYcHAr;                        \
       printf("\npress ENTER...");                \
       while ( (mYcHAr=getchar()) != '\n' && mYcHAr != EOF )    \
           ;                        \
   }while(0)


typedef struct Car {
   char driver[MAXLEN_CAR_DRIVER];
   char plate[MAXLEN_CAR_PLATE];
}Car;

typedef struct TimeInfo {
   time_t start;
   time_t end;
}TimeInfo;

typedef struct Spot {
   int     id;
   int     floor;
   Car      *car;
   TimeInfo *timeInfo;
}Spot;

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
bool spot_init( Spot *spot )
{
   if ( !spot )
       return false;

   spot->id     = -1;
   spot->floor     = -1;
   spot->car    = NULL;
   spot->timeInfo    = NULL;

   return true;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
bool spot_cleanup( Spot *spot )
{
   if ( !spot )
       return false;

   FREE(spot->car);
   FREE(spot->timeInfo);

   return spot_init(spot);
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
bool spot_set( Spot *spot, int idSpot, int idFloor, Car *car, TimeInfo *timeInfo )
{
   if ( !spot )
       return false;

   if ( VALID_SPOTID(idSpot) )
       spot->id = idSpot;

   if ( VALID_FLOORID(idFloor) )
       spot->floor = idFloor;

   if ( NULL != car )
       memmove(spot->car, car, sizeof(Car) );

   if ( NULL != timeInfo )
       memmove(spot->timeInfo, timeInfo, sizeof(TimeInfo) );

   return true;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
bool spot_register_car( Spot *spot, const char *driver, const char *plate )
{
   if ( !spot || !driver || !plate )
       return false;

   printf( "--- Registering a car at Spot %d ---\n", spot->id );
   if ( NULL != spot->car ) {
       puts( "--- the spot is already occupied ---\n" );
       return false;
   }

   spot->car = calloc(1, sizeof(Car) );
   if ( !spot->car ) {
       puts( "*** INTERNAL ERROR: POSSIBLY OUT OF MEMORY ***" );
       return false;
   }
   spot->timeInfo = calloc(1, sizeof(TimeInfo));
   if ( !spot->timeInfo ) {
       puts( "*** INTERNAL ERROR; POSSIBLY OUT OF MEMORY ***" );
       FREE( spot->car );
       return false;
   }

   strncpy( spot->car->driver, driver, MAXLEN_CAR_DRIVER-1 );
   strncpy( spot->car->plate, plate, MAXLEN_CAR_PLATE-1 );

   spot->timeInfo->start = time(NULL);

   printf( "--- car \"%s\" was successfully registered ---\n\n", plate );
   return true;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
double spot_unregister( Spot *spot )
{
   double ret = -1.0d;

   if ( !spot )
       return ret;

   printf( "--- UnRegistering Spot %d ---\n", spot->id );
   if ( NULL == spot->car ) {
       puts( "--- the spot is already vacant ---\n" );
       return ret;
   }
   if ( NULL == spot->timeInfo ) {
       puts( "!!! ALERT: The car in this spot was NOT registered !!!\n\n" );
       return ret;
   }

   ret = difftime( time(NULL), spot->timeInfo->start );
   printf( "--- car \"%s\" was successfully unregistered ---\n", spot->car->plate );
   printf( "--- PARKING DURATION IN SECONDS: %g ---\n\n", ret );

   FREE( spot->car );
   FREE( spot->timeInfo );

   return ret;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
bool spot_print( Spot *spot )
{
   bool ret = true;

   if ( !spot )
       return false;

   if ( !VALID_SPOTID(spot->id) ) {
       puts( "*** ERROR: Invalid spot id ***" );
       return false;
   }
   if ( !VALID_FLOORID(spot->floor) ) {
       puts( "*** ERROR: Invalid floor ***" );
       return false;
   }

   printf( "Spot #%d (on floor %d): ", spot->id, spot->floor );
   printf( "%s ", NULL == spot->car ? "vacant" : spot->car->plate );

   struct tm *tmTemp = NULL;
   if ( NULL == spot->car )
       putchar('\n');
   else if ( NULL == spot->timeInfo )
       puts( "!!! ALERT: an UNREGISTERD car detected !!!" );
   else if (NULL == (tmTemp = localtime(&spot->timeInfo->start)) ) {
       puts( "*** ERROR : invalid statring time ***" );
       ret = false;
   }
   else
       printf( "| since: %s", asctime(tmTemp) );

   return ret;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
bool parking_init( Spot parking[NFLOORS][NSPOTS_PER_FLOOR] )
{
   bool ret = true;

   if ( !parking )
       return false;

   for (int i=0; i < NFLOORS; i++)
   {
       for (int j=0; j < NSPOTS_PER_FLOOR; j++)
       {
           int idSpot = i * NSPOTS_PER_FLOOR + j;
           if ( !spot_init(&parking[i][j])
           || !spot_set(&parking[i][j], idSpot, i, NULL, NULL)
           ){
               ret = false;
               break;
           }
       }
   }

   putchar('\n');
   return ret;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
bool parking_cleanup( Spot parking[NFLOORS][NSPOTS_PER_FLOOR] )
{
   if ( !parking )
       return false;

   for (int i=0; i < NFLOORS; i++)
       for (int j=0; j < NSPOTS_PER_FLOOR; j++)
           spot_cleanup( &parking[i][j] );

   return true;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
bool parking_print( Spot parking[NFLOORS][NSPOTS_PER_FLOOR], const char *heading )
{
   if ( !parking )
       return false;

   if ( heading )
       printf( "%s", heading );

   for (int i=0; i < NFLOORS; i++)
       for (int j=0; j < NSPOTS_PER_FLOOR; j++)
           if ( !spot_print( &parking[i][j] ) )
               return false;
   return true;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
int main( void )
{
   struct {
       char *driver;
       char *plate;
   } car[ NSPOTS ] = {
       {"Mitsos",     "MIT-1234"},
       {"Vaggos",     "VAG-1234"},
       {"Mpampis",     "MPA-1234"},
       {"Stellaras",     "STE-1234"},
       {"Antigoni",     "ANT-1234"},
       {"Persefoni",     "PER-1234"},
       {"Diomidis",     "DIO-1234"},
       {"Maria",     "MAR-1234"},
       {"Giannis",     "GIA-1234"}
   };

   srand( time(NULL) );

   Spot parking[NFLOORS][NSPOTS_PER_FLOOR];

   parking_init(parking);
   parking_print( parking, "___PARKING OVERVIEW___\n" );
   pressENTER();

   // register NSPOTS cars at random parking-spots
   printf( "Auto registering %d cars at random spots...\n", NSPOTS );
   for (int n=0; n < NSPOTS; n++ ) {
       int i = rand() % NFLOORS;
       int j = rand() % NSPOTS_PER_FLOOR;
       Sleep( 1000 * (rand() % 3) );
       spot_register_car( &parking[i][j], car[n].driver, car[n].plate );
   }

   parking_print( parking, "___PARKING OVERVIEW___\n" );
   pressENTER();

   // unregister 6 random parking-spots
   printf( "Auto un-registering %d random spots...\n\n", 6 );
   for (int n=0; n < 6; n++ ) {
       int i = rand() % NFLOORS;
       int j = rand() % NSPOTS_PER_FLOOR;
       spot_unregister( &parking[i][j] );
   }

   parking_print( parking, "___PARKING OVERVIEW___\n" );

   parking_cleanup(parking);

   pressENTER();
   exit( EXIT_SUCCESS );
}

 

 

 

Έξοδος...

 

 

>
___PARKING OVERVIEW___
Spot #0 (on floor 0): vacant
Spot #1 (on floor 0): vacant
Spot #2 (on floor 0): vacant
Spot #3 (on floor 1): vacant
Spot #4 (on floor 1): vacant
Spot #5 (on floor 1): vacant
Spot #6 (on floor 2): vacant
Spot #7 (on floor 2): vacant
Spot #8 (on floor 2): vacant

press ENTER...
Auto registering 9 cars at random spots...
--- Registering a car at Spot 3 ---
--- car "MIT-1234" was successfully registered ---

--- Registering a car at Spot 7 ---
--- car "VAG-1234" was successfully registered ---

--- Registering a car at Spot 6 ---
--- car "MPA-1234" was successfully registered ---

--- Registering a car at Spot 3 ---
--- the spot is already occupied ---

--- Registering a car at Spot 7 ---
--- the spot is already occupied ---

--- Registering a car at Spot 6 ---
--- the spot is already occupied ---

--- Registering a car at Spot 8 ---
--- car "DIO-1234" was successfully registered ---

--- Registering a car at Spot 8 ---
--- the spot is already occupied ---

--- Registering a car at Spot 4 ---
--- car "GIA-1234" was successfully registered ---

___PARKING OVERVIEW___
Spot #0 (on floor 0): vacant
Spot #1 (on floor 0): vacant
Spot #2 (on floor 0): vacant
Spot #3 (on floor 1): MIT-1234 | since: Fri Nov 09 16:01:09 2012
Spot #4 (on floor 1): GIA-1234 | since: Fri Nov 09 16:01:24 2012
Spot #5 (on floor 1): vacant
Spot #6 (on floor 2): MPA-1234 | since: Fri Nov 09 16:01:13 2012
Spot #7 (on floor 2): VAG-1234 | since: Fri Nov 09 16:01:11 2012
Spot #8 (on floor 2): DIO-1234 | since: Fri Nov 09 16:01:20 2012

press ENTER...
Auto un-registering 6 random spots...

--- UnRegistering Spot 3 ---
--- car "MIT-1234" was successfully unregistered ---
--- PARKING DURATION IN SECONDS: 37 ---

--- UnRegistering Spot 4 ---
--- car "GIA-1234" was successfully unregistered ---
--- PARKING DURATION IN SECONDS: 22 ---

--- UnRegistering Spot 6 ---
--- car "MPA-1234" was successfully unregistered ---
--- PARKING DURATION IN SECONDS: 33 ---

--- UnRegistering Spot 3 ---
--- the spot is already vacant ---

--- UnRegistering Spot 3 ---
--- the spot is already vacant ---

--- UnRegistering Spot 1 ---
--- the spot is already vacant ---

___PARKING OVERVIEW___
Spot #0 (on floor 0): vacant
Spot #1 (on floor 0): vacant
Spot #2 (on floor 0): vacant
Spot #3 (on floor 1): vacant
Spot #4 (on floor 1): vacant
Spot #5 (on floor 1): vacant
Spot #6 (on floor 2): vacant
Spot #7 (on floor 2): VAG-1234 | since: Fri Nov 09 16:01:11 2012
Spot #8 (on floor 2): DIO-1234 | since: Fri Nov 09 16:01:20 2012

press ENTER...

 

 

 

Κάνει register 9 αυτοκίνητα σε τυχαίες θέσεις, με τυχαίες ενδιάμεσες παύσεις από 0 έως 3 δευτερόλεπτα (αλλιώς γίνονται όλα τα αμάξια registered την ίδια ώρα, αφού η time μετράει δευτερόλεπτα).

 

Κατόπιν κάνει un-register 6 τυχαίες θέσεις και γράφει πόσα δευτερόλεπτα έμειναν δεσμευμένες από το αμάξι.

 

Το struct TimeInfo δεν το χρειάζεσαι, μπορείς να κρατάς μονάχα την ώρα του registration της θέσης απευθείας σε μια μεταβλητή, στο struct Spot (κι εγώ έχω unused το πεδίο: Spot->timeInfo->end ... το έβαλα στην αρχή σκεπτόμενος διαφορετική υλοποίηση, τελικά δεν το χρειάστηκα, αλλά βαρέθηκα να το αφαιρέσω μετά από τον κώδικα).

 

Η συνάρτηση spot_unregister() σου επιστρέφει την ώρα που έμεινε δεσμευμένη η θέση σε δευτερόλεπτα, έτσι ώστε αν θέλεις να μπορείς να χρησιμοποιήσεις την τιμή επιστροφής της για να υπολογίσεις π.χ. το κόστος χρέωσης (σε περίπτωση σφάλματος επιστρέφει -1.0d... δεν το ελέγχω στον κώδικά, κανονικά πρέπει).

 

Κανονικά υποθέτω πως τα un-registrations θα πρέπει τα κάνεις βάσει αυτοκινήτου (π.χ. πινακίδας ή/και οδηγού).

 

Μια πιθανή υλοποίηση για τον συγκεκριμένο κώδικα θα μπορούσε να είναι μια έξτρα συνάρτηση που θα ψάχνει στο πάρκινγκ για αυτά τα στοιχεία και θα επιστρέφει έναν δείκτη στο Spot που βρέθηκαν (ή τα indices του spot από τον πίνακα parking). Αυτό τον δείκτη μπορούμε κατόπιν να τον περάσουμε στην spot_unregister().

 

Επίσης, δεν είναι καθόλου απαραίτητο τα πεδία spot->car και spot->timeInfo να υλοποιηθούν ως δείκτες σε struct Car και struct TimeInfo, αντίστοιχα. Μπορούν κάλλιστα να είναι απλά struct (το TimeInfo δεν χρειάζεται καν, όπως αναφέρω παραπάνω). Έτσι θα γλιτώσεις και τα malloc()/free(), αλλά μάλλον θα χρειαστείς κάποιες σταθερές που θα σηματοδοτούν πως αυτά τα πεδία είναι valid (εγώ απλώς το ξεκίνησα με δείκτες, οπότε το τέλειωσα κι έτσι, οπότε τα κάνω validate με NULL στον κώδικα).

 

Τέλος, η συνάρτηση Sleep(millisecond) είναι Windows specific (για αυτό και το #include <windows.h> στην αρχή. Αν είσαι με gcc σε posix πλατφόρμα, μπορείς να δοκιμάσεις την sleep() με #include <unistd.h> ... αν και τη συγκεκριμένη συνάρτηση δεν την χρειάζεσαι για το πρόγραμμά σου (εγώ απλώς την έβαλα για να μεσολαβούν τυχαίες τεχνητές καθυστερήσεις ανάμεσα στα αυτόματα registrations).

 

EDIT:

 

Διόρθωση bug λόγω typo, στην spot_register(), από...

 

>
       if ( NULL != timeInfo )
               memmove(spot->timeInfo, timeInfo, sizeof(timeInfo) );

 

σε ...

 

>
       if ( NULL != timeInfo )
               memmove(spot->timeInfo, timeInfo, sizeof(TimeInfo) );

 

Δηλαδή sizeof(TimeInfo) αντί για sizeof(timeInfo) ... στο context της spot_register() ο timeInfo είναι απλώς ένας δείκτης, ενώ εμείς θέλουμε να κάνουμε memmove το μέγεθος του struct TimeInfo.

 

Επεξ/σία από migf1
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

σε ευχαριστω πολυ! καμμια σχεση με αυτο που εγραψα ,θα πατησω πανω στο δικο σου...

 

Κανονικά υποθέτω πως τα un-registrations θα πρέπει τα κάνεις βάσει αυτοκινήτου (π.χ. πινακίδας ή/και οδηγού).//εχω καμερα που κατα την εισοδο του αυτοκινητου πριν σηκωθει η μπαρα θα φωτογραφιζει την πινακιδα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ξανακοίταγα τον κώδικα και εντόπισα ένα typo που παράγει bug. Το διόρθωσα με edit (βασικά τσέκαρέ τον και μόνος σου τον κώδικα, μπορεί να μου 'χουν ξεφύγει κι άλλα... μη σε πάρω στο λαιμό μου τζάμπα και βερεσέ :) )

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...