Ada: Palindromproblem, ta bort mellarum ur strings

Permalänk
Medlem

Ada: Palindromproblem, ta bort mellarum ur strings

Hej,

TL;DR: Hur tar jag bort mellanrum ur meningar i Ada

Sitter och skall programera ett program som tar en mening och kontrollerar om denna mening är ett palindrom(dvs går att läsa framlänges och baklänges).

Jag har dock stött på lite problem då jag skall ta bort eventuella mellanrum i meningarna.

Här är min kod:

with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; Procedure lab2_uppgift2 is Recieve : String(1..50); I : Integer := 0; V : Integer := 1; H : Integer := 0; Z : Integer := 0; Space : Integer := 1; Done : Boolean := False; --Buffer : String(1..50); begin Get_Line (Recieve,H); Put (H); Z := H; New_Line; Put (Recieve); New_Line; New_Line; New_Line; loop if Space <= Z then if Recieve (Space) = ' ' then Recieve(Space .. 50) := Recieve((Space + 1) .. 50); Space := Space + 1; -- Put (Recieve); elsif Space = Z then Recieve := Recieve(1..(Recieve'Last)); Done := True; else Space := Space + 1; end if; if Done = True then if Recieve(V) = Recieve(H) then Put_Line (Recieve (V) & " " & Recieve (H)); New_Line; if V = Z then Put_Line ("Palindrom"); exit; end if; V := V + 1; H := H - 1; else Put_Line ("Meningen är inte ett palindrom"); exit; end if; end if; end if; end loop;

Dold text

Är medveten om att koden är ganska kladdig, är än så länge fortfarande nybörjare inom Ada.

Problemet är, att när jag då kör den första biten kod som går igenom meningen efter mellanrum är att jag får ett errormeddelande:

raised CONSTRAINT_ERROR : lab2_uppgift2.adb:27 length check failed

Och jag har inte lyckats hitta vad detta innebär.

Den uppmärksamme har sett att jag har försökt pilla lite med Ada.String.Unbound paketet där det finns en funktion som heter Delete. Denna funktion skall tydligen kunna ta bort saker som oönskade mellanrum etc. Jag har dock inte lyckats hitta någon vettig dokumentation om det hela som förklarar de tre olika parametrarna.

Jag tycker dock att min lilla kodsnutt borde fungera, men det gör den ju då inte.... Är det någon vänlig själ som vill slänga ett öga på koden och kanske upplysa mig om något misstag jag gjort?

/Alex

Permalänk
Medlem

Vilken rad är radnummer 27? Jag skulle tro att det blir lättare om du använder dig av ada.string.unbound med metoderna index och delete.

Var lär man ut Ada idag? Det var det första språket jag kom i kontakt med högskolan i mitten av nittiotalet.

Permalänk
Medlem

I första inlägger är rad 27 detta: "Recieve(Space .. 50) := Recieve((Space + 1) .. 50);"

Jag har pillat lite med Ada.String.Unbound och Delete, vilket gjorde saker och ting avsevärt mycket enklare.

Koden ser nu ut såhär:

with Ada.Text_IO; Use Ada.Text_IO; with Ada.Integer_Text_IO; Use Ada.Integer_Text_IO; with Ada.Strings.Unbounded.Text_IO; Use Ada.Strings.Unbounded.Text_IO; with Ada.Strings.Unbounded; Use Ada.Strings.Unbounded; with Ada.Strings.Bounded; use Ada.Strings.Bounded; procedure unbounded_string_test is Recieve : Unbounded_String; -- Palindromet I : Integer := 0; --Iteration V : Integer := 1; --Vänster palindromkontroll H : Integer := 0; -- Höger palindromkontroll Z : Integer := 0; --Längd på string Space : Integer := 1; --Mellanrumskontroll Done : Boolean := False; Result : String(1..50); begin Get_Line (Recieve); Z := Length(Recieve); Put(Z); Result := To_String(Recieve); loop If Recieve(Space) = ' ' then Delete(Recieve,Space,Space); elsif Space = Z then Result := To_String(Recieve); Put(Result); loop --------------------------------------------------------- if Result(V) = Result(H) then --Put (Recieve (V) & " " & Recieve (H)); New_Line; if V = Z then Put_Line ("Palindrom"); exit; end if; V := V + 1; H := H - 1; else Put_Line ("Meningen är inte ett palindrom"); exit; end if; ---------------------------------------------------------- end loop; else Space := Space + 1; end if; end loop; end unbounded_string_test;

Dold text

Problemet jag får när jag kompilerar är "array type required in indexed component" vid rad 29

If Recieve(Space) = ' ' then

Jag har provat att göra en fullösning genom att göra om en unbound string till en vanlig string och köra sökningen genom den, för att sedan utföra Delet-kommandond i unbound-stringen.

Dock går kompileringen finfint men jag får error när jag kör den, samma som tidigare fast på raden där jag sparar unbound string som en vanlig string

Result := To_String(Recieve);

Hur gör jag när jag skall indexera en unbound-string? den info jag har hittat ser ut såhär:

function Index (Source : in Unbounded_String; Pattern : in String; Going : in Direction := Forward; Mapping : in Maps.Character_Mapping := Maps.Identity) return Natural;

Lyckas inte riktigt förstå mig på dessa förklarningar tyvärr. Hittar massa info som är skrivet på detta vis, men har ingen aning om hur man applicerar det i praktiken

Kan tillägga att det är endast mellanrummen som jag har problem med, palindromkontrollen fungerar utmärkt.

I övrigt så är det en Grundkurs i programmering på Mälardalens högskola det handlar om. Läser till Civilingenjör i Robotik

Permalänk
Medlem
Skrivet av Itchago:

Hur gör jag när jag skall indexera en unbound-string? den info jag har hittat ser ut såhär:

function Index (Source : in Unbounded_String; Pattern : in String; Going : in Direction := Forward; Mapping : in Maps.Character_Mapping := Maps.Identity) return Natural;

Enligt referensmanualen så letar alltså Index i strängen Source efter mönstret pattern och returnerar positionen för den första träffen som en Natural.

Referensmanualen är ju inte direkt lättläst och har en förskräckligt massa referenser hit och dit men den är värd att användas ändå.

Permalänk
Medlem

Fattar Source, så långt är jag med, men fattar inte riktigt resten, är index något mer av en sökfunktion i strängen eller vad? Sätter jag Pattern till ett mellanrum så letar index efter det första mellanrummet och returnerar positionen av mellanrummet eller?

Permalänk
Medlem
Skrivet av Itchago:

Fattar Source, så långt är jag med, men fattar inte riktigt resten, är index något mer av en sökfunktion i strängen eller vad? Sätter jag Pattern till ett mellanrum så letar index efter det första mellanrummet och returnerar positionen av mellanrummet eller?

Ja, så säger specifikationen i Ada standarden.

Permalänk
Medlem

Faktiskt börjat förså dessa kryptiska förklaringar, lyckades lösa uppgiften med hjälp av endast Unbounded strings! När man väl greppat det hela så vart det genast mkt enklare.