• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Zadanie c++ string

42 Warsaw Coding Academy
0 głosów
1,097 wizyt
pytanie zadane 24 marca 2020 w C i C++ przez wall7489 Obywatel (1,280 p.)
zamknięte 24 marca 2020 przez wall7489

Dlaczego program się nie kompiluje

#include <iostream>
using namespace std;

string ciag;


int main() {
	cin>>ciag;
	int a=ciag.length();
	string f[a];

for(int i=0;i<a;i++) f[i] = ciag[i];


for(int i=0;i<a;i++;)
{
	if(f[i]==)
	
	
	
}

	
	return 0;
}

 

 

komentarz zamknięcia: Błąd wyjaśniony
komentarz 24 marca 2020 przez tkz Nałogowiec (42,020 p.)
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
Niestety, nic mi to nie pomogło bo dozwolona biblioteka to tylko iostream
komentarz 24 marca 2020 przez tkz Nałogowiec (42,020 p.)
Możesz zaimplementować sam.
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
No a w tym problem że nie wiem w jaki sposób.
komentarz 24 marca 2020 przez tkz Nałogowiec (42,020 p.)
Użyj googla...
komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
Nie przesadzajmy z tą własną implementacją priority_queue. Najprostsze rozwiązania są zawsze najlepsze, prawda? A to da się rozwiązać bez tej struktury
komentarz 24 marca 2020 przez tkz Nałogowiec (42,020 p.)
A to coś ponadprzeciętnego? Nie widzę problemu, by poświęcić 15 minut zapoznaniu się co to jest i jak działa.
komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
Wątpię żeby ktoś był w stanie zrozumieć jak działa priority_queue w 15 minut i jeszcze to jakoś zaimplementować. W szczególności, że do tego potrzebna jest jeszcze znajomość kopców binarnych
komentarz 24 marca 2020 przez tkz Nałogowiec (42,020 p.)
Nie pisałem nic o implementacji. Napisanie prostej kolejki nie jest czymś górnolotnym.
komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
Jeżeli mówimy o zwykłej kolejce, to tu się zgadzam. Natomiast zdziwiłbym się gdyby osoba, która nigdy tego nie implementowała, nie miała problemów z napisaniem tego

1 odpowiedź

0 głosów
odpowiedź 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
wybrane 24 marca 2020 przez wall7489
 
Najlepsza
Da się to zrobić bez priority_queue. Wystarczy że będziesz trzymał dwie tablice, w jednej będziesz dodawał zwykłych pacjentów a w drugiej priorytetowych. Gdy pojawia się jakiś pacjent to dodajesz go na koniec odpowiedniej tablicy. I teraz gdy doktor chce kogoś przyjąć na początku sprawdzasz czy w tablicy pacjentów priorytetowych są jeszcze jakieś osoby i je usuwasz, a jak nie do bierzesz zwykłych pacjentów. I teraz tak, nie potrafimy usuwać elementów z początku tablicy, ale kto powiedział że musimy to robić? Możesz trzymać dla każdej tablicy dwie zmienne, indeks początku kolejki i jej końca. Jeżeli dodajesz jakąś osobę to zwiększasz licznik końca, a jak usuwasz to zwiększasz licznik początku kolejki. Do tego wystarczy tylko biblioteka iostream
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)

Napisałeś: w jednej zwykłych, w drugiej priorytetowych. Ale jak skoro ciąg to np. ZGGPZGZZPGZPPG?

mam zrobić takie coś?

string ciag; //ciąg	
cin>>ciag;
int a=ciag.length();
	string tab[a];
	string p[a];
	string z[a]

for(int i=0;i<a;i++)
{
if(tab[i]=='P') p[i]="P";
if(tab[i]=='Z') z[i]="Z";
	
}

Mam pacjentów priorytetowych w priorytetowej a zwykłych w zwykłej. I co teraz.

komentarz 24 marca 2020 przez mokrowski Mędrzec (158,440 p.)

@Whistleroosh, hmm.. lepiej to przemyśl. W szczegółach są problemy. Jak duże powinny być tablice? Co w przypadku gdy wyjdziesz poza ostatni poprawnie alokowany element tablicy (początek tablicy w Twojej propozycji)?

komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
Wątpię żeby długość tego ciągu była większa niż 10^6, więc dwie tablice rozmiaru milion wystarczą w zupełności
komentarz 24 marca 2020 przez mokrowski Mędrzec (158,440 p.)

Wątpię żeby długość tego ciągu była większa niż 10^6, więc dwie tablice rozmiaru milion wystarczą w zupełności

Inżynieria nie polega na wierze lub zwątpieniu. To nie jest sposób rozwiązania tak prostego problemu. A ta droga "dajmy hektar RAM'u to się może uda" to także nie jest dobre podejście produkcyjne :) Nie pomyliłeś się co do jednego. Rzeczywiście przy 2 priorytetach można wydzielić 2 kontenery. Pomyliłeś się tylko co do ich rodzaju (podpowiedź).

komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)

@wiktorlewicki, bardziej chodziło mi o coś w stylu:

for(int i=0;i<a;i++)
{
      if(tab[i]=='P') p[idx_p++]=i+1;
      if(tab[i]=='Z') z[idx_z++]=i+1;
     
}

Gdzie idx_p to indeks, który wskazuje na koniec kolejki pacjentów priorytetowych, a idx_z klientów zwykłych. Dzięki temu w tablicy p i  z znamy też numery kolejnych klientów. Trzeba będzie jeszcze stworzyć indeks na początek kolejki

komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)

@mokrowski, masz rację. Aczkolwiek w problemach algorytmicznych na takim poziomie nie spotkałem się nigdy z sytuacją, gdy rozmiar stringa podanego na wejściu jest większy od miliona, więc to powinno wystarczyć

komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)

@mokrowski, nie okłamujmy się też, to jest proste zadanie mające sprawdzić czy ktoś zna podstawy programowania. Nikt nie oczekuje tutaj jakiegoś wyrafinowanego rozwiązania :)

komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)

@Whistleroosh, „I teraz gdy doktor chce kogoś przyjąć na początku sprawdzasz czy w tablicy pacjentów priorytetowych są jeszcze jakieś osoby i je usuwasz, a jak nie do bierzesz zwykłych pacjentów.” Jakich tu IF'ów użyć?

komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)

Jeżeli idx_p_beg to indeks początku kolejki priorytetowych pacjentów, a idx_p_end indeks końca kolejki priorytetowych pacjentów (analogicznie dla pacjentów zwykłych) to coś takiego:

if(idx_p_beg < idx_p_end)
{
     cout << p[idx_p_beg] << "\n";
     idx_p_beg++;
}

else //zakladamy, ze jezeli nie ma pacjentow priorytetowych to zawsze bedzie jakiś zwykly
{
     cout << p[idx_z_beg] << "\n";
     idx_z_beg++;
}

 

komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
Ponadto mam komunikat o takim problemie      [Error] no match for 'operator==' (operand types are 'std::string {aka std::basic_string<char>}' and 'char')

Co to oznacza?
komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
Pokaż kod. Może porównujesz gdzieś stringa z char'em.
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
#include <iostream>

using namespace std;

string ciag;
int main() {
	cin>>ciag;
	int a=ciag.length();
	string tab[a];
	string p[a];
	string z[a];
int	idx_p, idx_z, idx_pk, idx_zk;

for(int i=0;i<a;i++) tab[i] = ciag[i];

for(int i=0;i<a;i++)
{
	
if(tab[i]=='P') p[idx_p++]=i+1;
if(tab[i]=='Z') z[idx_z++]=i+1;

}
	



	
	return 0;
}

 

komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)

W linii 19. i 20. porównujesz string z char. Najlepiej rozwiązać to tak, że usuniesz tablicę tab i będziesz porównywał bezpośrednio stringa ciag z char'em. Czyli:

if(ciag[i]=='P') p[idx_p++]=i+1;
if(ciag[i]=='Z') z[idx_z++]=i+1;

 

komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
edycja 24 marca 2020 przez wall7489

Jaki błąd jest w tym kodzie? W sensie program się kompiluje, ale jak wprowadze do niego ciąg i zatwierdze enterem, to się zawiesza.

#include <iostream>

using namespace std;

string ciag;
int main() {
	cin>>ciag;
	int a=ciag.length();
	string p[a];
	string z[a];
int	idx_p, idx_z, idx_p_end, idx_z_beg, idx_p_beg;


for(int i=0;i<a;i++)
{

if(ciag[i]=='P') p[idx_p++]=i+1;
if(ciag[i]=='Z') z[idx_z++]=i+1;
}
	for(int i=0;i<a;i++)
	{
	
if(idx_p_beg < idx_p_end)
{
     cout << p[idx_p_beg] << "\n";
     idx_p_beg++;
}

else 
{
     cout << p[idx_z_beg] << "\n";
     idx_z_beg++;
}


}
	return 0;
}

 

komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)

Gdy mówiłem Ci jak to rozwiązać to umknęło mi kilka szczegółów. Po pierwsze musimy stworzyć nową zmienną, powiedzmy cnt, która liczby ile klientów dotychczas rozpatrzyliśmy. I wtedy w linii 17 i 18 przypisujemy ++cnt zamiast i+1.

Po drugie będziemy korzystali tylko z jednej pętli, która będzie łączyła to co napisałeś w tych dwóch Twoich.

Ogólnie to powinno wyglądać tak:

#include <iostream>
#include <string>

using namespace std;


int main()
{
	string ciag;
	cin >> ciag;

	int a = ciag.length();
	int idx_p_beg = 0, idx_z_beg = 0, idx_p_end = 0, idx_z_end = 0, cnt = 0;
	
	int* p = new int[a];
	int* z = new int[a];

	for (int i = 0; i < ciag.length(); i++)
	{
		if (ciag[i] == 'P')
			p[idx_p_end++] = ++cnt;

		else if (ciag[i] == 'Z')
			z[idx_z_end++] = ++cnt;

		else
		{
			if (idx_p_beg < idx_p_end)
			{
				cout << p[idx_p_beg] << "\n";
				idx_p_beg++;
			}

			else
			{
				cout << z[idx_z_beg] << "\n";
				idx_z_beg++;
			}
		}
	}

	return 0;
}

 

komentarz 24 marca 2020 przez mokrowski Mędrzec (158,440 p.)
Na pierwszy rzut oka, brak nagłówka string i stosowanie VLA.
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
edycja 24 marca 2020 przez wall7489

@Whistleroosh, Nie mogę użyć żadnej innej biblioteki poza iostream, oraz dla danych wejściowych ZZPPGGZPG

wyskakuje takie coś, co jest błędne

3

4

6

komentarz 24 marca 2020 przez mokrowski Mędrzec (158,440 p.)
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
@mokrowski Ty jak byś ten program zrobił? Siedzę od godziny 9 i się zastanawiam jak to zrobić.
komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
Jak wygląda poprawna odpowiedź? Bo moim zdaniem to jest dobrze. Doktor przyjął pacjentów tylko 3 razy w tym przykładzie i byli to tylko priorytetowi
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
Dla danych wejściowcyh ZZPPGGZPG

poprawne wyjście to:

3

4

1

2

6

5

bo w pierwszej kolejce są ZZPP, czyli najpierw wchodzą priorytetowi według kolejności,  a poźniej zwykli według kolejności dlatego tu jest 3,4,1,2. Potem mamy jednego zwykłego i jednego priorytetowego, czyli najpierw wchodzi priorytetowy i będzie 6,5. Łączymy i wychodzi 3,4,1,2,6,5
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
albo czekaj, bo już sam przestałem to rozumieć.
komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
To nie jest tak, że jedno 'G' oznacza, że tylko jedna osoba może wejść? Tak wynika z testu przykładowego, który podałeś na samej górze
komentarz 24 marca 2020 przez mokrowski Mędrzec (158,440 p.)

@wiktorlewicki,
 po prostu zaimplementuj 2 kolejki FIFO i je wypełniaj i opróżniaj.

komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
Dopiero zrozumiałem zadanie...
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
JEDNAK WSZYSTKO JEST DOBRZE. WHISTRLEROOSH JESTEŚ BOGIEM INFORMATYKI! DZIĘKUJĘ CI ZA POMOC WE WSZYSTKICH MOICH ZADANIACH. JESTEŚ SUPER!
komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
WHISTRLEROOSH, mam jeszcze jedno pytanie. Wyrzuciłem bibliotekę string i wszystko działa poprawnie. To nie ma żadnego wpływu na program?
komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)

iostream w swojej implementacji zapewne wykorzystuje w jakimś stopniu bibliotekę string, ale to nie znam szczegółów. Tutaj wolałbym aby @mokrowski dopowiedział, dlaczego tak się dzieje.

komentarz 24 marca 2020 przez wall7489 Obywatel (1,280 p.)
@Whistleroosh, jest jeszcze jeden malutki problem. Dla wejścia ZZPPGGG , nawet ja nie wiem jakie było by poprawne wyjście. Ale w programie jest 3,4,1. Czy jest to dobre wyjście?
komentarz 24 marca 2020 przez Whistleroosh Maniak (57,400 p.)
No tak, na początku opróżniamy kolejkę klientów priorytetowych, czyli 3 i 4, a potem bierzemy pierwszego z kolejki zwykłych, czyli 1
komentarz 24 marca 2020 przez mokrowski Mędrzec (158,440 p.)

W niektórych implementacjach, <iostream> może także wczytywać <string> (i inne nagłówki). Jednak nie można na tym bazować bo uzależniasz się od jednej wersji kompilatora i biblioteki standardowej (a w nowej wersji to się może zmienić). Używane deklaracje z nagłówków, powinny być jawnie wczytywane do programu.

Podobne pytania

0 głosów
1 odpowiedź 950 wizyt
pytanie zadane 5 stycznia 2020 w C i C++ przez AlexSilesia Nowicjusz (240 p.)
0 głosów
1 odpowiedź 420 wizyt
pytanie zadane 6 lipca 2016 w Java przez Jonki Dyskutant (8,180 p.)
0 głosów
2 odpowiedzi 295 wizyt
pytanie zadane 21 czerwca 2016 w Java przez windsmasher Nowicjusz (170 p.)

93,381 zapytań

142,381 odpowiedzi

322,536 komentarzy

62,738 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...