-
pin number question
This question has been posted here before, but I need a slightly more detailed answer. So here goes. I am working on a project that is, basically, an atm simulation. The part I'm having problems with (at the moment) is the PIN number. For this exercise, the pin has to be any 4 digit number. Meaning, the program won't be looking for a specific number, but rather any number with 4 digits. Any suggestions on how to do this?
melee
-
Can the pin number begin with zeros (i.e. 0001)? If yes, you'd probably want to read it as a string.
-
yes, the pin can begin with a zero. But how does one read it as a string and then verify that it does indeed have 4 digits? (sorry for the newbie questions)
melee
-
Read in the number using a char array - use fgets() reading stdin -- all defined in stdio.h
Check that each character of the string is a number - use isdigit() from ctype.h
Check that the length of the input string is exactly four chars - strlen() from string.h
-
If you read it in as a string, use strlen() to find out how many characters you have, then isdigit() to verify each is a number, you can then be sure that atoi() will give you a valid integer.
-
-
Ok, sorry It took me so long to get to this, but I'm still having problems. Part of my confusion lies in the fact that we have not covered the strlen or fgets functions in my class as of yet. I put the relevant code here so someone wiser can point me in the right direction.
Code:
int main(void)
{
/*Local Definitions*/
int count = 0;
char pin[4];
float bal = 1000;
int dep;
int with;
int pinlen;
int mainchoice;
int check = 0;
/*Statements*/
printf("\tWelcome to the COP2220 ATM");
printf("\n\t Please enter your 4 digit PIN \n ");
scanf("%c", &pin);
if (strlen(*pin) = 4)
I didn't post any of the other code because (1.) This is the point at which I am stuck. The rest of my code surely contains numerous errors, but I'll do my best to figure those out on my own. and (2.) This is where my compiler stops with an error (invalid conversion from "char"to "const char")
any help?
melee
-
Code:
if (strlen(*pin) = 4)
1) You don't ever dereference arrays.
2) Just use the name of the array, which will be in effect a pointer to its first element.
3) You use == for equality. = for assignment.
Quzah.
-
Aha...problem solved. Let's see if I can go a few minutes without causing another. Thanks!
melee
-
Ok, I'm a bit farther (at least syntactical error-wise). Here's my updated code. Currently I'm stuck on the balinq function. Any help would be greatly appreciated. Thanks in advance.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
/*Prototype Declarations*/
float fastcash (float bal, float fwith);
float Withdraw (float bal, float with);
float Deposit (float bal, float dep);
void balinq (float bal);
void endtrans (void);
int mainchoice (void);
int main(void)
{
/*Local Definitions*/
int count = 0;
char pin[4];
float bal = 1000;
int dep;
int with;
int choice;
int check = 0;
/*Statements*/
printf("\tWelcome to the COP2220 ATM");
printf("\n\t Please enter your 4 digit PIN \n ");
scanf("%c", &pin);
if (strlen(pin) != 4)
printf("\a\nThat PIN is incorrect. Please re-enter your 4 digit PIN \n");
++count;
if (count == 3)
void endtrans (void);
int mainchoice (choice);
if (mainchoice == 1)
float fastcash (float bal);
else if (mainchoice == 2)
float withdraw (float bal);
else if (mainchoice == 3)
float deposit (float bal);
else if (mainchoice == 4)
float balinq (void);
else
void endtrans (void);
return 0;
}
/*==================================Mainchoice===========================
This function asks the user to select which type of transaction he/she wants
to make.
*/
int mainchoice (void)
{
/*Local Definitions*/
int choice;
/*Statements*/
printf("\n\tPlease make a selection from the list below and hit Return:");
printf("\n\t*****************************");
printf("\n\t* MENU *");
printf("\n\t* *");
printf("\n\t* 1. Fast Cash *");
printf("\n\t* 2. Withdrawal *");
printf("\n\t* 3. Deposit *");
printf("\n\t* 4. Balance Inquiry *");
printf("\n\t* 5. End Transaction *");
printf("\n\t* *");
printf("\n\t*****************************");
scanf("%d", &choice);
return choice;
} /*mainchoice*/
/*============================Fast Cash================================
Asks the user to select from a list of withdrawal amounts. The
amount is then subtracted from the balance.
*/
float FastCash (float bal,
int fwith)
{ /*Statements*/
printf("\n\tPlease select the amount of money you would like to withdraw:");
switch (fwith)
{
case 1: printf("$20.00\n");
break;
case 2: printf("$40.00\n");
break;
case 3: printf("$80.00\n");
break;
case 4: printf("$100.00\n");
break;
case 5: printf("Main Menu\n");
break;
}
bal = bal - fwith;
}/*fastcash*/
/*============================Withdrawal================================
Asks the user to enter the amount of money to be withdrawn. The amount
is then subtracted from the balance.
*/
float Withdraw (int with,
float bal)
{
/*Statements*/
printf("Please enter the amount of money you would like to withdraw: \n");
scanf("%f", &with);
bal = bal - with;
return bal;
} /*Withdrawal*/
/*==============================Deposit==================================
Asks the user to enter the amount of money to be deposited. The amount
is then added to the balance.
*/
float Deposit (float bal,
float dep)
{
/*Statements*/
printf("Please enter the amount of money you would like to deposit: \n");
scanf("%f", &dep);
bal = bal + dep;
return bal;
} /*Deposit*/
/*==============================BalInq============================
Prints the users current balance.
*/
void balinq (bal) /*<---error occurs here*/
{
/*Statements*/
printf("\n\tYour current balance is: %f", *bal);
return 0;
}/*BalInq*/
/*==================================endtrans===================================
This function ends the transaction either at the request of the user or
when the incorrect PIN is entered too many times.
*/
void endtrans (void);
{
/*Statements*/
printf("\n\t Goodbye!");
return;
}/*endtrans*/
system("PAUSE");
return 0;
}
the error I'm getting on the balinq function is " "bal" was not declared in this scope"
-
You should probably specify bal's type in your function prototype.
-
> printf("\n\tYour current balance is: %f", *bal);
And to print out bal you don't need to dereference it:
printf("\n\tYour current balance is: %f", bal);
-
ahem... :rolleyes:
DOH!!
melee
-
And, if, as the function declaration states, bal should be a float, then don't dereference it. Only dereference pointers.
*edit*
Nevermind...
-
This is perfectly correct, but just a cool trick:
Does the exact same thing. You'll also see the same thing with +, *, and /.
-
ok, corrected those mistakes which, as usual for me, found other errors earlier in the code.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
/*Prototype Declarations*/
float fastcash (float bal, float fwith);
float Withdraw (float bal, float with);
float Deposit (float bal, float dep);
void balinq (float bal);
void endtrans (void);
int mainchoice (void);
float bal;
int main(void)
{
/*Local Definitions*/
int count = 0;
char pin[4];
float bal = 1000;
int dep;
int with;
int choice;
int check = 0;
/*Statements*/
printf("\tWelcome to the COP2220 ATM");
printf("\n\t Please enter your 4 digit PIN \n ");
scanf("%c", &pin);
if (strlen(pin) != 4)
printf("\a\nThat PIN is incorrect. Please re-enter your 4 digit PIN \n");
++count;
if (count == 3) /*error occurs here*/
void endtrans (void);
int mainchoice (choice);
if (mainchoice == 1)
float fastcash (float bal);
else if (mainchoice == 2)
float withdraw (float bal);
else if (mainchoice == 3)
float deposit (float bal);
else if (mainchoice == 4)
float balinq (void);
else
void endtrans (void);
return 0;
}
/*==================================Mainchoice===========================
This function asks the user to select which type of transaction he/she wants
to make.
*/
int mainchoice (void)
{
/*Local Definitions*/
int choice;
/*Statements*/
printf("\n\tPlease make a selection from the list below and hit Return:");
printf("\n\t*****************************");
printf("\n\t* MENU *");
printf("\n\t* *");
printf("\n\t* 1. Fast Cash *");
printf("\n\t* 2. Withdrawal *");
printf("\n\t* 3. Deposit *");
printf("\n\t* 4. Balance Inquiry *");
printf("\n\t* 5. End Transaction *");
printf("\n\t* *");
printf("\n\t*****************************");
scanf("%d", &choice);
return choice;
} /*mainchoice*/
/*============================Fast Cash================================
Asks the user to select from a list of withdrawal amounts. The
amount is then subtracted from the balance.
*/
float FastCash (float bal,
int fwith)
{ /*Statements*/
printf("\n\tPlease select the amount of money you would like to withdraw:");
switch (fwith)
{
case 1: printf("$20.00\n");
break;
case 2: printf("$40.00\n");
break;
case 3: printf("$80.00\n");
break;
case 4: printf("$100.00\n");
break;
case 5: printf("Main Menu\n");
break;
}
bal = bal - fwith;
}/*fastcash*/
/*============================Withdrawal================================
Asks the user to enter the amount of money to be withdrawn. The amount
is then subtracted from the balance.
*/
float Withdraw (int with,
float bal)
{
/*Statements*/
printf("Please enter the amount of money you would like to withdraw: \n");
scanf("%f", &with);
bal = bal - with;
return bal;
} /*Withdrawal*/
/*==============================Deposit==================================
Asks the user to enter the amount of money to be deposited. The amount
is then added to the balance.
*/
float Deposit (float bal,
float dep)
{
/*Statements*/
printf("Please enter the amount of money you would like to deposit: \n");
scanf("%f", &dep);
bal = bal + dep;
return bal;
} /*Deposit*/
/*==============================BalInq============================
Prints the users current balance.
*/
void balinq (float bal)
{
/*Statements*/
printf("\n\tYour current balance is: %f", bal);
return;
}/*BalInq*/
/*==================================endtrans===================================
This function ends the transaction either at the request of the user or
when the incorrect PIN is entered too many times.
*/
void endtrans (void)
{
/*Statements*/
printf("\n\t Goodbye!");
return;
}/*endtrans*/
system("PAUSE");
return 0;
}
I'm getting a "parse error before 'void' " error. For the record (because I'm new...what exactly is a parse error?
melee
-
> if (mainchoice == 1)
> float fastcash (float bal);
Based on you definition of FastCash(), your call should look like:
Code:
bal = FastCash(bal);
Also, you don't need the second parameter (fwith). Finally, you didn't return anything from FastCash().
All you function calls need to be modified to look similar to the above call to FastCash.
-
>> scanf("%c", &pin);
read this
the two main problems with your code are:
- incorrect syntax in invoking functions
- passing variables that are modified in functions by value instead of as pointers
I'd recommend you go back to your book and review those two things before you do anything else with the code.
-
Ok, so I think I see what you're saying. Unfortunately, the book that my professor has chosen as a textbook isn't very user friendly. While that won't keep me from learning what I need to, it does slow me down a bit. I'll re-read. However, nobody answered my previous question. What exactly is a parse error? Knowing what it is might help me determine why I'm getting one.
-
>> What exactly is a parse error?
it's a syntax error such as unmatched braces, missing semicolens, incorrect declarations, etc, etc.