0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 18
1

Комплексное число в консольном приложении: повторный запрос данных при недопустимом вводе

24.12.2012, 20:29. Показов 1818. Ответов 4
Метки нет (Все метки)

Знаете, задача на самом деле простая. Но замутнааяяя Понимаете, программу написала, всё работает отлично. Подправила где надо. Загвоздка вся в защите данных от ошибки в классе: т.е. требуется, в случае ввода с клавиатуры чего-либо, помимо числа, и первое число меньше или равное нулю, заново в том месте запустить запрос на ввод. Я так полагаю цикл нужен. Но с каким условием? Использовала try...catch, но кроме отлова ошибок и запуска новой консоли, да и закрытия старой, я так впихнуть и не смогла... Мозги закипели. Ведь вводить нужно действительную и мнимую часть два раза (для двух комплексных чисел). И если первое число задано нормально, а во втором что-то "накосячили", то не заново запускать программу, а то же место повторить и продолжить.
Ни с кем посоветоваться не могу, очень нуждаюсь в вашей помощи...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
namespace ComplexNumber
{
    class ComplexNumber
    {
        int p; double f; double a, b;
        Process process = new Process();
        
        public int P
        {
            get{return p;}
            set
            {
                if (value > 0) value = p;
                else Console.WriteLine("Модуль числа должен быть положительным!");
            }
        }
        public double F
        {
            get { return f; }
            set { value = f; }
        }
      
       public ComplexNumber(int mod, double arg)
        {
            try
            {
                P = mod;
                F = arg;
            }
            catch (Exception)
            {
                Console.WriteLine("Число введено некорректно!");
                Process.Start("ComplexNumber.exe", "ComplexNumber\\bin\\Release");
                //Environment.Exit(0); - закрывает консоль
            }
        }
         
        public ComplexNumber()
        {
            try
            {
                Console.WriteLine("Введите модуль комплексного числа");
                p = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Введите коэфициент аргумента Pi комплексного числа");
                f = Convert.ToDouble(Console.ReadLine());
            }
            catch (Exception)
            {
                Console.WriteLine("Число введено некорректно!");
                Process.Start("ComplexNumber.exe", "ComplexNumber\\bin\\Release");
                //Environment.Exit(0); - закрывает консоль
            }
        }
        
             
        public void PokazForm ()
        {
            Console.WriteLine("Показательная форма:");
            Console.WriteLine("     "+f+"*Pi");
            Console.WriteLine("z="+p+"+e");
        }
 
        public void TrigForm ()
        {
            Console.WriteLine("Тригонометрическая форма:");
            Console.WriteLine("z="+p+"*(cos("+f+")+i*sin("+f+"))");
        }
 
        public void AlgForm()
        {
            Console.WriteLine("Алгебраическая форма:");
            a = p*Math.Cos(f);
            b = p*Math.Sin(f);
            Console.WriteLine("z=" + a + "+" + "i*(" + b + ")");
        }
 
        //перегрузки
        public static ComplexNumber operator + (ComplexNumber ComNum1, ComplexNumber ComNum2)
        {
            ComplexNumber tmp = new ComplexNumber(0, 0);
            tmp.p = ComNum1.p + ComNum2.p;
            tmp.f = ComNum1.f + ComNum2.f;
            return tmp;
        }
 
        public static ComplexNumber operator - (ComplexNumber ComNum1, ComplexNumber ComNum2)
        {
            ComplexNumber tmp = new ComplexNumber(0, 0);
            tmp.p = ComNum1.p - ComNum2.p;
            tmp.f = ComNum1.f - ComNum2.f;
            return tmp;
        }
 
        public static ComplexNumber operator / (ComplexNumber ComNum1, ComplexNumber ComNum2)
        {
            ComplexNumber tmp = new ComplexNumber(0, 0);
            tmp.p = ComNum1.p / ComNum2.p;
            tmp.f = ComNum1.f / ComNum2.f;
            return tmp;
        }
 
        public static ComplexNumber operator * (ComplexNumber ComNum1, ComplexNumber ComNum2)
        {
            ComplexNumber tmp = new ComplexNumber(0, 0);
            tmp.p = ComNum1.p * ComNum2.p;
            tmp.f = ComNum1.f * ComNum2.f;
            return tmp;
        }
 
    }
}
Ладно, допустим вместо try...catch вставим бесконечный while, но условие - наличие ошибки? Ошибку выловить надо, так? Знаний у меня на это не хватает

На всякий пожарный вот код программы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
 
namespace ComplexNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            
            
                Console.WriteLine('\t' + "ПЕРВОЕ ЧИСЛО");
                ComplexNumber ComNum1 = new ComplexNumber();
                ComNum1.PokazForm();
                ComNum1.TrigForm();
                ComNum1.AlgForm();
 
                Console.WriteLine('\t' + "ВТОРОЕ ЧИСЛО");
                ComplexNumber ComNum2 = new ComplexNumber();
                ComNum2.PokazForm();
                ComNum2.TrigForm();
                ComNum2.AlgForm();
 
                ComplexNumber ComNum3 = new ComplexNumber(0, 0);
                ComNum3 = ComNum1 + ComNum2;
                Console.WriteLine('\t' + "Сумма:");
                ComNum3.PokazForm();
 
                ComplexNumber ComNum4 = new ComplexNumber(0, 0);
                ComNum4 = ComNum1 - ComNum2;
                Console.WriteLine('\t' + "Разность:");
                ComNum4.PokazForm();
 
                ComplexNumber ComNum5 = new ComplexNumber(0, 0);
                ComNum5 = ComNum1 / ComNum2;
                Console.WriteLine('\t' + "Деление:");
                ComNum5.PokazForm();
 
                ComplexNumber ComNum6 = new ComplexNumber(0, 0);
                ComNum6 = ComNum1 * ComNum2;
                Console.WriteLine('\t' + "Произведение:");
                ComNum6.PokazForm();
 
                Console.ReadLine();
            
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2012, 20:29
Ответы с готовыми решениями:

Как изменить шрифт в консольном приложений при вводе данных и в выводе данных ?
Как изменить шрифт в консольном приложений при вводе данных и в выводе данных ?

Нет конвертации String-а в Double при консольном вводе данных
Не работают в Visual Studio Express 2010 подобные коды: Console.Write("p= "); double p =...

Повторный запуск процедуры при неверном вводе значения
Всем привет! Не могу запустить программу заново. Многие способы использовал, но программа все равно...

Не работает запрос при вводе данных
Доброго времени суток! Вроде бы пустяковая задача, но почему-то не работает. Есть форма в...

4
Эксперт Python
4606 / 2027 / 359
Регистрация: 17.03.2012
Сообщений: 10,081
Записей в блоге: 6
25.12.2012, 08:44 2
Ну как не помочь симпатичной девушке?
Посмотрел ваш код. Пришел в легкий ужас.
1. Ввод данных в конструкторе не делается. Сделайте создание - чтобы конструктор принимал параметры, но ввод отдельно. Может быть - отдельный метод для считывания из консоли, чтобы вызывался не в конструкторе.
2. В случае ошибки вы запускаете этот процесс опять??? Добропорядочные программы так не пишутся, так делаются форк-бомбы ( ru.wikipedia.org/wiki/Fork-бомба )
3.
Цитата Сообщение от Orein_Chis Посмотреть сообщение
Ладно, допустим вместо try...catch вставим бесконечный while, но условие - наличие ошибки?
Да, для ввода можно поставить бесконечный while, условие - успешный ввод данных.
0
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 18
25.12.2012, 14:35  [ТС] 3
Спасибо за отклик)) Комп сломался не вовремя, инет не работал, но я успела найти кое-какую инфу и закончила программу сама. По крайней мере исполняется как надо (я действительно билась головой об чужой монитор). Не успела правда сдать задание))) Сама понимаю, что код грубый и неотёсанный.
1. На счёт ввода в конструкторе мне ничего не сказал преподаватель, даже наоборот, посоветовал. Хочет он видеть там ввод. А если я начну опять что-то переделывать, то точно запутаюсь
2. Форк-бомба - милая весчь, мой кругозор расширился)))) Действительно, получается вводя данные заново я заполняю память, так? Опять ткнут в нерациональность Вывод - чистить переменную после отлова ошибки... Хммм... Хорошее замечание.
3. Использовала do...while и try...catch внутри для p и f, условия - несовпадение типов данных и равенство нулю)))

Ну, собсно, нынешний результат...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ComplexNumber
{
    class ComplexNumber
    {
        int p; double f; double a, b;
        
        public int P
        {
            get{return p;}
            set{value = p;}
        }
        public double F
        {
            get { return f; }
            set { value = f; }
        }
      
       public ComplexNumber(int mod, double arg)
        {
            P = mod;
            F = arg;
        }
         
        public ComplexNumber()
        {
            do
            {
                try
                {
                    Console.WriteLine("Введите модуль комплексного числа");
                    p = Convert.ToInt32(Console.ReadLine());
                    if (p < 0 || p == 0) Console.WriteLine("Число введено некорректно!");
                }
                catch (Exception)
                {
                    Console.WriteLine("Число введено некорректно!");
                }
            }
            while (p.GetType() != typeof(int) || p < 0 || p == 0);
            
            do
            {
                try
                {
                    Console.WriteLine("Введите коэфициент аргумента Pi комплексного числа");
                    f = Convert.ToDouble(Console.ReadLine());
                    if (f == 0) Console.WriteLine("Число введено некорректно!");
                }
                catch (Exception)
                {
                    Console.WriteLine("Число введено некорректно!");
                }
            }
            while (f.GetType() == typeof(Exception) || f == 0);
        }
 
 
        public void PokazForm()
        {
            if (p.GetType() == typeof(int) && f.GetType() != typeof(Exception))
            {
                Console.WriteLine("Показательная форма:");
                Console.WriteLine("     " + f + "*Pi");
                Console.WriteLine("z=" + p + "+e");
 
            }
        }
 
        public void TrigForm ()
        {
            if (p.GetType() == typeof(int)&& f.GetType() != typeof(Exception))
            {
                Console.WriteLine("Тригонометрическая форма:");
                Console.WriteLine("z=" + p + "*(cos(" + f + ")+i*sin(" + f + "))");
            }
        }
 
        public void AlgForm()
        {
            if (p.GetType() == typeof(int) && f.GetType() != typeof(Exception))
            {
                Console.WriteLine("Алгебраическая форма:");
                a = p * Math.Cos(f);
                b = p * Math.Sin(f);
                Console.WriteLine("z=" + a + "+" + "i*(" + b + ")");
            }
        }
 
        //перегрузки
        public static ComplexNumber operator + (ComplexNumber ComNum1, ComplexNumber ComNum2)
        {
                ComplexNumber tmp = new ComplexNumber(0, 0);
                tmp.p = ComNum1.p + ComNum2.p;
                tmp.f = ComNum1.f + ComNum2.f;
                return tmp;
        }
 
        public static ComplexNumber operator - (ComplexNumber ComNum1, ComplexNumber ComNum2)
        {
                ComplexNumber tmp = new ComplexNumber(0, 0);
                tmp.p = ComNum1.p - ComNum2.p;
                tmp.f = ComNum1.f - ComNum2.f;
                return tmp;
        }
 
        public static ComplexNumber operator / (ComplexNumber ComNum1, ComplexNumber ComNum2)
        {
                ComplexNumber tmp = new ComplexNumber(0, 0);
                tmp.p = ComNum1.p / ComNum2.p;
                tmp.f = ComNum1.f / ComNum2.f;
                return tmp;
        }
 
        public static ComplexNumber operator * (ComplexNumber ComNum1, ComplexNumber ComNum2)
        {
                ComplexNumber tmp = new ComplexNumber(0, 0);
                tmp.p = ComNum1.p * ComNum2.p;
                tmp.f = ComNum1.f * ComNum2.f;
                return tmp;
        }
 
    }
}
0
Эксперт Python
4606 / 2027 / 359
Регистрация: 17.03.2012
Сообщений: 10,081
Записей в блоге: 6
25.12.2012, 15:25 4
Не знаю, что там у вас не совпало. Делайте так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    class Program
    {
        static void Main(string[] args)
        {
            var c = Complex.ReadFromConsole();
        }
    }
 
    class Complex
    {
        float p; double f;
        public float P
        {
            get { return p; }
            set { value = p; }
        }
        public double F
        {
            get { return f; }
            set { value = f; }
        }
        public Complex(float ap, double af)
        {
            p = ap;
            f = af;
        }
        public static Complex ReadFromConsole()
        {
            String str;
            float p;
            do
            {
                str = Console.ReadLine();
            } 
            while (!float.TryParse(str, out p));
            return new Complex(p, 18);
        }
    }
И никакого ввода в конструкторе, и, тем более, других процессов.
0
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 18
29.01.2013, 00:42  [ТС] 5
Ой, руки не доходили ответить Х)))
Всё нормально, спасибо за советы, всё работает как надо. Спасибо ещё раз, но за отклик)))))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2013, 00:42
Помогаю со студенческими работами здесь

Как ввести дробное число в консольном приложении
Не могу сделать чтобы вводило дробовые числа в программу, нужна помощь, пожалуйста. using System;...

Обработка введенных данных в консольном приложении
Есть программа. Как вы поняли здесь нужно вводить 3 каких-либо числа. Но вот в чем загвостка - если...

Комплексное число. Вычислить модуль комплексного числа. Найти комплексное число, обратное заданному
Ребят, помогите дописать задачу. Никак дальше сообразить не могу Нужно создать комплексное...

Разработка программы со строковым типом данных в консольном приложении.
Ввести строковую последовательность из 13-ти или меньшего количества элементов и удалить из строки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru