Monthly Archives: Marzec 2017

Matematyka w życiu, czyli jaka średnica pizzy jest najkorzystniejsza?

Matematyka przydaje się dosłownie wszędzie, a ludzie, którzy z niej nie korzystają dużo tracą. Najprostszym przykładem jest zakup pizzy w przypadku gdy mamy kilka dobrych pizzerii i nie wiemy z której zamówić. W każdej z pizzerii jest inna wielkość pizzy i inna cena.

W takim wypadku nie wiemy, która oferta jest najkorzystniejsza, ponieważ pole powierzchni nie rośnie liniowo wraz ze wzrostem średnicy, więc musimy liczyć bo inaczej może się okazać że przepłacimy (takie studenckie podejście :D). Parę lat temu wpadłem na napisanie programu wyliczającego współczynnik ceny za cm2 pizzy, a teraz ten program odnalazłem, poprawiłem i trochę ulepszyłem 🙂

W niektórych miejscach dodałem LINQ, ponieważ działa szybciej i wygląda lepiej niż samodzielnie napisany kod, no i dodałem TryParse których kilka lat temu nie znałem. Kod jest napisany możliwie uniwersalnie, dlatego można dodać jeszcze inne parametry do obliczeń. A choć wiem, że można wydzielić jego fragmenty do funkcji, nie zrobiłem tego z uwagi na to, że ten kod jest napisany w celach rozrywkowych, a jeżeli ktoś ma ochotę to zachęcam do przeróbek.

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

namespace PolePizzy
{
    class Program
    {
        static void Main(string[] args)
        {
            var iloscPizz = 0;
            var typOdcinka = new TypOdcinka();
            var dlugoscOdcinka = new List<double>();
            var cenyPizz = new List<double>();

            // Wczytywanie ilości pizz
            var success = false;
            while (!success)
            {
                Console.WriteLine("Wpisz ile placków zamierzasz porównywać: ");
                // sprawdzanie czy da się parsować poprawnie dane z konsoli, jeżeli tak to przypisuje do zmiennej iloscPizz
                success = int.TryParse(Console.ReadLine(), out iloscPizz);
                // Sprawdzanie czy iloscPizz jest większe od 0
                success = iloscPizz > 0;
                Console.Clear();
            }

            // Wczytywanie typu odcinka
            // Zamiana enumu na tablicę elementów
            var tablicaTypow = Enum.GetNames(typeof(TypOdcinka));
            // Dodanie elementów do stringa i przedzielenie ich przecinkiem
            var typyJakoString = String.Join(", ", tablicaTypow);
            success = false;
            while (!success)
            {
                Console.WriteLine("Podaj typ odcinka (" + typyJakoString + "): ");
                // Sprawdzanie czy da się parsować poprawnie dane z konsoli, jeżeli tak to przypisuje do zmiennej typOdcinka
                success = Enum.TryParse(Console.ReadLine(), true, out typOdcinka);
                Console.Clear();
            }

            // Wczytywanie wielkości pizz i cen
            for (int i = 0; i < iloscPizz; i++)             {                 success = false;                 while (!success)                 {                     double tmp = 0;                     Console.WriteLine(typOdcinka.ToString() + " " + (i + 1) + " pizzy (w cm): ");                     // Sprawdzenie czy da się parsować poprawnie dane z konsoli, jeżeli tak to przypisuje do zmiennej tmp                     success = double.TryParse(Console.ReadLine(), out tmp);                     // Sprawdzanie czy zmienna tmp jest większa od 0                     success = tmp > 0;
                    // Jeżeli wartość jest poprawna to dodawana jest na listę długości odcinków
                    if (success)
                    {
                        dlugoscOdcinka.Add(tmp);

                        success = false;
                        while (!success)
                        {
                            tmp = 0;
                            Console.WriteLine("Podaj cenę " + (i + 1) + " pizzy (w zł): ");
                            // Sprawdzenie czy da się parsować poprawnie dane z konsoli, jeżeli tak to przypisuje do zmiennej tmp
                            success = double.TryParse(Console.ReadLine(), out tmp);
                            // Sprawdzanie czy zmienna tmp jest większa od 0
                            success = tmp > 0;
                            // Jeżeli wartość jest poprawna to dodawana jest na listę długości odcinków
                            if (success)
                            {
                                cenyPizz.Add(tmp);
                            }
                        }

                    }
                    Console.Clear();
                }
            }

            // Obliczanie pól powierzchni
            double wynik = 0;
            var listaPolPowierzchni = new List<double>();
            for (int i = 0; i < iloscPizz; i++)
            {
                double promien = 0;
                if (typOdcinka == TypOdcinka.Promień)
                {
                    promien = dlugoscOdcinka.ElementAt(i);
                } 
                else if (typOdcinka == TypOdcinka.Średnica)
                {
                    promien = dlugoscOdcinka.ElementAt(i) / 2;
                }

                // Liczenie pola powierzchni
                double polePowierzchni = Math.PI*Math.Pow(promien, 2);
                // Pole powierzchni zostaje dodane do listy pól powierzchnii
                listaPolPowierzchni.Add(polePowierzchni);
            }

            // Obliczam cenę za cm² pizzy
            List<double> wspolczynniki = new List<double>();
            for (int i = 0; i < iloscPizz; i++)
            {
                wspolczynniki.Add(cenyPizz.ElementAt(i) / listaPolPowierzchni.ElementAt(i));
            }

            for (int i = 0; i < iloscPizz; i++)             {                 Console.WriteLine("Pizza " + (i + 1) + " posiada pole powierzchni: " + listaPolPowierzchni.ElementAt(i) + " cm²");                 Console.WriteLine("Kosztuje: " + cenyPizz.ElementAt(i) + " zł");                 Console.WriteLine("czyli " + wspolczynniki.ElementAt(i) + " zł za cm²");                 Console.WriteLine();             }             // Sprawdzanie która pizza jest korzystniejsza             // Najpierw sprawdzam, czy czasem ktoś nie dodał kilku takich samych pizz z taką samą ceną             if (listaPolPowierzchni.Any(o => o != listaPolPowierzchni[0]) && cenyPizz.Any(o => o != cenyPizz[0]))
            {
                // Ustalam jaki jest index minimalnej ceny za cm²
                var indexAtMax = wspolczynniki.ToList().IndexOf(wspolczynniki.Min());
                // ponieważ index jest zawsze od 0 to muszę dodać 1 do tej wartości żeby uzyskać numer najkorzystniejszej pizzy
                Console.WriteLine((indexAtMax + 1) + " pizza jest najkorzystniejsza!");
            }
            else
            {
                Console.WriteLine("Obie pizze mają identyczne pole powierzchni");
            }

            // Dodane żeby program nie zakończył się automatycznie, tylko oczekiwał naciśnięcia jakiegokolwiek przycisku
            Console.ReadKey();
        }

        // Enum typów odcinka
        public enum TypOdcinka
        {
            Średnica,
            Promień
        }
    }
}

Screen z działania programu: