I have the whole code working but need a little help getting the converted array to display correctly in the wordListBox. Any help would be appreciated. The code I have is listed below and the string[] word is declared in the class level.
private void Convert(string[] wordArray, int count)
{
//Convert numbers
for (int index = 0; index < count; index++)
{
if (numbers[index] == 1)
{
wordArray[index] = "one";
}
else if (numbers[index] == 2)
{
wordArray[index] = "two";
}
else if (numbers[index] == 3)
{
wordArray[index] = "three";
}
else if (numbers[index] == 4)
{
wordArray[index] = "four";
}
else if (numbers[index] == 5)
{
wordArray[index] = "five";
}
else if (numbers[index] < 1)
{
wordArray[index] = "lower";
}
else
{
wordListBox.Items.Add("higher");
}
}
}
private void ConvertButton_Click(object sender, EventArgs e)
{
wordListBox.Items.Clear();
Convert(word, count);
wordListBox.Items.Add(word);
}
I would use List<string> instead of string[] for the word variable and method parameter wordArray, so you don't have to initialize the array size. In the ConvertButton_Click you are missing a foreach loop that iterates trough all of the elements in wordArray and adds them to the wordListBox. Here is an example:
int[] numbers = { -5, 3, 6, 9, -2, 1, 0, 4};
int count = 8;
List<string> word = new List<string>();
private void Convert(List<string> wordArray, int count)
{
//Convert numbers
for (int index = 0; index < count; index++)
{
if (numbers[index] == 1)
{
wordArray.Add("one");
}
else if (numbers[index] == 2)
{
wordArray.Add("two");
}
else if (numbers[index] == 3)
{
wordArray.Add("three");
}
else if (numbers[index] == 4)
{
wordArray.Add("four");
}
else if (numbers[index] == 5)
{
wordArray.Add("five");
}
else if (numbers[index] < 1)
{
wordArray.Add("lower");
}
else
{
wordArray.Add("higher");
}
}
}
private void ConvertButton_Click(object sender, EventArgs e)
{
wordListBox.Items.Clear();
Convert(word, count);
foreach (var item in word)
{
wordListBox.Items.Add(item);
}
}
Result:
Try:
private void ConvertButton_Click(object sender, EventArgs e)
{
wordListBox.Items.Clear();
Convert(word, count);
wordListBox.Items.AddRange(word);
}
Related
So I'm trying to remove all even numbers from the generated random list I created. But this message keeps showing up: "System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index'
I don't know what I'm doing wrong. What do I need to change?
public partial class Form2 : Form
{
ArrayList array = new ArrayList();
int count = -1;
int[] numbers = new int[5];
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Random randNum = new Random();
for (int i = 0; i < 5; i++)
{
numbers[i] = randNum.Next(-100, 100);
array.Add(numbers[i]);
richTextBox1.Clear();
}
for (int i = 0; i <= count; i++)
{
//displays random numbers to rich textbox
richTextBox1.AppendText(array[i].ToString() + '\n');
}
}
private void button2_Click(object sender, EventArgs e)
{
foreach (int i in array)
{
if (Convert.ToInt32(array[i]) % 2 == 0)
{
array.RemoveAt(i);
}
richTextBox1.Text = array[i].ToString();
}
}
Your code in Button2_click is wrong. You are using foreach loop and then trying to access the index of array using its elements value.
change your second button code with following code
for (int i = 0; i < array.Count; )
{
if (Convert.ToInt32(array[i]) % 2 == 0)
{
array.RemoveAt(i);
}
else {
i++;
}
}
foreach (var item in array)
{
richTextBox1.Text = item +"\n";
}
You should change your enumeration like:
private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < array.Count; i++)
{
if (Convert.ToInt32(array[i]) % 2 == 0)
{
array.RemoveAt(i);
}
richTextBox1.Text = array[i].ToString();
}
}
Using LINQ you can achieve this easily.
var oddArray = array.Where(a => a % 2 != 0);
richTextBox1.Text = string.Join(", ", oddArray);
PS - You just need to add a namespace i.e. System.Linq
I am trying to write a code that lists roots of given number.
This is what I did so far. The result I get is 2*2*5*5 which is true but I want to get this instead: 2^2*5^2.
public partial class Form1 : Form
{
List<int> divisor;
public Form1()
{
InitializeComponent();
}
private void list_Click(object sender, EventArgs e)
{
int number;
divisor = new List<int>();
showroot.Text = "";
number = Int32.Parse(usernum.Text);
for (int i = 2; i <= number; i++)
{
if (number % i == 0)
{
divisor.Add(i);
number = number / i;
i = 1;
}
}
for (int i = 0; i < divisor.Count; i++)
{
print(""+ divisor[i]);
}
}
private void print(String text)
{
if (showroot.Text != "")
{
showroot.Text = showroot.Text + "*" + text;
}
else
{
showroot.Text = text;
}
}
}
I tried to check how much same root and count them by two for statements nested but that brings another errors within.
for (int i = 0; i < divisor.Count; i++) {
for (int a = 0; i < divisor.Count; a++) {
if (i == a) {
base[i]++;
}
}
}
What to do?
Split the task into easy to implement portions, extract methods:
First of all, let's collect all prime divisors (divisors can repeat):
private static IEnumerable<int> AllPrimeDivisors(int value) {
if (value <= 1)
yield break;
for (; value % 2 == 0; value /= 2)
yield return 2;
int n = (int)(Math.Sqrt(value) + 0.5);
for (int d = 3; d <= n; d += 2) {
while (value % d == 0) {
yield return d;
value /= d;
n = (int)(Math.Sqrt(value) + 0.5);
}
}
if (value > 1)
yield return value;
}
Then combine them in required format (we should GroupBy the same - repeating - divisors and represent them either in divisor or in divisor^power format)
private static string Solve(int value) {
var terms = AllPrimeDivisors(value)
.GroupBy(divisor => divisor)
.Select(group => group.Count() == 1
? $"{group.Key}"
: $"{group.Key}^{group.Count()}");
return string.Join("*", terms);
}
Finally add UI:
private void list_Click(object sender, EventArgs e) {
if (int.TryParse(usernum.Text, out var number))
showroot.Text = Solve(number);
else
showroot.Text = "Incorrect Input, Syntax Error";
}
Tests:
int[] tests = new int[] {
3, 5, 9, 12, 16, 41, 81, 100,
};
var result = tests
.Select(item => $"{item,3} == {Solve(item)}");
Console.Write(string.Join(Environment.NewLine, result));
Outcome:
3 == 3
5 == 5
9 == 3^2
12 == 2^2*3
16 == 2^4
41 == 41
81 == 3^4
100 == 2^2*5^2
A naive implementation would be by changing your for to this:
for (int i = 2; i <= number; i++)
{
count = 0;
while (number % i == 0)
{
number = number / i;
count++;
}
if (count > 0)
{
divisor.Add(i);
powers.Add(count);
}
}
However a lot of optimizations can be done.
I'm trying to check if two words are anagram and trying to do this with LinkedList.To do that,first,I created a class named LinkedList:
class LinkedList
{
private Node head;
private int count;
public LinkedList()
{
this.head = null;
this.count = 0;
}
public bool Empty
{
get { return this.count == 0; }
}
public int Count
{
get { return this.count; }
}
public object this[int index]
{
get { return this.Get(index); }
}
public object Add(int index,object o)
{
if (index < 0)
{
throw new ArgumentOutOfRangeException("Index - " + index); //if index is less than 0 throw an error message
}
if (index > count) // if size exceeds the limit of the list the item will be added to the last line of the list.
{
index = count;
}
Node current = this.head;
if(this.Empty || index== 0)
{
this.head = new Node(o, this.head);
}
else
{
for(int i = 0; i < index - 1; i++)
{
current = current.Next;
}
current.Next = new Node(o, current.Next);
}
count++;
return o;
}
public object Add(Object o)
{
return this.Add(count, o);
}
public object Remove(int index)
{
if (index < 0)
{
throw new ArgumentOutOfRangeException("Index - " + index);
}
if (this.Empty)
{
return null;
}
if (index >= this.count)
{
index = count-1;
}
Node current = this.head;
object result = null;
if (index == 0)
{
result = current.Data; //gets the first node
this.head = current.Next; //makes 2nd node to the first node
}
else
{
for(int i = 0; i < index - 1; i++)
{
result = current.Next.Data;
}
result = current.Next;
current.Next = current.Next.Next;
}
count--;
return result;
}
public int IndexOf(object o)
{
Node current = this.head;
for(int i = 0; i < this.count; i++)
{
if (current.Data.Equals(o))
{
return i;
}
current = current.Next;
}
return -1;
}
public bool Contains(object o)
{
return this.IndexOf(o) >= 0; //if list contains object it returns bigger value than -1 and also 0.
}
public object Get(int index)
{
if(index < 0)
{
throw new ArgumentOutOfRangeException("Index - " + index);
}
if (this.Empty)
{
return null;
}
if(index >= this.count)
{
index = this.count-1;
}
Node current = this.head;
for(int i=0;i< index; i++)
{
current = current.Next;
}
return current.Data;
}
}
And another class named "Node":
class Node
{
private object data;
private Node next;
public Node(object data,Node next) //constructor
{
this.data = data;
this.next = next;
}
public object Data
{
get { return this.data; }
set { this.data = value; }
}
public Node Next
{
get { return this.next; }
set { this.next = value; }
}
}
And in main program,I created two objects from linkedlist class and read two strings from user and added the words' chars to the linked list.And compared the chars and if they found they'll be deleted from linkedlist,increases the counter and so on.If counter equals to the list1's number ofelements then they are anagrams if not the words are not anagrams.Here's my main program code:
class Program
{
static void Main(string[] args)
{
int counter = 0;
String word1, word2;
Console.WriteLine("Welcome to Anagram Checker!\nPlease enter your first word:");
word1 = Console.ReadLine();
Console.WriteLine("\nPlease enter the second word:");
word2 = Console.ReadLine();
int result = AnagramChecker(word1, word2, counter);
if (result == 1)
{
Console.WriteLine("These words are anagram");
}
if (result == 0)
{
Console.WriteLine("The words are not anagrams");
}
Console.ReadLine();
}
public static int AnagramChecker(String word1, String word2, int counter)
{
char[] ArrayWord1 = word1.ToCharArray();
char[] ArrayWord2 = word2.ToCharArray();
LinkedList list1 = new LinkedList();
LinkedList list2 = new LinkedList();
for (int i = 0; i < ArrayWord1.Length; i++) //Adds char of word1 to the list
{
list1.Add(i,ArrayWord1[i]);
}
for (int j = 0; j < ArrayWord2.Length; j++) //Adds char of word2 to the list
{
list2.Add(j,ArrayWord2[j]);
}
int max;
if (list1.Count >= list2.Count)
{
max = list1.Count;
}
if (list2.Count > list1.Count)
{
max = list2.Count;
}
for (int i = 0; i < list1.Count; i++)
{
if (list2.Contains(list1[i]) && list1.Contains(list2[i]))
{
list1.Remove(i);
list2.Remove(list2.IndexOf(list1[i]));
counter++;
}
}
Console.WriteLine(counter);
if (counter == word1.Length || counter == word2.Length)
{
return 1;
}
else
return 0;
}
}
When I'm entering different words I get different results.The output examples are below.What do I do wrong?
Outputs:
1-)
2-)
Thanks for your kind helps.
If you're just looking to find if words are anagrams, you can use this method:
private static bool areAnagrams(string word1, string word2)
{
List<char> w1 = word1.OrderBy(c => c).ToList();
List<char> w2 = word2.OrderBy(c => c).ToList();
return !w1.Where((t, i) => t != w2[i]).Any();
}
Which create two lists ordered with the words chars, then compare both.
More readable equivalent:
private static bool areAnagrams(string word1, string word2)
{
List<char> w1 = word1.OrderBy(c => c).ToList();
List<char> w2 = word2.OrderBy(c => c).ToList();
if (w1.Count != w2.Count)
return false;
for (int i = 0; i < w1.Count; i++)
{
if (w1[i] != w2[i])
return false;
}
return true;
}
I fixed the problem,I just modified the if statement which checks if they're anagram or not:
for (int i = 0; i < list1.Count; i++)
{
if (list2.Contains(list1[i]))
{
list1.Remove(i);
// list2.Remove(list2.IndexOf(list1[i]));
i--;
counter++;
}
Thanks all of you for your helps :)
Your answers are:
int[] sayilar1 = new int[150];
int[] sayilar2 = new int[150];
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var rand = new Random();
for (int i = 0; i < sayilar1.Length; i++)
{
sayilar1[i] = rand.Next();
sayilar2[i] = rand.Next();
lvNumbers.Items.Add(sayilar1[i].ToString());
lvNumbers.Items.Add(sayilar2[i].ToString());
}
}
private void btnShuffle_Click(object sender, EventArgs e)
{
int[]newArray=BubbleSort();
for (int i = 0; i < newArray.Count(); i++)
{
lvSorted.Items.Add(newArray[i].ToString());
}
}
private int[] BubbleSort()
{
int temp = 0;
int[] newArray = new int[300];
for (int i = 0; i < 300; i++)
{
if (i < 150)
{
newArray[i] = sayilar1[i];
}
if (i >= 150)
newArray[i] = sayilar2[i - 150];
}
for (int i = 0; i < newArray.Length; i++)
{
for (int sort = 0; sort < newArray.Length - 1; sort++)
{
if (newArray[sort] > newArray[sort + 1])
{
temp = newArray[sort + 1];
newArray[sort + 1] = newArray[sort];
newArray[sort] = temp;
}
}
}
return newArray;
}
}
2.
private void btnTek_Click(object sender, EventArgs e)
{
lvFiltered.Items.Clear();
string[] sayilar = tbSayilar.Text.Split('\n');
int[] array = new int[sayilar.Length];
for (int i = 0; i < sayilar.Length; i++)
{
array[i] = int.Parse(sayilar[i]);
}
List<int> ayiklanmisSayilar = TekCiftAyir(array, "T");
for (int i = 0; i < ayiklanmisSayilar.Count; i++)
{
lvFiltered.Items.Add(ayiklanmisSayilar[i].ToString());
}
}
private void btnCift_Click(object sender, EventArgs e)
{
lvFiltered.Items.Clear();
string[] sayilar = tbSayilar.Text.Split('\n');
int[] array = new int[sayilar.Length];
for (int i = 0; i < sayilar.Length; i++)
{
array[i] = int.Parse(sayilar[i]);
}
List<int> ayiklanmisSayilar = TekCiftAyir(array, "C");
for (int i = 0; i < ayiklanmisSayilar.Count; i++)
{
lvFiltered.Items.Add(ayiklanmisSayilar[i].ToString());
}
}
private List<int> TekCiftAyir(int[] array, string TC)
{
List<int> ayiklanmisSayilar = new List<int>();
if (TC == "T")
{
for (int i = 0; i < array.Length; i++)
{
if (array[i] % 2 == 1)
{
ayiklanmisSayilar.Add(array[i]);
}
}
}
if (TC == "C")
{
for (int i = 0; i < array.Length; i++)
{
if (array[i] % 2 == 0)
{
ayiklanmisSayilar.Add(array[i]);
}
}
}
return ayiklanmisSayilar;
}
}
This question already has an answer here:
Why do I only see some of my text output when my Window Forms application has a loop?
(1 answer)
Closed 7 years ago.
I am trying to combine prime numbers, even numbers and odd numbers and their results in a Windows Form Application. I have tested the code in Console but in Windows Form it will not loop to the next applicable number. For example: In console 1 - 10 in primes would result in "2, 3, 5, 7", however in Windows Form Application it will result in "2"
public partial class NumberCalc : Form
{
public NumberCalc()
{
InitializeComponent();
}
private void Primes_CheckedChanged(object sender, EventArgs e)
{
{
int f = Convert.ToInt32(Min.Text);
int i = Convert.ToInt32(Max.Text);
bool isPrime = true;
for (f = 0; f <= i; f++)
{
for (int j = 2; j <= i; j++)
{
if (f != j && f % j == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
string final;
final = ("The Prime Numbers Are:" + f);
Result.Text = final;
}
isPrime = true;
}
}
}
private void Result_TextChanged(object sender, EventArgs e)
{
}
private void Min_TextChanged(object sender, EventArgs e)
{
}
private void Evens_CheckedChanged(object sender, EventArgs e)
{
int f = Convert.ToInt32(Min.Text);
int i = Convert.ToInt32(Max.Text);
for (f = 0; f >= i; f++)
{
if (f % 2 == 0)
{
{
string final;
final = ("The Even Numbers Are:" + f);
Result.Text = final;
}
}
}
}
private void Odds_CheckedChanged(object sender, EventArgs e)
{
int f = Convert.ToInt32(Min.Text);
int i = Convert.ToInt32(Max.Text);
for (f = 0; f <= i; f++)
{
if (f % 2 != 0)
{
{
string final;
final = ("The Even Numbers Are:" + f);
Result.Text = final;
}
}
}
}
}
}
Change your code to:
private void Primes_CheckedChanged(object sender, EventArgs e)
{
{
string final = "The Prime Numbers Are:";// you need to keep the result out of the loop instead of reset it everytime
int f = Convert.ToInt32(Min.Text);
int i = Convert.ToInt32(Max.Text);
bool isPrime = true;
for (f = 0; f <= i; f++)// why set f=0 here ? Does not f = min already ?
{
for (int j = 2; j <= i; j++)// maybe j < f not j <= i
{
if (f != j && f % j == 0)// then remove f != j here
{
isPrime = false;
break;
}
}
if (isPrime)
final = final + " " + f;// then add your found number to the result here
isPrime = true;
}
Result.Text = final;
}
}
Even and Odd goes the same.BTW 1 is not prime number, am I right ?
I would combine your loops/checks into one method like this:
private void Form1_Load(object sender, EventArgs e)
{
this.Primes.CheckedChanged += Options_CheckedChanged;
this.Evens.CheckedChanged += Options_CheckedChanged;
this.Odds.CheckedChanged += Options_CheckedChanged;
this.Min.TextChanged += Range_Changed;
this.Max.TextChanged += Range_Changed;
CheckNumbers();
}
private void Range_Changed(object sender, EventArgs e)
{
CheckNumbers();
}
private void Options_CheckedChanged(object sender, EventArgs e)
{
CheckNumbers();
}
private void CheckNumbers()
{
int min, max;
try
{
min = Convert.ToInt32(Min.Text);
max = Convert.ToInt32(Max.Text);
}
catch (Exception)
{
Results.Text = "Invalid Range!";
return;
}
List<int> lstPrimes = new List<int>();
List<int> lstEvens = new List<int>();
List<int> lstOdds = new List<int>();
if (Primes.Checked || Evens.Checked || Odds.Checked)
{
bool isPrime;
for (int f = min; f <= max; f++)
{
if (Primes.Checked)
{
isPrime = true;
for (int j = 2; j <= max; j++)
{
if (f != j && f % j == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
lstPrimes.Add(f);
}
}
int modResult = f % 2;
if (Evens.Checked && modResult == 0)
{
lstEvens.Add(f);
}
if (Odds.Checked && modResult != 0)
{
lstOdds.Add(f);
}
}
}
StringBuilder sb = new StringBuilder();
if (Primes.Checked)
{
sb.AppendLine("The Prime Numbers Are:" + String.Join(",", lstPrimes));
}
if (Evens.Checked)
{
sb.AppendLine("The Even Numbers Are:" + String.Join(",", lstEvens));
}
if (Odds.Checked)
{
sb.AppendLine("The Odd Numbers Are:" + String.Join(",", lstOdds));
}
Results.Text = sb.ToString();
}
I think LINQ is more suitable here, You can try this:
int[] numbers = Enumerable.Range(f, i-f).ToArray<int>();
string oddNumbers=string.Join(",", from number in numbers
where (number % 2)!=0
select number);
string evenNumbers = string.Join(",", from number in numbers
where (number % 2) == 0
select number);
Result.Text = "The Even Numbers Are:" + evenNumbers;
Result.Text = "The Odd Numbers Are:" + oddNumbers;
Updates for Prime number:
var primeNumbers= string.Join(",",from number in numbers
where (IsPrime(number))
select number);
Where IsPrime() method is defined as follows?
private static bool IsPrime(int number)
{
for (int i = 2; i < number; i ++)
if (number % i == 0) return false;
return true;
}
This question already has answers here:
How can I test for primality?
(16 answers)
Closed 8 years ago.
I need to use a boolean variable to identify if a number inserted in a text box is a prime number and be written in C#
protected void isPrimeButton_Click(object sender, EventArgs e)
{
int TestNumber = int.Parse(primeNumberTextBox.Text);
bool isPrime = true;
for (int i = 0; i < TestNumber; i++)
{
while (TestNumber % i == 0)
{
bool isPrime = true;
yesNoPrimeTextBox.Text = "prime";
break;
}
while (TestNumber % i == 0)
{
bool isPrime = false;
yesNoPrimeTextBox.Text = "not prime";
break;
}
}
}
Extract IsPrime as a method and you'll have something like this:
public static Boolean IsPrime(int value) {
if (value <= 1)
return false;
else if (value <= 3) // 2 and 3 are primes
return true;
else if (value % 2 == 0) // even numbers (2 excluded) are not primes
return false;
// Test odd numbers 3, 5, 7, ... as potential dividers
// up to square root of the value
int n = (int) (Math.Sqrt(value) + 1);
for (int i = 3; i <= n; i += 2)
if (value % i == 0)
return false;
return true;
}
...
protected void isPrimeButton_Click(object sender, EventArgs e) {
int testNumber;
if (!int.TryParse(primeNumberTextBox.Text, out testNumber)) {
// primeNumberTextBox.Text is not a int (incorrect format)
//TODO: probably you have to put some text into yesNoPrimeTextBox.Text
return;
}
if (IsPrime(testNumber))
yesNoPrimeTextBox.Text = "prime";
else
yesNoPrimeTextBox.Text = "not prime";
}
Use this method to check :
Also consider changing the return type , maybe you want it to return boolean instead of string
public static string CheckPrime(int number)
{
bool isPrime = true;
for (int i = 2; i < number; i++)
{
if (number % i == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
return number.ToString() + " is a Prime number";
}
else
{
return number.ToString() + " is not a Prime number";
}
}
Not very efficient, but this should work:
protected void isPrimeButton_Click(object sender, EventArgs e)
{
int TestNumber = int.Parse(primeNumberTextBox.Text);
bool isPrime = true;
for (int i = 2; i < TestNumber; i++)
{
if (TestNumber % i == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
yesNoPrimeTextBox.Text = "prime";
else
yesNoPrimeTextBox.Text = "not prime";
}
This should do it.
protected void isPrimeButton_Click(object sender, EventArgs e)
{
int TestNumber = int.Parse(primeNumberTextBox.Text);
bool isPrime = false;
for (int i = 2; i < TestNumber-1; i++)
{
if (TestNumber % i == 0)
{
isPrime = true;
yesNoPrimeTextBox.Text = "prime";
break;
}
}
}