ищу GOSUB
От: BCoder Россия http://bcoder.narod.ru
Дата: 30.06.05 16:55
Оценка: 33 (11) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :))) :)
Привет, программисты !

Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться.
Подскажите, а как это можно сделать на с#.
Вот текст программы:


using System;

namespace MegaRulezzz
{
    class Class1
    {
        static float v1, v2, v3;
        static string s0;
        static char i;
        static int j;
        static void Main(string[] args)
        {
            lminus5:
                s0 = "Hellow, dummy user !\n";
                i=(char)0;
                goto l100;
            lminus4:
                s0= "I am a Great Programm !\n";
                i=(char)1;
                goto l100;
            lminus3:
                s0= "My Great Mission is to solve quadratic equation !\n";
                i=(char)2;
                goto l100;
            lminus2:
                s0= "New economy algorithm for memory using !!!\n";
                i=(char)3;
                goto l100;
            lminus1:
            l0:
                s0= "Please, dummy user, insert a,b,c koefficients :\n";
                i=(char)4;
                goto l100;
            l1:
                v1 = (float)Convert.ToDouble(Console.ReadLine());
                v2= (float)Convert.ToDouble(Console.ReadLine());
                v3= (float)Convert.ToDouble(Console.ReadLine());
            l3:
                if (v2*v2 <4*v1*v3) goto l4;
                goto l5;
            l4:
                s0= "You are realy dummy user, your equation havn't solve.\n";
                i=( char)6;
                goto l100;
            l4a:
                s0="Try again, (Y/N) ?\n";
                i=(char)7;
                goto l100;
            l4b:
                v1 = (float)Console.Read();
                Console.ReadLine();
                if(v1 == 121) goto l0;
                if(v1 == 110) goto l9;
                goto l4a;
            l5:
                v3 = v2*v2 -4*v1*v3;
                v3 = (float)Math.Sqrt(v3)/ v1/2;
                v2 /= -2*v1;
                v1 = v2 + v3;
                v2 = v1 - 2*v3;
            l7:
                s0= "x1 =" + v1.ToString()+ "\n";
                i=(char)11;
                goto l100;
            l7a:
                s0="x2 = " +v2.ToString() +"\n";
                i=(char)10;
                goto l100;
            l8:
                s0="Once again, (Y/N) ?\n";
                i=(char)9;
                goto l100;
            l8a:
                v1 = (float)Console.Read();
                Console.ReadLine();
                if(v1 == 121) goto l0;
                if(v1 == 110) goto l9;
                goto l8;
            l9:
                goto l1000;

            l100:
                j=-1;
            l101:
                if(j==s0.Length-1) goto l110;
                Console.Write(s0[j=j+1].ToString());
                System.Threading.Thread.Sleep(50);
                goto l101;
            l110:
                if(i==0 ) goto lminus4;
                if(i==1) goto lminus3;
                if(i==2) goto lminus2;
                if(i==3) goto lminus1;
                if(i==4 ) goto l1;
                if(i==6 ) goto l4a;
                if(i==7) goto l4b;
                if(i==11 ) goto l7a;
                if(i==10) goto l8;
                if(i==9) goto l8a;
                if(i==12) goto l1001;
                goto lminus5;
            l1000:
                s0 ="Goodbye, user.\n";
                i=(char)12;
                goto l100;
            l1001:;
        }
    }
}



Спасибо.
Иван



30.06.05 22:54: Перенесено из '.NET'
Re: ищу GOSUB
От: dshe  
Дата: 30.06.05 17:13
Оценка:
Здравствуйте, BCoder, Вы писали:

BC>Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться.


Вместо GOSUB уже давно используется вызов методов. (С передачей параметрами и прочими прелестями)
--
Дмитро
Re: ищу GOSUB
От: AlexGK Россия  
Дата: 30.06.05 17:52
Оценка:
Здравствуйте, 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;
            }
            
        }
    }
}
Re[2]: ищу GOSUB
От: AlexGK Россия  
Дата: 30.06.05 17:54
Оценка:
Здравствуйте, AlexGK, Вы писали:

AGK>Здравствуйте, BCoder, Вы писали:


BC>>Привет, программисты !


BC>>Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться.

BC>>Подскажите, а как это можно сделать на с#.
BC>>Вот текст программы:


BC>>Спасибо.

BC>>Иван


Забыл добавить: не надо использовать goto, сравни свой код и мой, в твоем глаза сломать можно, а пр расширяемость и говорить нечего.
Re: ищу GOSUB
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.06.05 18:11
Оценка: 3 (1) :))
Здравствуйте, BCoder, Вы писали:

Вот сижу и думаю — зачем этому человеку C#?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: ищу GOSUB
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.06.05 19:05
Оценка: 3 (1) :)
Здравствуйте, 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;
                }
            }
        }
    }
}
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: ищу GOSUB
От: DEMON HOOD  
Дата: 30.06.05 20:04
Оценка:
Здравствуйте, AlexGK, Вы писали:

AGK>Это такой прикол? Хотя помнится на первом курсе наш пепод так любил goto,что потом еле-еле отучился


На самом деле, существует много разных языков и разных компьютеров... Я например, школьником, решал квадратные уравнения при помощи девайса — калькулятор МК-?? Там был goto... и был особый стиль программирования — ищу GOSUB
Автор: BCoder
Дата: 30.06.05
вот он продемонстрован. На моём оборудовании, по другому (без goto) программировать было нельзя, подозреваю что и сейчас существует техника на которой без goto не обойтись, какие нибудь станки с ЧПУ....
Я сам очень долго учился мыслить без goto, и отвыкать было довольно таки сложно.
Так, что может это не прикол — человек работает с старой (?) техникой....
silent RSDN@Home 1.1.4 beta 7 [447] Windows XP 5.1.2600.0
Re[2]: ищу GOSUB
От: DEMON HOOD  
Дата: 30.06.05 20:05
Оценка:
Здравствуйте, 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>


ты не сделал медленный, посимвольный вывод сообщения
silent RSDN@Home 1.1.4 beta 7 [447] Windows XP 5.1.2600.0
ищу GOSUB
От: Аноним  
Дата: 30.06.05 21:40
Оценка:
Если пишешь на C шарп, то используй возможности именно этого языка и ОТУЧАЙСЯ от goto.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: ищу GOSUB
От: AlexGK Россия  
Дата: 01.07.05 05:06
Оценка: +1
Здравствуйте, 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>ты не сделал медленный, посимвольный вывод сообщения


Ты это серьезно?

private static void Write(string msg){
            foreach(char item in msg){
                Console.Write(item);
                Thread.Sleep(_timeOut);
            }
        }
Re[3]: ищу GOSUB
От: AlexGK Россия  
Дата: 01.07.05 05:13
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, AlexGK, Вы писали:


AGK>>Вот работающий пример


A>Ещё один приколист AlexGK твой работающий пример неправильно считает

A>Более того, зачем на C# писать в таком ярко выраженном сишном стиле?
A>Короче надо было так (замедленным выводом не занимаюсь)


Если что-то не так надо переделать метод _solve(..). Задача была не заставить программу считать а написать аналог без goto. Насче создания отдельного класса я тоже думал, была идея и как сделать read из консоли нормально, более централизовано и правильно. Но я давно себя отучил не делать того,ч ео делать не надо. Если ,предположим, это была часть какого-то большого проекта — другое дело, а так, знаешь ли....
Re[3]: ищу GOSUB
От: AlexGK Россия  
Дата: 01.07.05 05:21
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, AlexGK, Вы писали:


AGK>>Вот работающий пример


A>Ещё один приколист AlexGK твой работающий пример неправильно считает

A>Более того, зачем на C# писать в таком ярко выраженном сишном стиле?
A>Короче надо было так (замедленным выводом не занимаюсь)

А вообще, я тебе так скажу: если у меня была бы необходимость высчитывать корни квадратного уравнения я бы поместил один статичный метод в класс типа Common.Functions, я понимаю, что у нас ООП, но в этом случае такой необходимости нет, потому что все вычисляется в один метод, в пять строк, без вызова других внутри. Делать отдельный класс для пяти строк, это слишком (не спорю, что там есть и проперти и проч не нужная лабуда, но все что необходимо, это пять строк)
Re: ищу GOSUB
От: SiAVoL Россия  
Дата: 01.07.05 05:22
Оценка: 3 (1) :))) :))) :))) :))) :))
Здравствуйте, BCoder, Вы писали:

BC>Я вот написал программу для расчёта квадратного уравнения.

все круто! но вот с форматированием... лучше писать так

using System;
namespace MegaRulezzz{class Class1{static 
float v1, v2, v3;static string s0;static 
char i;static int j;static void Main(string[] 
args){lminus5:s0="Hellow, dummy user !\n";i=
(char)0;goto l100;lminus4:s0=
"I am a Great Programm !\n";i=(char)1;goto l100;
lminus3:s0="My Great Mission is to solve quadratic equation !\n";
i=(char)2;goto l100;lminus2:s0=
"New economy algorithm for memory using !!!\n";i=(char)3;goto l100;
lminus1:l0:s0="Please, dummy user, insert a,b,c koefficients :\n";
i=(char)4;goto l100;l1:v1=(float)Convert.ToDouble(Console.ReadLine());
v2=(float)Convert.ToDouble(Console.ReadLine());v3=(float)Convert.
ToDouble(Console.ReadLine());l3:if(v2*v2<4*v1*v3)goto l4;goto l5;
l4:s0="You are realy dummy user, your equation havn't solve.\n";
i=(char)6;goto l100;l4a:s0="Try again, (Y/N) ?\n";i=(char)7;
goto l100;l4b:v1=(float)Console.Read();Console.ReadLine();
if(v1==121)goto l0;if(v1==110)goto l9;goto l4a;l5:v3=v2*v2-4
*v1*v3;v3=(float)Math.Sqrt(v3)/v1/2;v2/=-2*v1;v1=v2+v3;v2=v1-
2*v3;l7:s0="x1 ="+v1.ToString()+"\n";i=(char)11;goto l100;
l7a:s0="x2 = "+v2.ToString()+"\n";i=(char)10;goto l100;l8:
s0="Once again, (Y/N) ?\n";i=(char)9;goto l100;l8a:v1=(float)
Console.Read();Console.ReadLine();if(v1==121)goto l0;if(v1==
110)goto l9;goto l8;l9:goto l1000;l100:j=-1;l101:if(j==s0.Length
-1)goto l110;Console.Write(s0[j=j+1].ToString());System.
Threading.Thread.Sleep(50);goto l101;l110:if(i==0)goto 
lminus4;if(i==1)goto lminus3;if(i==2)goto lminus2;if(i==3) 
goto lminus1;if(i==4)goto l1;if(i==6)goto l4a;if(i==7)goto 
l4b;if(i==11)goto l7a;if(i==10)goto l8;if(i==9)goto l8a;if
(i==12)goto l1001;goto lminus5;l1000:s0="Goodbye, user.\n";
i=(char)12;goto l100;l1001:;}}}


Спасибо тебе, Иван!
... << RSDN@Home 1.1.4 beta 7 rev. 501>>
Re[2]: ищу GOSUB
От: White Barsik  
Дата: 01.07.05 07:33
Оценка: +1
Здравствуйте, AlexGK, Вы писали:

AGK>Здравствуйте, BCoder, Вы писали:


BC>>Привет, программисты !


BC>>Я вот написал программу для расчёта квадратного уравнения. Задумал её улучшить и сделал медленный вывод строки (как печатают на машинке). Когда я её писал на qbasic'е там была удобная комманда gosub, которая работала как goto, только позволяла вурнуться.

BC>>Подскажите, а как это можно сделать на с#.
BC>>Вот текст программы:


BC>>Спасибо.

BC>>Иван


AGK>Это такой прикол? Хотя помнится на первом курсе наш пепод так любил goto,что потом еле-еле отучился

Если честно, то я когда начинал программировать сначала на Басике, а потом на Паскале, с негодованием принимал отсутствие номера строки и презрение опытных программистов к GOTO
Re: ищу GOSUB
От: minorlogic Украина  
Дата: 01.07.05 07:50
Оценка:
Это один из агрументов в теме "Влияние языка на качество программирования"
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: ищу GOSUB
От: Аноним  
Дата: 01.07.05 08:54
Оценка:
наверное есть языки в которых без goto вааще никак, но при попытке такие вспомнить, приходит на ум только бейсик для спектрума(крутейшая штуковина была, надо сказать
10: LOAD ""
20: PRINTF ("Hello, world!")
30: .............................
40: GOTO 20
дамс, синтаксис забыл напрочь, надо освежить
).
А если есть возможность его не юзать, то имхо лучше его не юзать.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: ищу GOSUB
От: BCoder Россия http://bcoder.narod.ru
Дата: 01.07.05 10:09
Оценка: 3 (1) :))) :))) :))) :))) :)
Здравствуйте, dshe, Вы писали:

D>Вместо GOSUB уже давно используется вызов методов. (С передачей параметрами и прочими прелестями)


В моей программе очень много комманд goto, и если для каждой писать свой метод, то программа станет большой и сложной. Вот я нашёл комманду return, но она работает не правильно, программа просто останавливается.
Re[3]: ищу GOSUB
От: AlexGK Россия  
Дата: 01.07.05 10:13
Оценка: 2 (1) +1
Здравствуйте, BCoder, Вы писали:

BC>Здравствуйте, dshe, Вы писали:


D>>Вместо GOSUB уже давно используется вызов методов. (С передачей параметрами и прочими прелестями)


BC>В моей программе очень много комманд goto, и если для каждой писать свой метод, то программа станет большой и сложной. Вот я нашёл комманду return, но она работает не правильно, программа просто останавливается.


Я же говорю: сравни мой код и свой, есть еще более компактный вариант( там пару условий можно убрать). Какя тебе собственно разница много goto или много чего-то типа void _func(...).
Спорит не буду, кто рожден "летать" с goto, тот не будет "пользать" в ООП
Re[2]: ищу GOSUB
От: BCoder Россия http://bcoder.narod.ru
Дата: 01.07.05 10:14
Оценка: :))
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, BCoder, Вы писали:


A>Вот сижу и думаю — зачем этому человеку C#?


Да, вот мой друг программист на Turbo Pascale сказал что можно использовать комманду case вместо goto, но в c# у меня это не получилось.
Re: ищу GOSUB
От: Аноним  
Дата: 01.07.05 10:21
Оценка: +1
черезмерное употребление Бейсика разрушает мозг (с) Дийкстра
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.