Povrch a objem koule
2. PovrchObjemKouleWPF
2.5. Výsledný kód
XAML kód
Výsledný XAML kód formuláře (MainWindow.xaml) - viz Kód 1.
<Window x:Class="PovrchObjemKouleWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:PovrchObjemKouleWPF" mc:Ignorable="d" Title="Povrch a objem koule" Height="250" Width="700" MinWidth="500" MinHeight="200"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <GroupBox Header="Specifikace" Grid.Row="0" Margin="10,20"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="3*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="4*"/> </Grid.ColumnDefinitions> <Label Content="Poloměr koule:" Grid.Row="0" Grid.Column="0" Margin="5" /> <TextBox Name="TxtPolomer" Grid.Row="0" Grid.Column="1" VerticalContentAlignment="Center" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" GotFocus="TxtPolomer_GotFocus" LostFocus="TxtPolomer_LostFocus"/> <Label Content="Povrch koule:" Grid.Row="0" Grid.Column="4" Margin="5" /> <TextBox Name="TxtPovrch" Grid.Row="0" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/> <Label Content="Objem koule:" Grid.Row="1" Grid.Column="4" Margin="5" /> <TextBox Name="TxtObjem" Grid.Row="1" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/> </Grid> </GroupBox> <StackPanel Grid.Row="2"> <WrapPanel HorizontalAlignment="Center"> <Button Name="BtnMetoda" Content="Metoda" Margin="5" Click="BtnMetoda_Click"/> <Button Name="BtnMetodaNavrat" Content="Metoda - návrat" Margin="5" Click="BtnMetodaNavrat_Click"/> <Button Name="BtnMetodaVyraz" Content="Metoda - výraz" Margin="5" Click="BtnMetodaVyraz_Click" /> <Button Name="BtnMetodaParametry" Content="Metoda - výstupní parametry" Margin="5" Click="BtnMetodaParametry_Click"/> <Button Name="BtnMetoda2Navraty" Content="Metoda - 2 návraty" Margin="5" Click="BtnMetoda2Navraty_Click"/> <Button Name="BtnMetodaReference" Content="Metoda - reference" Margin="5" Click="BtnMetodaReference_Click"/> </WrapPanel> <WrapPanel HorizontalAlignment="Right" > <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" Click="BtnKonec_Click"/> </WrapPanel> </StackPanel> </Grid> </Window>
Kód 1: Výsledný XAML kód vytvořeného formuláře
C# kód
Code Behind - C# kód pro veškeré události vyvolané uživatelem při manipulaci s aplikací (MainWindow.xaml.cs) - viz Kód 2.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace PovrchObjemKouleWPF { /// <summary> /// Statická třída obsahující deklarace konstant /// </summary> static class Constants { //Deklarace a inicializace datové složky třídy public const string ZadPolomer = "Zadejte poloměr"; } /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //Při spuštění aplikace je vypsán text v prvku s poloměrem koule this.TxtPolomer.Text = Constants.ZadPolomer; } #region Výpočty /// <summary> /// Metoda s návratem pro výpočet povrchu koule /// </summary> /// <param name="r"> poloměr koule - vstupní parametr metody (předán hodnotou) </param> /// <returns> výstup metody je povrch koule </returns> private double PovrchKouleMetodaSNavratem(double r) { //Návrat vypočteného povrchu return 4 * Math.PI * Math.Pow(r, 2); } /// <summary> /// Výpočet objemu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> objem koule </returns> private double ObjemKouleMetodaSNavratem(double r) { //Návrat vypočteného objemu return (4d / 3) * Math.PI * Math.Pow(r, 3); } /// <summary> /// Metoda orientovaná na výraz pro výpočet povrchu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> povrch koule </returns> private double PovrchKouleMetodaVyraz(double r) => 4 * Math.PI * r * r; /// <summary> /// Metoda orientovaná na výraz pro výpočet objemu koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> objem koule </returns> private double ObjemKouleMetodaVyraz(double r) => (4d / 3) * Math.PI * Math.Pow(r, 3); /// <summary> /// Metody s výstupními parametry pro výpočet povrchu a objemu koule /// </summary> /// <param name="r"> poloměr koule - vstupní parametr </param> /// <param name="s"> povrch koule - první výstupní parametr </param> /// <param name="v"> objem koule - druhý výstupní parametr </param> private void PovrchObjemKouleVystupniParametry(double r, out double s, out double v) { s = 4 * Math.PI * r * r; v = ((double)4 / 3) * Math.PI * Math.Pow(r, 3); } /// <summary> /// Metoda navracející 2 výstupy - povrch a objem koule /// </summary> /// <param name="r"> poloměr koule </param> /// <returns> povrch, objem - výstupy metody jsou typu double </returns> private (double, double) PovrchObjemKouleMetodaDvaNavraty(double r) { double s, v; s = 4 * Math.PI * r * r; v = (4d / 3) * Math.PI * Math.Pow(r, 3); return (s, v); } /// <summary> /// Metoda bez návratu - předání parametrů odkazem (povrch a objem koule) /// </summary> /// <param name="r"> poloměr koule - parametr předaný hodnotou </param> /// <param name="s"> povrch koule - parametr předaný odkazem </param> /// <param name="v"> povrch koule - parametr předaný odkazem </param> private void PovrchObjemKoulePredaniOdkazem(double r, ref double s, ref double v) { //Výpočet povrchu koule s = 4 * Math.PI * r * r; //Výpočet objemu koule v = (4d / 3) * Math.PI * Math.Pow(r, 3); } #endregion #region Události //Vymazání počátečního textu v objektu pro poloměr při zacílení objektu private void TxtPolomer_GotFocus(object sender, RoutedEventArgs e) { //Pokud je umístěn počáteční text "Zadejte poloměr" v objektu pro poloměr if (this.TxtPolomer.Text == Constants.ZadPolomer) { //Vymazání textu v objektu pro poloměr this.TxtPolomer.Text = string.Empty; } } //Vyplnění počátečního textu v objektu pro poloměr při opuštění objektu private void TxtPolomer_LostFocus(object sender, RoutedEventArgs e) { //Pokud je objekt poloměru prázdný (neobsahuje text) if (this.TxtPolomer.Text == string.Empty) { //Vyplnění poloměru textem "Zadejte poloměr" this.TxtPolomer.Text = Constants.ZadPolomer; //Vymazání předchozího povrchu koule this.TxtPovrch.Text = ""; //Vymazání předchozího objemu koule this.TxtObjem.Text = ""; } } //Metoda bez návratu pro výpočet povrchu a objemu koule bez volání metod private void BtnMetoda_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu (stringu) na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Výpočet povrchu pomocí konstanty PI (třída Math) s = 4 * Math.PI * r * r; //Výpočet objemu - přetypování na datový typ double; Pow - metoda pro umocnění v = ((double)4 / 3) * Math.PI * Math.Pow(r, 3); //Konverze reálného čísla (uloženého v lokální proměnné) na text(string) this.TxtPovrch.Text = s.ToString(); //Konverze reálného čísla na text this.TxtObjem.Text = v.ToString(); } //jinak... else { /* Zobrazení okna se zprávou (1. parametr - text v okně; 2. parametr - titulek okna; 3. parametr - s jedním * tlačítkem pro zavírání; 4. parametr - s ikonou varování) - minimálně 1 parametr povinný */ MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Příkaz pro špatné zadání poloměru - zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod s návratem private void BtnMetodaNavrat_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu(stringu) na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { /* Zavolání metody s návratem pro výpočet povrchu koule, která má 1 vstup(r) a 1 výstup - konverze * výstupního reálného čísla na text(string) */ this.TxtPovrch.Text = PovrchKouleMetodaSNavratem(r).ToString(); /* Zavolání metody s návratem pro výpočet objemu koule, která má 1 vstup(r) a 1 výstup - konverze * výstupního reálného čísla na text(string) */ this.TxtObjem.Text = ObjemKouleMetodaSNavratem(r).ToString(); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod orientovaných na výraz private void BtnMetodaVyraz_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { /* Volání metody orientované na výraz pro výpočet povrchu koule, která má 1 vstup(r) a * 1 výstup - konverze výstupního reálného čísla na text(string) v požadovaném fomátu */ this.TxtPovrch.Text = string.Format("{0:N2}", PovrchKouleMetodaVyraz(r)); /* Volání metody orientované na výraz pro výpočet objemu koule, která má 1 vstup(r) a * 1 výstup - konverze výstupního reálného čísla na text(string) v požadovaném fomátu */ this.TxtObjem.Text = string.Format("{0:N2}", ObjemKouleMetodaVyraz(r)); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod s výstupními parametry private void BtnMetodaParametry_Click(object sender, RoutedEventArgs e) { //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Volání metody s výstupními parametry, která má 1 vstupní parametr (r) a 2 výstupní parametry (s,v) PovrchObjemKouleVystupniParametry(r, out double s, out double v); //Zobrazení vypočteného povrchu (konverze reálného čísla na text(string)) this.TxtPovrch.Text = s.ToString(); //Zobrazení vypočteného objemu this.TxtObjem.Text = v.ToString(); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metody navracející dva výstupy private void BtnMetoda2Navraty_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Volání metody navracející 2 výstupy (povrch, objem koule) (s, v) = PovrchObjemKouleMetodaDvaNavraty(r); //Zobrazení vypočteného povrchu uloženého v lokální proměnné 's' (konverze reálného čísla na text(string)) this.TxtPovrch.Text = string.Format("{0:N2}", s); //Zobrazení vypočteného objemu uloženého v lokální proměnné 'v' (konverze reálného čísla na text(string)) this.TxtObjem.Text = string.Format("{0:N2}", v); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metody, které jsou předány parametry odkazem private void BtnMetodaReference_Click(object sender, RoutedEventArgs e) { // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule double s, v; //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak... if (double.TryParse(this.TxtPolomer.Text, out double r)) { //Inicializace proměnných, tj. počáteční přiřazení hodnoty s = v = 0; //Volání metody bez návratu - předání parametru 'r' hodnotou a předání parametrů 's' a 'v' odkazem PovrchObjemKoulePredaniOdkazem(r, ref s, ref v); //Zobrazení vypočteného povrchu uloženého v lokální proměnné 's' (konverze reálného čísla na text(string)) this.TxtPovrch.Text = string.Format("{0:N2}", s); //Zobrazení vypočteného objemu uloženého v lokální proměnné 'v' (konverze reálného čísla na text(string)) this.TxtObjem.Text = string.Format("{0:N2}", v); } //jinak... else { //Okno se zprávou MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning); //Zacílení na objekt poloměru koule this.TxtPolomer.Focus(); } } //Metoda bez návratu pro zavření formuláře private void BtnKonec_Click(object sender, RoutedEventArgs e) { //zavření formuláře this.Close(); } #endregion } }
Kód 2: Výsledný C# kód vytvořeného formuláře a metod jeho prvků
Výstup programu
Na následujícím obrázku vidíme výstup naší aplikace pro výpočet povrchu a objemu koule ze zadaného poloměru na formuláři - viz Výstup programu - Kód 1 a 2. Různé typy metod pro výpočet povrchu a objemu koule jsou spouštěny pomocí příslušných tlačítek. U metod jsou také použity různé typy formátování výsledků. Aplikaci lze ukončit pomocí tlačítka Konec, nebo pomocí zavíracího tlačítka umístěného v pravém rohu aplikace.
Výstup programu - Kód 1 a 2: Výpis vypočteného povrchu a objemu koule ze zadaného poloměru