C Programming Tutorial

 
 
 
 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <ctype.h>
#include <math.h>


void showstatus( ) ;
void allotlift ( int *, int, int, char ) ;

/* show current status, i.e. the floor no. on which
   the lifts are standing */
void showstatus ( int *lf )
{
    int i ;

    for ( i = 0 ; i < 5 ; i++ )
        printf ( \"Lift : %d is on %d floor\\n\", i, lf[i] ) ;
}

/* allot the lift to the user */
void allotlift ( int *lf, int flnos, int flnot, char d )
{
    /* struct p to store the difference between 2 lifts */
    struct p
    {
        int lfno[5] ;
         int pos[5] ;
        int diff[5] ;
    } arr ;

    int lno = -1 ;      /* to store the lift no. that can be made available */
    int i, j, k, t1, t2, t3 ;

    /* initialize array */
    for ( i = 0; i < 5; i++ )
    {
        arr.lfno[i] = i ;
        arr.pos[i] = 0 ;
        arr.diff[i] = 0 ;
    }

    while ( lno == -1 )
    {
        /* get the current position of a lift */
        for ( i = 0 ; i < 5; i++ )
            arr.pos[i] = lf[i] ;

        for ( i = 0; i < 5; i++ )
        {
            /* get the diff. between floor on which lift is standing
               and the floor on which the user is standing */
            arr.diff[i] = abs ( arr.pos[i] - flnos ) ;
        }

        /* sort array */
        for ( i = 0; i < 5; i++ )
        {
            for ( j = 0; j < 4; j++ )
            {
                if ( arr.diff[i] < arr.diff[j] )
                {

                    t1 = arr.lfno[i] ;
                    t2 = arr.pos[i] ;
                    t3 = arr.diff[i] ;
                    arr.lfno[i] = arr.lfno[j] ;
                    arr.pos[i] = arr.pos[j] ;
                    arr.diff[i] = arr.diff[j] ;
                    arr.lfno[j] = t1 ;
                    arr.pos[j] = t2 ;
                    arr.diff[j] = t3 ;
                }
            }
        }

        /* check for the lift that can be alloted
           depending on the direction */
        for ( i = 0, k = 0; i < 5; i++ )
        {
            k = arr.lfno[i] ;

            if ( ( d == \'u\' ) && (
                 ( lf[k] < flnos ) ||
                 ( lf[k] == 0 ) ||
                 ( lf[k] == flnos ) ) )
            {
                lno = k ;
                break ;
            }

            if ( ( d == \'d\' ) && (
                 ( lf[k] > flnos ) ||
                 ( lf[k] == 0 ) ||
                 ( lf[k] == flnos ) ) )
            {
                lno = k ;
                break ;
            }
        }

        /* if none of the lift has been alloted */
        j = 30 ;
        if ( lno == -1 )
        {
            for ( i = 0; i < 5; i++ )
            {
                if ( j > arr.diff[i] )
                {
                    j = arr.diff[i] ;
                    lno = i ;
                }
            }
        }
    }

    printf ( \"\\nThe lift available to you would be: %d\\n\\n\", lno ) ;

    lf[lno] = flnot ;
}

/* the main menu */
int showmenu( )
{
    int c ;

    printf ( \" -------------------- Lift Program -------------------- \\n\" ) ;
    printf ( \" There are 5 lifts available for your service. \\n\" ) ;
    printf ( \" Select 1 if you want to use a lift. \\n\" ) ;
    printf ( \" Selecting 2 would show, for each of the 5 lifts, \\n\" ) ;
    printf ( \" the floor no. on which the lift is currently standing. \\n\" ) ;
    printf ( \" Select 3 to quit the program \\n\" ) ;
    printf ( \" ------------------------------------------------------ \\n\" ) ;
    printf ( \" 1. Do you wish to use lift?\\n\" ) ;
    printf ( \" 2. Show status of lift\\n\" ) ;
    printf ( \" 3. Exit\\n\" ) ;
    printf ( \" ------------------------------------------------------ \\n\" ) ;
    scanf ( \"%d\", &c ) ;

    return c ;
}

void validate ( int *fs, int *ft, char *d )
{
    int flnos, flnot ;
    char dir ;
    int flag ;
    unsigned char chr ;

    flnos = flnot = -1 ;
    flag = 0 ;

    while ( flnos < 0 || flnos > 29 )
    {
        printf ( \"Enter the floor no. where you are standing : \" ) ;
        scanf ( \"%d\", &flnos ) ;

        if  ( flnos < 0 || flnos > 29 )
        {
            printf ( \"\\nIncorrect floor no.! Enter floor no. in a range of 0 - 29 \\n\\n\" ) ;
            getch( ) ;
        }
    }

    while ( flag == 0 )
    {
        dir = \'j\' ;
        while ( tolower ( dir ) != \'u\' && tolower ( dir ) != \'d\' )
        {
            printf ( \"Do you wish to go up or down (up/down): \" ) ;
            fflush ( stdin ) ;
            scanf ( \"%c\", &dir ) ;
            printf ( \"\\n\" ) ;

            if ( dir != \'u\' && dir != \'d\' )
                printf ( \"Incorrect direction! Enter again\\n\" ) ;
        }

        if ( flnos == 0 && dir == \'d\' )
        {
            printf ( \"\\nYou are already standing on ground floor.\\n\" ) ;
            printf ( \"Cannot go further down.\\n\" ) ;
            getch( ) ;
            flag = 0 ;
        }
        else
            flag = 1 ;
    }
    flag = 0 ;

    while ( flag == 0 )
    {
        printf ( \"\\nEnter the floor no. where you want to go: \" ) ;
        scanf ( \"%d\", &flnot ) ;

        if ( ( flnos == 0 && flnot == 0 ) ||
             ( flnot < 0 || flnot > 29 ) ||
             ( flnos == flnot ) ||
             ( ( flnos != 0 ) && ( dir == \'d\' && ( flnos - flnot < 0 ) ) ) ||
             ( ( flnos != 0 ) && ( dir == \'u\' && ( flnot < flnos ) ) ) )
        {
            printf ( \"\\nIncorrect floor no. or trying to move to the same \\n\" ) ;
            printf ( \"floor where you are standing, or either the \\n\" ) ;
            printf ( \" direction given is incorrect or the floor number \\n\" ) ;
            printf ( \" is incorrect. Try again \\n\") ;
            flag = 0 ;
        }
        else
            flag = 1 ;
    }

    *fs = flnos ;
    *d =  dir ;
    *ft = flnot ;
}

void main( )
{
    int ch ;        /* stores the no. entered as a choice for the menu */
    int flnos ;    /* to store floor no. where the user stands */
    int flnot ;    /* to store the target floor no. */
    char dir ;     /* to store the direction */
    char chr[20] ;     /* a temporary variable */
    int lf[5] = { 0, 0, 0, 0, 0 } ;

    void validate ( int *, int *, char * ) ;

    flnos = flnot = -1 ;

    clrscr( ) ;

    while ( 1 )
    {
        /* display main menu */
        ch = showmenu( ) ;

        /* switch-case for menu options to be handled */
        switch ( ch )
        {
            case 1 :

                    /* actual program logic */
                    printf ( \"Allot lift: \\n\" ) ;
                    validate ( &flnos, &flnot, &dir ) ;
                    allotlift ( lf, flnos, flnot, dir ) ;
                    break ;

            case 2 :

                    /* getstaus */
                    printf ( \"Current status of lifts: \\n\" ) ;
                    showstatus ( lf ) ;
                    break ;

            case 3 :

                    /* exit program */
                    exit ( 0 ) ;
                    break ;

            default :

                    /* wrong choice */
                    printf ( \"Incorrect choice! try again!\" ) ;
        }

        printf ( \"\\n\\n\" ) ;
        printf ( \"Press key to continue...\" ) ;
        fflush ( stdin ) ;
        scanf ( \"%c\", &chr ) ;
    }
}