source: esimerkit/2014k/live/live13/MjPilkkominen/MjPilkkominen.cs @ 1392

Revision 884, 5.1 KB checked in by anlakane, 3 years ago (diff)

live13

Line 
1using System;
2using System.Text;
3using System.Linq;
4using System.Collections.Generic;
5using System.Globalization;
6
7/// @author Antti-Jussi Lakanen
8/// @version 25.2.2014
9///
10/// <summary>
11/// Merkkijonojen pilkkominen
12/// </summary>
13public class MjPilkkominen
14{
15    /// <summary>
16    /// Merkkijonojen pilkkominen
17    /// </summary>
18    public static void Main()
19    {
20        char[] erottimet = new char[] { ' ', ';', ',' };
21        Console.Write("Kirjoita > ");
22        String mj = Console.ReadLine();
23        // mj = mj.Trim();
24
25        // Split()-metodin avulla saadaan tehtya merkkijonosta
26        // merkkijonotaulukko. Split ottaa parametrina merkkitaulukon
27        // jossa erotinmerkit on ilmoitettu.
28        String[] palat = mj.Trim().Split(erottimet);
29        TulostaPalat(palat);
30        Console.WriteLine("-----");
31
32        Console.Write("Anna kokonaislukuja > ");
33        String lukusyote = Console.ReadLine();
34
35        int[] luvut = new int[]{};
36
37        // Jos kayttaja antanut jotain muuta kuin kokonaislukuja, ei yritetakaan laskea lukuja yhteen
38        if (OnkoVainLukuja(lukusyote, erottimet))
39        {
40            luvut = MerkkijonoLuvuiksi(lukusyote, erottimet);
41            Console.WriteLine("antamiesi lukujen summa on " + Summa(luvut));
42        }
43        else
44        {
45            Console.WriteLine("Annoit jotain muuta kuin lukuja");
46        }
47
48        String luvutPotkossa = String.Join(", ", luvut);
49        Console.WriteLine("Luvut olivat siis: " + luvutPotkossa);
50
51    }
52
53    /// <summary>
54    /// Taulukon summa
55    /// </summary>
56    /// <param name="luvut">Luvut</param>
57    /// <returns>Summa</returns>
58    public static int Summa(int[] luvut)
59    {
60        int summa = 0;
61        foreach (int luku in luvut)
62        {
63            summa += luku;
64        }
65        return summa;
66    }
67
68    /// <summary>
69    /// Onko syötteessä pelkkiä lukuja
70    /// ja erotinmerkkejä.
71    /// </summary>
72    /// <param name="syote">Syöte yhtenä merkkijonona</param>
73    /// <param name="erottimet">Sallitut erotinmerkit</param>
74    /// <returns>Sisältääkö jono pelkkiä lukuja ja erotinmerkkejä</returns>
75    /// <example>
76    /// <pre name="test">
77    ///  char[] erottimet = new char[] { ' ', ';', ',' };
78    ///  MjPilkkominen.OnkoVainLukuja("1 2 3 4 5;6", erottimet) === true;
79    ///  MjPilkkominen.OnkoVainLukuja("1 2 3 a 4 5;6", erottimet) === false;
80    ///  MjPilkkominen.OnkoVainLukuja("1 2 3 4 5;-6", erottimet) === true;
81    ///  MjPilkkominen.OnkoVainLukuja("", erottimet) === false;
82    /// </pre>
83    /// </example>
84    public static bool OnkoVainLukuja(String syote, char[] erottimet)
85    {
86        if (syote.Length == 0) return false;
87        //for (int i = 0; i < erottimet.Length; i++)
88        //{
89        //    syote = syote.Replace(erottimet[i].ToString(), "");
90        //}
91
92        String[] pilkottu = syote.Split(erottimet);
93
94        NumberStyles style = NumberStyles.Integer;
95        CultureInfo culture = CultureInfo.InvariantCulture;
96
97        /*
98        foreach (char merkki in syote)
99        {
100            if (!Char.IsDigit(merkki))
101            {
102                return false;
103            }
104        }
105         * */
106
107        for (int i = 0; i < pilkottu.Length; i++)
108        {
109            int tulos;
110            if (!int.TryParse(pilkottu[i], style, culture, out tulos)) return false;
111        }
112
113        return true;
114    }
115
116    /// <summary>
117    ///
118    /// <summary>
119    /// Aliohjelma muuttaa annetun merkkijonon kokonaislukutaulukoksi
120    /// siten, etta eri luvut erotellaan annetun merkkitaulukon (erotinmerkkien)
121    /// perusteella. Alkuperäisen syötteen alusta ja lopusta poistetaan välilyönnit.
122    /// </summary>
123    /// <param name="syote">Muunnettava merkkijono</param>
124    /// <param name="erottimet">Sallitut erotinmerkit merkkitaulukossa</param>
125    /// <returns>Merkkijonosta selvitetty kokonaislukutaulukko.</returns>
126    /// <example>
127    /// <pre name="test">
128    /// int[] t1 = MjPilkkominen.MerkkijonoLuvuiksi("1 2 3", new char[] {' '});
129    /// String.Join(" ", t1) === "1 2 3";
130    /// int[] t2 = MjPilkkominen.MerkkijonoLuvuiksi(" ,,1;;3  ;5  ", new char[] {' ', ',', ';'});
131    /// String.Join(":", t2) === "0:0:1:0:3:0:0:5";
132    /// int[] t3 = MjPilkkominen.MerkkijonoLuvuiksi("1;;3  ;5", new char[] {' ', ',', ';'});
133    /// String.Join(":", t3) === "1:0:3:0:0:5";
134    /// </pre>
135    /// </example>
136    public static int[] MerkkijonoLuvuiksi(String syote, char[] erottimet)
137    {
138        String[] pilkottu = syote.Trim().Split(erottimet);
139        int[] luvut = new int[pilkottu.Length];
140        for (int i = 0; i < pilkottu.Length; i++)
141        {
142            luvut[i] = int.Parse(pilkottu[i]);
143        }
144        return luvut;
145    }
146
147    /// <summary>
148    /// Tulostetaan merkkijonotaulukon osat foreach-silmukassa
149    /// </summary>
150    /// <param name="pilkottu">Tulostettava merkkijonotaulukko</param>
151    public static void TulostaPalat(String[] palat)
152    {
153        foreach (String pala in palat)
154        {
155            Console.WriteLine("Pala: \"{0}\"", pala);
156        }
157    }
158}
Note: See TracBrowser for help on using the repository browser.