[c++] problem z wypisywaniem największej liczby ciągu

Polecenie jest takie : Wczytać ciąg liczb dodatnich zakończony liczbą niedodatnią. Wydrukować największą liczbę 

tego ciągu. 

 

Napisałam program, który wczytuje ciąg, czyli zrobiłam pierwszą część zadania, natomiast nie mam pojęcia jak zrobić drugą. Może ma ktoś pomysł albo jakąś wskazówkę, z góry dzięki za pomoc :slight_smile:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	string a;
	while(a[0] != '-' && a != "0")
	{
	
		cout<<"Podaj ciag= "; cin>>a;
					
	}
	

return 0;
}

 

 

Stwórz zmienną w której będziesz przechowywać największą wartość (w pętli będziesz porównywać - jeżeli jest większą, to przypisujesz, w przeciwnym razie nic nie robisz).

Więc tak jeśli zares danych wejściowych pozwala ci użyć typu standardowego, to:

(a1, a2, ..., an);
MAX = a1;

powtarzaj (od ai = a2, do ai = an) {
    jeśli (ai > MAX)
        MAX = ai;
}

W przypadku nie możliwości zastosowania typu standardowego, szkielet algorytmu będzie prawie identyczny.

Pomyśl też o pętli i zmiennej typu int

do{
    //Reszta kodu
}while(true)

No dobra, tylko problem jest w tym, że nie wiem ile będzie wprowadzonych z klawiatury tych liczb/ciągów…

kostek135 wiem, o co Ci chodzi, tylko nie mam pojęcia jakie będzie ‘n’ ? I tu mam właśnie problem… :slight_smile:

Jeżeli nie wiesz ile tych danych będzie. Potrzeba jest tutaj użycia chociażby listy jednokierunkowej.

#include <iostream>
 
using namespace std;
 
int main(int argc, char* argv[]) {
    string s;
 
    while(cin >> s)
        cout << s << endl;
}

Mały template, który przepisze wejście na wyjście, przepisując słowo po słowie, każde w nowej linii.

Przykład:

IN

a b c

d ef

OUT

a

b

c

d

ef

PS

Nie słuchaj rady o liście jednokierunkowej, ten problem można rozwiązać podczas wczytywania, dane wystarczy przejść dokładnie jeden raz. Wystarczy znać aktualne maksimum pewnego podsłowa mającego początek w pierwszym wyrazie (a1, a2, …, ak), co przechowujemy w jednej zmiennej oraz znać wyraz ak+1, który można wczytać z wejścia do drugiej zmiennej. Trywialny dowód indukcyjny.

PS2

Zapomniałem wyjaśnić czemu pętla działa. Każdy strumień (w tym plik) ma na końcu znacznik końca pliku, tzw. EOF. Jego odczytanie powoduje zwrócenie fałszu przez cin i w konsekwencji wyjście z pętli. Inaczej mówiąc czytamy liczby do końca pliku.

Zgadzam się, że nie trzeba tutaj wykorzystywać listy. Aczkolwiek użycie typu string jest tutaj niepoprawne tak, jak to używa @kostek135.

 

Tutaj z automatu rezerwuje nam się 28 Bajtów pamięci a spokojnie nie używając listy łączonej za pomocą int’ów można zużyć mniej pamięci. W obecnych czasach nie ma to znaczenia, no ale może warto wyrobić lepszy nawyk.

@Proteced_48, nie wiem co próbujesz udowodnić, ale sobie odpuść:

  1. Nie wiem, gdzie ja tutaj wspominam o tablicach. Ani, co to ma do tematu. Piszę do tego konkretnego tematu i piszę Tobie, że użycie string’a jest niepoprawne, niepotrzebne. I potem, co? Mam wpisać sobie 1 2 3 4 5 6 7 8 9 podzielić i rzutować na int i porównać do kodów ASCII? Przecież to niepotrzebne, jak i prawdopodobnie l_l.

Nie wiem czy zauważyłeś, ale OP używa stringa. Jaki możemy wysnuć wniosek? Że dane wejściowe nie mieszczą się w typie standardowym (wbudowanym). Przeczytaj jeszcze raz mój post (#3), w którym rozgraniczam, na wszelki wypadek, że jeśli zmieścisz się w typie standardowym to możesz go użyć, wpp. lepiej jest użyć napisu. Następnie podaje czym będzie się różnić porównywanie liczb napisowych od wbudowanych (dwa punkty).

Nie musisz mi przepisywać wyjaśnionych zdać z SPOJ’a. Tutaj weszła nuta filozoficzna, co było gdyby w zadaniu był określony przedział. Oczywiście, jeżeli mamy tutaj bardzo duże liczby, to tak można użyć string’a. W innym wypadku nie ma to żadnego sensu.

Z jakiego SPOJ’a o czym ty bredzisz? Każdy program czy system ma pewne limity.Te limity są nakładane przez limity mniejszych “klocków” w postaci poszczególnych funkcji, będących implementacjami konkretnych algorytmów. Żeby algorytm można uznać za poprawny trzeba znać dane wejściowe, format, limity, alfabet i dopiero możemy rozmawiać o tym czy algorytm jest poprawny, w przeciwnym przypadku, zawsze mogę wziąć liczbę, która będzie większa niż dostępna ilość pamięci wszędzie i dojść do wniosku, że jest on błędny.

 

Nie widzisz tego po tym. Tylko po prostu przeczytałeś poprzedni wątek założony przez bright(…), co później zauważyłem. Ty natomiast wyprowadziłeś mnie w pole, bo po prostu można było mnie odesłać do linka tematu i nie przepisywać zbędnej teorii o której każdy może przeczytać(no, ale może taki był zamiar), a widać że poprzednio proponuje coś, co nie ma w takim razie żadnych uwarunkowań(Post numer 4), a nie ma tutaj w tym temacie nic o przedziale i nie jestem medium, aby wiedzieć co było pisane w innym temacie. To, że Ona wczytuje przez string nie jest jednoznaczne, bo równie dobrze można to zrobić przez char, o ile mówimy tutaj o bardzo małych liczbach.