Zostaje pierwsza i ostania litera a pozostałe zostaną zamienione znakami "-"

0

Napisz program w języku programowania C++, który przekształca zdania zgodnie z podanym poniżej przykładem. Z każdego wyrazu zostają tylko pierwsze i ostatnie litery, pozostałe litery (o ile są) zostają zastąpione znakiem „–”.
Przykładowe zdanie:
a kiedy wreszcie wyjedziemy na wakacje
Przykładowe zdanie po przekształceniu:
a k-y w-e w-y na w-e
Dany jest plik tekstowy o nazwie dane.txt, zawierający 10 zdań w osobnych wierszach. Zdania zbudowane są z wyrazów składających się z małych liter alfabetu łacińskiego, bez znaków interpunkcyjnych. Wyrazy oddzielone są pojedynczymi znakami odstępu.

z góry dzięki :)

1

Fajne zadanie, co w związku z tym?

0

może był by ktoś tak dobry i pomógł z tym

0

Pokaż co już masz.

0

nie wiem jak zamienić tylko te litery na - bo resztę już sobie napisze sam

1

Pokaż co już masz. Generalnie wystarczy w pętli od 1 do przedostatniego elementu sprawdzić czy znak poprzedzający i znak po tym elemencie są czymś innym niż spacja, jeżeli tak, zmieniamy go na 1.
coś ala

for (auto i{0}; i < str.size() - 2; ++i)
    if (tab[i - 1] != ' ' && tab[i + 1] != ' ')
        tab[i] = '-';
0

C++ nie umiem za bardzo, ale w Pascalu zrobiłbym to tak:

function Censor(ASentence: String): String;
var
  Letters: Integer = 0;
  I: Integer;
begin
  Result := '';

  for I := 1 to ASentence.Length do
    if ASentence[I] = ' ' then
    begin
      if Letters > 2 then Result += '-';
      if Letters > 1 then Result += ASentence[I - 1];

      Result += ' ';
      Letters := 0;
    end
    else
    begin
      Letters += 1;

      if Letters = 1 then
        Result += ASentence[I];
    end;

  if Letters > 0 then
  begin
    if Letters > 2 then Result += '-';
    if Letters > 1 then Result += ASentence[ASentence.Length];
  end
end;

Już tłumaczę o co chodzi.

Zmienna Letters to licznik następujących po sobie liter, zmienna I zawiera indeks bieżącego znaku w wejściowym ciągu, którą inkrementuje główna pętla for. Więcej pętli nie potrzeba, ale trzeba więcej warunków.

Pierwszy warunek sprawdza, czy bieżący znak to spacja i jeśli tak, wykonuje dwa dalsze warunki. Pierwszy z nich sprawdza, czy długość słowa jest większa niż dwa i jeśli tak to dopisuje do rezultatu znak minusa. Drugi sprawdza, czy słowo ma więcej niż jedną literę i jeśli tak, dopisuje do rezultatu ostatnią literę słowa. Następnie do rezultatu dodawany jest znak spacji (czyli bieżący względem iteratora), a licznik liter jest zerowany.

Po else wykonywany jest kod, jeśli bieżącym znakiem jest litera (lub cokolwiek innego niż spacja). Najpierw zwiększamy licznik liter w słowie. Następnie sprawdzamy czy to pierwsza litera słowa i jeśli tak – dodajemy ją do ciągu wyjściowego.

Po pętli trzeba jeszcze sprawdzić, czy licznik liter jest większy niż 0 – to oznacza, że na końcu ciągu wejściowego jest słowo, które nie jest zakończone spacją, więc trzeba je zakończyć. Tu wykonuje się ten sam kod co w przypadku napotkania znaku spacji – jeśli trzeba to dodajemy znak minusa i jeśli słowo ma co najmniej dwie litery to dodajemy ostatnią literę do rezultatu.


No, powyższa propozycja działa prawidłowo z różnymi ciągami wejściowymi, więc możesz ten kod potraktować jako pseudokod i na jego podstawie napisać sobie odpowiednik w C++. Różnica polega na tym, że w Pascalu ciągi znaków indeksuje się od 1 (zaszłość historyczna), więc miej to na uwadze. ;)

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