[newbie] Standard Input i wpisanie elementów do tablicy z separatorem (split)

0

Hej Wszystkim!

Mam następujący problem - próbuje ze Standard Input`u wpisanego przez użytkownika podczas używania programu wyrzucić do tablicy te inputy, przeczesać tablicę od lewej, wybrać tylko 3 integer numbers, przypisać im później zmienne a, b i c na których to ostatecznie będzie sobie user mógł później uprawiać obliczenia. Problem jest taki, że user może wpisać wszystko co tylko mu się żywnie podoba. Program ma mu to umożliwić a następnie wszystkie elementy wpisać do tablicy i podzielić po każdej linii kodu na jeden element w tablicy. Zakładam, że user może wszystko. Wpisuje więc dowolny ciąg znaków, linia po linii. Jeśli już skończy potrzebuje aby program wprowadził do tablicy używając najlepiej chyba Split tak aby każda linia była jedną komórką i sprawdził od lewej które z tych wprowadzonych wartości to liczby całkowite licząc tablicę od lewej. Lepszego pomysłu na to nie mam a że jestem w tym kompletny amator to proszę o pomoc. Mi wyszło coś takiego po grzebaniu w bibliotece Microsoft, pytanie mam na dzień dobry - jak sprawić aby string line był zapisywany do tablicy, pewnie da się to zrobić do wpisywania do tablicy jakby "w tle"? Wpisuje element - zapisanie do tablicy w tle - wpisuje element - zapisanie do tablicy w tle - .... potem stop. Teraz check na Integer i przypisane od lewej zmiennych a, b i c. Ale to tylko zarys więc jakakolwiek konstruktywna podpowiedź była by niezwykle pomocna.

using System;
public class Example
{
    public static void Main()
    {
        string line;
        Console.WriteLine("Enter one or more lines of text (press CTRL+Z to exit):");
        Console.WriteLine();
        do
        {
            Console.Write("   ");
            line = Console.ReadLine();
            if (line != null)
                Console.WriteLine("      " + line);
        } while (line != null);
        //var split = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    }
}
1

Zapisywanie niepustych linijek do listy:

var list = new List<string>();
var line = "";
do
{
	line = Console.ReadLine();

	if (!string.IsNullOrWhiteSpace(line)) // doda do listy te linijki, które nie są: pustę lub spacjami 
	{
		list.Add(line);
	}
} while (line != null);

Listy używasz podobnie do tablicy jeżeli chodzi o odnoszenie się do konkretnych elementów - możesz użyć [index].

Jeżeli chcesz sprawdzić czy string jest liczbą całkowitą, to int.TryParse(string, out int wartosc) zwraca prawdę/fałsz w zależności czy zamiana napisu na liczbę całkowitą się udała.

TryParse(String, Int32)

0

Dzięki Ci dobry człowieku, póki co już jakoś to rozwiązanie zagnieździłem w kodzie ale jest jedno pytanie - jak z jednej do-if-when przejść do następnej do-if-when? Jest na to pewnie jakiś mechanizm typy kontrola przepływu i sterowania w aplikacji ale na to jeszcze jestem za ciemny. Może jest jakaś dokumentacja abym mógł po prostu przez majówkę usiąść i przerobić może? Póki co wychodzi mi z kodu tyle ale jak mówię - no nie umiem przejść z jednego etapu do drugiego.

public class Example
{
    public static void Main()
    {
        string line;
        
        Console.WriteLine("Enter one or more lines of text (press CTRL+Z to exit):");
        Console.WriteLine();
        do
        {
            Console.Write("   ");
            line = Console.ReadLine();
            if (line != null)
                Console.WriteLine("      " + line);
        } while (line != null);
        var list = new List <string>();
        var index = "";
        do
        {
            index = Console.ReadLine();

            if (!string.IsNullOrWhiteSpace(index))  
            {
                list.Add(index);
            }
        } while (index != null);
    }
}

Możliwe, że jest to zły zapis ale jedyne co udało mi się w tym przypadku osiągnąć to takie coś - przynajmniej nie sypie błędami:

using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        string line;
        var list = new List<string>();
        var index = "";

        Console.WriteLine("Enter one or more lines of text (press CTRL+Z to exit):");
        Console.WriteLine();
        index = Console.ReadLine();
        do
        {
            Console.Write("   ");
            line = Console.ReadLine();
            if (line != null)
                Console.WriteLine("      " + line);
            while (line != null) ;
        }
        while (!string.IsNullOrWhiteSpace(index));  
        do
            {
                list.Add(index);
            }
        while (index != null);
    }
}

Pozdrawiam i dziękuje za wszelką pomoc.

1

Generalnie aby przejść z jednej pętli do drugiej, to ta pierwsza powinna się skończyć (pomijając zagnieżdżenia) np. poprzez warunek (twoje when) lub np. użycie instrukcji break;

póki co już jakoś to rozwiązanie zagnieździłem w kodzie

Mieszanie ich raczej nie ma sensu, ten kod który wrzuciłem po prostu wczyta do listy wpisywany tekst (linijki) i za tą pętlą robisz kolejny krok.

Aby pętla wczytująca tekst się zakończyła musisz np. jak sam wyżej napisałeś Enter one or more lines of text (press CTRL+Z to exit): nacisnąć CTRL+Z i enter (wysyłasz znak końca pliku)

var lista_linijek = new List<string>();
var line = "";
do
{
	line = Console.ReadLine();

	if (!string.IsNullOrWhiteSpace(line))
	{
		lista_linijek.Add(line);
	}
} while (line != null);

// kolejny krok np. wyświetlanie
foreach (var linijka in lista_linijek)
{
	Console.WriteLine(linijka);
}
0

Czyli abyśmy mieli jasność, a przynajmniej tak jak to rozumiem - najpierw leci pierwsza pętla, podczas której user wprowadza wszystkie elementy które mu są potrzebne. Następnie wykonuje krok przerywający pierwszą pętlę, po niej następuje druga instrukcja, którą podałeś i to ona wpisuje te wszystkie wprowadzone inputy od usera do tablicy? Staram się w tym nie pogubić. Jedna pętelka aż nie będzie pustych elementów czyli spacji, przerwanie, pobranie wprowadzonych elementów do tablicy i dalej kolejne kroki do sprawdzania liczb całkowitych?

0

Prawie.

Pętla zapisująca wykonuje się aż nie dostanie znaku końca pliku (CTRL+Z), ale do listy dodaje tylko te linijki, które nie są pustę, no tak aby zapisane dane miały jakiś sens.

Jeżeli ten fragment

if (!string.IsNullOrWhiteSpace(line))
{
	lista_linijek.Add(line);
}

zamienisz na samo

lista_linijek.Add(line);

to puste linie też będą się zapisywać.

0

Cześć Mistrzu!

Jako, że jesteś jedynym który odpowiedział na mój post to mam do Ciebie takie jedno teoretyczne bardziej konceptualne pytanie - czy jest możliwość wyrzucenia użytkownika z tego zadania i postawienia programu wsadowego (batch) który to będzie wprowadzał bez końca elementy do stringa? To znaczy tak aby input działa bez końca. Ot tak, wbija losowe elementy bez końca swojego działania. Wbija, wbija, ciągle inputuje. A program wybiera tylko te wartości które są liczbami (sprawdza je przez warunek) i zapisuje je w tablicy jednowymiarowej. Potem dopiero program działa na zasadzie poprzednio definiowanej - wpisuje do tablicy wszystkie liczbowe elementy będące liczbami rzeczywistymi - potem check if - tylko całkowite i działa dalej? Jak to się ma z wydajnością? Chodzi mi o to aby zrobić ten program, te pętelki jak najbardziej user-friendly i jak najbardziej optymalne. Zwróć uwagę, że tego kompletnie nie umiem, uczę się tego więc każda wskazówka jak zawsze na wagę złota.

Generalnie chodzi o to: wchodzi wszystko - bez końca wchodzi, wbija do programu -> potem check if wartość wprowadzona jest liczbą (pytanie co z liczbami urojonymi albo dojściem do Pierwiastek z dwóch) -> jest liczbą -> wbicie do tablicy -> dalsze działania i kreowanie kolejnych elementów w tablicy... (pytanie gdzie to skończyć, jakie są granice takiego programu?) ->? finalne obliczenia?

Raz jeszcze wielkie dzięki za wszelką pomoc i przede wszystkim wyrozumiałość, lama w tym jestem więc pytam gdzie się da.

Pozdrawiam,
Paweł

0

@Daerato:

Te dane chcesz generować np. losowo czy np. wprowadzać z pliku do programu?

0

Raczej losowo, wprowadzanie ich z określonego pliku mija się z celem. To nie ludzie je będą generować ale określone działanie po stronie samej maszyny. Z tym też mam problem bo sam problem losowości w naukach komputerowych też jest dość problematyczny = 42.

0

Możesz odpalić program i dane podać jako string[] args

cmd: program.exe "a" "b" "c" "d"

private static void Main(string[] args)
{
    foreach (var element in args)
    {
        Console.WriteLine(element);
    }
}

i taki kod je po prostu wyświetli

a
b
c
d

0

Hej,

Dalej nie wiem jak to ugryźć, co zrobić z już wprowadzony inputem od usera? Jak oznaczyć wprowadzone wszystkie elementy i jak wbić je to tablicy albo listy, z której potem będę łowił tylko liczby całkowite? Program musi dynamicznie obliczyć ile tych elementów jest, każdy w nowej linijce a potem wbić je do tablicy albo listy. Ale jak to zrobić? Jak nie daje break`a tylko normalnie kończę Consol.WriteLine za pomocą Ctrl+Z to jak zapamiętać gdzieś w programie to co już mamy wprowadzone i (1) wbić do tablicy - > check po tablicy o liczby całkowite -> (2)wbicie ich do drugiej tablicy -> wykonywanie obliczeń na trzech liczbach. Wszędzie jakieś porady typu "wbij te liczby na twardo" albo "niech user wprowadza tylko liczby całkowite i sam określi a, b i c". Z czego się tego nauczyć?

using System;
using System.Collections.Generic;

class BasicForLoop
{
    public static void Main()
    {
        // Wstęp do programu, opis i zadania jakie ma wykonać
        Console.WriteLine("- - - Basic - - - for - - - Loop - - -");
        Console.WriteLine("This program has been create to read Standard Input, {0} check from user Input 3 Integer Numbers{0} and create variations of mathemathic calculations{0} based upon previously inputted elements.",
                          Environment.NewLine);
        Console.WriteLine();
        // String jako każdy z wprowadzonych elementów (Standard Input)
        Console.WriteLine("Standard Input Reader: {0}  Input Anything from Keyboard, backspace to delete{0}  Press Enter to push Input and step onto next line{0}  Press Ctrl+Z and Enter to finish inputing and go forward",
                          Environment.NewLine);
        Console.WriteLine();
        string s;
        do
        {
            s = Console.ReadLine();
            if (s != null)
                Console.WriteLine("     User Standard Input = " +s);
        } while (s != null);

        // Teraz wpisanie Stringa z miejsc wprowadzonych przez Usera do tablicy
        Console.WriteLine("Now your Input will be saved and pushed into First Table");
        //s.Split();
        var list = new List<string>();
        var line = "";
        do
        {
            line = Console.ReadLine();

            if (!string.IsNullOrWhiteSpace(line)) // doda do listy te linijki, które nie są: pustę lub spacjami 
            {
                list.Add(line);
            }
        } while (line != null);
        //break;

        // Checkowanie tablicy przez wybór liczb tylko całkowitych (licz do trzech bo a,b,c)
        // Wpisanie liczb całkowitych do drugiej tablicy (obliczeniowej z trzema elementami)
        // Przypisanie zmiennych a, b, c i wykonywanie obliczeń

        //foreach (var ch in s)
        // Console.WriteLine("'{0}': {1}", ch, Char.GetUnicodeCategory(ch));
    }
}

Pozdrawiam,
Paweł

1

Nie wiem dlaczego robisz dwie osobne pętle do wprowadzania danych, zrób jedną i tylko raz wprowadzaj dane

var list = new List<string>();
var line = "";
do
{
	line = Console.ReadLine();

	if (!string.IsNullOrWhiteSpace(line)) // doda do listy te linijki, które nie są: pustę lub spacjami 
	{
		list.Add(line);
	}
} while (line != null);

foreach (var item in list)
{
	Console.WriteLine("wprowadzona wartość: " + item);
}
0

Dobra teraz jest git, elementy są na bieżąco wpisywane a potem po Ctrl+Z jest wypisanie ich listy jeden element pod drugim.
Pytanie jak będzie wiadomo co dalej z tą listą zrobić? Znaczy każdy element jest jako item a skąd wiedzieć, że jest tu kolejność wprowadzania i odczytywania? Od początkowego pierwszego elementu do ostatniego? Chyba, że od razu na tym da się zrobić szukanie od góry do dołu w poszukiwaniu tylko liczb całkowitych i jak to wrzucić dalej do nowej listy? Tej właściwej na której będą już robione obliczenia?

using System;
using System.Collections.Generic;

class BasicForLoop
{
    public static void Main()
    {
        // Wstęp do programu, opis i zadania jakie ma wykonać
        Console.WriteLine("- - - Basic - - - for - - - Loop - - -");
        Console.WriteLine("This program has been create to read Standard Input, {0} check from user Input 3 Integer Numbers{0} and create variations of mathemathic calculations{0} based upon previously inputted elements.",
                          Environment.NewLine);
        Console.WriteLine();
        // String jako każdy z wprowadzonych elementów (Standard Input)
        Console.WriteLine("Standard Input Reader: {0}  Input Anything from Keyboard, backspace to delete{0}  Press Enter to push Input and step onto next line{0}  Press Ctrl+Z and Enter to finish inputing and go forward",
                          Environment.NewLine);
        Console.WriteLine();
        var list = new List<string>();
        var line = "";
        do
        {
            line = Console.ReadLine();

            if (!string.IsNullOrWhiteSpace(line)) // dodaje do listy te linijki, które nie są: puste lub tylko samymi spacjami 
            {
                list.Add(line);
            }
        } while (line != null);

        Console.WriteLine("Now your Input will be saved and pushed into List of Elements:");

        foreach (var item in list)
        {
            Console.WriteLine("List of Elements: " + item);
        }           

        // Checkowanie listy przez wybór liczb tylko całkowitych (licz do trzech bo a,b,c)
        // Wpisanie listy liczb całkowitych do listy drugiej właściwej (obliczeniowej z trzema elementami)
        // Przypisanie zmiennych a, b, c i wykonywanie obliczeń
             
    }
}

Pozdrawiam,
Paweł

0

Znaczy każdy element jest jako item a skąd wiedzieć, że jest tu kolejność wprowadzania i odczytywania? Od początkowego pierwszego elementu do ostatniego?

Po wprowadzeniu czegoś w konsoli wywołujesz metodę Add na liście, która jak sama dokumentacja mówi:

Dodaje obiekt na końcu List<T>.
Parametry item T
Obiekt, który ma zostać dodany na końcu List<T>. Wartość może być null dla typów referencyjnych.1

https://docs.microsoft.com/pl-pl/dotnet/api/system.collections.generic.list-1.add?view=netcore-3.1

jak to wrzucić dalej do nowej listy?

Najprościej będzie zrobić nową listę, ale tym razem typu List<int> i tam wkładać prze przekonwertowane na int liczby.
Możesz wykorzystać pętle foreach (var item in list) i tam dokonać tej zamiany i dodania do drugiej listy.

Dałoby się to zwięźlej zrobić bez robienia kilku list, ale tak powinno być prościej na ten moment.

2

Aby przekonwertować listę <string> na listę <int> lub <double> można zrobić tak:

        public static IEnumerable<int> ConvertFromStrings(IEnumerable<string> lines)
        {
            return lines.Select(line => int.Parse(line));
        }
        public static IEnumerable<double> ConvertFromStrings(IEnumerable<string> lines)
        {
            return lines.Select(line => double.Parse(line));
        }

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