[C#] kontrola uzávorkování – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

[C#] kontrola uzávorkování – .NET – Fórum – Programujte.com[C#] kontrola uzávorkování – .NET – Fórum – Programujte.com

 

sh00ter0
Newbie
4. 5. 2011   #1
-
0
-

Zdravim,

mám takovej problém, mám napsat program na kontrolu uzávorkování, což neni, nebo neměl by bejt takovej problém, jen (samozřejmě nevim proč) mi moje řešení vrací někdy špatný výsledky. Vstupy neznám.

Myslim, že je důležitý podotknout, že aplikace je testovaná v prostředí Mono pod Linuxem, takže řádky jsou ukončený pouze znakem #10 LF.

Zadání

Na vstupu je dána posloupnost libovolných znaků, mezi kterými se vyskytují kulaté (), hranaté [], špičaté <> a složené {} závorky. 

Zjistěte, zda je posloupnost správně uzávorkovaná -- tzn. že každá otevítací závorka má korespondující zavírací závorku
a že závorky se nekříží. Není-li posloupnost správně uzávorkovaná, vypište na standardní výstup index znaku,
na kterém nastala chyba (první znak má index 1). V opačném případě vypište 0. Pokud se závorky nekříží, ale nějaká zůstane otevřená,
vraťte index znaku, který následuje za posledním (tzn. celkový počet znaků + 1).

Pozn: Pokud nečtete vstup po znacích, předpokládejte, že zalomení řádku jsou reprezentována pouze znakem LF
(ASCII hodnota 10) - tzn. zabírají právě jeden znak.


Můj kód je tenhle.

using System;

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

namespace spravne_uzavorkovani
{
class Program
{

static bool jeZavorkaOtviraci(char znak)
{
string zavorky = "([<{";
if (zavorky.Contains(znak)) return true;
else return false;
}

static char jeZavorkaZaviraci(char znak)
{
string zavorky = ")]>}";
if (zavorky.Contains(znak))
{
switch (znak)
{
case ')':
return '(';
case ']':
return '[';
case '>':
return '<';
case '}':
return '{';
default: return '0';
}
}
else return '0';
}

static void Main(string[] args)
{
Stack<char> zasobnik = new Stack<char>();

int i = 0;
int c = Console.Read();
while (c != 10 && c != 13)
{
char z = (char)c;
i++;
if (jeZavorkaOtviraci(z)) zasobnik.Push(z);
else
{
char znak = jeZavorkaZaviraci(z);
if (znak != '0')
{
try
{
if (znak != zasobnik.Pop())
{
Console.WriteLine(i);
Console.ReadKey();
return;
}
}
catch (Exception)
{
Console.WriteLine(i);
Console.ReadKey();
return;
}
}
}
c = Console.Read();
}

if (zasobnik.Count > 0)
{
Console.WriteLine(i+1);
}
else Console.WriteLine(0);
Console.ReadKey();
}
}
}


díky za rady.

Nahlásit jako SPAM
IP: 94.113.85.–
JankoHrasko
~ Anonymní uživatel
3 příspěvky
8. 5. 2011   #2
-
0
-



using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public static readonly string[] SadyZatvoriek = { "{}", "()", "[]", "<>" };

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
// Pokus 1
string text = "blabla () bla [ { }] bla {\nbla}";
int? chybnyIndex = KontrolujZatvorky(text);
MessageBox.Show(text + " -> " + (chybnyIndex.HasValue ? chybnyIndex.ToString() : "OK"));

// Pokus 2
text = "({{})";
chybnyIndex = KontrolujZatvorky(text);
MessageBox.Show(text + " -> " + (chybnyIndex.HasValue ? chybnyIndex.ToString() : "OK"));

// Pokus 3
text = "({}";
chybnyIndex = KontrolujZatvorky(text);
MessageBox.Show(text + " -> " + (chybnyIndex.HasValue ? chybnyIndex.ToString() : "OK"));

// Pokus 4
text = "bla }";
chybnyIndex = KontrolujZatvorky(text);
MessageBox.Show(text + " -> " + (chybnyIndex.HasValue ? chybnyIndex.ToString() : "OK"));
}

public static int? KontrolujZatvorky(string text)
{
string zasobnikZatvoriek = string.Empty;
int index = 0;

foreach (char aktualnyZnak in text)
{
if (JeOtvaraciaZatvorka(aktualnyZnak))
zasobnikZatvoriek += aktualnyZnak;
else if (JeUzatvaraciaZatvorka(aktualnyZnak))
{
// Uzatvaracia zatvorka bez otvaracej
if (string.IsNullOrEmpty(zasobnikZatvoriek))
return index + 1;

// Porovnat ci sa jedna o rovnaku sadu
char poslednaOtvaraciaZatvorka = zasobnikZatvoriek[zasobnikZatvoriek.Length - 1];
if (!SuZatvorkyZhodne(poslednaOtvaraciaZatvorka, aktualnyZnak))
return index + 1;

// Su zhodne zatvorky - vybrat zo zasobnika
zasobnikZatvoriek = zasobnikZatvoriek.Substring(0, zasobnikZatvoriek.Length - 1);
} // else if

index++;
} // foreach

if (string.IsNullOrEmpty(zasobnikZatvoriek))
return null;

return text.Length + 1; // Chyba zatvorka (dalsi znak tam mal byt)
}

public static bool JeOtvaraciaZatvorka(char znak)
{
foreach (string sada in SadyZatvoriek)
{
if (sada[0] == znak)
return true;
} // foreach

return false;
}

public static bool JeUzatvaraciaZatvorka(char znak)
{
foreach (string sada in SadyZatvoriek)
{
if (sada[1] == znak)
return true;
} // foreach

return false;
}

public static bool SuZatvorkyZhodne(char otvaraciaZatvorka, char zatvaraciaZatvorka)
{
foreach (string sada in SadyZatvoriek)
{
if (sada[0] == otvaraciaZatvorka)
return (sada[1] == zatvaraciaZatvorka);
} // foreach

return false; // Znak nie je zo ziadnej sady
}
}
}

Nahlásit jako SPAM
IP: 88.212.40.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 30 hostů

Podobná vlákna

Kontrola HW — založil Petr

Kontrola id — založil Majox

Kontrola — založil jiri.free

Kontrola údajov — založil Michal115

Kontrola argumentu — založil vazbok

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý