Wątek przeniesiony 2016-10-13 23:01 z C# i .NET przez DibbyDum.

Decimal i liczby

0

Cześć,

Mam za zadanie napisać program, który liczy przeciwprostokątną, do tego mam użyć i potem porównać wielkości przy trzech typach zmiennych (int, double i decimal), kod przy int i double działa bardzo dobrze, jednak przy decimal występują problemy których nie potrafię naprawić. Wiem że przy liczbach podanych w kodzie przy decimal trzeba podać literkę "M" aby program zadziałał, jednak tutaj nie wiem w jaki sposób jej użyć.

Bardzo proszę o pomoc,
Pozdrawiam
Jumpeq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zad1
{
    class Program
    {
        
        static void Main(string[] args)
        {
            int a;
            int b;
            int c;
            int d;
            Console.WriteLine("Podaj długość pierwszej przyprostokątnej: ");
            a = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Podaj długość drugiej przyprostokątnej: ");
            b = Convert.ToInt32(Console.ReadLine());

            c = a * a + b * b;
            d = Convert.ToInt32(Math.Sqrt(c));
            Console.WriteLine("Długość przeciwprostokątnej dla klasy typu int: {0:G17}", d);

            Console.ReadKey();

            double e;
            double f;
            double g;
            double h;
            Console.WriteLine("Podaj długość pierwszej przyprostokątnej: ");
            e = Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Podaj długość drugiej przyprostokątnej: ");
            f = Convert.ToDouble(Console.ReadLine());

            g = e*e + f*f;
            h = Convert.ToDouble(Math.Sqrt(g));
            Console.WriteLine("Długość przeciwprostokątnej dla klasy typu double: {0:G17}", h);
            
            Console.ReadKey();


            decimal i;
            decimal j;
            decimal k;
            decimal l;
            Console.WriteLine("Podaj długość pierwszej przyprostokątnej: ");
            i = Convert.ToDecimal(Console.ReadLine());

            Console.WriteLine("Podaj długość drugiej przyprostokątnej: ");
            j = Convert.ToDecimal(Console.ReadLine());

            k = i * i + j * j;
            l = Convert.ToDecimal(Math.Sqrt(k));
            Console.WriteLine("Długość przeciwprostokątnej dla klasy typu decimal: {0:G17}", l);
            Console.ReadKey();
        }
    }
}
 
1

Masz błąd który jasno mówi że nie można zrobić konwersji z 'decimal' na 'double'. Math.Sqrt ma tylko jeden parametr o typie 'double', o ile liczbę całkowitą (int) można łatwo rzutować na zmiennoprzecinkową (double) o tyle nie można niejawnie rzutować 'double' na 'decimal' mimo że jedno i drugie reprezentuje liczby zmiennoprzecinkowe ale to robią to w całkowicie inny sposób:
floating decimal point type
floating binary point types

Czyli nic ci nie zostało jak samemu policzyć ten pierwiastek, zamiast używać gotowej funkcji. ;)

1
l = (decimal)Math.Sqrt((double)k);

:D

1

Nie nazywaj zmiennych l, bo wygląda jak 1.

Nie musisz deklarować zmiennych przed ich użyciem, równie dobrze możesz napisać:

 Console.WriteLine("Podaj długość pierwszej przyprostokątnej: ");
int a = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Podaj długość drugiej przyprostokątnej: ");
int b = Convert.ToInt32(Console.ReadLine());

int c = a * a + b * b;
int d = Convert.ToInt32(Math.Sqrt(c));

"Długość przeciwprostokątnej dla klasy typu int" - nie ma czegoś takiego jak "typ klasy", klasa sama w sobie jest typem. I nie ma czegoś takiego jak klasa int, bo int to struktura.

0
.Al napisał(a):
l = (decimal)Math.Sqrt((double)k);

:D

Okazało się że sposób wykonania funkcji ma być troszkę inny niż napisałem, jednak udało się i działa. Czy zawsze w taki sposób musi wyglądać konwersja do decimal? Jest może jakiś prostszy sposób, albo trik z wyłączeniem przed nawias itp. itd.? Czy już to tak musi wyglądać w kodzie który zamieszczam poniżej?

Prezentuje tutaj całe zadanie:

 using System;

class Program
{
    static int ObliczDługośćPrzeciwprostokątnej(int a, int b)
    {
        return Convert.ToInt32(Math.Sqrt(a * a + b * b));
    }
    static double ObliczDługośćPrzeciwprostokątnej(double a, double b)
    {
        return Convert.ToDouble(Math.Sqrt(a * a + b * b));
    }
    static decimal ObliczDługośćPrzeciwprostokątnej(decimal a, decimal b)
    {
        return (decimal)Math.Sqrt((double)a * (double)a + (double)b * (double)b);
    }
    static void Main(string[] args)
    {
        string a, b;

        Console.WriteLine("Podaj długośc pierwszej przyprostokątnej: ");
        a = Console.ReadLine();

        Console.WriteLine("Podaj długośc drugiej przyprostokątnej: ");
        b = Console.ReadLine();

        Console.WriteLine("Wynik to: {0:G17}", ObliczDługośćPrzeciwprostokątnej(Convert.ToInt32(a), Convert.ToInt32(b)));

        Console.ReadLine();
        

        Console.WriteLine("Podaj długośc pierwszej przyprostokątnej: ");
        a = Console.ReadLine();

        Console.WriteLine("Podaj długośc drugiej przyprostokątnej: ");
        b = Console.ReadLine();

        Console.WriteLine("Wynik to: {0:G17}", ObliczDługośćPrzeciwprostokątnej(Convert.ToDouble(a), Convert.ToDouble(b)));

        Console.ReadLine();


        Console.WriteLine("Podaj długośc pierwszej przyprostokątnej: ");
        a = Console.ReadLine();

        Console.WriteLine("Podaj długośc drugiej przyprostokątnej: ");
        b = Console.ReadLine();

        Console.WriteLine("Wynik to: {0:G17}", ObliczDługośćPrzeciwprostokątnej(Convert.ToDecimal(a), Convert.ToDecimal(b)));

        Console.ReadLine();
    }
} 

a szczególnie linijka:

  static decimal ObliczDługośćPrzeciwprostokątnej(decimal a, decimal b)
    {
        return (decimal)Math.Sqrt((double)a * (double)a + (double)b * (double)b);
    } 

1 użytkowników online, w tym zalogowanych: 0, gości: 1