2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Решение квадратных уравнений на C#
Сообщение09.09.2014, 16:29 
Аватара пользователя


13/04/14
133
Тюмень
Здравствуйте. Начал изучать 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 


27/08/14
206
Правильно преобразовывать string в double так:
Код:
double d = double.Parse(s);

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

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

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 17:12 
Аватара пользователя


13/04/14
133
Тюмень
Progger в сообщении #905920 писал(а):
Вообще при программировании на C# очень редко возникает необходимость прямого приведения типов. Старайтесь его избегать - скорее всего есть более лучшее решение.

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

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 17:24 


27/08/14
206
Dr.RichardFeynman в сообщении #905923 писал(а):
Progger в сообщении #905920 писал(а):
Вообще при программировании на C# очень редко возникает необходимость прямого приведения типов. Старайтесь его избегать - скорее всего есть более лучшее решение.

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

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

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 17:58 
Аватара пользователя


13/04/14
133
Тюмень
Спасибо большое, 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 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Dr.RichardFeynman в сообщении #905943 писал(а):
К сожалению, не смогу реализовать решение уравнений с b=0, c=0

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

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 18:52 
Аватара пользователя


13/04/14
133
Тюмень
Munin в сообщении #905948 писал(а):
Dr.RichardFeynman в сообщении #905943 писал(а):
К сожалению, не смогу реализовать решение уравнений с b=0, c=0

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

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

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение09.09.2014, 19:37 
Заслуженный участник


27/04/09
28128
Не понимаю, что случается, если 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 
Заслуженный участник


02/08/11
6892
arseniiv в сообщении #905982 писал(а):
Ещё совет: объявляйте d там
Почему только d? Все переменные лучше объявлять непосредственно при первом использовании:
Код:
string a_string = Console.ReadLine();

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 00:45 
Заслуженный участник


27/04/09
28128

(Оффтоп)

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

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 03:52 
Аватара пользователя


20/10/12
308
Вот вам задача на решение квадратного уравнения.
 !  Toucan:
Ссылка удалена. См. post906377.html#p906377


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

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 10:57 
Аватара пользователя


13/04/14
133
Тюмень
Сначала у меня был не Console.ReadLine, а Console.Read, но он принимал только первое значение. Заменив на Console.ReadLine, мне пришлось использовать не double, а string.
И, да, я заметил, что код повторяется, и знал, что так не делается. Но пока мне было важно сделать хоть как-нибудь работающую программу, используя только основные команды и операторы.
Всем спасибо за ответы

 Профиль  
                  
 
 Re: Решение квадратных уравнений на C#
Сообщение10.09.2014, 11:33 
Заслуженный участник


02/08/11
6892
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 
Аватара пользователя


13/04/14
133
Тюмень
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 
Заслуженный участник


02/08/11
6892
Dr.RichardFeynman в сообщении #906170 писал(а):
Я так понял, что Progger советовал избежать этого.
Нет, он советовал избегать приведения типов - это когда тип пишется в круглых скобочках - (double) например. Злоупотребление этим - действительно плохая практика, потому что ведёт к появлению трудноустанимых ошибок в работе программы.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group