Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться.
Подскажите, а как это можно сделать на с#.
Вот текст программы:
Здравствуйте, dshe, Вы писали:
D>Вместо GOSUB уже давно используется вызов методов. (С передачей параметрами и прочими прелестями)
В моей программе очень много комманд goto, и если для каждой писать свой метод, то программа станет большой и сложной. Вот я нашёл комманду return, но она работает не правильно, программа просто останавливается.
Я тут посмотрел предложенные программы, но в них ещё не разобрался.
Зато я полазил по сайту и почитал про объектно ориентированное программирование, и мы на выходных с другом программистом на турбо паскале переписали программу без комманды goto с помощью процедур.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, AlexGK, Вы писали:
A>Угу, надо исправить: A>if((desc<0)||(a==0)) A>return false A>x1=(-b+Math.Sqrt(desc))/(2*a) A>x1=(-b+Math.Sqrt(desc))/(2*a)
A>Если раньше неправильно считало, то теперь вооще не компилируется
М-да..... в России две беды: доороги и люди, у которых не компилируются программы....
Здравствуйте, AlexGK, Вы писали:
AGK>Вот работающий пример
Ещё один приколист AlexGK твой работающий пример неправильно считает
Более того, зачем на C# писать в таком ярко выраженном сишном стиле?
Короче надо было так (замедленным выводом не занимаюсь)
using System;
namespace cstest
{
enum SolverResult
{
Unknown,
Root0,
Root1,
Root2
};
class Solver
{
private double _a = 0.0;
private double _b = 0.0;
private double _c = 0.0;
private SolverResult _result = SolverResult.Unknown;
private double _root1 = 0.0;
private double _root2 = 0.0;
public Solver()
{
}
public void Execute()
{
if (_a != 0.0)
{
double discriminant = B*B - 4.0*A*C;
if (discriminant < 0.0)
{
_result = SolverResult.Root0;
}
else if (discriminant > 0.0)
{
_root1 = (-B + Math.Sqrt(discriminant))/(2*A);
_root2 = (-B - Math.Sqrt(discriminant))/(2*A);
_result = SolverResult.Root2;
}
else
{
_root1 = -B/(2*A);
_result = SolverResult.Root1;
}
}
else
{
_root1 = -C/B;
_result = SolverResult.Root1;
}
}
public double A
{
get {return _a;}
set
{
_a = value;
_result = SolverResult.Unknown;
}
}
public double B
{
get {return _b;}
set
{
_b = value;
_result = SolverResult.Unknown;
}
}
public double C
{
get {return _c;}
set
{
_c = value;
_result = SolverResult.Unknown;
}
}
public SolverResult Result
{
get {return _result;}
}
public double Root1
{
get
{
if ((Result == SolverResult.Root1) || (Result == SolverResult.Root2))
{
return _root1;
}
else
{
throw new NotSupportedException();
}
}
}
public double Root2
{
get
{
if (Result == SolverResult.Root2)
{
return _root2;
}
else
{
throw new NotSupportedException();
}
}
}
}
class CSTest
{
static bool ReadYN()
{
for (;;)
{
Console.Write("Do you want to solve one more equation? (Y/N): ");
string line = Console.ReadLine().Trim().ToUpper();
if (line.Length == 0)
{
Console.WriteLine("Invalid input - no input.");
}
else if ((line[0] != 'Y') && (line[0] != 'N'))
{
Console.WriteLine("Invalid input - not Y or N.");
}
else
{
return line[0] == 'Y';
}
}
}
static double ReadDouble()
{
for (;;)
{
string line = Console.ReadLine();
if (line.Length == 0)
{
Console.WriteLine("Invalid input - no input.");
}
else
{
try
{
return double.Parse(line);
}
catch (FormatException e)
{
Console.WriteLine(e.Message);
}
}
}
}
[STAThread]
static void Main(string [] args)
{
Console.WriteLine("Quadratic equation solver 1.0");
for (bool answer = true; answer; answer = ReadYN())
{
Solver solver = new Solver();
Console.Write("Enter coefficient A: ");
solver.A = ReadDouble();
Console.Write("Enter coefficient B: ");
solver.B = ReadDouble();
Console.Write("Enter coefficient C: ");
solver.C = ReadDouble();
solver.Execute();
switch (solver.Result)
{
case SolverResult.Root0:
Console.WriteLine("No roots");
break;
case SolverResult.Root1:
Console.WriteLine("The only root is {0}", solver.Root1);
break;
case SolverResult.Root2:
Console.WriteLine("First root is {0} and second is {1}", solver.Root1, solver.Root2);
break;
}
}
}
}
}
Здравствуйте, BCoder, Вы писали:
BC>Здравствуйте, dshe, Вы писали:
D>>Вместо GOSUB уже давно используется вызов методов. (С передачей параметрами и прочими прелестями)
BC>В моей программе очень много комманд goto, и если для каждой писать свой метод, то программа станет большой и сложной. Вот я нашёл комманду return, но она работает не правильно, программа просто останавливается.
Я же говорю: сравни мой код и свой, есть еще более компактный вариант( там пару условий можно убрать). Какя тебе собственно разница много goto или много чего-то типа void _func(...).
Спорит не буду, кто рожден "летать" с goto, тот не будет "пользать" в ООП
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, AlexGK, Вы писали:
A>Угу, надо исправить: A>if((desc<0)||(a==0)) A>return false A>x1=(-b+Math.Sqrt(desc))/(2*a) A>x1=(-b+Math.Sqrt(desc))/(2*a)
A>Если раньше неправильно считало, то теперь вооще не компилируется
Ты тупой? Наверное не компилируется потому что ";" надо ставить.
Здравствуйте, DEMON HOOD, Вы писали:
DH>Здравствуйте, AlexGK, Вы писали:
AGK>>
AGK>> Write("Hellow, dummy user !\n");
AGK>> Write("I am a Great Programm !\n");
AGK>> Write("My Great Mission is to solve quadratic equation !\n");
AGK>> Write("New economy algorithm for memory using !!!\n");
AGK>>
DH>ты не сделал медленный, посимвольный вывод сообщения
Здравствуйте, AlexGK, Вы писали:
AGK>Здравствуйте, BCoder, Вы писали:
BC>>Привет, программисты !
BC>>Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться. BC>>Подскажите, а как это можно сделать на с#. BC>>Вот текст программы:
BC>>Спасибо. BC>>Иван
AGK>Это такой прикол? Хотя помнится на первом курсе наш пепод так любил goto,что потом еле-еле отучился
Если честно, то я когда начинал программировать сначала на Басике, а потом на Паскале, с негодованием принимал отсутствие номера строки и презрение опытных программистов к GOTO
Здравствуйте, Ranger_XL, Вы писали:
R_X>Думаю, что хорошим в данном случае будет вариант замены goto на switch. Как в С# это будет, на 100% утверждать не буду, но в С++ примерно так: R_X>
R_X>#include <iostream>
R_X>#include <string>
R_X>using namespace std;
R_X>int main()
R_X>{
R_X> string s0;
R_X> enum _states {S1, S2, S3, S4, SEND};
R_X> _states state = S1;
R_X> while (state != SEND) {
R_X> switch (state) {
R_X> case S1:
R_X> s0 = "Hellow, dummy user!\n";
R_X> state = S2;
R_X> break;
R_X> case S2:
R_X> s0 = "I'm a mighty oracul!\n";
R_X> state = S3;
R_X> break;
R_X> case S3:
R_X> s0 = "Do you want to know your future?\n";
R_X> state = S4;
R_X> break;
R_X> case S4:
R_X> s0 = "Whatever you want your fate is DEATH :)\n";
R_X> state = SEND;
R_X> break;
R_X> }
R_X> cout << s0;
R_X> }
R_X> return 0;
R_X>}
R_X>
Спасибо за помощь, но я так и не понял как этот код решает уравнение, или для этого в С++ есть специальная комманда ? Если с++ так хорош, то может использовать его вместо с# ?
Мне кажется что это спланированная этака на светлый образ BCoder'а, война, вышедшего под флагами GOTO на поле брани с пропагандистскими течениями ООП и функциональщины.
Вот недавно читал о C# 3.0, да-а-а, чего только не напридумывают люди, чтобы избавиться от добрых goto и gosub.
Лучше бы развивали QBasic. Например сделали бы комманду GOTO [имя переменной], такой управляемый GOTO наверняка бы разрешил огромное число проблемм программистов.
Но ведь это не выгодно, ведь столько авторов обогащаются на несчастных-бедных программистах, вбухивающих кучу денег на книги об ООП. А эти выдумщики языков ? C++, C# (за пять? лет уже вышли версии 1.0, 2.0, 3.0) ?
BC>Лучше бы развивали QBasic. Например сделали бы комманду GOTO [имя переменной], такой управляемый GOTO наверняка бы разрешил огромное число проблемм программистов.
было, и даже выражения можно как адрес перехода в некоторых васиках юзать
Здравствуйте, BCoder, Вы писали:
BC>Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться.
Вместо GOSUB уже давно используется вызов методов. (С передачей параметрами и прочими прелестями)
Здравствуйте, BCoder, Вы писали:
BC>Привет, программисты !
BC>Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться. BC>Подскажите, а как это можно сделать на с#. BC>Вот текст программы:
BC>Спасибо. BC>Иван
Это такой прикол? Хотя помнится на первом курсе наш пепод так любил goto,что потом еле-еле отучился
Вот работающий пример (единсвенно, это надо добавить try для FormatException перед parse для float, на случай, если введенная строка не является числом):
using System;
using System.IO;
using System.Threading;
namespace MegaRulezzz
{
class Class1
{
private const int _timeOut=50;
private static void Write(string msg)
{
foreach(char item in msg)
{
Console.Write(item);
Thread.Sleep(_timeOut);
}
}
private static bool _solve(double a, double b, double c, out double x1, out double x2)
{
x1=x2=0;
double desc = b*b-4*a*c;
if(desc<0)
return false;
x1 = -b+Math.Sqrt(desc)/(2*a);
x2= -b-Math.Sqrt(desc)/(2*a);
return true;
}
static double _readdouble()
{
return double.Parse(Console.ReadLine());
}
static char _readChar()
{
return char.Parse(Console.ReadLine());
}
static void Main(string[] args)
{
double x1=0,x2=0;
char chr;
bool solve;
bool doC = true;
Write("Hellow, dummy user !\n");
Write("I am a Great Programm !\n");
Write("My Great Mission is to solve quadratic equation !\n");
Write("New economy algorithm for memory using !!!\n");
while(doC)
{
Write("Please, dummy user, insert a,b,c koefficients :\n");
solve =_solve(_readdouble(),_readdouble(),_readdouble(),out x1, out x2);
if(solve)
if(x1==x2)
Write(string.Format("Решение уравнения: x={0}\n",x1));
else
Write(string.Format("Решения уравнения: x1={0}, x2={1}\n",x1,x2));
else
Write("You are realy dummy user, your equation havn't solve.\n");
do
{
Write("Try again, (Y/N) ?\n");
chr = _readChar();
}
while((chr!='Y')&&(chr!='y')&&(chr!='N')&&(chr!='n'));
if((chr=='N')||(chr=='n'))
doC = false;
}
}
}
}
Здравствуйте, AlexGK, Вы писали:
AGK>Здравствуйте, BCoder, Вы писали:
BC>>Привет, программисты !
BC>>Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться. BC>>Подскажите, а как это можно сделать на с#. BC>>Вот текст программы:
BC>>Спасибо. BC>>Иван
Забыл добавить: не надо использовать goto, сравни свой код и мой, в твоем глаза сломать можно, а пр расширяемость и говорить нечего.
Здравствуйте, AlexGK, Вы писали:
AGK>Это такой прикол? Хотя помнится на первом курсе наш пепод так любил goto,что потом еле-еле отучился
На самом деле, существует много разных языков и разных компьютеров... Я например, школьником, решал квадратные уравнения при помощи девайса — калькулятор МК-?? Там был goto... и был особый стиль программирования — ищу GOSUB
вот он продемонстрован. На моём оборудовании, по другому (без goto) программировать было нельзя, подозреваю что и сейчас существует техника на которой без goto не обойтись, какие нибудь станки с ЧПУ....
Я сам очень долго учился мыслить без goto, и отвыкать было довольно таки сложно.
Так, что может это не прикол — человек работает с старой (?) техникой....
silent RSDN@Home 1.1.4 beta 7 [447] Windows XP 5.1.2600.0
AGK> Write("Hellow, dummy user !\n");
AGK> Write("I am a Great Programm !\n");
AGK> Write("My Great Mission is to solve quadratic equation !\n");
AGK> Write("New economy algorithm for memory using !!!\n");
AGK>
ты не сделал медленный, посимвольный вывод сообщения
silent RSDN@Home 1.1.4 beta 7 [447] Windows XP 5.1.2600.0
ищу GOSUB
От:
Аноним
Дата:
30.06.05 21:40
Оценка:
Если пишешь на C шарп, то используй возможности именно этого языка и ОТУЧАЙСЯ от goto.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, AlexGK, Вы писали:
AGK>>Вот работающий пример
A>Ещё один приколист AlexGK твой работающий пример неправильно считает A>Более того, зачем на C# писать в таком ярко выраженном сишном стиле? A>Короче надо было так (замедленным выводом не занимаюсь)
Если что-то не так надо переделать метод _solve(..). Задача была не заставить программу считать а написать аналог без goto. Насче создания отдельного класса я тоже думал, была идея и как сделать read из консоли нормально, более централизовано и правильно. Но я давно себя отучил не делать того,ч ео делать не надо. Если ,предположим, это была часть какого-то большого проекта — другое дело, а так, знаешь ли....
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, AlexGK, Вы писали:
AGK>>Вот работающий пример
A>Ещё один приколист AlexGK твой работающий пример неправильно считает A>Более того, зачем на C# писать в таком ярко выраженном сишном стиле? A>Короче надо было так (замедленным выводом не занимаюсь)
А вообще, я тебе так скажу: если у меня была бы необходимость высчитывать корни квадратного уравнения я бы поместил один статичный метод в класс типа Common.Functions, я понимаю, что у нас ООП, но в этом случае такой необходимости нет, потому что все вычисляется в один метод, в пять строк, без вызова других внутри. Делать отдельный класс для пяти строк, это слишком (не спорю, что там есть и проперти и проч не нужная лабуда, но все что необходимо, это пять строк)
Это один из агрументов в теме "Влияние языка на качество программирования"
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: ищу GOSUB
От:
Аноним
Дата:
01.07.05 08:54
Оценка:
наверное есть языки в которых без goto вааще никак, но при попытке такие вспомнить, приходит на ум только бейсик для спектрума(крутейшая штуковина была, надо сказать
10: LOAD ""
20: PRINTF ("Hello, world!")
30: .............................
40: GOTO 20
дамс, синтаксис забыл напрочь, надо освежить
).
А если есть возможность его не юзать, то имхо лучше его не юзать.
Думаю, что хорошим в данном случае будет вариант замены goto на switch. Как в С# это будет, на 100% утверждать не буду, но в С++ примерно так:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s0;
enum _states {S1, S2, S3, S4, SEND};
_states state = S1;
while (state != SEND) {
switch (state) {
case S1:
s0 = "Hellow, dummy user!\n";
state = S2;
break;
case S2:
s0 = "I'm a mighty oracul!\n";
state = S3;
break;
case S3:
s0 = "Do you want to know your future?\n";
state = S4;
break;
case S4:
s0 = "Whatever you want your fate is DEATH :)\n";
state = SEND;
break;
}
cout << s0;
}
return 0;
}
Здравствуйте, BCoder, Вы писали:
BC>Привет, программисты !
BC>Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться. BC>Подскажите, а как это можно сделать на с#. BC>Вот текст программы:
Окончательный вариант:
using System;
using System.IO;
using System.Threading;
namespace MegaRulezzz {
class Class1 {
private const int _timeOut = 50;
private static void Write(string msg) {
foreach (char item in msg) {
Console.Write(item);
Thread.Sleep(_timeOut);
}
}
private static bool _solve(double a, double b, double c, out double x1, out double x2) {
x1 = x2 = 0;
double desc = b * b - 4 * a * c;
if ((desc < 0) || (a == 0))
return false;
x1 = (-b + Math.Sqrt(desc)) / (2 * a);
x2 = (-b - Math.Sqrt(desc)) / (2 * a);
return true;
}
static double _readdouble(ref bool ex) {
try {
return double.Parse(Console.ReadLine());
}
catch (FormatException) {
ex = true;
return 0.0;
}
}
static char _readChar() {
try {
return char.Parse(Console.ReadLine());
}
catch (FormatException) {
return' ';
}
}
private static bool _readVals(out Double a, out Double b, out Double c) {
bool pr = false;
a = _readdouble(ref pr);
b = _readdouble(ref pr);
c = _readdouble(ref pr);
return pr;
}
private static bool _isDstChar(char src, char dst) {
return (src == Char.ToUpper(dst)) || (src == Char.ToLower(dst));
}
static void Main(string[] args) {
double x1, x2, a, b, c;
char chr;
do {
Write("Введите коэффициенты квадратного уравнения:\n");
if (_readVals(out a, out b, out c))
Write("Введенные значения числами не являются!\n");
else
if (_solve(a, b, c, out x1, out x2))
if (x1 == x2)
Write(string.Format("Решение уравнения: x={0}\n", x1));
else
Write(string.Format("Решения уравнения: x1={0}, x2={1}\n", x1, x2));
else
Write("Уравнение решения не имеет.\n");
do Write("Попробуете еще раз, (Y/N) ?\n");
while (((chr = _readChar()) == ' ') || (!_isDstChar(chr, 'y') && !_isDstChar(chr, 'n')));
} while (!_isDstChar(chr, 'n'));
}
}
}
Здравствуйте, DEMON HOOD, Вы писали:
DH>На самом деле, существует много разных языков и разных компьютеров... Я например, школьником, решал квадратные уравнения при помощи девайса — калькулятор МК-?? Там был goto... и был особый стиль программирования — ищу GOSUB
вот он продемонстрован. На моём оборудовании, по другому (без goto) программировать было нельзя, подозреваю что и сейчас существует техника на которой без goto не обойтись, какие нибудь станки с ЧПУ....
На уровне маш.кодов без goto не обойдешься, но не на уровне языка. Firmware для контроллеров давно уже пишут на С и даже на C++, в некоторых случаях на ассемблере.
BC>Спасибо за помощь, но я так и не понял как этот код решает уравнение, или для этого в С++ есть специальная комманда ? Если с++ так хорош, то может использовать его вместо с# ?
Этот код не решает уравнение, он демонстрирует, как заменить goto/gosub
Re[3]: ищу GOSUB
От:
Аноним
Дата:
04.07.05 06:01
Оценка:
Лежу на полу, и бьюсь в истерике...
jmz, однозначно, Иван, тебе нужен jmz...
А губит людей даже не goto, губит многих людей их собственный мозг, честное слово.
Здравствуйте, BCoder, Вы писали:
BC>Да нет, просто я только две недели назад взялся писать программы на c#, а до этого был программистом на qbasice.
долго?
Здравствуйте, faulx, Вы писали:
F>По-моему, человек явно прикалывается и играет виртуальную личность. Но смешно. Жду продолжения.
Поддерживаю
После первого поста было смешно, а потом явно стал просматриваться стеб
ИМХО конечно.
А потом мне на ум пришел случай.
У нас в универе далеко не все кто учился в нашей группе хотели стать программистами, и мало кто что-то хоть отдаленно понимал в программировании. Я их не виню, это им просто не нужно было, а поступали все по разным причинам. Кому поступать было больше не куда, кто в армию не хотел
Так вот, были у нас подобные задачки в универе, и некоторые студенты просто драли эти лабораторки у других, а некоторые отчаянно пытались их сделать. Например, нужно было написать программу которая бы умножала матрицы размером 4x4. Был парень, который вместо того, чтобы массив объявить объявлял кучу переменных типа A11, A12, A13, ... A44.
Не хочу никого обидеть, просто первая мысль была что человек прикалывается, а потом пришел на ум ряд универских случаев. Так что в принципе такое возможно
Здравствуйте, SiAVoL, Вы писали:
BC>>Я вот написал программу для расчёта квадратного уравнения. SAV>все круто! но вот с форматированием... лучше писать так
SAV>
SAV>using System;
SAV>namespace MegaRulezzz{class Class1{static
SAV>float v1, v2, v3;static string s0;static
SAV>char i;static int j;static void Main(string[]
SAV>args){lminus5:s0="Hellow, dummy user !\n";i=
SAV>(char)0;goto l100;lminus4:s0=
SAV>"I am a Great Programm !\n";i=(char)1;goto l100;
SAV>lminus3:s0="My Great Mission is to solve quadratic equation !\n";
SAV>i=(char)2;goto l100;lminus2:s0=
SAV>"New economy algorithm for memory using !!!\n";i=(char)3;goto l100;
SAV>lminus1:l0:s0="Please, dummy user, insert a,b,c koefficients :\n";
SAV>i=(char)4;goto l100;l1:v1=(float)Convert.ToDouble(Console.ReadLine());
SAV>v2=(float)Convert.ToDouble(Console.ReadLine());v3=(float)Convert.
SAV>ToDouble(Console.ReadLine());l3:if(v2*v2<4*v1*v3)goto l4;goto l5;
SAV>l4:s0="You are realy dummy user, your equation havn't solve.\n";
SAV>i=(char)6;goto l100;l4a:s0="Try again, (Y/N) ?\n";i=(char)7;
SAV>goto l100;l4b:v1=(float)Console.Read();Console.ReadLine();
SAV>if(v1==121)goto l0;if(v1==110)goto l9;goto l4a;l5:v3=v2*v2-4
SAV>*v1*v3;v3=(float)Math.Sqrt(v3)/v1/2;v2/=-2*v1;v1=v2+v3;v2=v1-
SAV>2*v3;l7:s0="x1 ="+v1.ToString()+"\n";i=(char)11;goto l100;
SAV>l7a:s0="x2 = "+v2.ToString()+"\n";i=(char)10;goto l100;l8:
SAV>s0="Once again, (Y/N) ?\n";i=(char)9;goto l100;l8a:v1=(float)
SAV>Console.Read();Console.ReadLine();if(v1==121)goto l0;if(v1==
SAV>110)goto l9;goto l8;l9:goto l1000;l100:j=-1;l101:if(j==s0.Length
SAV>-1)goto l110;Console.Write(s0[j=j+1].ToString());System.
SAV>Threading.Thread.Sleep(50);goto l101;l110:if(i==0)goto
SAV>lminus4;if(i==1)goto lminus3;if(i==2)goto lminus2;if(i==3)
SAV>goto lminus1;if(i==4)goto l1;if(i==6)goto l4a;if(i==7)goto
SAV>l4b;if(i==11)goto l7a;if(i==10)goto l8;if(i==9)goto l8a;if
SAV>(i==12)goto l1001;goto lminus5;l1000:s0="Goodbye, user.\n";
SAV>i=(char)12;goto l100;l1001:;}}}
SAV>
Разбирая код нашёл пару логических ошибок. Теперь попробуй найти ты
Здравствуйте, Аноним, Вы писали:
А>Неее это не Светка и не друг никакой это её муж программист
А>ЗЫ если меня память не подводит то на одном из форумов она замуж за програмиста выскочила (по моему когда боролась или ЛЕЧИЛА вирусы )
А это не про неё Экслер написал "Записки невесты программиста"?