Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/35: Рейтинг темы: голосов - 35, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 10
1

Принцип объектно-ориентированного программирования при написании калькулятора

03.12.2013, 11:14. Показов 6693. Ответов 43
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста сделать такой же калькулятор, только в 2 или 3 классах, так чтобы не нарушать принцип объектно-ориентированного программирования
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication8
{
    class Program
    {
 
        static double a, b, c, D;
        static double x1, x2;
 
        static void Main(string[] args)
        {
 
          
            while (true)
            {
                string command;
        
                Console.Write("Введите параметр или нажмите x, чтобы выйти:");
                command = Console.ReadLine();
                if (command == "x") break;
                if (command == "a")
                {
                    Console.Write("Введите a: ");
                    a = Double.Parse(Console.ReadLine());
                    Reshenie();
                    Console.WriteLine("D=" + D.ToString());
                    Console.WriteLine("x1=" + x1.ToString());
                    Console.WriteLine("x2=" + x2.ToString());
 
                    continue;
                   
                }
                if (command == "b")
                {
                    Console.WriteLine("Введите b: ");
                    b = Double.Parse(Console.ReadLine());
                    Reshenie();
                    Console.WriteLine("D=" + D.ToString());
                    Console.WriteLine("x1=" + x1.ToString());
                    Console.WriteLine("x2=" + x2.ToString());
 
                    continue;
                    
                }
                if (command == "c")
                {
                    Console.WriteLine("Введите c: ");
                   c = Double.Parse(Console.ReadLine());
                   Reshenie();
                   Console.WriteLine("D=" + D.ToString());
                   Console.WriteLine("x1=" + x1.ToString());
                   Console.WriteLine("x2=" + x2.ToString());
 
                    continue;
                   
                }
                
            }
        }
 
        static void Reshenie()
        {
            D = b*b - 4 * a * c;
            if (D > 0 || D == 0)
            {
                x1 = (-b + Math.Sqrt(D)) / (2 * a);
                x2 = (-b - Math.Sqrt(D)) / (2 * a);
 
 
            }
 
 
            else
            {
                Console.WriteLine("Дискриминант d < 0 ---> Решение квадратного уравнения невозможно.");
                x1 = 0;
                x2 = 0;
 
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2013, 11:14
Ответы с готовыми решениями:

Какую литературу порекомендуете для изучения объектно-ориентированного программирования?
Приветствую, я новичок в ООП, писал до этого разве на бэйсике=)) какую дитературу порекомендуете...

Фундаментальные принципы объектно ориентированного программирования
Я вот пытаюсь изучать ООП на с++ и столкнулся с тем что все кто пытается объяснить что это такое...

Ознакомление с принципами объектно-ориентированного программирования
Создать класс «Логические операции». Предусмотреть выполнение операций AND, OR, XOR над целыми...

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

43
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
03.12.2013, 13:14 2
Анализируй логику проги, раздели сущности
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 10
03.12.2013, 21:21  [ТС] 3
у меня не получается, ошибки выходят, я только начинаю учиться, а это задание к зачету. Очень надо, помогите пожалуйста
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
03.12.2013, 22:36 4
В соседнем топике сегодня такую же делали, смотри
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 10
04.12.2013, 21:28  [ТС] 5
можешь кинуть ссылку? а то я не нашел(
0
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
04.12.2013, 21:36 6
mc10maxim, я так понимаю, имеется в виду эта тема
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
04.12.2013, 22:03 7
Ловите, кажется использовал все принципы ООП

Кликните здесь для просмотра всего текста

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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
public abstract class CalcBase
        {
            protected readonly List<string> Command;
 
            protected readonly Dictionary<string, double> _values = new Dictionary<string, double>(); 
 
            protected CalcBase(List<string> command)
            {
                Command = command;
            }
 
            public virtual bool IsValidParametr(string param, object value)
            {
                if (value != null)
                {
                    double v;
                    if (!_values.TryGetValue(param, out v))
                    {
                        if (double.TryParse(value.ToString(), out v))
                        {
                            _values.Add(param, v);
                            return true;
                        }
                    }
                }
                return false;
            }
 
            public abstract double Execute();
 
            public abstract string CommandDescription { get; }
 
            public abstract int CommandID { get; }
 
            public virtual List<string> GetParameters()
            {
                return Command;
            }
        }
 
        public class PlusAverage : Plus
        {
            public override string CommandDescription
            {
                get { return @"Среднее из суммы 2 чисел - 2"; }
            }
 
            public override int CommandID
            {
                get { return 2; }
            }
 
            public override double Execute()
            {
                var result = base.Execute();
                return result/2;
            }
        }
 
        public class Plus : CalcBase
        {
            public Plus()
                : base(new List<string> {"a", "b"})
            {
            }
 
            #region Overrides of CalcBase
 
            public override double Execute()
            {
                double result = 0;
                foreach (var c in Command)
                {
                    double v;
                    if (_values.TryGetValue(c, out v))
                    {
                        result += v;
                    }
                }
                return result;
            }
 
            public override string CommandDescription
            {
                get { return "Сложение двух чисел - 1"; }
            }
 
            public override int CommandID
            {
                get { return 1; }
            }
 
            #endregion
        }
 
        [STAThread]
        private static void Main(string[] args)
        {
            var calcBases = new List<CalcBase> {new Plus(), new PlusAverage()};
 
            while (true)
            {
                foreach (var calcBase in calcBases)
                {
                    Console.WriteLine(calcBase.CommandDescription);
                }
 
                CalcBase calc = null;
                int commandId = -1;
                while (commandId==-1)
                {
                    Console.Write("Введите параметр или нажмите x, чтобы выйти:");
                    var readLine = Console.ReadLine();
                    if (string.IsNullOrEmpty(readLine))
                        continue; 
                    if (int.TryParse(readLine, out commandId))
                    {
                        foreach (var calcBase in calcBases)
                        {
                            if(calcBase.CommandID == commandId)
                            {
                                calc = calcBase;
                                break;
                            }
                        }
                    }
                    if (readLine == "x") break;
                }
                
                if(calc==null)
                    break;
 
                foreach (var param in calc.GetParameters())
                {
                    while (true)
                    {
                        Console.Write(string.Format("Введите {0}: ", param));
                        if (calc.IsValidParametr(param, Console.ReadLine()))
                        {
                            break;
                        }
                    }
                }
                Console.WriteLine("Результат = " + calc.Execute().ToString());
            }
        }
0
Psilon
04.12.2013, 22:04
  #8

Не по теме:

Цитата Сообщение от Grishaco Посмотреть сообщение
использовал все принципы ООП
Шива, ты?

0
rattrapper
04.12.2013, 22:06
  #9

Не по теме:

Psilon, ахах, вот что значит профессионал - людей по коду запоминать :)

0
Psilon
04.12.2013, 22:09
  #10

Не по теме:

rattrapper, так то людей...

0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 10
04.12.2013, 23:27  [ТС] 11
А можете именно мою программу сделать так же? не нарушая принципы ООП
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
05.12.2013, 00:32 12
Могу

Кликните здесь для просмотра всего текста

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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
internal class Program
    {
        [STAThread]
        private static void Main(string[] args)
        {
            var calcBases = new List<CalcBase> {new Plus()};
 
            while (true)
            {
                foreach (CalcBase calcBase in calcBases)
                {
                    Console.WriteLine(calcBase.CommandDescription);
                }
 
                CalcBase calc = null;
                int commandId = -1;
                while (commandId == -1)
                {
                    Console.Write("Введите параметр или нажмите x, чтобы выйти:");
                    string readLine = Console.ReadLine();
                    if (string.IsNullOrEmpty(readLine))
                        continue;
                    if (int.TryParse(readLine, out commandId))
                    {
                        foreach (CalcBase calcBase in calcBases)
                        {
                            if (calcBase.CommandID == commandId)
                            {
                                calc = calcBase;
                                break;
                            }
                        }
                    }
                    if (readLine == "x") break;
                }
 
                if (calc == null)
                    break;
 
                calc.Reset();
                foreach (string param in calc.GetParameters())
                {
                    while (true)
                    {
                        Console.Write(string.Format("Введите {0}: ", param));
                        if (calc.IsValidParametr(param, Console.ReadLine()))
                        {
                            break;
                        }
                    }
                }
                Console.WriteLine("Результат:");
                Dictionary<string, double?> dictionary = calc.Execute();
                foreach (string key in dictionary.Keys)
                {
                    Console.WriteLine(string.Format("{0} = {1}", key, dictionary[key]));
                }
            }
        }
 
        #region Nested type: CalcBase
 
        public abstract class CalcBase
        {
            protected readonly List<string> Command;
 
            protected readonly Dictionary<string, double> _values = new Dictionary<string, double>();
 
            protected CalcBase(List<string> command)
            {
                Command = command;
            }
 
            public bool IncludeHandmadeValue { get; set; }
 
            public abstract string CommandDescription { get; }
 
            public abstract int CommandID { get; }
 
            public virtual bool IsValidParametr(string param, object value)
            {
                if (value != null)
                {
                    double v;
                    if (!_values.TryGetValue(param, out v))
                    {
                        if (double.TryParse(value.ToString(), out v))
                        {
                            _values.Add(param, v);
                            return true;
                        }
                    }
                }
                return false;
            }
 
            public abstract Dictionary<string, double?> Execute();
 
            public virtual List<string> GetParameters()
            {
                return Command;
            }
 
            public void Reset()
            {
                _values.Clear();
            }
        }
 
        #endregion
 
        #region Nested type: Plus
 
        public class Plus : CalcBase
        {
            public Plus()
                : base(new List<string> {"a", "b", "c"})
            {
            }
 
            #region Overrides of CalcBase
 
            public override string CommandDescription
            {
                get { return "Решение квадратного уравнения - 1"; }
            }
 
            public override int CommandID
            {
                get { return 1; }
            }
 
            public override Dictionary<string, double?> Execute()
            {
                var result = new Dictionary<string, double?>();
                double a;
                double b;
                double c;
                if (_values.TryGetValue("a", out a) && _values.TryGetValue("b", out b) &&
                    _values.TryGetValue("c", out c))
                {
                    if (IncludeHandmadeValue)
                    {
                        result.Add("a", a);
                        result.Add("b", b);
                        result.Add("c", c);
                    }
                    double D = b*b - 4*a*c;
                    if (D > 0 || D == 0)
                    {
                        result.Add("D", D);
                        double x1 = (-b + Math.Sqrt(D))/(2*a);
                        result.Add("x1", x1);
                        double x2 = (-b - Math.Sqrt(D))/(2*a);
                        result.Add("x2", x2);
                    }
                    else
                    {
                        result.Add("Дискриминант d < 0 ---> Решение квадратного уравнения невозможно.", null);
                    }
                }
                return result;
            }
 
            #endregion
        }
 
        #endregion
    }
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
05.12.2013, 03:29 13
Цитата Сообщение от Grishaco Посмотреть сообщение
Могу
Исправил:
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
public enum CommandTypes
    {
        Quad = 1
    }
 
    public interface IInputService
    {
        CommandTypes ReadCommand(string input);
        Arguments ReadArguments();
    }
 
    public class Arguments
    {
        public int A { get; set; }
        public int B { get; set; }
        public int C { get; set; }
    }
 
    public class ConsoleService : IInputService
    {
        public CommandTypes ReadCommand(string command)
        {
            return (CommandTypes) Enum.Parse(typeof (CommandTypes), command);
        }
 
        public Arguments ReadArguments()
        {
            Console.Write("Enter arguments A ");
            int a = int.Parse(Console.ReadLine());
            Console.Write("Enter arguments B ");
            int b = int.Parse(Console.ReadLine());
            Console.Write("Enter arguments C ");
            int c = int.Parse(Console.ReadLine());
            return (new Arguments() {A = a, B = b, C = c});
        }
    }
 
    public class Result
    {
        public Result(string name, double value)
        {
            Name = name;
            Value = value;
        }
        public string Name { get; set; }
        public double Value { get; set; }
    }
 
    public interface ICalculator
    {
        List<Result> Execute(CommandTypes command, Arguments args);
    }
 
    public class Calculator : ICalculator
    {
        public List<Result> Execute(CommandTypes command, Arguments args)
        {
            switch (command)
            {
                case CommandTypes.Quad:
                    return Quad(args);
                default:
                    throw new InvalidOperationException();
            }
        }
 
        private List<Result> Quad(Arguments a)
        {
            List<Result> r = new List<Result>();
            double def = a.B*a.B - 4*a.A*a.C;
            if (def >= 0)
            {
                r.Add(new Result("D", def));
                double x1 = (-a.B + Math.Sqrt(def))/(2*a.A);
                r.Add(new Result("x1", x1));
                double x2 = (-a.B - Math.Sqrt(def))/(2*a.A);
                r.Add(new Result("x2", x2));
            }
            else
            {
                Console.WriteLine("Arguments are invalid");
            }
            return r;
        }
    }
 
    internal class Program
    {
        private static void Main()
        {
            while (true)
            {
                try
                {
                    Console.Write("Enter command: ");
                    IInputService cs = new ConsoleService();
                    CommandTypes command = cs.ReadCommand(Console.ReadLine());
                    Arguments arguments = cs.ReadArguments();
                    ICalculator c = new Calculator();
                    var result = c.Execute(command, arguments);
                    foreach (var r in result)
                    {
                        Console.WriteLine("{0}: {1}", r.Name, r.Value);
                    }
                }
                catch
                {
                    Console.WriteLine("Argument input error");
                }
            }
        }
    }
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
05.12.2013, 09:53 14
Цитата Сообщение от DataPlanner Посмотреть сообщение
Исправил:
Не понял. Что исправил?
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
05.12.2013, 20:55 15
Цитата Сообщение от Grishaco Посмотреть сообщение
Не понял. Что исправил?
Исправил твои макароны
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
05.12.2013, 20:56 16
Цитата Сообщение от DataPlanner Посмотреть сообщение
Исправил твои макароны
Так сказать бумерангом, теперь я не завидую твоему работодателю.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.12.2013, 21:07 17
Grishaco, DataPlanner,
оба хороши Хотя как пример использования всех принципов ООП - неплохо вышло.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
05.12.2013, 21:10 18
Psilon, Вопрос не в этом, вопрос в том каждый по разному видит фломастеры, в том числе и ООП. В моем коде есть все и Наследование и полиморфизм и инкапсуляция. Если он кривой, так и скажите и укажите.

Спасибо за Шиву.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.12.2013, 23:26 19
Grishaco, просто задача из разряда "забейте гвоздь, используя каждый инструмент из ящика". Если молоток еще ок, то потом добивать его пассатижами и наждачкой - не комильфо.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
05.12.2013, 23:31 20
Цитата Сообщение от Psilon Посмотреть сообщение
Grishaco, просто задача из разряда "забейте гвоздь, используя каждый инструмент из ящика". Если молоток еще ок, то потом добивать его пассатижами и наждачкой - не комильфо.
Не совсем понимаю, это был сарказм?

ТС прямо спросил

Цитата Сообщение от mc10maxim Посмотреть сообщение
Принцип объектно-ориентированного программирования при написании калькулятора
Я показал (как смог) . В чем проблема то?

З.Ы. При чем тут ящик с инструментами?
0
05.12.2013, 23:31
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2013, 23:31
Помогаю со студенческими работами здесь

Задачка для любителей объектно-ориентированного программирования
Доброго времени суток всем! Я новичок в Python и пока только учусь, споткнулся на задаче по...

Основные алгоритмические структуры объектно-ориентированного программирования
Привет форумчане. Через неделю сессия, попались такие вопросы по предмету. Не могу найти решения 13...

Методами объектно-ориентированного программирования описать графический объект
Методами объектно-ориентированного программирования описать графический объект + как потомок...

Литература VBA с грамотным объяснением объектно-ориентированного программирования.
Подскажите, пожалуйста несколько толковых книжек по VBA/VB. Желательно с грамотным объяснением...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Преобразование полей (элементов управления содержимым) в обычный текст
РоΜа 23.01.2025
Возникла необходимость преобразовать поля в текст (те, что на вкладке разработчик добавляются) . Помучившись родил следующее: Sub ПоляВТекст() Преобразует все поля в текст (даты, текст,. . .
Как проверить существование директории в скрипте Bash
bt_guru 23.01.2025
При разработке скриптов Bash одной из ключевых задач является корректная работа с файловой системой, где особое место занимает проверка существования директорий. Эта операция становится критически. . .
Как работают срезы (slice) в Python
bytestream 23.01.2025
Python предоставляет разработчикам мощный и гибкий инструмент для работы с последовательностями данных - срезы (slices). Эта функциональность позволяет извлекать, модифицировать и управлять. . .
Как удалить подмодуль (submodule) в Git
bytestream 23.01.2025
При работе с крупными проектами в системе контроля версий Git разработчики часто сталкиваются с необходимостью управления зависимостями и внешними компонентами. Подмодули (submodules) представляют. . .
В чем разница между @staticmethod и @classmethod в Python. Декораторы методов
bytestream 23.01.2025
В Python декораторы методов представляют собой мощный инструмент, позволяющий модифицировать поведение функций и методов без изменения их исходного кода. Эта возможность является одной из. . .
Как преобразовать InputStream в String в Java
bytestream 23.01.2025
В мире Java-разработки работа с потоками данных является одной из ключевых операций при создании современных приложений. InputStream, как фундаментальный класс для обработки входных потоков данных,. . .
Как обновить форк (ответвление) репозитория в Git
bytestream 23.01.2025
Одним из наиболее мощных инструментов Git для организации совместной работы является механизм форкинга репозиториев, который позволяет создавать независимые копии проектов для дальнейшей разработки. . . .
Как работает async/await в C#. Асинхронное программировани­е в .NET
bytestream 23.01.2025
Введение в асинхронное программирование Асинхронное программирование представляет собой важнейшую концепцию современной разработки программного обеспечения, особенно в контексте создания. . .
КуМир: полное руководство
bytestream 23.01.2025
Введение в КуМир: история создания и назначение КуМир (Комплект Учебных МИров) представляет собой образовательную среду программирования, которая была создана для обучения основам алгоритмизации и. . .
Что такое OLAP. Где и как использовать многомерный анализ данных
bytestream 23.01.2025
Введение в OLAP-технологии В современном мире бизнес-аналитика и обработка больших массивов данных играют ключевую роль в принятии стратегических решений. Организации накапливают огромные объемы. . .
MongoDB: что это, для чего нужна и как использовать
bytestream 23.01.2025
Введение в MongoDB: современная документоориентированная СУБД В современном мире разработки программного обеспечения выбор правильной системы управления базами данных является критически важным. . .
Как использовать закрытый ключ шифрования в Git. Шифрование в Git
bytestream 23.01.2025
Установка и настройка закрытых ключей в Git предоставляет дополнительный уровень безопасности для работы с репозиториями. Для начала необходимо создать пару ключей, обычно это осуществляется с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru