Obliczanie NWD i NWW algorytmem Euklidesa w C# i Javie

0

Tak, o tych książkach do Javy 1.6 już wiem ale skoro nieprędko wyjdzie u nas coś do Javy 1.7 to na razie w języku polskim to są chyba najlepsze pozycje. Na Amazon zerknę niebawem, bo nigdy tam nic nie kupowałem.

Na razie jednak przepisałem na nowo mój program do obliczania NWD i NWW. Zamieszczam jego kod jedynie w C# bo w Javie wygląda dość podobnie a szkoda miejsca na to samo:

 
using System;

namespace Euklides
{
		
	class Euklides 
	{
		
		public static int nwd(int a, int b)
		{
			int x;
			
			while (b!=0) 
			{
				x = a % b;
				a = b;
				b = x;
			}
			
			return x;			
		}
			
		public static void Main()
		{	
			
			int a=0, b=0;
			
			Console.Write("a = ");
			try
			{
				a = int.Parse(Console.ReadLine());
			} catch (SystemException ex)
			{
				Console.WriteLine(ex.Message);
				Console.ReadKey(true);
				return;
			}
			
			Console.Write("b = ");
		
			try
			{
				b = int.Parse(Console.ReadLine());
			} catch (SystemException ex)
			{
				Console.WriteLine(ex.Message);
				Console.ReadKey(true);
				return;
			}
			
			int nd = nwd(a,b);
			int nw = Math.Abs(a/nd*b);
			
			Console.WriteLine("NWD = " + nd);
			Console.WriteLine("NWW = " + nw);
			
			Console.Write("Press any key to continue . . . ");
			Console.ReadKey(true);
		}
	}
}
0

Jeszcze trochę ten program usprawniłem pod kątem obsługi wyjątków. Wystarczy kod samej funkcja Main(), bo tylko tam są zmiany:

 
		public static void Main() 
		{	
			
			int a, b, nd, nw;

			try
			{
				Console.Write("a = ");
				a = int.Parse(Console.ReadLine());
				Console.Write("b = ");
				b = int.Parse(Console.ReadLine());
				
			} catch (SystemException ex)
			{
				Console.WriteLine(ex.Message);
				Console.ReadKey(true);
				return;
			}
			
			nd = nwd(a,b);
			
			try
			{
				nw = Math.Abs(a/nd*b);

			}catch (DivideByZeroException ez)
			{
				Console.WriteLine(ez.Message);
				Console.ReadKey(true);
				return;
			}
			
			Console.WriteLine("NWD = " + nd);
			Console.WriteLine("NWW = " + nw);
			Console.ReadKey(true);
		}

PS. Mam jeszcze takie pytanko, bo ostatnio było zamieszanie, że MS w Windows 8 stawia na HTML5 i JavaScript w celu wsparcia rynku urządzeń mobilnych a ogranicza technologie Silverlight i .NET. Czy może to oznaczać uwiąd platformy .NET i języka C# w tej dekadzie?

0
  1. Dlaczego w pierwszym catchu przechwytujesz SystemException?
  2. Dlaczego dopuszczasz sytuację dzielenia przez zero, zamiast wcześniej sprawdzić, czy dzielnik jest zerem?
  3. .NET jest używany przede wszystkim do tworzenia aplikacji i usług WWW, niewiele powstaje w nim aplikacji dekstopowych. Zatem nawet jeśli pojawi się możliwość tworzenia ich w HTML i JS, nie będzie miało to wielkiego wpływu na platformę jako całość. Zarówno ona, jak i języki na nią są ciągle rozwijane i powstają nowe ich wersje.
0
Cortes napisał(a)

Czytając Waszą dyskusję o zrobieniu z języka C języka obiektowego to może już istnieje coś takiego o nazwie Objective-C?

Wibowit napisał(a)

Objective-C jest hybrydą C i Smalltalka, tzn konkretnie to do C zostały dołączone elementy filozofii Smalltalka. Każdy prawidłowy kod C jest też prawidłowym kodem Objective-C (oczywiście implikacja w drugą stronę jest nieprawdziwa).

i podobnie C++ jest hybrydą C i Smalltalka. (ktoś widział w ogóle tego Smalltalka? bo ja nie…) i C++ jest w 99% zgodny z C. jest jeszcze niszowy język D, choć nie wiem jak z jego zgodnością z C.

do tego niezliczona ilość języków z Javą i C# na czele o składni wzorującej się na C.

tak więc „zrobienie z C języka obiektowego” przerabialiśmy już wiele razy na różne sposoby, nic nowego.

somekind napisał(a)

C#/.NET i teraz można z powodzeniem uczyć się z książek do wersji 2.0
wersję 2.0 nazwałbym „podstawową” wersją C#, poniżej której nie ma po co schodzić, a od której warto zacząć. uzasadnienie: 1) generyki zmieniają wszystko. 2) wersja 2.0 ma takie same wymagania co 1.0, czyli windows 98. 3) Visual 2008 i 2010 pozwalają kompilować do wersji najniżej 2.0. 4) instalka 2.0 jest mała w porównaniu z kobyłą 3.5.

0
somekind napisał(a)
  1. Dlaczego w pierwszym catchu przechwytujesz SystemException?

Aby wyeliminować możliwość wczytania do zmiennych a i b danych innych typów niż int.

somekind napisał(a)
  1. Dlaczego dopuszczasz sytuację dzielenia przez zero, zamiast wcześniej sprawdzić, czy dzielnik jest zerem?

Próbowałem wprowadzić tam warunek z DivideByZeroException w drugim catch ale nie wiem jak to zrobić, bo kompilator zgłasza, ze wszystkie wyjątki załatwia już pierwszy catch. Mogę to zrobić bez wyjątków po prostu instrukcją:

if(a==0 && b==0) 
{
       Console.WriteLine("Co najmniej jeden argument musi być niezerowy.");
       Console.ReadKey(True);
       return;
}

ale nie ma tutaj żadnych obiektów klas System.Exception.

somekind napisał(a)
  1. .NET jest używany przede wszystkim do tworzenia aplikacji i usług WWW, niewiele powstaje w nim aplikacji dekstopowych. Zatem nawet jeśli pojawi się możliwość tworzenia ich w HTML i JS, nie będzie miało to wielkiego wpływu na platformę jako całość. Zarówno ona, jak i języki na nią są ciągle rozwijane i powstają nowe ich wersje.

OK, to dobrze bo musiałbym wtedy wybrać Javę.

0
Cortes napisał(a)

Aby wyeliminować możliwość wczytania do zmiennych a i b danych innych typów niż int.

W sumie ja za mało precyzyjne pytanie zadałem, więc się poprawię - czemu używasz SystemException, a nie po prostu Exception?

ale nie ma tutaj żadnych obiektów klas System.Exception.

No i co z tego? Skoro masz zamiar dzielisz przez jakąś liczbę, to wystarczy sprawdzić, czy nie jest ona równa 0, i wtedy zamiast dzielenia wyświetlić użytkownikowi komunikat.
Wyjątki stosuje się tam, gdzie nie możesz czegoś przewidzieć, a tę sytuację możesz, więc stosowanie wyjątków jest bezzasadne.

OK, to dobrze bo musiałbym wtedy wybrać Javę.

Musiał?
Myślę, że z uwagi na to, że biznes opiera się na tych dwóch technologiach, to obie będą utrzymywane i rozwijane jeszcze przez długi czas, więc każda z nich jest przyszłościowym wyborem.

0

Jak sprawdzałem tak z rok temu benchmarki, to wyjątki na CLR działają rzędy wielkości wolniej niż na JVM, a z kolei nawet na JVM wyjątki działają rzędy wielkości wolniej niż po prostu włożenie ifa. Oczywiście mówię tu o używaniu wyjątków do obsługiwania sytuacji niewyjątkowych, często występujących, np częściej niż 1000 razy na sekundę, bo jeśli rzeczywiście rzadko są rzucane to i mały mają wpływ na czas wykonania.

0

Więc jaki jest "złoty środek" w stosowaniu wyjątków?

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