I have a simple program that tells the user to input n amount of students, foreach student an x amount of money is allocated. At the end, the program divides x by n, meaning the total money is divided equally by the students.
The problem is that Console.Readline() is reading the second inputted value as see below.:
This means that the user has to enter the values two times, each time Console.Readline() is called, which is obviously wrong!
Code:
static void Main(string[] args)
{
double total = 0;
int noOfStudents = 0;
try
{
Console.WriteLine("Please enter the number of students :");
noOfStudents = checkInputTypeInt(Console.ReadLine());
Console.WriteLine("Enter the students(" + noOfStudents + ") money!");
for (int i = 0; i <= noOfStudents - 1; i++)
{
double money = checkInputTypeDouble(Console.ReadLine());
total += money;
}
double dividedTotal = total / noOfStudents;
Console.WriteLine("Total divided by " + noOfStudents + " is $ " + dividedTotal.ToString("F2"));
Console.ReadKey();
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
private static int checkInputTypeInt(string s)
{
int numericValue = 0;
bool done = false;
while (!done)
{
if (!int.TryParse(Console.ReadLine(), out numericValue))
Console.WriteLine("The input must be between 0 and 1000!");
else if (numericValue > 100)
Console.WriteLine("The input must be between 0 and 1000!");
else
done = true;
}
return numericValue;
}
You ReadLine twice:
noOfStudents = checkInputTypeInt(Console.ReadLine());
and in checkInputTypeInt method:
if (!int.TryParse(Console.ReadLine(), out numericValue))
You should either send only the string to method like this:
noOfStudents = checkInputTypeInt(Console.ReadLine());
and in your method just check that value like:
if (!int.TryParse(s, out numericValue))
in this case you should have the while loop in your main method.
or just use readline in the called method.
Console.WriteLine("Please enter the number of students :");
noOfStudents = checkInputTypeInt(); // and you should change your method to fit no arguments.
Edit: final codes:
static void Main(string[] args)
{
double total = 0;
int noOfStudents = 0;
try
{
Console.WriteLine("Please enter the number of students :");
noOfStudents = checkInputTypeInt();
Console.WriteLine("Enter the students(" + noOfStudents + ") money!");
for (int i = 0; i <= noOfStudents - 1; i++)
{
double money = checkInputTypeDouble(Console.ReadLine());
total += money;
}
double dividedTotal = total / noOfStudents;
Console.WriteLine("Total divided by " + noOfStudents + " is $ " + dividedTotal.ToString("F2"));
Console.ReadKey();
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
private static int checkInputTypeInt()
{
int numericValue = 0;
bool done = false;
while (!done)
{
if (!int.TryParse(Console.ReadLine(), out numericValue))
Console.WriteLine("The input must be between 0 and 1000!");
else if (numericValue > 100)
Console.WriteLine("The input must be between 0 and 1000!");
else
done = true;
}
return numericValue;
}
OR:
static void Main(string[] args)
{
double total = 0;
int noOfStudents = -1;
try
{
Console.WriteLine("Please enter the number of students :");
do{
noOfStudents = checkInputTypeInt(Console.ReadLine());
}while(noOfStudents == -1);
Console.WriteLine("Enter the students(" + noOfStudents + ") money!");
for (int i = 0; i <= noOfStudents - 1; i++)
{
double money = checkInputTypeDouble(Console.ReadLine());
total += money;
}
double dividedTotal = total / noOfStudents;
Console.WriteLine("Total divided by " + noOfStudents + " is $ " + dividedTotal.ToString("F2"));
Console.ReadKey();
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
private static int checkInputTypeInt(string s)
{
int numericValue = -1;
if (!int.TryParse(Console.ReadLine(), out numericValue))
Console.WriteLine("The input must be between 0 and 1000!");
else if (numericValue > 1000)
{Console.WriteLine("The input must be between 0 and 1000!");
numericValue = -1;
}
return numericValue;
}
Try to divide the noOfStudents and Console.ReadLine() like this:
int i = Convert.ToInt32(Console.ReadLine());
noOfStudents = i;
Related
my code is where the user needs to enter a mark between and then if the mark is not between 0 and 100, it must ask again, i got that to work , but now the question states : Adapt the above program to also count the number of marks greater than or equal to 50.
How do I do this , I have tried declaring count an integer 0 but I am unsure how
to implement this.
Here is my code:
static void Main(string[] args)
{
int total = 0;
for (int x = 1; x <= 5; x++)
{
Console.WriteLine("Enter your mark");
int mark = int.Parse(Console.ReadLine());
if (mark > 100 || mark < 0)
{
Console.WriteLine("Invalid mark,Enter your mark again");
int newmark = int.Parse(Console.ReadLine());
mark = newmark;
}
total += mark;
}
Console.WriteLine("sum = " + total);
double average = (total / 5) * 1.00;
Console.WriteLine("average = " + average);
Console.ReadLine();
}
First of all, I suggest extracting a method: do not cram everything into a single Main:
private static int readMark() {
Console.WriteLine("Enter your mark");
int result = 0;
while (true)
if (!int.TryParse(Console.ReadLine(), out result))
Console.WriteLine("Incorrect syntax, enter your mark again");
else if (result < 0 || result > 100)
Console.WriteLine("Mark should be in [0..100] range, enter your mark again");
else
return result;
}
Then let's read all the marks into a collection, say, an array:
static void Main(string[] args) {
int[] marks = new int[5];
for (int i = 0; i < marks.Length; ++i)
marks[i] = readMark();
}
Now it's time for the statistics. Usually we use Linq for this:
static void Main(string[] args) {
...
double average = marks.Average();
int sum = marks.Sum();
int countGreaterThan50 = marks.Count(item => item > 50);
But we can put a good old for / foreach loop for this:
static void Main(string[] args) {
...
int total = 0;
countGreaterThan50 = 0;
for (int i = 0; i < marks.Length; ++i) {
total += marks[i];
if (marks[i] > 50)
countGreaterThan50 += 1;
}
// (double) total - be careful with integer division:
// 91 / 5 == 18 when 91.0 / 5 == 18.2
double average = ((double) total) / marks.Length;
static void Main(string[] args)
{
int total = 0;
int gt50Count = 0;
for (int x = 1; x <= 5; x++)
{
Console.WriteLine("Enter your mark");
int mark = int.Parse(Console.ReadLine());
if (mark > 100 || mark < 0)
{
Console.WriteLine("Invalid mark,Enter your mark again");
int newmark = int.Parse(Console.ReadLine());
mark = newmark;
}
total += mark;
if (mark >= 50)
{
gt50Count++;
}
}
Console.WriteLine("sum = " + total);
double average = (total / 5) * 1.00;
Console.WriteLine("average = " + average);
Console.WriteLine("Greater or equal to 50 count = " + gt50Count);
Console.ReadLine();
}
I would change the way you check if your mark is invalid to a while loop. With just that if check, if the user inserts invalid values consecutively, your code will accept it.
static void Main(string[] args)
{
int total = 0;
int marksAbove50Count = 0;
for (int x = 1; x <= 5; x++)
{
Console.WriteLine("Enter your mark");
int mark = int.Parse(Console.ReadLine());
while (mark > 100 || mark < 0)
{
Console.WriteLine("Invalid mark,Enter your mark again");
int newmark = int.Parse(Console.ReadLine());
mark = newmark;
}
total += mark;
if(mark >= 50) marksAbove50Count++;
}
Console.WriteLine("sum = " + total);
double average = (total / 5) * 1.00;
Console.WriteLine("average = " + average);
Console.WriteLine("Marks above 50 count: " + marksAbove50Count);
Console.ReadLine();
}
Hi I was wondering if someone could explain how to to make this method diplay a running count and average, and not just display it once the user has finished entering its data?
public void InScreen()
{
int count = 0;
double total = 0.0;
double average = 0.0;
double number;
Console.WriteLine("Enter the set of scores (enter 0 to indicate end of set)");
number = double.Parse(Console.ReadLine());
while(number != 0)
{
total += number;
count++;
number = double.Parse(Console.ReadLine());
}
if (count != 0)
average = total / count;
Console.Beep(20000, 2000);
Console.WriteLine("The user has entered {0} scores.", count);
Console.WriteLine("The sum of scores entered = {0}", total);
Console.WriteLine("The average of scores entered = {0}", average);
}
Simply try this
static void Main(string[] args)
{
try
{
StringBuilder runningtotal = new StringBuilder();
int count = 0;
double total = 0.0;
double average = 0.0;
double number;
Console.WriteLine("Enter the set of scores (enter 0 to indicate end of set)");
number = double.Parse(Console.ReadLine());
runningtotal.Append(number.ToString());
while (number != 0)
{
total += number;
count++;
number = double.Parse(Console.ReadLine());
if (number!=0)
{
runningtotal.Append("+" + number.ToString());
}
}
if (count != 0)
average = total / count;
Console.Beep(20000, 2000);
Console.WriteLine("The user has entered {0} scores.", count);
Console.WriteLine("The sum of scores entered = {0}", total);
Console.WriteLine("The average of scores entered = {0}", average);
Console.WriteLine(runningtotal);
string[] inputs = runningtotal.ToString().Split('+');
Console.WriteLine("Running total");
int temp=0;
for (int i = 0; i <inputs.Length; i++)
{
if (temp==0)
{
Console.WriteLine("{0} = {1}",inputs[i],inputs[i]);
temp = Convert.ToInt32(inputs[i]);
}
else
{
Console.WriteLine("{0} = {1}", inputs[i], Convert.ToInt32(inputs[i]) + temp);
temp = Convert.ToInt32(inputs[i]) + temp;
}
}
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
Console.ReadLine();
}
Output Screenshot
Read Here
I have an assignment to input random numbers from the keyboard that is different from 0 and random number k. I need to find the sum of the odd numbers + k(if k is also odd). Also when typing the numbers only when 0 is being typed the typing of numbers is interrupted. This is what I've got so far!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Program
{
static void Main()
{
int k;
int min;
int max;
int odd = 0;
Console.WriteLine("Enter the value of k: ");
k = int.Parse(Console.ReadLine());
Console.WriteLine("Enter minimum integer: ");
min = int.Parse(Console.ReadLine());
Console.WriteLine("Enter maximum integer: ");
max = int.Parse(Console.ReadLine());
Console.Write("Odd: ");
for (int x = min; x <= max; x++)
{
if (x % 2 != 0)
{
Console.Write(x);
Console.Write(" + ");
odd += x;
}
}
Console.WriteLine();
Console.Write("Odd Numbers + K: ");
Console.WriteLine();
{
if (k % 2 !=0)
{
Console.Write(k);
Console.Write(" + ");
odd += k;
}
}
Console.Write("= ");
Console.Write(odd + "\n");
}
}
This code does what you need. It checks the bounds min and max. It finishes when zero is entered and it also keeps the total sum of the odd numbers.
Replace your static void Main() function with this one.
static void Main()
{
//int k;
int min;
int max;
int odd = 0;
Console.WriteLine("Enter minimum integer: ");
min = int.Parse(Console.ReadLine());
Console.WriteLine("Enter maximum integer: ");
max = int.Parse(Console.ReadLine());
Console.WriteLine("Enter your number: ");
bool userIsTyping = true;
while (userIsTyping)
{
Console.WriteLine("Enter another number: ");
int userNumber = int.Parse(Console.ReadLine());
if (userNumber == 0)
{
userIsTyping = false;
}
else if (userNumber > max)
{
Console.WriteLine("The number is out of bounds: greater than max.");
}
else if (userNumber < min)
{
Console.WriteLine("The number is out of bounds: less than min.");
}
else
{
if (userNumber % 2 != 0)
{
odd += userNumber;
Console.WriteLine("Current Total: " + odd.ToString());
}
else
{
Console.WriteLine("That is not an odd number.");
}
}
}
Console.WriteLine("The final result is: " + odd.ToString());
Console.ReadLine();
}
I am fetching the Grade of the Students. I am trying to fetch Student Grades in sorted order. But when i printed the testgrade variable its just showing only one record at the end.
namespace EX4_GradesMethod
{
class Program
{
static void Main(string[] args)
{
int namelength;
string names;
double grade, max, min, testgradeaverage;
Console.WriteLine("Please enter the amount of names you wish to enter: ");
namelength = Convert.ToInt32(Console.ReadLine());
string[] name = new string[namelength];
double[] testgrades = new double[namelength];
for (int i = 0; i < testgrades.Length; i++)
{
Console.WriteLine("Please enter the names of each student");
names = Convert.ToString(Console.ReadLine());
name[i] += names;
}
for (int i = 0; i < name.Length; i++)
{
Console.WriteLine("Please enter the final grade for " + name[i]);
grade = Convert.ToDouble(Console.ReadLine());
testgrades[i] += grade;
}
max = testgrades.Max();
min = testgrades.Min();
testgradeaverage = testgrades.Average();
Console.WriteLine("The highest grade is: " + max);
Console.WriteLine("The Lowest Grade is:" + min);
Console.WriteLine("The class average is: " + testgradeaverage);
for ( int k = 0; k < namelength - namelength + 1; k++)
{
Console.WriteLine(testgrades[k]);
}
Console.ReadLine();
}
public static void sorted(ref double [] testgrades)
{
double temp = 0;
for (int write = 0; write < testgrades .Length; write++)
{
for (int sort = 0; sort < testgrades.Length - 1; sort++)
{
if (testgrades [sort] > testgrades [sort + 1])
{
temp = testgrades[sort + 1];
testgrades [sort + 1] = testgrades [sort];
testgrades [sort] = temp;
}
}
}
}
}
}
new to C# and programming and been practicing on loops.
Im trying to build a program that will initially ask for 2 numbers, then it will output the sum, then will ask for another number again, then add to the previous result.
The loop will only stop when the user input 00.
Here is the code that i thought of, apologies for the poor coding yet. ><
Please suggest/use any loop that you may think that is efficient for this. Thanks!
public static void getnum()
{
Console.Write("Enter number: ");
int num = Int32.Parse(Console.ReadLine());
Console.Write("Enter number: ");
int num2 = Int32.Parse(Console.ReadLine());
}
static void Main(string[] args)
{
getnum();
while (num!=00)
{
getnum();
int sum = num + num2;
Console.WriteLine("Sum is: " + sum);
}
Console.Read();
You can simplify it something like this
static void Main(string[] args)
{
int sum = 0;
string currentNumber = "0";
while (currentNumber!="00")
{
int num = Int32.Parse(currentNumber);
sum += num;
Console.WriteLine("Sum is: " + sum);
currentNumber = Console.ReadLine();
}
Console.Read();
}
Here is a sample which does what you want:
var answer = 0;
var num = 0;
var num2 = 0;
while(answer!=1)
{
Console.Write("Enter number: ");
num = Int32.Parse(Console.ReadLine());
Console.Write("Enter number: ");
num2 = Int32.Parse(Console.ReadLine());
var sum = num + num2;
Console.WriteLine("Sum is: " + sum);
Console.Write("Press 1 to exit or 2 to continue: ");
answer = Int32.Parse(Console.ReadLine());
};
This code will work.
class Program
{
static int num1 = 0;
static int num2 = 0;
public static void getnum()
{
Console.Write("Enter number: ");
num1 = Int32.Parse(Console.ReadLine());
Console.Write("Enter number: ");
num2 = Int32.Parse(Console.ReadLine());
}
static void Main(string[] args)
{
getnum();
//This is the loop.
do
{
ShowNum();
getnum();
} while (num1 != 00);
}
static void ShowNum()
{
int sum = num1 + num2 ;
//Here we show the Sum.
Console.WriteLine("Sum is: " + sum.ToString());
}
}
You can try this too
string input = "";
int Sum = 0, newNumber;
while (input != "00")
{
Console.Write("Enter number(press 00 to print the sum): ");
input = Console.ReadLine();
if (!Int32.TryParse(input, out newNumber))
{
Console.WriteLine("Input is not a valid number; 0 is taken as default value");
}
Sum += newNumber;
}
Console.WriteLine(" Sum of entered numbers {0}",Sum);
Console.ReadKey();
You need two things.
Read atleast two numbers.
Sum input numbers until user press '00'
.
public static void Main()
{
int numCount = 0;
int sum = 0;
string input;
do
{
Console.Write("Enter number: ");
input = Console.ReadLine();
int num;
if (int.TryParse(input, out num))
{
sum += num;
numCount++;
Console.WriteLine("Sum is: " + sum);
}
} while (!(numCount > 2 && input == "00")); // Make sure at least two numbers and until user rpess '00'
}
Working Demo
You can also try with this
int input = 0;
int total = 0;
while (true)
{
Console.WriteLine("Enter a number (Write Ok to end): ");
string write = Console.ReadLine();
if (write == "Ok")
{
break;
}
else
{
input = int.Parse(write);
total = total + input;
}
Console.WriteLine("Total: " + total);
}