Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 3
Регистрация: 31.05.2012
Сообщений: 81
1

Вычисление операций на выбор поль-ля

19.04.2013, 14:15. Показов 768. Ответов 8
Метки нет (Все метки)

Пишу небольшую программу по выполнению на выбор поль-ля: 1)решение квадратного ур-ния, 2)линейного, 3)нахождение точек пересечения 2 окр-тей..возникают ошибки, которые ставят меня в тупик..все идеи исправления закончились, что-то было мной упущено, помогите разобраться
Вложения
Тип файла: rar выбор.rar (27.2 Кб, 5 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2013, 14:15
Ответы с готовыми решениями:

Надулась ли-поль
Вмонтирована в робота на постоянку, два года назад. Заряжена постоянно. Постепенно стала...

Вычисление количества операций присваивания
Есть задача: Необходимо реализовать программу(язык - Java, С++). Подскажите, как это можно...

Вычисление количества операций присваивания
Задание 1. Составить программу, вычисляющую точное значение среднего количества оп-ций...

Вычисление логических операций по формуле
Программа должна считать по заданной формуле. Программа написана для процессора 8086 под...

8
177 / 177 / 50
Регистрация: 06.01.2013
Сообщений: 392
19.04.2013, 14:17 2
Не у всех есть желание скачивать, открывать, смотреть, разбираться в чужом коде. Вы лучше сами выложите часть кода, и скажите: "Вот тут-то и тут-то выдает ошибку, в чем проблема?"
0
0 / 0 / 3
Регистрация: 31.05.2012
Сообщений: 81
19.04.2013, 14:51  [ТС] 3
Цитата Сообщение от Ksenya23 Посмотреть сообщение
Пишу небольшую программу по выполнению на выбор поль-ля: 1)решение квадратного ур-ния, 2)линейного, 3)нахождение точек пересечения 2 окр-тей..возникают ошибки, которые ставят меня в тупик..все идеи исправления закончились, что-то было мной упущено, помогите разобраться
в ф-ции output, в случае выбора Operation.QuadraticEquationSolve, после вызова функции input, выделяет ее переменные как неопредленные, ошибки типа: Ошибка 6 Элемент "a" не существует в текущем контексте.
часть кода:
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
public partial class Program
    {
        public static double[] QuadraticEquationSolve( double a,  double b, double c)
        {
            if (a == 0 && b == 0) //вырожденный случай
                return c == 0 ? null : new double[] { };
            if (a == 0)         //линейное уравнение
                return new[] { -c / b };
 
            double D = b * b - 4 * a * c;
            if (D > 0)
                return new[] { (-b + Math.Sqrt(D)) / (2 * a), (-b - Math.Sqrt(D)) / (2 * a) }; //два корня в массиве
            if (D < 0)
                return new double[] { };
            return new[] { -b / (2 * a) };
        }
        enum Operation { QuadraticEquationSolve, LineEquation, IntersectPoint, Nop };
 
        public static double[] IntersectPoint( double x1,  double y1,  double r1,  double x2,  double y2,  double r2)
        {
            double l = Math.Pow((x1 - x2), 2) + Math.Pow((y1 - y2), 2);
            double vt = Math.Pow((r1 + r2), 2);
            if (l <= vt)
            {
                double xc = 1 / (2 * l);
                double t = (l - Math.Pow(r2, 2) + Math.Pow(r1, 2)) * xc;
                l = Math.Sqrt((vt - l) * (l - Math.Sqrt(r1 - r2))) * xc;
                xc = (x2 - x1) * t + x1;
                double yc = (y2 - y1) * t + y1;
                t = (y2 - y1) * l;
                double xa = xc + t;
                double xb = xc - t;
                t = (x1 - x2) * l;
                double ya = yc + t;
                double yb = yc - t;
                return new[] { xc + t, yc + t, xc - t, yc - t };
            }
            else
                return new double[] { };//("Нет решения");
        }
        public static double[] LineEquation( double l,  double n, double m)
        {
            return new[] { -l / m };
 
        }
        public static void Main(string[] args)
        {  
           ConsoleKeyInfo();
           Operation op = Operation.Nop; 
            Input(op);
            Output(op);
        }
        private static Operation ConsoleKeyInfo()
        {
            
            Console.WriteLine("Выберите желаемый расчет уравнения: ");
            Console.WriteLine("__________________________________");
            Console.WriteLine("1) Квадратное уравнение (нажмите 1)");
            Console.WriteLine("2) Линейное уравнение: (нажмите 2)");
            Console.WriteLine("3) Поиск точек пересечения 2 окружностей: (нажмите 3)");
            ConsoleKeyInfo input = Console.ReadKey();
            switch (input.KeyChar)
            {
                case '1': return Operation.QuadraticEquationSolve;
                case '2': return Operation.LineEquation;
                case '3': return Operation.IntersectPoint;
                default: return Operation.Nop; //"Вы не пожелали произвести расчет с помощью программы";
            }
           
        }
   
        private static double[] Input(Operation op)
        {
          //string  Error;
            switch (op)
            {
                case Operation.QuadraticEquationSolve:
                    {   
                        Console.WriteLine("Введите коэффициенты для решения квадратного уравнения (a b c) = ");
                        double a = Convert.ToDouble(Console.ReadLine());
                        double b = Convert.ToDouble(Console.ReadLine());
                        double c = Convert.ToDouble(Console.ReadLine());
                        return QuadraticEquationSolve( a,  b, c);
                    }
                case Operation.LineEquation:
                    {
                        Console.WriteLine("Введите коэффициенты для решения линейного уравнения (a b c) = ");
                        double l = Convert.ToDouble(Console.ReadLine());
                        double m = Convert.ToDouble(Console.ReadLine());
                        double n = Convert.ToDouble(Console.ReadLine());
                        return LineEquation(l, n, m);
                    }
                case Operation.IntersectPoint:
                    {
                        Console.WriteLine("Введите коэффициенты для нахождения точек пересечения 2 окружностей (х1 у1 r1 х2 у2 r2) = ");//вывести отсюда в функцию ввода
                        double x1 = Convert.ToDouble(Console.ReadLine());
                        double y1 = Convert.ToDouble(Console.ReadLine());
                        double r1 = Convert.ToDouble(Console.ReadLine());
                        double x2 = Convert.ToDouble(Console.ReadLine());
                        double y2 = Convert.ToDouble(Console.ReadLine());
                        double r2 = Convert.ToDouble(Console.ReadLine());
                        return IntersectPoint(x1, y1, r1, x2, y2, r2);
                    }
                default:
                   // Error = "Недопустимый аргумент функции";
                    return null;
            }
          
        }
 
        private static double[] Output(Operation op)
        {  
            string Error = "";
            switch (op)
            {
                case Operation.QuadraticEquationSolve:
                    {
//ниже ошибка, подчеркивание синим a, b, c
                        double[] solve = QuadraticEquationSolve( a,  b,  c); //здесь ошибка, подчеркивание синим a, b, c
                        if (solve == null) { Console.WriteLine("Уравнение имеет бесконечное множество решений. x - любое"); Console.Read(); }
                        else if (solve.Length == 0) { Console.WriteLine("Действительных корней нет!"); Console.Read(); }
                        else { foreach (double r in solve) Console.WriteLine(r); Console.Read(); }
                        return solve; 
                    }
0
906 / 667 / 132
Регистрация: 01.03.2010
Сообщений: 1,250
19.04.2013, 23:37 4
Цитата Сообщение от Ksenya23 Посмотреть сообщение
"a" не существует в текущем контексте.
Конечно не существует. Если переменная создана внутри какой то пары скобок { } , то она и прекращает свое существование при их закрытии.

У вас все переменные создаются, инициируются и уничтожаются внутри case. Это локальные переменные. Например

C#
1
2
3
4
5
6
7
8
                case Operation.QuadraticEquationSolve:
                    {   
                        Console.WriteLine("Введите коэффициенты для решения квадратного уравнения (a b c) = ");
                        double a = Convert.ToDouble(Console.ReadLine());
                        double b = Convert.ToDouble(Console.ReadLine());
                        double c = Convert.ToDouble(Console.ReadLine());
                        return QuadraticEquationSolve( a,  b, c);
                    }
Когда вы вызываете метод [B]QuadraticEquationSolve( a, b, c) в других местах, то
переменных a, b, c уже не существуют, т.к. они "умерли".

Попробуйте так:

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
        public static void Main(string[] args)
        {
            Input();
        }
 
        private static Operation ConsoleKeyInfo()
        {
 
            Console.WriteLine("Выберите желаемый расчет уравнения: ");
            Console.WriteLine("__________________________________");
            Console.WriteLine("1) Квадратное уравнение (нажмите 1)");
            Console.WriteLine("2) Линейное уравнение: (нажмите 2)");
            Console.WriteLine("3) Поиск точек пересечения 2 окружностей: (нажмите 3)");
            ConsoleKeyInfo input = Console.ReadKey();
            switch (input.KeyChar)
            {
                case '1': return Operation.QuadraticEquationSolve;
                case '2': return Operation.LineEquation;
                case '3': return Operation.IntersectPoint;
                default: return Operation.Nop; //"Вы не пожелали произвести расчет с помощью программы";
            }
 
        }
 
      static  private void Input()
        {
            //string  Error;
            Operation op;
            switch (op = ConsoleKeyInfo())
            {
                case Operation.QuadraticEquationSolve:
                    {
                        Console.WriteLine("Введите коэффициенты для решения квадратного уравнения (a b c) = ");
                        double a = Convert.ToDouble(Console.ReadLine());
                        double b = Convert.ToDouble(Console.ReadLine());
                        double c = Convert.ToDouble(Console.ReadLine());
                        Output(QuadraticEquationSolve(a, b, c), op);
                        break;
                    }
            }
        }
 
       static private void Output(double[] result, Operation op)
        {
            switch (op)
            {
                case Operation.QuadraticEquationSolve:
                    {
                        double[] solve = result;
                        if (solve == null) { Console.WriteLine("Уравнение имеет бесконечное множество решений. x - любое"); Console.Read(); }
                        else if (solve.Length == 0) { Console.WriteLine("Действительных корней нет!"); Console.Read(); }
                        else { foreach (double r in solve) Console.WriteLine(r); Console.Read(); }
                        break;
                    }
            }
        }
1
0 / 0 / 3
Регистрация: 31.05.2012
Сообщений: 81
20.04.2013, 00:21  [ТС] 5
Евгений, спасибо) почему-то мне казалось проблему можно решить 'ref' и 'out'...теперь дошло)
0
906 / 667 / 132
Регистрация: 01.03.2010
Сообщений: 1,250
20.04.2013, 00:31 6
Цитата Сообщение от Ksenya23 Посмотреть сообщение
мне казалось проблему можно решить 'ref' и 'out'
ref и out позволяют изменять внешние переменные, переданные в параметры метода, прямо внутри этого метода.
0
0 / 0 / 3
Регистрация: 31.05.2012
Сообщений: 81
20.04.2013, 17:20  [ТС] 7
ок, запомню

Добавлено через 16 часов 42 минуты
Хотелось бы уточнить по поводу использования оператора switch:
Употребление вложенного оператора для повторного выбора операций пользователя по нажатию клавиши дает неверный результат, все время ссылаемый на операцию Operation.Nop;
хоть решение было создано с помощью руководства, на лицо мое неправильное представление..не пойму что я упустила из виду, подскажите пожалуйста?
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
 private static Operation ConsoleKeyInfo()
       {
 
           Console.WriteLine(" Выберите желаемый расчет уравнения: ");
           Console.WriteLine("__________________________________");
           Console.WriteLine("1) Квадратное уравнение (нажмите 1)");
           Console.WriteLine("2) Линейное уравнение: (нажмите 2)");
           Console.WriteLine("3) Поиск точек пересечения 2 окружностей: (нажмите 3)");
           ConsoleKeyInfo input = Console.ReadKey();
           ConsoleKeyInfo input2 = Console.ReadKey();
 
           switch (input.KeyChar)
           {
               case 'y': Input();
                   switch (input2.KeyChar)
                   {
                       case '1': return Operation.QuadraticEquationSolve;
                       case '2': return Operation.LineEquation;
                       case '3': return Operation.IntersectPoint;
                       default: return Operation.Nop; }
 
                       default: return Operation.Nop;
                   }
           
       }
0
906 / 667 / 132
Регистрация: 01.03.2010
Сообщений: 1,250
21.04.2013, 07:16 8
Цитата Сообщение от Ksenya23 Посмотреть сообщение
я упустила из виду, подскажите пожалуйста?
Вы запутались в логике решения. Упростите подход.

В
C#
1
2
3
4
        public static void Main(string[] args)
        {
            Input();
        }
создайте цикл с условием, хочет ли пользователь продолжить работу?
Крутите Input() пока пользователь соглашается.
0
0 / 0 / 3
Регистрация: 31.05.2012
Сообщений: 81
21.04.2013, 15:26  [ТС] 9
По заданию - именно со второго раза предложение выбора..получилось без предусловия, разрешила if и несколькими включенными дополнительно переменными. Спасибо за помощь=)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2013, 15:26
Помогаю со студенческими работами здесь

Вычисление количества операций присваивания
Задание 1. Составить программу, вычисляющую точное значение среднего количества оп-ций...

Вычисление количества арифметических операций
Задание такое: нужно вектор-столбец, состоящий из 16 элементов умножить на матрицу 16x16, затем...

Указатели, вычисление арифметических операций
Ввести с клавиатуры четыре числа: A, B, C, D. Вычислить: A + B + C + D, если A, B, C, D не равны...

Разбор и вычисление бинарных инфиксных операций
Вот мой очередной убогий ленивый кот. У меня такое ощущение, что я пытаюсь забивать микроскопом...


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

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

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