Zadanie maturalne z informatyki

0

Rozwiązuję zadania maturalne z informatyki i natrafiłem na przykład, którego nie mam pojęcia jak rozwiązać
Treść brzmi następująco:
Podaj algorytm (w pseudokodzie lub wybranym języku programowania), który mając zapisany w tablicy pewien napis, sprawdzi czy jest on (w całości) dwukrotnym powtórzeniem pewnego fragmentu, a jeśli tak, wypisze skompresowany napis w postaci ( fragment ). Jeśli napis
wejściowy nie jest powtórzeniem, na wyjście nie należy nic wypisywać.
Dane:
• liczba całkowita n>0 oraz tablica napis[1..n], zawierająca napis złożony z małych liter
alfabetu angielskiego
Wynik:
• jeżeli napis wejściowy jest dwukrotnym powtórzeniem tego samego fragmentu, wynikiem
są kolejne znaki napisu skompresowanego.

W rozwiązaniach tego zbioru zadań jest podany pseudokod, który chciałem przerobić na kod c++ jednakże nie dałem rady. Proszę o pomoc w rozwiązaniu.
SS z pseudokodem:
screenshot-20201110115020.png

3

A co już napisałeś?

Edit. W pseudo-c to będzie:

bool mozliwe = false;
if (n % 2 == 0) {
  mozliwe = true;
  for (int i = 0; i < n/2; i += 1) {
    if (napis[i] != napis[i + n/2]) {
      mozliwe = false;
    }
  }
}

if (mozliwe) {
  putchar('(');
  for (int i = 0; i < n/2; i += 1) {
    putchar(napis[i]);
  }
  putchar(')');
}

Gdzieś może być błąd przesunięcia o 1 lub coś podobnego

0

@KamilAdam: moj kod wyglada praktycznie tak samo, tylko problem mam z tym jakich zmiennych uzyc zeby to wszystko mialo rece i nogi

1

moj kod wyglada praktycznie tak samo, tylko problem mam z tym jakich zmiennych uzyc zeby to wszystko mialo rece i nogi

Co przez to masz na myśli? Jakie chcesz użyć? Między czym a czym się zastanawiasz? Dopytuje się bo nie rozumiem twojej wypowiedzi :(

3
#include <iostream>
using namespace std;

struct mod {
  mod(): v(0) {}
  mod &operator<<(int v2) {
  	v = v ? v % v2 : v2;
  	return *this;
  }	  
  operator int() {
  	return v;
  }
  int v;
} mod;

template<int a>
bool mozliwe() {
	return a;
}

bool prawda() {
	return mozliwe<1>();
}

bool falsz() {
	return mozliwe<0>();
}

struct napis_t {
  napis_t(const std::string &value): v(value) {}
  char operator[](int idx) { return v[idx - 1]; }
  string v;
};

void wypisz(const std::string &value) {
   cout << value;	
}

void wypisz(char value) {
   cout << value;	
}

int main() {
	string wartosc;
	int n;
	bool mozliwe = falsz();
	cin >> n;
	cin >> wartosc;
	napis_t napis(wartosc);
	
	if ((mod << n << 2) == 0) {
        mozliwe = prawda();       		
        for(int i=1; i <= n / 2; i++) {
           	if(napis[i] != napis[i + n / 2]) {
           		mozliwe = falsz();
           	}
        }
	}
	
	if (mozliwe) {
		wypisz("(");
		for(int i=1; i <= n / 2; i++) {
			wypisz(napis[i]);
		}
		wypisz(")");
	}
	return 0;
}

https://ideone.com/ZUBrQq

0

Użyj std::string i osobnej funkcji tak jak w przykładzie:

string isDoubled( const string& fragment )
{
    if( fragment.size()%2 != 0 ) return "";
    for( int index {0} ; index<fragment.size()/2 ; ++index ) if( fragment[index] != fragment[fragment.size()/2+index] ) return "";
    return fragment.substr(fragment.size()/2,fragment.size());
}
0

@KamilAdam: w kodzie jest użyta zmienna "napis[]" oraz 'n', które nie są zdefiniowane i o ile wydaje mi się, że 'n' powinno być intem to nie wiem co zrobić z napisem

1

Masz to przecież napisane w samym zadaniu:

Dane:
• liczba całkowita n>0 oraz tablica napis[1..n], zawierająca napis złożony z małych liter
alfabetu angielskiego

Czyli n jest intem, a napis — tablicą charów.

0

Do tego należy dopisać sprawdzenie, czy faktycznie podano tyle znaków, ile wynosi n. Jak podasz n=10 i napis samsam, to program się wysypie, a dla n=6 i napisu takitaki program da fałszywą odpowiedź.

Trudno zgadywać, co autor zadania ma na myśli, ale liczbę znaków można odczytać z samego napisu, więc nie rozumiem po co ją pobierać od użytkownika. No chyba, że użytkownik ma podać liczbę znaków, a potem pobierać pojedyncze znaki w pętli, która będzie mieć n iteracji.

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