-4

Encountering several problems, you will constantly see me on here begging for help. Im very very new to C. Doing a program with about 5 functions for a school based assessment. The program is coupled with a problem definition for problems encountered in an imaginary business. There are five functions so far.

Function 1: MembershipInfo stores membership information for the company (which is like a club with a subscription/membership system)

Function 2: SelectService is supposed to display and prompt the user to choose various services that can be offered to them. It uses a struct and and an array and various ifs. The if statement does not run, or doesn't show up on the console after being built successfully.

Function 3: payment' calculates the full cost a member is to pay based on his/her membership type. The calculation outputs 0.0000.

Function 4: is like function 1 but caters for a customer who wishes to uses some of the services on an hourly rate without becoming a member. The calculations on this output 0.0000 as well.

Function 5: MemberExp is supposed to keep track of the date in which a member's membership expires and alert the user. I suppose I would have to somehow collect group the date from each member in function 1 at the time of there registration and compare it with the date when their membership expires. I have an float variable known as pay-plan used to calculate the full cost. It is the amount of months one wishes to be a member for.

I am using Xcode on El Capitan.

My Code

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

struct MembershipInfo{



float regfee;
int set;
float payplan;
char cust_fname[20];
char cust_lname[20];
char memtype[20];
char date[20];

};

/*Functions */

void MembershipInfo();
void Payment();
void SelectService();
void MemberExp();
void Accomodation();

int q;
int x=0;
int set;
float memcost;
float Fullcost;
char selection[20];


/*MAIN FUNCTION */


int main()

{


char decision[20];

printf("Are you registering a member or is it accomodation?, type in lowercase \n");
scanf( "%s" , decision);

if ( strcmp (decision, "member") ==0)
{
    MembershipInfo();

}

else {
    ( strcmp(decision, "accomodation") ==0);
    Accomodation();
}


MemberExp();

}


/* Function used to store membership information */
void MembershipInfo()
{
struct MembershipInfo member[x];
printf("Press 1 to continue or any other character to cancel \n ");
scanf( "%d", &set);

if (set==1) {

while (set==1) {
    x++ ;
    printf( "Please enter the first name of member\n");
    scanf( "%s", member[x].cust_fname);

    printf( "Please enter the last name of member\n");
    scanf( "%s", member[x].cust_lname);

    printf( "Please enter Membership type:\n Silver\n Gold\n Platinum\n");
    scanf( "%s", member[x].memtype);

    SelectService();

    printf("Please enter payment plan\n"); /* An integer value from 1 to 12 which determines how much months are being paid for */
    scanf( "%f", &member[x].payplan);


    Payment();




    printf("Do you have another member to register? Type 1 to continue or any number to End\n");
    scanf( "%d", &set);

}
    main();

    }
main();

}


/* Function used to calculate the amount to be paid by each member */
void Payment()
{

struct MembershipInfo member[x];

if (strcmp(member[x].memtype, "Silver") ==0) {
    memcost = 100;

if (strcmp(member[x].memtype, "Gold") ==0) {
    memcost = 180;

if (strcmp(member[x].memtype, "Platinum") ==0) {
    memcost = 300;
}
}
}

Fullcost = memcost * member[x].payplan ;
printf(" The Full cost is %f \n", Fullcost);


}


/* Function to Select Services for Members */

void SelectService()
{

struct MembershipInfo member[x];
if (strcmp(member[x].memtype, "Silver") ==0) {
    printf("Check");
}

}



/*Function to determine Membership Expiration*/

void MemberExp()
{



}

void Accomodation()
{

struct Accomodationinfo{
    char ac_fname[20];
    char ac_lname[20];
    int hours;
    char date[30];
    char selection[20];
    int Fullcost; //Full Cost is an integer and not a float because hours will be rounded off and therefore customer will pay a rounded off value



};


struct Accomodationinfo customer[x];
printf("Press 1 to continue or any other number to cancel \n");
scanf( "%d" , &set);
if (set==1) {


    while (set==1){
    x++;
    printf("Please enter customer's first name \n");
    scanf( "%s", customer[x].ac_fname);

    printf("Please enter customer's last name \n");
    scanf( "%s" , customer[x].ac_lname);

printf("You have either the Gym, Sports Centres, or Music Studio available\n");
scanf( "%s" , customer[x].selection);

printf("How many hours?\n");
scanf( "%d", &customer[x].hours);

customer[x].Fullcost = customer[x].hours * 8;
printf("The full cost is %f  per hour \n" , Fullcost );
    getchar();
    printf( "%s %s will have access to %s for %d hours \n", customer[x].ac_fname, customer[x].ac_lname , customer[x].selection, &customer[x].hours );
        getchar();
    printf("Do you have another customer for accomodation? Press 1 to continue or any other number to return to main \n ");
    scanf( "%d" , &set);
    }
    main();
}
main();

}

SelectService Function

void SelectService()
{
    if (strcmp(Members[x].memtype, "Silver") ==0)
    {
        printf( "You have available any three of the following(Notice      the casino is not available):\n");
        printf( "Swimming Pools \n Spas \n Bars \n Arcade\n Sports Centres\n Resource Room\n Theatre\n Gym\n Food Courts\n Music Studio\n");
        for (q=0; q<4; q=q+1) {
            printf( "Please enter selection\n");
            scanf( "%s" , selection[q]);
            printf( "Your chosen selections are %s , %s and %s\n" , selection[1], selection[2], selection[3]);
    }


    if (strcmp(Members[x].memtype, "Gold") ==0) {
        printf( "You have available any five of the following\n");
        printf( "Casino \n Swimming Pools \n Spas \n Bars \n Arcade\n Sports Centres\n Resource Room\n Theatre\n Gym\n Food Courts\n Music Studio\n");
        for (q=0; q<6; q=q+1) {
            printf( "Please enter selection\n");
            scanf( "%s" , &selection[q]);


        }
        if (strcmp(Members[x].memtype, "Platinum") ==0) {
            printf( "You have all services available");
        }
    }
}

}

EDIT: The program keeps skipping over the function SelectService idk . Idk how to make this clearer. Try running it in your own compilers and access the problem?

Box Box Box Box
  • 5,094
  • 10
  • 49
  • 67
Yuan
  • 5
  • 3
  • 2
    Please post a [Minimal, Complete, and Verifiable example](http://stackoverflow.com/help/mcve). – R Sahu Jan 14 '16 at 03:05
  • C++ disallows calling `main()`. Why not use the proper looping constructs within `main` itself? – PaulMcKenzie Jan 14 '16 at 03:20
  • 1
    Have you tried stepping through your code with a debugger? – user253751 Jan 14 '16 at 03:51
  • I have no idea what any of you are saying... @PaulMcKenzie Im using C not C++ . There has been no issue regarding that – Yuan Jan 14 '16 at 04:00
  • @immibis Thank you Ill try that – Yuan Jan 14 '16 at 04:02
  • Why is the question tagged both `C` and `C++`? – CinCout Jan 14 '16 at 04:41
  • @Yuan *Try running it in your own compilers* -- The question is tagged as both C and C++. C++ does not allow calling `main()`, so it will not compile successfully for a standard ANSI C++ compiler. See here: http://stackoverflow.com/questions/2128321/can-main-function-call-itself-in-c What I am saying is that instead of calling `main` recursively, write the loop inside of `main` using a `while` or a `do-while` loop. – PaulMcKenzie Jan 14 '16 at 07:18
  • for readability and ease of understanding by us humans: (never use tabs for indenting) indent the code after every opening brace '{'. un-indent the code before every closing brace '}'. separate code blocks (for, if, else, while, do...while, switch, case, default) by a blank line – user3629249 Jan 14 '16 at 15:05
  • to start, the statement: `#include ` needs to be inserted at the beginning of the file. – user3629249 Jan 14 '16 at 15:08
  • when compiling, always enable all the warnings, then fix those warnings. (for gcc, at a minimum use: `-Wall -Wextra -pedantic` (I also use: `-Wconversion -std=c99`) – user3629249 Jan 14 '16 at 15:10
  • this line: `( strcmp(decision, "accomodation") ==0);` does nothing! what were you expecting it to do? – user3629249 Jan 14 '16 at 15:12
  • this line: `printf( "%s %s will have access to %s for %d hours \n", customer[x].ac_fname, customer[x].ac_lname , customer[x].selection, &customer[x].hours );` is passing a pointer for the %d format specifier, suggest removing the `&` from the last parameter – user3629249 Jan 14 '16 at 15:14
  • the struct tag name and a function are both the same. While a modern compiler is able to distinguish the two by the context of their usage, it make the understanding of the code much more difficult. suggest changing one of the identifiers – user3629249 Jan 14 '16 at 15:18
  • in function: `Payment()`, the braces for the `if` statements are incorrectly placed, especially the closing brace for the first `if` statement. The result is the result is: if 'silver', then `memcos`t is set to 100 in all other cases, `memcost` is not set . When `memcost` is not set, then the calculation of `Fullcost` is using an uninitialized variable. – user3629249 Jan 14 '16 at 15:27
  • When prototyping functions that contain no parameters, place `void` between the parens, example: `void Payment( void );`. Note: the `void` is not necessary in the actual function signature – user3629249 Jan 14 '16 at 15:30
  • regarding this line in 'main()`: `scanf( "%s" , decision);`. 1) The '%s' format specifier must be limited to a max number of characters the user is allowed to input, so the receiving buffer 'decision' is not overflowed.. Remembering that a '%s' format specifier, in scanf() will cause a NUL byte to be appended to the input string, so the length modifier must be 1 less than the length of the input buffer 'decision'. 2) always check the returned value (not the parameter value) to assure the operation was successful. Suggest: `if( 1 != scanf( "%19s" , decision) { // handle error }` – user3629249 Jan 14 '16 at 15:37
  • the posted code contains some 'magic' numbers. Like 20 and 30. 'magic' numbers make the code much more difficult to understand, debug, maintain. Suggest; use #define's or an enum to give those 'magic' numbers meaningful names, then use those meaningful names throughout the code. example: `#define MAX_BUF_LEN (20)` and `#define MAZ_DATE_LEN (30)`. note: #define names are, by convention, all caps with underscores separating the root words. – user3629249 Jan 14 '16 at 15:42
  • in the `Accomodation()` function: Why the random calls to `getchar()`, (which may or may not require the user to enter some key stroke) (it may not require the user to enter some key stroke because the prior newline from the last field entered by the user may still be in the input stream (stdin) – user3629249 Jan 14 '16 at 15:50
  • in general, the `main()` function is used to coordinate activities, implement an outermost loop, initialize data, etc. It should never be called by the code. `member` and `accomodation` are too much typing by the user. Suggest inside a `while()` loop, print a menu (which includes an `exit/quit` choice) such that the user only has to enter one character AND the spelling is: `accommodation` – user3629249 Jan 14 '16 at 16:06
  • @user3629249 I dont know how to do that( re exit/quit choice). Yes Im aware I misspelled accommodation but that's the least of my problems . Thanks though. But does calling main() in code prevent it from coordinating its activities? It's not apart of the problem really is it? – Yuan Jan 15 '16 at 00:55
  • @user3629249 Just realizing you're responsible for all the comments, thanks a great deal. ( strcmp(decision, "accomodation") ==0); runs the accommodation function if the word accomodation is in decision.... – Yuan Jan 15 '16 at 00:59
  • actually, calling `main()` recursively (as the posted code is doing) is a big part of the problem. I'll post an answer that outlines what should be done in the code. – user3629249 Jan 15 '16 at 01:05
  • THANK YOU SOO MUCH @user3629249 – Yuan Jan 15 '16 at 01:10
  • @user3629249 I just realised I left out the actual contents of the SelectService function. I have printf("check"); there to check maybe if the if statement was working. Im going to edit the question to show you – Yuan Jan 15 '16 at 03:49

1 Answers1

0

the following code incorporates the comments, cleanly compiles, and is one possible implementation.

You will probably want to add more features

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>



#define MAX_DATE_LEN    (30)
#define MAX_MEMBERS     (100)
#define MAX_BUFFER_LEN  (20)
#define COST_PER_HOUR   (8)

struct MembershipInfo_t
{
    float regfee;
    int   set;
    unsigned payplan;
    char  cust_fname[ MAX_BUFFER_LEN ];
    char  cust_lname[ MAX_BUFFER_LEN ];
    char  memtype[ MAX_BUFFER_LEN ];
    char  date[ MAX_BUFFER_LEN ];
};


// prototypes
void processMembershipInfo( void );
void Payment( void );
void SelectService( void );
void MemberExp( void );
void processAccommodation( void );

//global data
struct MembershipInfo_t Members[ MAX_MEMBERS ];
int   numMembers = 0;

int q;
int x=0;
int set;
unsigned memcost;
unsigned Fullcost;
char selection[ MAX_BUFFER_LEN ];


/*MAIN FUNCTION */


int main( void )
{
    int done = 0;

    while( !done  && (x < MAX_MEMBERS) )
    {
        // clear stdin
        int ch;
        while( (ch = getchar()) != EOF && '\n' != ch );

        // display menu
        printf( "\nm: Member processing");
        printf( "\na: Accommodiation processing:");
        printf( "\nq: quit");
        printf( "\n");

        // get user menu selection
        int choice = 0;
        choice = getchar();

        // process the user menu choice
        switch( tolower(choice) )
        {
            case 'a':
                processAccommodation();
                break;

            case 'm':
                processMembershipInfo();
                break;

            case 'q':
                done = 1;
                break;

            default:
                printf( "\n %c is not a valid entry\n", (char)choice);
                break;
        } // end switch

        if( !done ) x++;  // step to next member entry in Members[] array
    } // end while


    if( x )
    {// then some members entered
        MemberExp();
    }
    return 0;
} // end function main()


/* Function used to store membership information */
void processMembershipInfo()
{
    printf( "Please enter the first name of member\n");
    scanf( " %19s", Members[x].cust_fname);

    printf( "Please enter the last name of member\n");
    scanf( " %19s", Members[x].cust_lname);

    printf( "Please enter Membership type:\n Silver\n Gold\n Platinum\n");
    scanf( " %19s", Members[x].memtype);

    SelectService();

    do
    {
        printf("Please enter payment plan range: 1...12 months\n"); /* An integer value from 1 to 12 which determines how much months are being paid for */
        scanf( "%u", &Members[x].payplan);
    } while( (1 > Members[x].payplan) && (12 < Members[x].payplan) );


    Payment();
} // end function: processMembershipInfo


/* Function used to calculate the amount to be paid by each member */
void Payment()
{
    if (strcmp(Members[x].memtype, "Silver") ==0)
    {
        memcost = 100;
    }

    else if (strcmp(Members[x].memtype, "Gold") ==0)
    {
        memcost = 180;
    }

    else if (strcmp(Members[x].memtype, "Platinum") ==0)
    {
        memcost = 300;
    }

    Fullcost = memcost * Members[x].payplan ;
    printf(" The Full cost is %u \n", Fullcost);
} // end function: Payment


/* Function to Select Services for Members */
void SelectService()
{
    if (strcmp(Members[x].memtype, "Silver") ==0)
    {
        printf("Check");
    }
}



/*Function to determine Membership Expiration*/

void MemberExp()
{

}

struct Accomodationinfo
{
    char       ac_fname[ MAX_BUFFER_LEN ];
    char       ac_lname[ MAX_BUFFER_LEN ];
    unsigned   hours;
    char       date[ MAX_DATE_LEN ];
    char       selection[ MAX_BUFFER_LEN ];
    unsigned   Fullcost; //Full Cost is an integer and not a float because hours will be rounded off and therefore customer will pay a rounded off value
};

void processAccommodation()
{

    struct Accomodationinfo customer;

    printf("Press 1 to continue or any other number to cancel \n");

    printf("Please enter customer's first name \n");
    scanf( " %19s", customer.ac_fname);

    printf("Please enter customer's last name \n");
    scanf( " %19s" , customer.ac_lname);

    printf("You have either the Gym, Sports Centres, or Music Studio available\n");
    scanf( " %19s" , customer.selection);

    printf("How many hours?\n");
    scanf( "%u", &customer.hours);

    customer.Fullcost = customer.hours * COST_PER_HOUR;
    printf("The full cost is $%u at $%u per hour \n", Fullcost, COST_PER_HOUR );

    printf( "%s %s will have access to %s for %u hours \n",
            customer.ac_fname,
            customer.ac_lname ,
            customer.selection,
            customer.hours );
} // end function: processAccommodation
user3629249
  • 16,402
  • 1
  • 16
  • 17