Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2013, 13:16   #1
buro
 
Регистрация: 08.12.2011
Сообщений: 6
Вопрос Разбить на пары

Здравствуйте, встал вопрос.

Имеется интерфейс программы, с двумя текстбоксами, и 2 кнопками.

Задача:

В "текстбокс1" вводятся значения, допустим: Иван, Василий, Пётр, Олег, Алексей. По нажатию кнопки "Ввод" они записываются в массив, если какойто вариант остается без пары, он удаляется.

По нажатию кнопки "Вывод" они в рандомном порядке делятся на пары, и выводятся в "текстбокс2"

Имеется консольный вариант:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication21
{
    internal class Program
    {
        private static void Main()
        {
            double input;
            var set = new HashSet<double>();
            Console.WriteLine("Вводите числа. Для окончания ввода введите не-число или нажмите <Enter>");
            while (double.TryParse(Console.ReadLine(), out input))
                set.Add(input);
            var result = new HashSet<Tuple<double, double>>();
            var r = new Random();
            while (set.Count > 1)
            {
                int x = r.Next(set.Count);
                int y;
                do y = r.Next(set.Count); while (y == x); //Получили 2 различающихся x и y.
                double atX = set.ElementAt(x), atY = set.ElementAt(y);
                result.Add(new Tuple<double, double>(atX, atY));
                set.Remove(atX);
                set.Remove(atY);
            }
            foreach (var tuple in result)
                Console.WriteLine("PAIR = {0} - {1}", tuple.Item1, tuple.Item2);
            Console.ReadKey();
        }
    }
}
Как его перевести в WinForm:
Код:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;

namespace Randomize
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		public MainForm()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
		
		void TextBox1TextChanged(object sender, EventArgs e) // Ввод
		{	

		}
		
		void Button1Click(object sender, EventArgs e) // Запись вводимых данных
		{

		}
		
		void TextBox2TextChanged(object sender, EventArgs e) // Вывод
		{

		}
		
		void Button2Click(object sender, EventArgs e) //Вывод результата
		{
			
		}
	}
}
buro вне форума Ответить с цитированием
Старый 14.04.2013, 14:47   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] s = textBox1.Text.Split(',');
            int n = s.Length;
            if (n % 2 != 0) n--;
            for (int i = 0; i < n; i++) {
                listBox1.Items.Add(s[i++] + ' ' + s[i]);
            }
        }
    }
}
Подходит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.04.2013, 15:03   #3
buro
 
Регистрация: 08.12.2011
Сообщений: 6
По умолчанию

Не совсем понимаю, поясните.
buro вне форума Ответить с цитированием
Старый 14.04.2013, 17:00   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Поясняю. По клику кнопки текст из эдита разбивается на массив слов, делимых по запятой из строки. Далее выводятся в ЛистБокс пары - текущее слово + следующее заним. Последнее, если колво слов нечетное не учитывается..
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.04.2013, 18:00   #5
buro
 
Регистрация: 08.12.2011
Сообщений: 6
По умолчанию

Немного не так, я не зря привел пример рабочего кончольного варианта

Код:
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication21
{
    internal class Program
    {
        private static void Main()
        {
            double input;
            var set = new HashSet<double>();
            Console.WriteLine("Вводите числа. Для окончания ввода введите не-число или нажмите <Enter>");
            while (double.TryParse(Console.ReadLine(), out input))
                set.Add(input);
            var result = new HashSet<Tuple<double, double>>();
            var r = new Random();
            while (set.Count > 1)
            {
                int x = r.Next(set.Count);
                int y;
                do y = r.Next(set.Count); while (y == x); //Получили 2 различающихся x и y.
                double atX = set.ElementAt(x), atY = set.ElementAt(y);
                result.Add(new Tuple<double, double>(atX, atY));
                set.Remove(atX);
                set.Remove(atY);
            }
            foreach (var tuple in result)
                Console.WriteLine("PAIR = {0} - {1}", tuple.Item1, tuple.Item2);
            Console.ReadKey();
        }
    }
}
пары формируются рандомно Random();

нужно этот консольный пример подстроить в этот код винформ
Код:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;

namespace Randomize
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		public MainForm()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
		
		void TextBox1TextChanged(object sender, EventArgs e) // Ввод
		{	

		}
		
		void Button1Click(object sender, EventArgs e) // Запись вводимых данных
		{

		}
		
		void TextBox2TextChanged(object sender, EventArgs e) // Вывод
		{

		}
		
		void Button2Click(object sender, EventArgs e) //Вывод результата
		{
			
		}
	}
}
buro вне форума Ответить с цитированием
Старый 20.04.2013, 12:58   #6
buro
 
Регистрация: 08.12.2011
Сообщений: 6
По умолчанию

Никто не поможет ? =(
buro вне форума Ответить с цитированием
Старый 25.04.2013, 05:45   #7
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Stilet привел почти полностью рабочую программу (по всем твоим требованиям):
Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] s = textBox1.Text.Split(',');
            int n = s.Length;
            if (n % 2 != 0) n--;
            for (int i = 0; i < n; i++) {
                listBox1.Items.Add(s[i++] + ' ' + s[i]);
            }
        }
    }
}
Единственно что нужно исправить, так это следующее:
Код:
        private void button2_Click(object sender, EventArgs e)
        {
            //создаем список из имен, которые разделены в строке textBox1.Text запятой
            List<String> persons = new List<String>(textBox1.Text.Split(','));
            //генератор случайных чисел
            Random rnd=new Random();
            //первая вставляемая персона
            String firstPerson;
            //индекс вставляемого элемента в строку listBox1 и удаляемого из persons
            Int32 removingIndex;
            //вторая вставляемая персона
            String secondPerson;
            //чистим textBox для вывода
            textBox2.Text=String.Empty;
            //пока количество элементов в списке persons превышает 1
            while(persons.Count>1)
            {
                        //сгенерировать случайным образом индекс в пределах от 0 до (persons.Count-1) - отнимаем 1, т.к. индексация идет с нуля, в Count вернет общее количество элементов
                        removingIndex=rnd.Next(persons.Count-1);
                        //извлечь персону по сгенерированному индексу
                        firstPerson=persons[removingIndex];
                        //удалить персону
                        persons.RemoveAt(removingIndex);
                        //аналогично
                        removingIndex=rnd.Next(persons.Count-1);
                        //аналогично
                        secondPerson=persons[removingIndex];
                        //аналогично
                        persons.RemoveAt(removingIndex);
                        //вставляем с переходом на следуюущую строку. Конечно, незабудь установить у textBox2 свойство Multiline
                        textBox2.Text+=(firstPerson + ' ' + secondPerson) + "\n";
            }
        }
Глупость сам пишешь:
Цитата:
Сообщение от buro Посмотреть сообщение
Код:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;

namespace Randomize
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		public MainForm()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
		
		void TextBox1TextChanged(object sender, EventArgs e) // Ввод
		{	

		}
		
		void Button1Click(object sender, EventArgs e) // Запись вводимых данных
		{

		}
		
		void TextBox2TextChanged(object sender, EventArgs e) // Вывод
		{

		}
		
		void Button2Click(object sender, EventArgs e) //Вывод результата
		{
			
		}
	}
}
Зачем тебе обработчики событий "TextBox1TextChanged" и "TextBox2TextChanged"? - они будут вызываться всякий раз, когда изменяется поле Text в textBox'ах, на кой черт это нужно? Зачем тебе также нужен мето "Button1Click"? Засунь указанный код в метод "Button2Click" и будет тебе счастье
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 02.05.2013, 13:37   #8
buro
 
Регистрация: 08.12.2011
Сообщений: 6
По умолчанию

Кажется понял.

Второй вопрос, а как сюда добавить рандомно выбранные чекбоксы ?
Код:
/*
 * Сделано в SharpDevelop.
 * Пользователь: Дом
 * Дата: 01.05.2013
 * Время: 20:37
 * 
 * Для изменения этого шаблона используйте Сервис | Настройка | Кодирование | Правка стандартных заголовков.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace Randomer
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        int server, n;
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
            
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
        
 
        
        void Button2Click(object sender, EventArgs e)
        {
            switch (n)
            {
                case 1:
                    {
                        server = 1; 
                        break;
                    }
                case 2:
                    {
                        server = 2; 
                        break;
                    }
                case 3:
                    {
                        server = 3; 
                        break;
                    }
                case 4:
                    {
                        server = 4; 
                        break;
                    }
                case 5:
                    {
                        server = 5;
                        break;
                    }
            }
            List<String> persons = new List<String>(textBox1.Text.Split(','));  
            Random rnd=new Random();                                            
            String firstPerson;                                                 
            Int32 removingIndex;                                                
            String secondPerson;                                                
            textBox2.Text=String.Empty;                                         
            while(persons.Count>1)                                              
            {
                        
            removingIndex=rnd.Next(persons.Count-1);    
            firstPerson=persons[removingIndex];         
            persons.RemoveAt(removingIndex);            
            removingIndex=rnd.Next(persons.Count-1);    
            secondPerson=persons[removingIndex];        
            persons.RemoveAt(removingIndex);            
            textBox2.Text+=(firstPerson + '-' + secondPerson + '-' + server + "\r\n"); 
            }
        }
        
        void CheckBox1CheckedChanged(object sender, EventArgs e)
        {
            n = 1;
        }
        
        void CheckBox2CheckedChanged(object sender, EventArgs e)
        {
            n = 2;
        }
        
        void CheckBox3CheckedChanged(object sender, EventArgs e)
        {
            n = 3;
        }
        
        void CheckBox4CheckedChanged(object sender, EventArgs e)
        {
            n = 4;
        }
        
        void CheckBox5CheckedChanged(object sender, EventArgs e)
        {
            n = 5;
        }
    }
}
buro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти пары чисел саша аврамов Паскаль, Turbo Pascal, PascalABC.NET 1 20.02.2013 06:54
Файлы,паскаль - Файл содержит пары чисел.Из каждой пары взять большее и записать в другой файл Vika2112 Помощь студентам 1 13.12.2012 08:35
Структуры и пары МартинИ Помощь студентам 3 09.12.2009 20:59
Как разбить число на цифрыКак разбить число на цифры: 3241 => 3,2,4,1 (Pascal) Banderas123 Помощь студентам 3 07.12.2009 18:26
Пары регистров в Delphi Jupiter Общие вопросы Delphi 4 13.08.2008 17:29