Страница 1 из 1

Преобразование типов С#

Добавлено: 27 мар 2011, 17:18
assis2007
Тема набившая оскомину многим но, прошу прощения, для меня она не решаемая. Проблема в том что при попытке забрать из textbox значение переменной tob выдаётся ошибка "Входная строка имела неверный формат". Компилятор не ругается, ругаться начинает при вводе чисел с точкой например 0.6 или 1.7 . При вводе целого числа всё нормально и расчёт идёт. Собственно код :

Код: Выделить всё

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 Пивк1
{
    public partial class Form1 : Form
    {
        string s1,s2,s3,s4;
        int n1=0;
        double n2=0;
        double tii=0;
        double tob=0;
        public Form1()
        {
            InitializeComponent();
        }
        double step(double a, int b)
        {
            double p = a;
            for (int i = 1; i < b; i++)
                p = p * b;
            return p;
        }
        int factor(int x)
        {
            if (x == 0) return 1;
            return x * factor(x - 1);
        }
        private void startbutton_Click(object sender, EventArgs e)
        {
            startbutton.Enabled = false;
            s1 = textBox1.Text;
            n1 = Convert.ToInt32(s1);
            s2 = textBox2.Text;
            tii = Convert.ToDouble(s2);
            s1 = textBox3.Text;
            tob = Convert.ToDouble(s1);//43 строка
            //bool isSuccess = double.TryParse(s3, out tob);
            s1 = tob.ToString();
            textBox13.Text = s1;
            s4 = textBox4.Text;
            n2 = Convert.ToDouble(s4);
            //проверка ввода
            //s1 = tii.ToString();
            //textBox13.Text=s1;
            //s2 = tii.ToString();
            //textBox6.Text = s2;
            //s1 = tob.ToString();
            //textBox13.Text = s3;
            //s1 = n2.ToString();
            //textBox8.Text = s4;
            double po=0;
            double ro;
            ro=n2*tob/tii;
            double rb = n2 * tob;
            //s1 = tob.ToString();
            //textBox13.Text = s1;
            double wq=0;
            double aq=0; 
            double az=0;
            //1)Вероятность того, что все каналы СМО свободны
            for (int k = 0; k < n1 ; k++)
            {
                aq = step(ro, k) / factor(k);
                wq = wq + aq;
            }
            az = step(ro, n1) / ((factor(n1 - 1)) * (n1 - ro));
            po = 1/(wq+az);
            //вывод
            s1 = po.ToString();
            textBox5.Text=s1;
            //3)Вероятность того, что все каналы СМО заняты (k >= n)
            double pn;
            pn = po * ((step(ro,n1)) / ((factor(n1 - 1)) * (n1 - ro)));
            //вывод
            s1 = pn.ToString();
            textBox6.Text = s1;
            //6)Среднее время ожидания требованием начала обслуживания в СМО
            double tog;
            tog = pn * tob / (n1 - ro);
            //вывод
            s1 = tog.ToString();
            textBox7.Text = s1;
            //7)Среднее длина очереди
            double mog;
            double aa;
            aa=1-ro/n1;
            mog = ro * pn / n1 * (step(aa,2));
            //вывод
            s1 = mog.ToString();
            textBox8.Text = s1;
            //9)Среднее число каналов, свободных от обслуживания
            double no = 0;
            for (int k = 1; k < n1 ; k++)
            {
                no = no + (step(ro,k) * po * (n1 - k)) / factor(k);
            }
            //вывод
            s1 = no.ToString();
            textBox9.Text = s1;
            //Коэффициент простоя  каналов
            double kp;
            kp = no / n1;
            //вывод
            s1 = kp.ToString();
            textBox10.Text = s1;
            //Среднее число каналов, занятых обслуживанием
            double nz;
            nz = n1 - no;
            //вывод
            s1 = nz.ToString();
            textBox11.Text = s1;
            //Коэффициент загрузки каналов
            double kz;
            kz = nz / n1;
            //вывод
            s1 = kz.ToString();
            textBox12.Text = s1;
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == '.') && (textBox1.Text.IndexOf(".") == -1)))
            {
                if (e.KeyChar != (char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
        }

    }
}
Язык C#.
Проблема в 43 строке. Там закоментил ещё 1 вариант. Он позволяет вводить но выдаёт 0.

Re: Преобразование типов С#

Добавлено: 27 мар 2011, 19:49
L.A.V.
Особенно понравилось
assis2007 писал(а):Проблема в 43 строке.
Ага ща тут все сели и посчитали строчки. :)

Не являюсь знатоком С#, но может попробовать вводить числа через запятую, типа 0,343
Если ошибка времени выполнения, советую познакомится с исключениями, они классные ;) . Намного упроститят жизнь в дальнейшем.

З.Ы. В комментах СМО, очереди.... Небось лабы по моделированию систем? :)

З.Ы.Ы. И на будущее, используй [ CODE=сpp ]твой код[ /CODE ] без пробелов. тогда код отображаемый на странице будет подсвечиваться, и его будет легче читать.

Re: Преобразование типов С#

Добавлено: 27 мар 2011, 23:04
assis2007
Запятые у меня не читает в принципе. Лабы да, что-то очень похожее на моделирование))
Ну а какое здесь исключение? стандартный(по идее) забор числа из текстбокса

Re: Преобразование типов С#

Добавлено: 28 мар 2011, 00:10
L.A.V.
Смотри, оказывается есть такая штука, вот тут.
Взяв это во внимание напишу для тебя тестовый примерчик:

Код: Выделить всё

using System;
using System.Globalization;

namespace FromForum1{
    class Program{
        static void Main(string[] args){
            Console.WriteLine("Hello double!");
            
            NumberFormatInfo provider = new NumberFormatInfo();
            
            // установить, что является разделителем в числах
            // название поля класса говорит за себя, комментарий избыточен :)
            provider.NumberDecimalSeparator = "."; // попробуй закомментировать и запустить
            
            String strTest = "1.2"; // попробуй поменять на запятую
            double dTest = 0.0;

            try{
                // попробовать преобразовать
                dTest = Convert.ToDouble(strTest, provider);
                
                Console.WriteLine("Наш дабл = {0}", dTest);
            }
            catch (FormatException e){ 
                Console.WriteLine("Оппа, не верный формат входных данных!\n" + e.ToString());
            }
            catch (InvalidCastException e){ 
                Console.WriteLine("Оппа, проблемы с преобразованим к типу!\n" + e.ToString());
            }
            catch (Exception e){
                Console.WriteLine("Оппа, что-то произошло, но я не знаю что. :( \n" + e.ToString());
            }
        }
    }
}
Выходит, разделитель для дробных чисел по умолчанию скорее всего "," поэтому если хочешь использовать именно точку, то должен это явно указать. Вот Как-то так. :)

Re: Преобразование типов С#

Добавлено: 28 мар 2011, 21:53
assis2007
Большое спасибо) я решил не заморачиваться и просто изменил в

Код: Выделить всё

 if (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == '.') && (textBox1.Text.IndexOf(".") == -1)))
на

Код: Выделить всё

 if (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == ',') && (textBox1.Text.IndexOf(",") == -1)))
И о чудо проверочный текстбокс выдал мне это значение))

Славные молодые красотки

Добавлено: 30 сен 2012, 15:41
pohernerw
Нужно опрос что ли создать пользовательский по топику !
It would be necessary to create poll any on a subject!




Молодежное скачать teen видео