Confused with breaks and looping in my program - c

Use for loops to process the data for 5 employees.
One loop to load the data
One loop to print the output.
In for loops, if any of the entered fields are –1, break out of the loop immediately after getting -1
Update the output as shown in the sample data.
Use arrays to store the user input.
I have a problem with breaking out of the loop. I think the system is reading it as an integer, not a character.
I also have a problem with looping the output. It is not looping the number of times the user has entered the info.
#include <stdio.h>
int main()
{
char name[5][10];
float hourswork[10];
float hourspay[10];
float grosspay[10];
float taxes[10];
float netpay[10];
int i = 0;
for (i = 0; i < 5; i++)
{
printf("Hello, enter your name: \n");
scanf("%s", &name[i][10]);
printf("Enter your hourly wage: \n");
scanf("%f", &hourspay[i]);
printf("Enter the hours you have worked \n");
scanf("%f", &hourswork[i]);
if (hourswork[i] <= 40)
{
grosspay[i] = hourspay[i] * hourswork[i];
}
else if (hourswork[i] > 40)
{
grosspay[i] = (40 * hourspay[i]) + (((hourswork[i] - 40) * 1.5) * hourspay[i]);
}
taxes[i] = grosspay[i] * 0.2;
if (name[i][10] == -1||hourspay[i] == -1||hourswork[i] == -1)
{
break;
}
}
for (i = 0; i < 5; i++)
{
printf("\n%c's Pay:\n", name[i][10]);
printf("Hourly Rate: %.2f\n", hourspay[i]);
printf("Hours Worked: %.2f\n", hourswork[i]);
printf("Gross Pay: %.2f\n", grosspay[i]);
printf("Taxes: %.2f\n", taxes[i]);
netpay[i] = grosspay[i] - taxes[i];
printf("Net Pay: %.2f\n\n", netpay[i]);
}

Related

How to break out of a loop and not execute the other statements in that loop?

void process(){
int ID;
float hours_employee_worked, hourly_wages_for_employees;
float tax = 0.4;
float overtime = 1.5;
float time_without_overtime, total_overtime;
float total, average;
do {
printf("Enter Employee ID (or -1 to exit): ");
scanf("%d", &ID);
printf("Enter hours worked (e.g 8.5 hours): ");
scanf("%f", &hours_worked);
printf("Enter hourly wage (e.g 20.25): ");
scanf("%f", &hourly_wage);
if (ID == -1)
{
puts("All done");
break;
}
else if (hours_employee_worked <=40)
{
total = hours_employee_worked* hourly_wages_for_employees;
average = total * tax;
average = total - average;
printf("%.2f", average);
}
else if (hours_employee_worked > 40)
{
total_overtime = ((hours_employee_worked- 40) * 1.5) * hourly_wage_for_employees;
total = (40 * hourly_wages_for_employees+ total_overtime) * tax;
time_without_overtime = 40 * hourly_wages_for_employees;
average = time_without_overtime + total_overtime - total;
printf("%f", average);
}
}while (ID != -1);
}
Basically, I want my program to end execution if the employee ID is equal to -1. But it still continues and breaks at the end. It doesnt say "All done" till the execution is finished and doesn't break out of the loop. Thanks.
Your program works fine if you want you can move your first if statement to the top of your program right after you check employee_id.

Program not assigning proper values to variables

I am new to programming in general, recently decided to get serious about try to learn C. I am trying to build a light account program using nested loops and arrays.
I'm trying to build the program in CodeBlocks. My program is a little rough,
1) my first issue is that after my program asks how many weeks of work has been done, it then has grabs a value for the next loop, ignoring the value of weeks for at least the first loop.
2) Entering any integer other than "1" causes tax to pull a random value from memory, and even worse, it can overwrite the value for "weeks" despite there not being another scanf function for "weeks", often leading to the for...loop depending on the variable weeks to loop well into the millions.
3) I haven't programmed pathways 5 & 6 for void menu() yet due to the rest of the program not functioning properly
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int pay = 10;
const int overtime;
float taxrate;
int hours; //user input for hours worked
int gross; //calculated integer for gross pay
int tax; //calculated integer for taxes
int net; //calculated integer for net pay
int gross_total = 0; //non printed value for summing gross
int i; //condition to exit loop
void tax_rate();
void menu();
void cust_paid_yn();
void hours_worked();
int menu_input;
int menu_break;
char c;
int unpaid;
int weeks;
int j;
int week_numb_array[];
int gross_array[];
int tax_array[];
int gross_total_array[];
void printfinal();
int main(void)
{
menu();
printf("How many weeks have been worked?\n");
scanf("%d\n", &weeks);
for (int j = 0; j <= weeks; j++)
{
while (menu_input = 1 || 2 || 3 || 4)
{
hours_worked();
while ( hours != 1)
{
//uses hours to calculate gross, taxes, and net
gross = (hours * pay);
//use loop and gross to determine tax
tax_rate();
//uses hours to calculate taxes, net, and gross_total
tax = (gross * taxrate);
net = (gross - tax);
gross_total += (net);
gross_array[j] = gross;
tax_array[j] = tax;
gross_total_array[j] = gross_total;
break;
}
printf("\nexited out of menu_input loop\n");
break;
}
printf("\nexited out of tax loop\n");
printf("\n \n %d\n \n", weeks);
printf("\n \n %d\n \n", j);
}
printf("\nexited out of for...loop\n");
j = 0;
printfinal();
return 0;
}
void printfinal()
{
for (j = 0; j <= weeks; j++)
{
//Prints the title headers: gross pay, taxes and net pay
printf("Week Numb\t gross pay \t taxes \t net pay\n");
//Prints the calculations for gross, taxes, and net
printf("week 1\t\t %ld \t\t %ld \t\t %ld \t\n", gross_array[j],
tax_array[j], gross_total_array[j]);
}
return 0;
}
void tax_rate()
{
//use loop and gross to determine tax
if (gross <= 300)
{
taxrate = .15;
}
else if (gross <= 450)
{
taxrate = .20;
}
else if (gross >= 451)
{
taxrate = .25;
}
return 0;
}
void menu()
{
printf("Please make a selection from the following options\n 1) Set Pay
Rate to 8.75\n 2) Set Pay Rate to 9.33\n 3) Set Pay Rate to 10.00\n 4) Set Pay Rate to 11.20\n 5) Print Out List\n 6) Quit\n");
scanf("%d", &menu_input);
switch (menu_input)
{
case 1:
printf("Pay Rate set to 8.75\n");
menu_break = 0;
pay = 8.75;
break;
case 2:
printf("Pay Rate set to 9.33\n");
menu_break = 0;
pay = 9.33;
break;
case 3:
printf("Pay Rate set to 10.00\n");
menu_break = 0;
pay = 10.00;
break;
case 4:
printf("Pay Rate set to 11.20\n");
menu_break = 0;
pay = 11.20;
break;
case 5:
menu_break = 1;
printf("List Printed\n");
break;
case 6:
printf("QUIT\n");
menu_break = 2;
break;
default:
printf("Unknown\n");
menu_break = 3;
break;
}
return 0;
}
void cust_paid_yn()
{
for (i=0; i<1; 1)
{
//get input for whether cust. was paid
printf("Was customer paid this week? (y/n)\n");
scanf("%c", &c);
//loop to check for y/n response
switch (c)
{
case 'y':
printf("\n");
i=1;
hours = (hours + unpaid);
unpaid = 0;
break;
case 'n':
printf("hours logged\n");
i=1;
unpaid = (unpaid + hours);
hours = 0;
break;
default:
printf("\n");
i=0;
break;
}
break;
}
return 0;
}
void hours_worked()
{
//asks how many hours were worked
printf("How many hours were worked?\n \nIf no work was done enter 0\n");
//gets user input for hours worked
scanf("%ld", &hours);
return 0;
}
I just want to create a program that:
1) gets user input for how many time the program will loop (see weeks var)
2) print out user data using an array
Any help and suggestions are greatly appreciated, I'm at my wits end on why my program pulls random values from memory.

Too few arguments to function.. What does it mean where do I go wrong?

Here's my code:
#include <stdio.h>
int validate(int low,int high);
int main ()
{
//Declare Variables
float strength, speed, defense, intelligence;
float strengthRatio, speedRatio, defenseRatio, intelligenceRatio;
int strength_F, speed_F, defense_F, intelligence_F;
float sum;
int luck;
float PStrength=10;
float PDefense=20;
float PIntelligence=40;
int PHP=10;
float EStrength=30;
float EDefense=40;
float EIntelligence=25;
int EHP=10;
int sel;
float attackp;
float magicp;
int low=1;
int high=3;
int Valid_Selection;
//Clear Screen
system("cls");
//Display Logo
printf("+----------------------+\n");
printf("| |\n");
printf("| CODE QUEST |\n");
printf("| |\n");
printf("+----------------------+\n\n");
//Main Menu
printf("--Main Menu--\n");
printf("\n");
printf("1 - New Game\n");
printf("2 - Load Game\n");
printf("3 - Exit\n");
printf("\n");
printf("Selection: \n\n");
//Validate user input using a functuion
Valid_Selection = validate(int low,int high);
//Game_Selection = validate();
printf ("Character Creation \n");
printf ("Please enter your desired stats for your character:\n");
printf ("\n");
printf ("Enter strength: ");
scanf ("%f", &strength);
printf ("Enter speed: ");
scanf ("%f", &speed);
printf ("Enter defense: ");
scanf ("%f", &defense);
printf ("Enter intelligence: ");
scanf ("%f", &intelligence);
//Calculate the sum of all attributes
sum = strength + speed + defense + intelligence;
//Calculate ratios for each attribute
strengthRatio = strength / sum;
speedRatio = speed / sum;
defenseRatio = defense / sum;
intelligenceRatio = intelligence / sum;
//Calculate the final Stats as whole number
strength_F = strengthRatio * 100;
speed_F = speedRatio * 100;
defense_F = defenseRatio * 100;
intelligence_F = intelligenceRatio * 100;
//Calculate the player's luck
luck = (int)sum % 30;
//Create an empty line for beauty
printf ("\n");
//Display to the user the finalized player stats
printf ("Your player's final stats are:");
printf ("\n");
printf ("Strength: %d\n", strength_F);
printf ("Speed: %d\n", speed_F);
printf ("Defense: %d\n", defense_F);
printf ("Intelligence: %d\n", intelligence_F);
printf ("Luck: %d\n", luck);
//Display "Battle Starts"
printf("Battle Start!\n\n");
while (PHP>=0 && EHP>=0) {
//Display user and enemy HP and asks user which attack execute
printf("Your HP: %d, Enemy HP: %d\n", PHP, EHP);
printf("1 - Attack Power\n");
printf("2 - Magic Power\n");
scanf("%d",&sel);
//Option 1, Option 2
if (sel==1){
attackp = (PStrength/EDefense)*5;
EHP = EHP - attackp;
printf("You Attacked The Enemy\n");
}
else{
magicp = (PIntelligence/EIntelligence)*5;
EHP = EHP - magicp;
printf("You bewitched the enemy!\n");
}
//Enemy reaction based on his own HP
if (EHP<=0)
printf("You Won!\n");
else {
attackp = (EStrength/PDefense)*5;
PHP = PHP - attackp;
printf("The Enemy Attacked You\n");
}
//Indicates if user lost the game
if (PHP<=0)
printf("You Lost!\n");
printf("\n");
}
return 0;
}
int validate(int low, int high) {
int s;
do{
scanf("%d", s);
if (s<1 || s>3)
printf("innvalid Input, try again:");
} while (s<1 || s>3);
return s;
}
int validate(int low, int high) {
int selection;
do {
scanf("%d", selection);
if (selection <0 || selection>3)
printf("Invalid Input, try again: ");
} while (0<selection<4);
return selection;
}
I want the user to enter a number between 1 and 3 and I need the validate function to verify it. Can anyone explain me where I go wrong please? what is the proper way to do it?
Your validate must be called as:
//Validate user input using a functuion
Valid_Selection = validate(1, 3);
as your menu has choices between 1 and 3, and your function should be:
int validate(int low, int high) {
int s=0;
char buf[128];
do {
if (fgets(buf,128,stdin)==0 || sscanf(buf, "%d", &s)!=1 || (s<low || s>high))
printf("invalid Input, try again:");
else
return s;
} while (1);
}
and there can be only one function with that name, so remove the second one. Btw, while (0<selection<4) in the second one, must be written as: while (0<selection && selection<4).
Edit: note the check for the return value of sscanf. It tells us whether sscanf could read the value type specified, %d, and note to pass the address of the integer where to store the result. The initialization of s to zero ensures the while loop will not be exited while there was invalid input.
Edit: fixed Chux's comment to consume stdin.

for/while loop memory clearing in C

In my program I'm messing around with, it simply asks for how many tests one has written and then returns an average. However I've modified it a bit so that it asks if the marks entered are correct.
Problem 1: It doesn't let you input your marks for all your tests
Problem 2: If the marks are wrong it starts over but keep the previous inputs in it's memory? How do I fix the?
Here's the code:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
//int variables for grade
unsigned int counter; //number of grades to be entered next
int grade;
int total;
float average;
// user input
int userInput; // amount of tests
int yesNo;
//amount of test passed
unsigned int pass = 0;
unsigned int fail = 0;
int doCount = 1;
//unsigned int test;
//---------------------------------------------------------------------------------------------------//
//standards for program to abide to
total = 0; //Total amount of test to be set to zero, until while statement
counter = 1; //Loop counter to start from one
//---------------------------------------------------------------------------------------------------//
printf ("Please enter amount of test you've written so far: ");
scanf ("%d", &userInput);
//printf ("%d", userInput);
//---------------------------------------------------------------------------------------------------//
do {
//Body of calculations of program
for(counter = 0; counter <= userInput; ++counter) { //for loop that correlates to userInput for amount of passes and test marks
printf ("Please enter percentage mark: "); //prompt for test mark
scanf("%d", &grade);
total = total + grade;
counter = counter + 1;
if (grade >= 40) { //if statement for pass or fail
pass = pass + 1;
} else {
fail = fail + 1;
}
}//end of for loop
printf ("Are the grades entered correct? (1 = yes, 2 = no): "); // user input for yesNo - are inputs correct
scanf ("%d", &yesNo);
if (yesNo == 2) {
} else {
average = ((float)total / userInput); //Getting average for tests so far
//if statement to clarify if you're passing
if (average < 40) {
printf ("\nYou are below sub minimum!\n");
printf ("Your overall average is: %.2f %\n", average);
printf ("Passed: %d\n", pass);
printf ("Failed: %d", fail);
} else if (average >= 75){
printf ("\nYou have a distinction agregate!\n");
printf ("Your overall average is: %.2f %\n", average);
printf ("Passed: %d\n", pass);
printf ("Failed: %d", fail);
} else {
printf ("\nYour overall average is: %.2f %\n", average);
printf ("Passed: %d\n", pass);
printf ("Failed: %d", fail);
}
doCount = 2;
}
} while (doCount == 1);
average = ((float)total / userInput); //Getting average for tests so far
//---------------------------------------------------------------------------------------------------//
getch ();
return 0;
}
In your do while loop, when you come around for your second pass you need to reset your variables. Specifically the total variable should be reset to zero. You do it for the first time outside the do while loop but once it's in the loop for the second pass it doesn't get reset to 0.
As for not reading all test inputs, if it asks for 9 but you need 10 then it likely is a problem with the for loop. I typically use counter++ and not ++counter as it increments the counter after the operation and not before the operation. That may or may not be the reason as I did not run your code, but it is worth looking at.
I've edited your code and commented the changes:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
//int variables for grade
unsigned int counter; //number of grades to be entered next
int grade;
int total;
float average;
// user input
int userInput; // amount of tests
int yesNo;
//amount of test passed
unsigned int pass = 0;
unsigned int fail = 0;
int doCount = 1;
//unsigned int test;
//---------------------------------------------------------------------------------------------------//
//standards for program to abide to
total = 0; //Total amount of test to be set to zero, until while statement
counter = 0; //Loop counter to start from zero, It's always better to start from zero
//---------------------------------------------------------------------------------------------------//
printf("Please enter amount of test you've written so far: ");
scanf("%d", &userInput);
//printf ("%d", userInput);
//---------------------------------------------------------------------------------------------------//
do {
//Body of calculations of program
total = 0; //You need to reset total pass and fail
pass = 0;
fail = 0;
for (counter = 0; counter < userInput; ++counter) { //for loop that correlates to userInput for amount of passes and test marks
printf("Please enter percentage mark: "); //prompt for test mark
scanf("%d", &grade);
total = total + grade;
//counter = counter + 1; You DON't need that
if (grade >= 40) { //if statement for pass or fail
pass = pass + 1;
}
else {
fail = fail + 1;
}
}//end of for loop
printf("Are the grades entered correct? (1 = yes, 2 = no): "); // user input for yesNo - are inputs correct
scanf("%d", &yesNo);
if (yesNo == 2) {
}
else {
average = ((float)total / userInput); //Getting average for tests so far
//if statement to clarify if you're passing
if (average < 40) {
printf("\nYou are below sub minimum!\n");
printf("Your overall average is: %.2f %\n", average);
printf("Passed: %d\n", pass);
printf("Failed: %d", fail);
}
else if (average >= 75) {
printf("\nYou have a distinction agregate!\n");
printf("Your overall average is: %.2f %\n", average);
printf("Passed: %d\n", pass);
printf("Failed: %d", fail);
}
else {
printf("\nYour overall average is: %.2f %\n", average);
printf("Passed: %d\n", pass);
printf("Failed: %d", fail);
}
doCount = 2;
}
} while (doCount == 1);
average = ((float)total / userInput); //Getting average for tests so far
//---------------------------------------------------------------------------------------------------//
getch();
return 0;
}

Loop with rolling total in c

I am trying to get a c program to ask me how many items i am buying than to ask the price for each item while keeping a rolling total and than ask again in a loop. I have the loop working fine but am having problems getting it to give me proper output.
here is the output i am getting when i run it.
http://i119.photobucket.com/albums/o134/halodude808/assignment2_zpsd46e84b8.jpg
#include <stdio.h>
#include <math.h>
int main(void)
{
//variables used
float penny = .01;
float nickel = .05;
float dime = .1;
float quarter = .25;
int items = 0;
float paid= 0.0;
float total = 0.0;
float price =0.0;
int counter =0.0;
for (;;)
{
printf("Please enter the number of grocery items:");
scanf("%d", &items);
for (counter = 1; counter <= items; counter++)
{
printf("Please enter the price for item #%d:", counter);
scanf("%f", &price);
total += price;
}
printf("items = %d total = %f \n", &items, &total);
getchar();
getchar();
}
}
Change
printf("items = %f total = %f \n", &items, &total);
to
printf("items = %i total = %f \n", items, total);
Also, you might want to consider checking for invalid values (zeroes, negative, characters, etc).

Resources