Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Diagnostics;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace WindowsFormsApplication1
- {
- public partial class Form1 : Form
- {
- Thread thr;
- Stopwatch stoper = new Stopwatch();
- int n, sil, progres, czas;
- int stan_value = 0; //0 - stop, 1 - run, 2 - pause
- int stan
- {
- get { return stan_value; }
- set
- {
- stan_value = value;
- zmiana_stanu();
- }
- }
- int silnia(int n)
- {
- int s = 1;
- for (int i = 1; i <= n; i++)
- {
- s *= i;
- }
- return s;
- }
- void zmiana_stanu()
- {
- switch (stan)
- {
- case 0: //stop
- stoper.Stop();
- numericUpDown1.Enabled = true;
- button1.Enabled = true;
- button2.Enabled = false;
- button3.Enabled = false;
- break;
- case 1: //run
- stoper.Start();
- numericUpDown1.Enabled = false;
- button1.Enabled = false;
- button2.Enabled = true;
- button3.Enabled = true;
- break;
- case 2: //pause
- stoper.Stop();
- numericUpDown1.Enabled = false;
- button1.Enabled = true;
- button2.Enabled = false;
- button3.Enabled = false;
- break;
- }
- }
- void reset()
- {
- progres = 0;
- czas = 0;
- progressBar1.Value = 0;
- stoper.Reset();
- textBox1.Clear();
- label3.Text = "0 %";
- label4.Text = "Czas od początku obliczeń: " + stoper.Elapsed;
- label5.Text = "Czas do zakończenia obliczeń: 0 s";
- stan = 0;
- }
- void wyswietl(int[] a)
- {
- string perm = "";
- for (int i = 0; i < a.Length; i++)
- perm += a[i] + " ";
- progres++;
- czas = (int)((sil - progres) * stoper.ElapsedMilliseconds / progres) / 1000;
- textBox1.Invoke(new MethodInvoker(() => textBox1.AppendText(perm + "\n")));
- progressBar1.Invoke(new MethodInvoker(() => progressBar1.Value = progres));
- label3.Invoke(new MethodInvoker(() => label3.Text = string.Format("{0} %", (int)((float)progres / sil * 100))));
- label4.Invoke(new MethodInvoker(() => label4.Text = "Czas od początku obliczeń: " + stoper.Elapsed));
- if (czas < 60)
- label5.Invoke(new MethodInvoker(() => label5.Text = "Czas do zakończenia obliczeń: " + czas + " s"));
- else
- label5.Invoke(new MethodInvoker(() => label5.Text = "Czas do zakończenia obliczeń: " + czas / 60 + " min " + czas % 60 + " s"));
- }
- void koniec()
- {
- stan_value = 0; //metoda zmiana_stanu tu nie działa, trzeba to zrobić ręcznie.
- stoper.Stop();
- numericUpDown1.Invoke(new MethodInvoker(() => numericUpDown1.Enabled = true));
- button1.Invoke(new MethodInvoker(() => button1.Enabled = true));
- button2.Invoke(new MethodInvoker(() => button2.Enabled = false));
- button3.Invoke(new MethodInvoker(() => button3.Enabled = false));
- }
- void QuickPerm() //http://www.c-sharpcorner.com/Forums/Thread/213338/C-Sharp-windows-form-application-pleasee-helllppp.aspx
- {
- int[] a = new int[n];
- int[] p = new int[n]; // all zero by default
- int i, j, tmp;
- for (i = 0; i < n; i++)
- a[i] = i + 1;
- wyswietl(a);
- i = 1;
- while (i < n)
- {
- if (p[i] < i)
- {
- j = i % 2 * p[i];
- tmp = a[j];
- a[j] = a[i];
- a[i] = tmp;
- wyswietl(a);
- p[i]++;
- i = 1;
- }
- else
- {
- p[i] = 0;
- i++;
- }
- }
- koniec();
- }
- private void numericUpDown1_ValueChanged(object sender, EventArgs e)
- {
- label2.Text = "n! = " + silnia((int)numericUpDown1.Value).ToString();
- }
- private void button1_Click(object sender, EventArgs e) //Start
- {
- if (stan == 2)
- {
- try
- {
- thr.Resume();
- stan = 1;
- }
- catch { }
- }
- else
- {
- reset();
- n = (int)numericUpDown1.Value;
- sil = silnia(n);
- progressBar1.Maximum = sil;
- thr = new Thread(QuickPerm);
- thr.Start();
- stan = 1;
- }
- }
- private void button2_Click(object sender, EventArgs e) //Pauza
- {
- try
- {
- thr.Suspend();
- stan = 2;
- }
- catch { }
- }
- private void button3_Click(object sender, EventArgs e) //Stop
- {
- try
- {
- thr.Abort();
- stan = 0;
- }
- catch { }
- reset();
- }
- public Form1()
- {
- InitializeComponent();
- reset();
- }
- /*
- void swap(int a, int b)
- {
- int tmp = list[a];
- list[a] = list[b];
- list[b] = tmp;
- }
- void perm(int k) //Heap's algorithm
- {
- if (k == 0)
- wyswietl_liste();
- else
- {
- for (int i = 0; i <= k; i++)
- {
- swap(i, k);
- perm(k - 1);
- swap(i, k);
- }
- }
- }
- */
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement