How to put array items in ascending order [duplicate] - c#

This question already has answers here:
C# sorting arrays in ascending and descending order
(8 answers)
Closed 6 years ago.
I'm trying to put this array in ascending order but I don't know why when I'm running it I'm getting what I want.
private static void sort()
{
int[] array = new int[3];
int order = array[0];
Console.WriteLine("plz enter 3 numbers");
for (int i = 0; i < array.Length; i++)
{
array[i] = int.Parse(Console.ReadLine());
Array.Sort(array);
Console.WriteLine("the number in order ", array [i]);
}
Console.ReadKey();
}

What about adding Array.Reverse(array);
private static void sort()
{
int[] array = new int[3];
int order = array[0];
Console.WriteLine("plz enter 3 numbers");
for (int i = 0; i < array.Length; i++)
{
array[i] = int.Parse(Console.ReadLine());
Array.Sort(array);
Array.Reverse(array);
Console.WriteLine("the number in order ", array[i]);
}
Console.ReadKey();
}

you need to first read the numbers , then sort and last but not least print them
private static void sort()
{
int[] array = new int[3];
int order = array[0];
Console.WriteLine("plz enter 3 numbers");
for (int i = 0; i < array.Length; i++)
{
array[i] = int.Parse(Console.ReadLine());
}
Array.Sort(array);
for (int i = 0; i < array.Length; i++)
Console.WriteLine("the number in order ", array [i]);
}
Console.ReadKey();
}

Related

can someone help me with this (most likely simple) error? [duplicate]

This question already has answers here:
Making an array of random ints
(2 answers)
Closed last month.
I have just started to learn coding and was hoping someone with a little more skill would help me out a bit.
Here is the code and when i run it the displayarray is coming up as just zeros and then the sum of the array is also zero I just cant grasp why thats happening so it would be awesome if someone could help me out.
namespace random_array_2._0
{
class Program
{
static void Main(string[] args)
{
int[] array;
int sum = 0;
int arraySum;
array = CreateArray();
DisplayArray(array);
arraySum = SumTheArray(array, sum);
}
static int[] CreateArray()
{
Random Array = new Random();
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Array.Next(1, 100));
}
return new int[10];
}
static void DisplayArray(int[] array)
{
Console.WriteLine();
Console.WriteLine("Sorted array in ASC order");
Array.Sort(array);
foreach (int i in array)
{
Console.Write(i + " ");
}
}
static int SumTheArray (int[] array, int sum)
{
for (int i = 0; i < array.Length; i++)
{
sum += array[i];
}
Console.WriteLine($"all together equals to: {sum}");
Console.ReadKey();
return sum;
}
}
}
Your CreateArray function is printing 10 random numbers and then returning a new array. The default value for int is 0, so this array contains 10 zeros.
You should first create the array and then populate it with random values:
static int[] CreateArray()
{
Random Array = new Random();
var a = new int[10];
for (int i = 0; i < a.Length; i++)
{
a[i] = Array.Next(1, 100);
}
return a;
}
There you go:
static int[] CreateArray()
{
Random randomNumberGenerator = new Random();
int[] array = new int[10];
for (int i = 0; i < array.Length; i++)
{
int randomNumber = randomNumberGenerator.Next(1, 100);
array[i] = randomNumber;
}
return array;
}
My advise to you is to stop using Console.WriteLine statements and start using the debugger. Console.WriteLine often lies; the debugger tends to never lie.
Your CreateArray function is not storing anything into Array, and it's returning an array with 10 zeroes (default value when none in given).
Try with
static int[] CreateArray()
{
Random rnd = new Random();
int[] Array = new int[10];
for (int i = 0; i < 10; i++)
{
Array[i] = rnd.Next(1, 100);
}
return Array;
}

Why Input string was not in a correct format and exception was unhandled

I am getting an error while taking array input from the user.
static void Main(string[] args)
{
int[] arrSum = new int[] { };
Console.WriteLine("Enter the array Size:\t");
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter the array elements of {0} as Array Size:\n",n);
for (int i = 0; i < n; i++)
{
arrSum[i] = int.TryParse(Console.ReadLine(), out arrSum[]);
}
Console.WriteLine("Enter the number whose sum you want to find:\n");
int j = Convert.ToInt32(Console.ReadLine());
ArraySum(arrSum,n,j);
}
public static int ArraySum(int[] arr, int key, int n)
{
for (int i = 0; i < arr.Length; i++)
{
int first = arr[i];
for (int k = i+1; k < arr.Length; k++)
{
int second = arr[k];
while (first + second == key)
{
Console.WriteLine("The numbers whose sum is {0}" + key + "are:\n" + first + second);
}
if (first + second != key)
{
return -1;
}
else
{
return 1;
}
}
}
return 0;
}
To take array size and elements and the number whose sum we need to compare among the given array elements from the user as input and return the possible pairs whose sum is equal to the given number.
I am not sure if I met the same problem as you, but I modified your code as following. At first I created a safe console readline method for integer that there is no exception thrown if an invalid integer is entered:
private static int GetIntFromInput()
{
while (true)
{
string value = Console.ReadLine();
if (!int.TryParse(value, out int parsedInt))
{
Console.WriteLine("Invalid integer! Retry or Ctrl+C to abort program...");
continue;
}
return parsedInt;
}
}
Then I modified your first method as following:
static void Main(string[] args)
{
Console.WriteLine("Enter the array Size:\t");
int n = GetIntFromInput();
if (n <= 0)
{
Console.WriteLine("Array has to be at least of size 1...");
return;
}
Console.WriteLine("Enter the array elements of {0} as Array Size:\n", n);
var arrSum = new int[n];
for (int i = 0; i < n; i++)
{
int newInt = GetIntFromInput();
arrSum[i] = newInt;
}
Console.WriteLine("Enter the number whose sum you want to find:\n");
int j = Convert.ToInt32(Console.ReadLine());
ArraySum(arrSum, n, j);
}
With this my tests had been successful. Please note, that I did not replace the last Convert.ToInt32 for j.
As a note, please always verify user input as far as possible for not throwing exceptions. If anytime you will check anything not correctly it will crash sometime for sure...
have a great day!
I just have modified your array input code lines, pretty much straight forward. You can use int.TryParse as well just in case you wish to have a check
Console.WriteLine("Enter the array Size:\t");
int n = Convert.ToInt32(Console.ReadLine());
int[] arrSum = new int[n];
Console.WriteLine("Enter the array elements of {0} as Array Size:\n",n);
for(int i = 0;i<n;i++){
arrSum[i]= Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine("Enter the number whose sum you want to find:\n");
int j = Convert.ToInt32(Console.ReadLine());
ArraySum(arrSum,n,j);

Comparing arrays without using linq

I am making a lottery game that asks the user for 10 numbers and then check it against random numbers that i have created in an array. I need to compare the two but I am not allowed to use the contains method.
I think I need to use a foreach loop to compare the arrays but really I am at a loss of what to do. I have been piecing it together from the little I know and would like to know if I am on the right track.
Is a foreach loop the correct way to compare the two arrays?
This is my code so far.
using System;
namespace lotto2
{
class Program
{
static void Main(string[] args)
{
//an array named "input" to hold the users' 10 guesses
int[] inputs = new int[10];
//an array named "lotNum" to hold 10 random numbers
int[] lotNums = new int[10];
//a for loop to loop over the inputs array. each loop will ask the user for a number
Console.WriteLine("Enter your 10 lottery numbers one at a time. The numbers must be between 1 and 25.");
for (int i = 0; i < inputs.Length; i++)
{
inputs[i] = Convert.ToInt32(Console.ReadLine());
}
//a random number generator
Random ranNum = new Random();
//loop to call the random generator 10 times and store 10 random numbers in the "lotNum" array
for (int i = 0; i < 10; i++)
{
lotNums[i] = ranNum.Next(1, 26); //chooses random numbers between 1 and 25
}
//writes out the randomly generated lotto numbers
Console.Write("\nThe lottery numbers are: ");
for (int i = 0; i < 10; i++)
{
Console.Write("{0} ", lotNums[i]);
}
//loop for checking users inputs against random generated numbers..
//foreach loop maybe?
foreach (var input in lotNums)
{
}
//print out if there are any matches, which numbers matched
//declared integer for the correct numbers the user guessed
int correct;
//end progam
Console.WriteLine("\n\nPress any key to end the program:");
Console.ReadKey();
}
}
}
Here's a program that correctly does what you want. It even ensures that you don't have duplicate lotto numbers.
void Main()
{
const int count = 10;
const int max = 25;
//an array named "input" to hold the users' 10 guesses
int[] inputs = new int[count];
//a for loop to loop over the inputs array. each loop will ask the user for a number
Console.WriteLine("Enter your {0} lottery numbers one at a time. The numbers must be between 1 and {1}.", count, max);
for (int i = 0; i < inputs.Length; i++)
{
inputs[i] = Convert.ToInt32(Console.ReadLine());
}
//a random number generator
Random ranNum = new Random();
//an array named "allNums" to hold all the random numbers
int[] allNums = new int[max];
for (int i = 0; i < allNums.Length; i++)
{
allNums[i] = i + 1;
}
//shuffle
for (int i = 0; i < allNums.Length; i++)
{
int j = ranNum.Next(0, allNums.Length);
int temporary = allNums[j];
allNums[j] = allNums[i];
allNums[i] = temporary;
}
//an array named "lotNum" to hold 10 random numbers
int[] lotNums = new int[count];
Array.Copy(allNums, lotNums, lotNums.Length);
//writes out the randomly generated lotto numbers
Console.Write("\nThe lottery numbers are: ");
for (int i = 0; i < lotNums.Length; i++)
{
Console.Write("{0} ", lotNums[i]);
}
int correct = 0;
Console.Write("\nThe correct numbers are: ");
for (int i = 0; i < lotNums.Length; i++)
{
for (int j = 0; j < inputs.Length; j++)
{
if (lotNums[i] == inputs[j])
{
Console.Write("{0} ", lotNums[i]);
correct++;
};
}
}
Console.Write("\nYou got {0} correct. ", correct);
Console.WriteLine("\n\nPress any key to end the program:");
Console.ReadLine();
}
You're on the right way.
My implementation would be:
foreach (var input in inputs)
{
for (int i = 0; i < lotNums.Length; i++){
if(input == lotNums[i]){
Console.WriteLine(lotNums[i]);
}
}
}
This will compare every number of the input array with the lottery array.
I'm printing every match, but you can set a variable to True if it finds a match or add every matching number into an array if you need it.
This is what I have tried.I hope it makes sense?
static void LottoMethod(int[] randNums,int[] userNums)
{
Console.WriteLine("Guess 10 numbers");
for(int i = 0; i <= userNums.Length-1; i++)
{
userNums[i] = Int32.Parse( Console.ReadLine());
}
Console.WriteLine("The numbers you entered: ");
foreach(int k in userNums)
{
Console.Write(k+" ");
}
//generate 10 numbers randomly
Random rnds = new Random();
for(int k = 0; k <= randNums.Length - 1; k++)
{
randNums[k] = rnds.Next(1, 26);
}
Console.WriteLine("Random Numbers");
foreach(int i in randNums)
{
Console.Write(i + " ");
}
int correctNums = 0;
//Check if random numbers correspond with entered numbers
try
{
for(int i = 0; i <= randNums.Length-1; i++)
{
for(int j = 0; j <= userNums.Length-1; j++)
{
if (randNums[i] == userNums[j])
{
correctNums++;
}
}
}
Console.WriteLine($"There are {correctNums} numbers ");
}
catch(Exception e) {
throw new Exception(e.ToString());
}
}
You have to calculate intersection of two sequences. You have three options:
Double foreach loop. This is something to avoid as it has time complexity O(m*n). It it not a problem for 10 items, but we should make programs that scale.
Using hash join. You can use HashSet for this and it would be my preferred method. But as it inherently implies using Contains, it is not the option here.
Merging sorted sequences. This would be the way to go here.
The program is rather self explanatory, it produces and intersects two random sequences.
static Random rnd = new Random((int)DateTime.Now.Ticks);
static int[] GetRandomArray(int arrSize, int minNumber, int maxNumber)
{
int[] tmpArr = new int[maxNumber - minNumber + 1];
for (int i = 0; i < tmpArr.Length; ++i)
{
tmpArr[i] = i + minNumber; // fill with 1, 2, 3, 4,...
}
int[] ret = new int[arrSize];
for (int i = 0; i < ret.Length; ++i)
{
int index = rnd.Next(tmpArr.Length - i); //choose random position
ret[i] = tmpArr[index];
tmpArr[index] = tmpArr[tmpArr.Length - 1 - i]; //fill last of the sequence into used position
}
return ret;
}
static IEnumerable<int> GetMatches(int[] a, int[] b)
{
Array.Sort(a);
Array.Sort(b);
for (int i = 0, j = 0; i < a.Length && j < b.Length;)
{
if (a[i] == b[j])
{
yield return a[i];
++i;
++j;
}
else if (a[i] > b[j])
{
++j;
}
else
{
++i;
}
}
}
static void Main(string[] args)
{
var a = GetRandomArray(5, 3, 7);
var b = GetRandomArray(10, 1, 25);
Console.WriteLine("A: " + string.Join(", ", a));
Console.WriteLine("B: " + string.Join(", ", b));
Console.WriteLine("Matches: " + string.Join(", ", GetMatches(a, b)));
Console.ReadKey();
}
The result is something like:
A: 7, 4, 6, 3, 5
B: 17, 1, 8, 14, 11, 22, 3, 20, 4, 25
Matches: 3, 4
You can think about what would happen if one or both of the sequences contain duplicities.

Storing values in an array and outputting the highest,lowest,average. Output flaw

This was a small problem the teacher gave us at school. We were asked to make a program which keeps asking the user to input test scores until he inputs -99 to stop the program. The values are stored in an array and the highest, lowest and average scores are displayed.
The problem I have with my code is that whenever I run it it always gives me a value of 0 for lowest scores even though there are no zeros in the input. Can anyone please point out the mistake in my code?
Code:
static void Main(string[] args)
{
int[] za = new int[100];
scores(za, 0);
}
public static void scores(int[] ar, int x)
{
Console.Write("Please enter homework score [0 to 100] (-99 to exit): ");
int a = Convert.ToInt16(Console.ReadLine());
if (a != -99)
{
ar[x] = a;
x++;
scores(ar, x);
}
else
{
Console.Clear();
Console.WriteLine("Homework App");
int[] arr = new int[x];
foreach (int l in arr)
{
arr[l] = ar[l];
}
int lowest = arr[0];
for (int i = 1; i < arr.Length; i++)
{
if (lowest > arr[i]) { lowest = arr[i]; }
}
int highest = arr[0];
for (int j = 1; j < arr.Length; j++)
{
if (highest < arr[j]) { highest = arr[j]; }
}
double sum = 0;
double nums = 0;
for (int k = 0; k < arr.Length; k++)
{
sum = sum + arr[k];
nums++;
}
double average = sum / nums;
Console.WriteLine("Highest Score: {0}", highest);
Console.WriteLine("Lowest Score: {0}", lowest);
Console.WriteLine("Average Score: {0}", average);
Console.ReadLine();
}
}
When you're copying items, don't use a foreach loop and then the element stored in the array as the index that you're inserting to. Instead, use a for loop with a counter variable.
You should change this:
int[] arr = new int[x];
foreach (int l in arr)
{
// You're using the wrong value for the index here.
// l represents the value of the item stored in `arr`, which is `0`
arr[l] = ar[l];
}
To this:
int[] arr = new int[x];
for (var counter = 0; counter < x; counter++)
{
arr[counter] = ar[counter];
}

Getting the average from a user entered array [duplicate]

This question already has answers here:
Find the average. largest, smallest number and mode of a int array
(3 answers)
Closed 7 years ago.
Hi I am trying to make a program that ask the user to enter up to 25 numbers and then displays the average for them but when It asks for the number it just keeps asking for numbers over ans over again and doesn't display the average.
Any guidance would be appreciated.
static void Main(string[] args)
{
Console.WriteLine("enter the amount of numbers you would like to find the average and mean of: ");
int arraylength = Int32.Parse(Console.ReadLine());
int[] AverageArray = new int[25];
//filling the array with user input
for (int i = 0; i < AverageArray.Length; i++)
{
Console.Write("enter the numbers you wish to find the average for: ");
AverageArray[i] = Int32.Parse(Console.ReadLine());
}
//printing out the array
Console.WriteLine("here is your array: ");
for (int i = 0; i < AverageArray.Length; i++)
{
Console.WriteLine(AverageArray[i]);
}
Console.WriteLine(FindAverage(AverageArray));
}
public static double FindAverage(int[] averageNumbers)
{
int arraySum = 0;
for (int i = 0; i < averageNumbers.Length; i++)
arraySum += averageNumbers[i];
return arraySum / averageNumbers.Length;
}
}
Well you already have arrayLength, why not use that as your array size indicator? Also, your average routine will lose precision. You are returning double, but your code has everything as int.
static void Main(string[] args)
{
Console.WriteLine("enter the amount of numbers you would like to find the average and mean of: ");
int arraylength = Int32.Parse(Console.ReadLine());
int[] AverageArray = new int[arraylength];
//filling the array with user input
for (int i = 0; i < arraylength; i++)
{
Console.Write("enter the numbers you wish to find the average for: ");
AverageArray[i] = Int32.Parse(Console.ReadLine());
}
//printing out the array
Console.WriteLine("here is your array: ");
for (int i = 0; i < arrayLength; i++)
{
Console.WriteLine(AverageArray[i]);
}
Console.WriteLine(FindAverage(AverageArray));
}
public static double FindAverage(int[] averageNumbers)
{
// change to 'double' otherwise you will lose precision
double arraySum = 0;
for (int i = 0; i < averageNumbers.Length; i++)
arraySum += averageNumbers[i];
return arraySum / averageNumbers.Length;
}

Categories

Resources