2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3  След.
 
 Решение квадратных уравнений на C#
Сообщение09.09.2014, 16:29 
Аватара пользователя
Здравствуйте. Начал изучать C#. Для первого задания взял написать программу, которая бы решала приведенное квадратное уравнение. Я знаю, что у меня в ошибка в присваивании значений для a,b и c, т.к. я не могу их ввести, когда запускаю программу. Как должно это выглядеть правильно? Спасибо
Код:
using System;

public class Equation
{
    static void Main()
    {
        double a,b,c,d,xone,xtwo;
        Console.WriteLine("Введите значение a:");
        a = (double)(Console.Read());
        Console.WriteLine("Введите значение b:");
        b = (double)(Console.Read());
        Console.WriteLine("Введите значение c:");
        c = (double)(Console.Read());
        d = b * b - 4 * a * c;
        xone = -b + Math.Sqrt(d) / (2*a);
        xtwo = -b - Math.Sqrt(d) / (2*a);
        if (d >= 0) Console.Write("Корни квадратного уравнения:" + xone + xtwo);
        else Console.Write("Квадратное уравнение не имеет решений");                         
    }
}

P.S. Наверное, стоит добавить решения для b и c, равных 0.

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 17:05 
Правильно преобразовывать string в double так:
Код:
double d = double.Parse(s);

Если строка не может быть разобрана, то будет брошено исключение. Его можно обработать, но лучше использовать TryParse:
Код:
double d;
if (!double.TryParse(s, out d)) {
  // Информируем пользователя, что он ввёл что-то не то
}

Вообще при программировании на C# очень редко возникает необходимость прямого приведения типов. Старайтесь его избегать - скорее всего есть более лучшее решение.

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 17:12 
Аватара пользователя
Progger в сообщении #905920 писал(а):
Вообще при программировании на C# очень редко возникает необходимость прямого приведения типов. Старайтесь его избегать - скорее всего есть более лучшее решение.

Что значит приведение типов? Из string в double, например?

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 17:24 
Dr.RichardFeynman в сообщении #905923 писал(а):
Progger в сообщении #905920 писал(а):
Вообще при программировании на C# очень редко возникает необходимость прямого приведения типов. Старайтесь его избегать - скорее всего есть более лучшее решение.

Что значит приведение типов? Из string в double, например?

Да. Всё, что выглядит так:
Код:
Type1 var1;
...
Type2 var2 = (Type2)var1;

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 17:58 
Аватара пользователя
Спасибо большое, Progger! Итого, у меня получилась такая программа. К сожалению, не смогу реализовать решение уравнений с b=0, c=0
Код:
using System;

public class Equation
{
    static void Main()
    {
        double d, xone, xtwo;
        String a_string, b_string, c_string;
        Console.WriteLine("Введите значение a:");
        a_string = (Console.ReadLine());
        double a = double.Parse(a_string);
        Console.WriteLine("Введите значение b:");
        b_string = (Console.ReadLine());
        double b = double.Parse(b_string);
        Console.WriteLine("Введите значение c:");
        c_string = (Console.ReadLine());
        double c = double.Parse(c_string);
        d = b * b - 4 * a * c;
        xone = (-b + Math.Sqrt(d)) / (2 * a);
        xtwo = (-b - Math.Sqrt(d)) / (2 * a);
        if (d >= 0) Console.Write("Корни квадратного уравнения: " + xone, +xtwo);
        else Console.Write("Квадратное уравнение не имеет решений");
    }
}

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 18:14 
Аватара пользователя
Dr.RichardFeynman в сообщении #905943 писал(а):
К сожалению, не смогу реализовать решение уравнений с b=0, c=0

Учитесь. if-ы с блоками и вложенные if-ы.

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 18:52 
Аватара пользователя
Munin в сообщении #905948 писал(а):
Dr.RichardFeynman в сообщении #905943 писал(а):
К сожалению, не смогу реализовать решение уравнений с b=0, c=0

Учитесь. if-ы с блоками и вложенные if-ы.

Это моя цель на завтра))

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 19:37 
Не понимаю, что случается, если b и c равны нулю — d будет тоже ноль, а корень из нуля нормально себе вычисляется. Отдельной обработки для этого не нужно! Разве что проверка d >= 0 у вас запоздала — надо бы это делать до попытки вычисления корня из d. :wink:

Ещё совет: объявляйте d там, где присваиваете ему значение в первый раз — здесь это всегда происходит в одном и том же месте всего один раз, так что альтернатива — объявлять где-то наверху — не востребована. Так при чтении сразу видно тип, и не надо держать в голове d, пока чтение не дошло до неё.

Ну и раз вы выбрали метод Parse, кидающий исключение при некорректном параметре, вы тогда и обрабатывайте исключение, иначе программа свалится с непонятным для пользователя сообщением. Лучше, как Progger посоветовал, всё же взять TryParse.

Напоследок, C# — не какой-то редкий язык :-) и форумная подсветка синтаксиса его знает, так что код на C# вкладывайте лучше в [​syntax lang="csharp"][​/syntax] (можно просто выбрать этот язык из списка «Подсветка синтаксиса» над полем ответа, и всё само вставится). Получится удобочитаемее!

-- Вт сен 09, 2014 22:49:49 --

Дальше.
Можно заметить, что одинаковые куски кода повторяются. Три раза — уже явный повод для рефакторинга, так что стоит, когда вы изучите массивы, вместо отдельных коэффициентов завести массив и вводить их значения в цикле). Если раньше вы изучите методы, можно до этого добавить статический метод, возвращающий double, разобрав строку, введённую от пользователя. Кроме того, можно будет заставлять его делать это до тех пор, пока не введёт число. Тут тоже цикл, только другой.

Косметическая деталь: если операторы внутри вашего if писать на отдельной строке, это сделает удобным добавление новых операторов, если это в будущем пригодится (раз скобка, два скобка, и никаких лишних движений. А некоторые даже однооператорные тела сразу в скобки берут, но последнее уже больше дело вкуса, чем первое).

Косметическая деталь №2: я бы поставил пробелы после двоеточия внутри строк — "Введите значение a: ", например. (Понятно, для чего? Текст в консоли будет выглядеть не так:
> Введите значение a:23
> Введите значение b:-7.8
> Введите значение c:␣
,
а так:
> Введите значение a: 23
> Введите значение b: -7.8
> Введите значение c: ␣
)

Кстати, про объявление d я написал, а про строки забыл. С ними аналогично. (Да и рефакторингу повторных кусков в цикл это поможет — опять же меньше переделывать.)

Вы неплохо выбрали задачу: улучшать её можно достаточно долго, пока вы будете изучать всё новые вещи! :-)

-- Вт сен 09, 2014 22:54:01 --

Посыпьте мне голову: там же WriteLine! Совет с пробелами бессмыслен. :oops:

-- Вт сен 09, 2014 23:09:49 --

(Хотя, по мне, при вводе однострочных вещей лучше вводить на той же строке, что и prompt.)

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 22:23 
arseniiv в сообщении #905982 писал(а):
Ещё совет: объявляйте d там
Почему только d? Все переменные лучше объявлять непосредственно при первом использовании:
Код:
string a_string = Console.ReadLine();

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 00:45 

(Оффтоп)

Да, я строки в первый раз не заметил (потом исправился и дописал :lol: ).

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 03:52 
Аватара пользователя
Вот вам задача на решение квадратного уравнения.
 !  Toucan:
Ссылка удалена. См. post906377.html#p906377


Заходите, регистрируйтесь и сдавайте задачи.
Даже C# у нас работает.

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 10:57 
Аватара пользователя
Сначала у меня был не Console.ReadLine, а Console.Read, но он принимал только первое значение. Заменив на Console.ReadLine, мне пришлось использовать не double, а string.
И, да, я заметил, что код повторяется, и знал, что так не делается. Но пока мне было важно сделать хоть как-нибудь работающую программу, используя только основные команды и операторы.
Всем спасибо за ответы

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 11:33 
Dr.RichardFeynman в сообщении #906140 писал(а):
Сначала у меня был не Console.ReadLine, а Console.Read, но он принимал только первое значение. Заменив на Console.ReadLine, мне пришлось использовать не double, а string.
Дело в том, что строка типа double a = (double)Console.Read(); делает совсем не то, что вы (по-видимому) от неё ждали. Эта строка эквивалентна следующим двум:
Код:
int a_int = Console.Read();
double a = (double)a_int;

Функция Console.Read() делает примерно следующее: она ждёт нажатия клавиши и возвращает её код. Этот код - целое число. Например, если вы нажмёте "0", то в a_int окажется число 91 - ASCII-код символа "0". В однострочном варианте всё то же самое, просто вместо a_int используется созданная компилятором временная переменная. Затем оператор "(double)" говорит компьютеру, что нужно превратить это целое в вещественное - и компьютер старательно помещает в переменную "a" вещественное число, равное коду нажатой клавиши. В примере с нажатием клавиши "0" это будет 91.0.

Дело в том, что из консоли на самом деле нельзя прочитать ничего, кроме текста. В частности, нельзя прочитать целое или вещественное число, но можно прочитать текстовое представление этого числа - последовательность некоторых символов (обычно, но не обязательно, арабских цифр), которую затем по определённым правилам можно превратить в число. Для чтения строки служит Console.ReadLine(), для превращения (парсинга) - double.Parse()/double.TryParse(). (И int.Parse()/int.TryParse() для превращения в целое.)

В некоторых языках есть функции, которые делают сразу две операции - ввод текста и его парсинг, но в C# такого нет - потому что даже там, где такое есть, обычно пользуются двумя раздельными функциями, чтобы иметь возможность обработать некорректный ввод (ожидалась строка из арабских цифр, а пользователь ввёл буквами "пять").

Но для обратной операции - вывода числа - в C# есть готовая функция (одна из многих, носящих имя Console.Write(), а также одна из Console.WriteLine() - эта ещё и переводит курсор на следующую строку), делающая сразу две вещи - преобразование числа в текст и вывод этого текста. Потому что число в текст всегда можно превратить, каким бы оно не было.

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 12:12 
Аватара пользователя
arseniiv в сообщении #905982 писал(а):
Не понимаю, что случается, если b и c равны нулю — d будет тоже ноль, а корень из нуля нормально себе вычисляется. Отдельной обработки для этого не нужно! Разве что проверка d >= 0 у вас запоздала — надо бы это делать до попытки вычисления корня из d. :wink:

Я имел ввиду не только случай, когда b и c равны 0, но и когда или b или c равны 0. В первом и третьем случае все нормально, но во втором получается d<0.

warlock66613 в сообщении #906149 писал(а):
Dr.RichardFeynman в сообщении #906140 писал(а):
Сначала у меня был не Console.ReadLine, а Console.Read, но он принимал только первое значение. Заменив на Console.ReadLine, мне пришлось использовать не double, а string.
Дело в том, что строка типа double a = (double)Console.Read(); делает совсем не то, что вы (по-видимому) от неё ждали. Эта строка эквивалентна следующим двум:
Код:
int a_int = Console.Read();
double a = (double)a_int;

Функция Console.Read() делает примерно следующее: она ждёт нажатия клавиши и возвращает её код. Этот код - целое число. Например, если вы нажмёте "0", то в a_int окажется число 91 - ASCII-код символа "0". В однострочном варианте всё то же самое, просто вместо a_int используется созданная компилятором временная переменная. Затем оператор "(double)" говорит компьютеру, что нужно превратить это целое в вещественное - и компьютер старательно помещает в переменную "a" вещественное число, равное коду нажатой клавиши. В примере с нажатием клавиши "0" это будет 91.0.

Дело в том, что из консоли на самом деле нельзя прочитать ничего, кроме текста. В частности, нельзя прочитать целое или вещественное число, но можно прочитать текстовое представление этого числа - последовательность некоторых символов (обычно, но не обязательно, арабских цифр), которую затем по определённым правилам можно превратить в число. Для чтения строки служит Console.ReadLine(), для превращения (парсинга) - double.Parse()/double.TryParse(). (И int.Parse()/int.TryParse() для превращения в целое.)

Как тогда можно получить значения для a,b и c, без парсинга? Я так понял, что Progger советовал избежать этого.

 
 
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 12:20 
Dr.RichardFeynman в сообщении #906170 писал(а):
Я так понял, что Progger советовал избежать этого.
Нет, он советовал избегать приведения типов - это когда тип пишется в круглых скобочках - (double) например. Злоупотребление этим - действительно плохая практика, потому что ведёт к появлению трудноустанимых ошибок в работе программы.

 
 
 [ Сообщений: 32 ]  На страницу 1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group