Имя: Пароль:
1C
1С v8
Квадратное уравнение с разбором
,
0 Sachaaaa
 
25.12.13
18:26
Здравствуйте! Погомите! Напишите пожалуйста программный код уравнения! Нужно разобрать кв уравнение, которое пользователь вводит в поле, например 3х^2+3х+1=0. Нужно разобрать что 3 относится к a, b=3 и с=1. а дельше решить как квадратное уравнение. на форму выводится только х1 и х2. Помогите пожалуйста! в 1С надо написать!
113 Sachaaaa
 
25.12.13
19:56
х^2
114 Sachaaaa
 
25.12.13
19:56
именно
115 zva
 
25.12.13
19:57
a*1^x*x^2 +b*ln(e^x)+c*x^0
116 Sachaaaa
 
25.12.13
19:57
(88)так нужно сделать
117 Feunoir
 
25.12.13
19:57
(105) Абстрактную произвольную запись ты решить не сможешь. Это придётся полную лексику описывать. Понятно, что это задача не того уровня.
118 Sachaaaa
 
25.12.13
19:58
просто уравнение 3х62+2х+1=0 а не такие сложные которые некоторые пишут
119 Sachaaaa
 
25.12.13
19:59
3х^2+2х+1=0 вот  из такого надо получить a b c
120 rphosts
 
25.12.13
20:01
Стр1 = Лев(Стр)
121 Sachaaaa
 
25.12.13
20:01
ну что же все замолчали?
122 rphosts
 
25.12.13
20:01
фальшстарт
123 Salimbek
 
25.12.13
20:02
Если работа со строками, то пожалуйста:

РазбитаяСтрока = СтрЗаменить(ВходнаяСтрока,"х^2",Символ.ПС);
РазбитаяСтрока = СтрЗаменить(ВходнаяСтрока,"х",Символ.ПС);
РазбитаяСтрока = СтрЗаменить(ВходнаяСтрока,"=",Символ.ПС);
А = СтрПолучитьСтроку(РазбитаяСтрока,1);
Б = СтрПолучитьСтроку(РазбитаяСтрока,2);
С = СтрПолучитьСтроку(РазбитаяСтрока,3);
Ноль = СтрПолучитьСтроку(РазбитаяСтрока,4);
124 Salimbek
 
25.12.13
20:03
(123) Во второй и третьей строках замени "ВходнаяСтрока" на "РазбитаяСтрока"
125 Sachaaaa
 
25.12.13
20:04
а потом просто как кв уравнение считать?
126 Sachaaaa
 
25.12.13
20:04
а что такое ПС еще?
127 rphosts
 
25.12.13
20:05
тогда не х^2 и х а *х^2 и *х
128 rphosts
 
25.12.13
20:05
(126) символ перевод строки, см СП
129 Salimbek
 
25.12.13
20:06
(126) В книжке по 1С написано
(127) Я на это опирался: 3х^2+2х+1=0 в (119)
130 Feunoir
 
25.12.13
20:06
(118) (119) ну если совсем жёстно закладываться на такой формат, то примерно так:

Предположим, что строку ты получила в переменную СтрУравенение. Будем разбирать.


//Сначала уберём лишние пробелы из строки
СтрУравнение = СтрЗаменить(СтрУравнение, " ", "");
// потом ищем x^2 в строке и a
Поз = Найти(СтрУравнение, "x^2");
А = Лев(СтрУравнение, Поз-1);
СтрУравнение = Сред(СтрУравнение, Поз+3);
// теперь b
Поз = Найти(СтрУравнение, "x");
B = Лев(СтрУравнение, Поз-1);
СтрУравнение = Сред(СтрУравнение, Поз+1);
// теперь c
Поз = Найти(СтрУравнение, "=");
B = Лев(СтрУравнение, Поз-1);


Ну а дальше считай
131 mrDSide
 
25.12.13
20:06
А почему не просто: ВвестиЗначение(а,"Введите ..."); кордескр=б*б-4*а*ц; икс1=(б+2*sqrt(кордескр))/2;икс2=(б-2*sqrt(кордескр))/2

Хотя за првильность формул икс1 и икс2 не ручаюсь =)
132 Salimbek
 
25.12.13
20:07
(125) Нет. не просто, в результате ты получишь строки, их надо проверить, чтобы они были Числом, и если все параметры - это числа, то преобразуешь их к Числу. А потом уже считаешь
133 rphosts
 
25.12.13
20:07
(131) потому что задача в простейшем парсинге строки
134 Feunoir
 
25.12.13
20:07
+(130) в последней строке

C = Лев(СтрУравнение, Поз-1);
135 Sachaaaa
 
25.12.13
20:09
спасибо большое ребятаа! щас разбираться буду и смотреть что не понятно будет спрошу!!!!! спасибо большое очень помогли!!!!
136 mrDSide
 
25.12.13
20:09
А если хотите парсить текст и решать что-то сложнее - возьмите какую-нибудь внешнюю компоненту (а еще лучше установить на машине интерпретатор phyton и в него передавать текст для решения).
137 Salimbek
 
25.12.13
20:10
(135) Фотку новую только не забудь ;-)
(136) А мне больше работа со строками в Ruby нравится
138 Fragster
 
гуру
25.12.13
20:12
Надо контролировать Х - русская или английская. + большая-маленькая


Уравнение = "3x^2+2x+1=0";

А=0;
Б=0;
В=0;

Знак = 1;

Числа = "0123456789";

Состояние = "А";
Для Сч = 1 По СтрДлина(Уравнение) Цикл
    
    ТекСимв = Сред(Уравнение, Сч, 1);
    
    Если Найти(Числа,ТекСимв) <> 0 Тогда
        
        Если Состояние = "А" Тогда
            А = А * 10 + Знак*Число(ТекСимв);
        ИначеЕсли Состояние = "Б" Тогда
            Б = Б * 10 + Знак*Число(ТекСимв);
        ИначеЕсли Состояние = "В" Тогда
            В = В * 10 + Знак*Число(ТекСимв);
        ИначеЕсли Состояние = "Квадрат" Тогда
            Состояние = "Б";
        КонецЕсли;
        
    Иначе
        Если Состояние = "Квадрат" Тогда
            Состояние = "Б"
        КонецЕсли;

        Если ТекСимв = "-" Тогда
            Знак = -1;
        ИначеЕсли ТекСимв = "+" Тогда
            Знак = 1;
        ИначеЕсли ТекСимв = "^" Тогда
            Состояние = "Квадрат";
        ИначеЕсли ТекСимв = "=" Тогда
            Состояние = "Конец";
        ИначеЕсли ТекСимв = "x" И Состояние="Б" Тогда
            Состояние = "В";
        КонецЕсли;
    КонецЕсли;
КонецЦикла;
139 Fragster
 
гуру
25.12.13
20:13
в (138), конечно, заляпуха, но  зачет получить можно
140 Sachaaaa
 
25.12.13
20:13
а что такое Сч?
141 Fragster
 
гуру
25.12.13
20:13
(140) открой конспект на главе про циклы
142 Fragster
 
гуру
25.12.13
20:14
Ну, или замени на Счетчик
143 Sachaaaa
 
25.12.13
20:14
хорошо
144 Fragster
 
гуру
25.12.13
20:17
(143) жду фотку с сигной ;)
145 Sachaaaa
 
25.12.13
20:18
спасибо большое мальчики! очень благодарна вам!
146 Sachaaaa
 
25.12.13
20:18
с чем?
147 Fragster
 
гуру
25.12.13
20:19
(146) -> (48)
148 Fragster
 
гуру
25.12.13
20:19
что-то (130) мне нравится больше...
149 mrDSide
 
25.12.13
20:20
(137) охотно верю, но речь скорее о модуле "math" для phyton'а.

А вообще:
1) заменить в строке Символ(160) на "";
2) заменить "-" на "+-";
3) разложить в массив подстрок по разделителю "+";
4) в новый массив структуры с й=Найти("*х`"), лев(все до й) в показатель, а прав(все после й) в степень;
5) перебрать массив, суммируя по условию эл[й]["показатель"]=сколько надо;
6) (131)
150 Sachaaaa
 
25.12.13
20:32
Мальчики, ошибку выдает! когда решение идет переменная не определена пишет а и с
151 Feunoir
 
25.12.13
20:34
(150) Внимательно перечитай сообщения и уточнения к ним и проверь русский-английский в именах переменных.

Ты по какому варианту делаешь?
152 Sachaaaa
 
25.12.13
20:36
все рус - англ было
153 Fragster
 
гуру
25.12.13
20:40
(150) ну так коэффициенты в (130) и (138) по другому, наверное, называются
154 Sachaaaa
 
25.12.13
20:42
все нормально сохранилось без ошибок, а вот нажимаю F5 ввожу уравнение нажимаю на кнопку решение и нечего не происходит, почему?
155 Sachaaaa
 
25.12.13
20:45
почему??
156 Feunoir
 
25.12.13
20:48
(155) Есть кнопка F9 - установка точки останова. Ставишь её на первой строке процедуры в которой разбираешь уравнение и по шагам (F10) проходишь процедуру, проверяя значения переменных.

А как ты результат выводишь? Как определила, что ничего не происходит.
157 Sachaaaa
 
25.12.13
20:53
через кнопку. У меня форма создана кнопка Решить, и процедура нажатие на эту кнопку вот запускаю F5 пишу уравнение нажимаю на кнопку и молчок
158 Feunoir
 
25.12.13
20:58
"Через кнопку" ты результат вывести не можешь. Через кнопку ты запускаешь решение. Так вот проверяй, что ты действительно решение запускаешь, то есть к кнопке привязано соответствующее действие.

И смотри, каким образом у тебя сообщается результат. А то может ты считать считаешь, а результат сообщить пользователю забываешь. Судя по твоему коду из (9) и (23), так и происходит.
159 Sachaaaa
 
25.12.13
21:00
а как тогда посчитать?
160 Sachaaaa
 
25.12.13
21:02
и результат вывести
161 Feunoir
 
25.12.13
21:02
Как ты сообщаешь пользователю, что нет решений?
162 Grobik
 
25.12.13
21:11
В карточке нет E-mail:, Город, страна:, День рождения:

Вдруг далеко живешь или старая?
163 Sachaaaa
 
25.12.13
21:14
ахахахахах обязательно заполнять?
164 Sachaaaa
 
25.12.13
21:15
так то не как не сообщаю( блин
165 Grobik
 
25.12.13
21:16
18:26 -> 21:15

Я бы над этим подумал.
166 Feunoir
 
25.12.13
21:18
(164) ой да ладно. А это что?

Если D<0 Тогда
Сообщить ("Решений нет");
...

Вот где у тебя такое сообщение результатов расчета в других случаях.

Ты по шагам процедуру проходила?
167 Grobik
 
25.12.13
21:19
+ не знаю каким броузером Вы пользуетесь. Но большинство подсвечивает ошибки. В правилах форума помню была фраза пользоваться русским.
168 Grobik
 
25.12.13
21:22
Feunoir молодец. Все порешает.

(156) +100500
169 User_Agronom
 
25.12.13
21:25
(0) я что-то пропустил? Дегустировать борщ кто первый?
170 Sachaaaa
 
25.12.13
21:31
в одном только!
получается везде сообщить добавить ну где иксы?
171 Grobik
 
25.12.13
21:32
(169) А кто сказал что автор украинка? Иначе я согласен дегустировать борщ только за 3000 рублей за чайную ложку.
172 Sachaaaa
 
25.12.13
21:47
русская я
173 dj_serega
 
25.12.13
22:31
(170) перечитай (156).
К нему же:
Можешь воспользоваться "Табло".
В запущеной отладке в конфигураторе:
Подменю "Отладка" -> "Табло" (третье снизу или ctrl+alt+w).
В выражения добавь свои переменные.
174 Wobland
 
26.12.13
04:19
ох, ничо вы тут нафлудили
175 rphosts
 
26.12.13
07:57
(174) спать нужно было меньше
176 Wobland
 
26.12.13
09:11
(175) спать нужно было больше. не выспался
177 dj_serega
 
26.12.13
12:42
(174) Флудили то флудили. А вот помогли или нет непонятно.
178 User_Agronom
 
26.12.13
12:48
(177) ТС варит борщ. Другого способа нет.
179 Птица
 
26.12.13
13:03
а в чем смысл такой задачи?
не, я понимаю еще когда идет распознавание какого-то текста и из него нужно вытащить квадратное уравнение, но когда вход зависит от программы, нафига усложнять жизнь, вводя квадратное уравнение строкой, когда его можно задавать тремя коэффициентами?
или программист считает, пользователю доставит особое удовольствие выписывать все эти икс и икс квадрат?
конечно понятно, что задача учебная, но хоть какая-то привязка к реальности должна быть? культура мышления должна быть?
180 User_Agronom
 
26.12.13
13:04
(179) Это студентка. Смысл: проверить навык работы со строками.
181 Птица
 
26.12.13
13:08
(180) читать я умею. но задача все равно идиотская.
навык работы со строками можно проверять и на более адекватных задачах, благо, это вещь часто востребованна в работе и подобрать задачу не  проблема.
182 Wobland
 
26.12.13
13:09
а это не её ли личная интерпретация задачи?
183 User_Agronom
 
26.12.13
13:10
(181) (182) Скорее всего такая. Смысл нужно спрашивать у преподавателя, но его мы спросить не можем. Поэтому только предположения.
184 Птица
 
26.12.13
13:11
+(181) не знаю, это как если бы интернов тренировали удалять аппендикс через горло(или другое отверстие), чтобы заодно проверить навыки манипулирования через разные отверстия.
а потом выпускали бы к пациентам, решать реальные задачи.
185 Wobland
 
26.12.13
13:12
всё правильно! аппендикс надо удалять через другое отверстие, там ближе
186 User_Agronom
 
26.12.13
13:14
(184) Несколько странное сравнение.
Задача разбиения строки с анализом результата - нормальная задача. И это часто приходится делать практически.
187 Wobland
 
26.12.13
13:36
(186) практически я иногда задумываюсь, как бы не работать со строками. просто на автопилоте. строки - они такие строки
188 Asirius
 
26.12.13
14:02
Решение
ункция ЭтоЦифра(Симв)
    Цифры ="1234567890.";
    Возврат  Найти(Цифры,Симв)>0;
         
КонецФункции

Функция ПолучитьНачальноеЧислоИзСтроки(Знач  СтрокаНачинающаясяСЧисла,ОстатокСтроки,ПолученноеЧисло)
    Для К = 1 По СТРДлина(СтрокаНачинающаясяСЧисла) Цикл
        Симв = Сред(СтрокаНачинающаясяСЧисла,К,1);
        Если Не ЭтоЦифра(Симв) Тогда
            Прервать;
        КонецЕслИ;
    КонецЦикла;
    Попытки
    ПолученноеЧисло= Число(Лев(СтрокаНачинающаясяСЧисла,к-1));
Исключение
Сообщить("Некорректный коэффициент "+Лев(СтрокаНачинающаясяСЧисла,к-1));
КонецПопытки
    ОстатокСтроки = Сред(СтрокаНачинающаясяСЧисла,К);
    
КонецФункции


Процедура ОтброситьПервыеНеЦифры(Знач ПроизвольнаяСтрока,ОстатокСтроки,Знак,ОтбрасываемаяСтрока)
    
    Знак = 1;
                                
    Для К = 1 По СТРДлина(ПроизвольнаяСтрока) Цикл
        Симв = Сред(ПроизвольнаяСтрока,К,1);
        
        Если Симв = "+" Тогда
            Знак = 1;
        КонецЕсли;
        
        Если Симв = "-" Тогда
            Знак = -1;
        КонецЕсли;
        
        Если ЭтоЦифра(Симв) Тогда
            Прервать;
        КонецЕслИ;
    КонецЦикла;
    
    ОстатокСтроки = Сред(ПроизвольнаяСтрока,К);
    ОтбрасываемаяСтрока  = Лев(ПроизвольнаяСтрока,К-1);
КонецПроцедуры

Процедура РазобратьКвадратноеУравнение(КорректнаяСтрока,a,b,c)
    Перем ОтбрасываемаяСтрока,ОстатокСтроки,Знак1,Знак2,Знак3;
    
    
    ОтброситьПервыеНеЦифры(КорректнаяСтрока, ОстатокСтроки,Знак1,ОтбрасываемаяСтрока);
    
    Если ОтбрасываемаяСтрока<>"-" и ОтбрасываемаяСтрока<>"+" Тогда
        Сообщить("Некорректное начало уравнения");
    КонецЕсли;
    
    ПолучитьНачальноеЧислоИзСтроки(ОстатокСтроки,ОстатокСтроки,a);
    ОтброситьПервыеНеЦифры(ОстатокСтроки, ОстатокСтроки,Знак2,ОтбрасываемаяСтрока);
    
    Если ОтбрасываемаяСтрока<>"XX+" и ОтбрасываемаяСтрока<>"XX-" Тогда
        Сообщить("Некорректный X^2 (не вначеле уравнения или отсутствует)");
    КонецЕсли;
    
    
    ПолучитьНачальноеЧислоИзСтроки(ОстатокСтроки,ОстатокСтроки,b);
    ОтброситьПервыеНеЦифры(ОстатокСтроки, ОстатокСтроки,Знак3,ОтбрасываемаяСтрока);
    
    
    Если ОтбрасываемаяСтрока<>"X+" и ОтбрасываемаяСтрока<>"X+" Тогда
        Сообщить("Некорректный X (не в середине уравнения или отсутствует)");
    КонецЕсли;
    
    
    ПолучитьНачальноеЧислоИзСтроки(ОстатокСтроки,ОстатокСтроки,c);
    Если ОстатокСтроки<>"=0" Тогда
        Сообщить("некорректрое окончание уравнения, должно быть =0");
    КонецЕслИ;
    
    a = a*знак1;
    b = b*знак2;
    c = c*знак3;
    
КонецПроцедуры

Функция ОткрорректироватьСтроку(Стр)
     Корректировка = ВРЕГ(СТРЗаменить(СТР,",","."));
     Корректировка = "+"+Корректировка ;
     Корректировка = СТРЗаменить(Корректировка,"+-","-");
     Корректировка = СТРЗаменить(Корректировка,"++","+");
     Корректировка = СТРЗаменить(Корректировка,"+X","+1X");
     Корректировка = СТРЗаменить(Корректировка,"-X","-1X");
     Корректировка = СТРЗаменить(Корректировка,"*X","X");
     Корректировка = СТРЗаменить(Корректировка,"X^2","XX");
     Возврат Корректировка;
    
КонецФункции

    

Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
    
//На форме реквизиты: ПолеВводаУравнения,a,b,c     РазобратьКвадратноеУравнение(ОткрорректироватьСтроку(ПолеВводаУравнения),a,b,c)
    
КонецПроцедуры
189 Wobland
 
26.12.13
14:06
(188) что будет при входе ""?
190 Asirius
 
26.12.13
14:09
(189)

Например, понимает:

2*X*X+x-1=0
-X^2+10*x+2=0
6X^2+4x+2=0
191 Wobland
 
26.12.13
14:10
(190) коли затеял проверки, делай нормально и до конца
192 Asirius
 
26.12.13
14:11
(191) а там все до конца. Не учтена только перестановка X и X*X
193 Wobland
 
26.12.13
14:12
(192) что будет при ""? и при "2х=0"?
194 Asirius
 
26.12.13
14:13
(193) Скажет, что не найден X^2
195 Wobland
 
26.12.13
14:14
(194) и героически пойдёт вычислять дальше?
196 Asirius
 
26.12.13
14:15
(195) героически найдет дальше все ошибки
197 Wobland
 
26.12.13
14:15
можно я не буду это запускать? чему будут равны А, Б и В при уравнении ""?
198 Asirius
 
26.12.13
14:17
При пустой стороке выдается сообщение:
Некорректный X^2 (не вначеле уравнения или отсутствует)
Некорректный коэффициент
Некорректный X (не в середине уравнения или отсутствует)
Некорректный коэффициент
некорректрое окончание уравнения, должно быть =0

a,b,c = 0
199 Wobland
 
26.12.13
14:19
ну тогда буду спать спокойно ;)
200 Feunoir
 
26.12.13
14:21
(200)
201 zva
 
26.12.13
14:24
(188) 1/3X^2 тоже поймет?
202 catena
 
26.12.13
14:30
А может преподаватель сидит на мисте? И потихоньку устраивает себе развлечение... Что-то много студентов последнее время поперло, явно в каком-то учебном заведении пиарят.
203 Wobland
 
26.12.13
14:32
а миста его вычислит и заявится всем составом требовать принятия зачёта. ещё и придираться будем
204 Asirius
 
26.12.13
15:02
(201) не, на такое выдаст ошибку.
Поймет 0.33*X^2+x+2=0
Доработать несложно: для дробей можно сделать препарсинг - искать все выражения вида число/число и менять на значения.
205 Asirius
 
26.12.13
15:05
Задача вполне из практики. Я на парсинге строк из назначений платежа для автоматической разноски банка собаку съел.
206 Sachaaaa
 
27.12.13
15:30
Привет всем! ак его вычислять не надо, я могу номер телефона скинуть..ахаха
207 narayanan
 
27.12.13
15:33
Sachaaaa, это Андрей, отправь письмо блRть!
208 Sachaaaa
 
27.12.13
15:36
дак отправила же
209 narayanan
 
27.12.13
15:37
210 Sachaaaa
 
27.12.13
15:40
дошло?
211 narayanan
 
27.12.13
15:42
(210) ага
212 Sachaaaa
 
27.12.13
19:50
narayanan, зайди на почту