problem z pętlami

0

Witam,
mam problem z pętlą. Chciałem zrobić dwie pętle : jedną przeszukującą

int w=2;
while(w==2){

String line = bre.readLine();
if(line.contains("Rawwy")==true){
	System.out.println("WARKOCZ\n");
	String lines = ("<html><body><p>Strona Zakazana</p></body></html>");

Zapis zap = new Zapis();
zap.wpis(lines);
w=1;
break;
    }
    else{w=2;
    System.out.println("Nie zmieniono");
    if(line==null)
    	break;
    }}

Ta sprawdza mi czy w Stringu wczytanym z bufora jest zawarta dana fraza - jeśli tak,to zmienia zawartość Stringu lines i zapisuje ją do pliku.
Druga pętla miała (po wykonaniu pierwszej i zwróceniu odpowiedniej wartości int`a w ( w tym przypadku =2), się uruchomić i zapisywać wczytaną zawartość Stringa do pliku.

if(w==2)
{BufferedReader bred;
bred = new BufferedReader( new InputStreamReader(in) );

    	while(true){
	
	String linia = bred.readLine();
	
	
	Zapis zapis = new Zapis();
zapis.wpis(linia);

if(linia == null)
	  
	break;}
    }

Niestety druga pętla się nie wykonuje. Generalnie: ma się wykonać pierwsza pętla - bez względu na wszystko - ,jeśli utworzy plik( w tym przypadku zmieni wartość w na 1,to druga ma się nie wykonać. Potrzebuję Waszej pomocy,gubię się w tych warunkach i albo działa mi jedno(wyszukuje spełnienie warunku i fajnie działa) ,ale w momencie,gdy ustawiam inny String jako do porównania(czyli zamiast "Rawwy" daję jakiś,którego na 200% nie ma) nie uruchamia drugiej pętli,która ma zapisywać do pliku zawartość wczytanego Stringa, albo wczytuje ten String bez względu na wszystko , wyłapując oczywiście zawartość równą i dodając linijkę z tekstem "Strona zakazana" . PLEASE HELP!! Wiem,że jak ktoś świeżym okiem spojrzy na to,to na pewno coś wyłapie,a ja się już zakleszczyłem . Chyba,że macie pomysł na inny sposób rozwiązania tego problemu(wywołanie pierwszej petli - sprawdzenia, potem z zależności od jej wyniku,wywołanie lub nie drugiej pętli - zapisywania Stringa z bufora)? Na obesztanie mnie też jestem otwarty:) . Pozdrawiam.

0

Proponuje troche poczytac ksiazek o programowaniu, poniewaz widac tu straszną nieudolnosc w rzeczach bardzo podstawowych.

Poczytaj m.in. o:

  1. Uzycie petli z wartownikiem
  2. wykozystanie break'a (nie zaleca sie zbyt czesto kozystanie z tego poniewaz jest to zly nawyk programisty)
0

ok,a czy możesz mnie nakierować,jak to poprawić(hasło pętla z wartownikiem jest dla mnie niestety mało jasne w tej sytuacji - w książce niestety nie znajdę takiego określenia - oczywiście rozumiem ideę tego określenia,ale czy mógłbyś podać mi przykład - w kodzie oczywiście - to myślę,że jestem w stanie jego zaadoptować do moich potrzeb i jednocześnie rozwinąć moją wiedzę z zakresu pisania kodu w jav`ie). Niestety w tym języku jestem dopiero początkujący, stąd moje "podstawowe" błędy. Jeśli mógłbyś mnie wesprzeć swym intelektem i znajomością tychże zagadnień,byłbym niezmiernie wdzięczny.

0

Określenie pętli z wartownikiem odnosi się do pewnego sposobu wychodzenia z pętli. Z twoich pętli wynika, że nie pisales wczesniej w zadnym języku programowania.

Przyklad petli z wart.:

w=1;
int licznik = 0;

while(w==1){

if(licznik>10){w=2}//nastapi wyjscie z petli
else licznik +=1;

}

Co do break'a to gdybym dal if(licznik>10){break;} wtedy wyszedlby z petli.

0

ok,a co może być nie tak w kodzie:

int w=2;

while(w==2){
   	
   	String line = bre.readLine();
   	String wse = "Ranny";
   	if(line.contains(wse)){
   		System.out.println("WARKOCZ\n");
   		String lines = ("<html><body><p>Strona Zakazana</p></body></html>");
   	
   	Zapis zap = new Zapis();
    zap.wpis(lines);
    w=1;
    
    	break;
        }

Bo w tej chwili pozmieniałem troszkę i to mi się nie uruchamia(nie znajduje zawartości równej Stringowi wse.A jest taka zawartość na stronie,którą pobieram do bufora. W tej chwili przechodzi mi od razu do drugiej pętli. Działa tylko w przypadku,gdy jako String szukany dam samą literę w :(

0

Twoim zasadniczym problemem jest to, że chyba nie wiesz co chcesz osiągnąć, a jeżeli nawet wiesz, to nie wiesz jak to sformułować.
Wskazuje na to początek Twojego posta "Chciałem zrobić dwie pętle". Otóż nie chciałeś zrobić pętli bo na pewno nie to jest Twoim rzeczywistym celem.
Pierwszą rzeczą jaką powinieneś zrobić jest sformułowanie przez Ciebie co kod ma wykonać - napisz to sobie po polsku np. na kartce. Możesz napisać to w poście, to każdy będzie w stanie Ci pomóc w przełożeniu to na zapis konkretnych instrukcji.
Nie wymyślaj przy tym żadnych zmiennych - tym bardziej jednoliterowych. I nie myśl w w sensie jakie mają być pętle bo te wynikną z samych sformułowań, które użyjesz. Krótko mówiąc musisz sobie rozpisać swoimi słowami algorytm. Dopóki tego nie zrobisz zawsze będziesz się "gubił z warunkami".
Dopiero sformułowany po ludzku algorytm przepiszesz sobie w postaci programu w Javie. Inaczej nigdy się nie pozbierasz.

Weź też pod uwagę jeszcze to, że tworzenie w pętli obiektów takich jak Zapis zap = new Zapis(), jest najprawdopodobniej błędem ponieważ z każdym przebiegiem pętli zap będzie reprezentował zupełnie inny nowy obiekt - na co zresztą wskazuje instrukcja/operator "new".

No i na koniec spróbuj jakoś sensownie formatować kod - przede wszystkim konsekwentnie umieszczaj otwierające i zamykające nawiasy klamrowe i rób tyle samo wcięć dla instrukcji, które mają się wykonywać jedna po drugiej. Dobrze jest nie pozwolić edytorowi na zamianę tabulacji na spacje. Bierz przykład z podręczników do programowania. Inaczej przestaniesz rozumieć to co sam napiszesz.

0
Olamagato napisał(a)

Twoim zasadniczym problemem jest to, że chyba nie wiesz co chcesz osiągnąć, a jeżeli nawet wiesz, to nie wiesz jak to sformułować.
Pierwszą rzeczą jaką powinieneś zrobić jest sformułowanie przez Ciebie co kod ma wykonać - napisz to sobie po polsku np. na kartce. Możesz napisać to w poście, to każdy będzie w stanie Ci pomóc w przełożeniu to na zapis konkretnych instrukcji.

Ok,dzięki za nakierowanie:)
Od początku:
mam napisać program - proxy filtrujące zawartość strony oraz jej adres. Adres jestem w stanie przefiltrować na poziomie wpisywania przez usera. Zostaje filtrowanie zawartości.Moim pomysłem(nie mówię,ze dobrym) było wczytanie linijka po linijce źródła do bufora (za pomocą klasy URL i BufferedReadera, skąd wczytuję to do Stringa nr.1 w pętli).W czasie,gdy mam wczytaną linię - strumień nr.1 - porównuję do konkretnego Stringa nr.2, i tu robią się schody - powinno sprawdzać i ,gdy String nr.1 z bufora zawiera identyczną zawartość jak String nr.2, pętla powinna się zakończyć i podmienić zawartość Stringa nr.1 na określoną String nr.3. W przypadku,gdy cała strona została sprawdzona(czyli wszystko z danego URLa zostało przepuszczone przez bufor i przypisane do Stringa nr.1 oraz sprawdzone - porównane z Stringiem nr.2 , a wynik jest negatywny,powinno przejść do wczytania jeszcze raz tej strony do bufora i zapisania jej do pliku. Po czym program się zamyka.

Olamagato napisał(a)

No i na koniec spróbuj jakoś sensownie formatować kod - przede wszystkim konsekwentnie umieszczaj otwierające i zamykające nawiasy klamrowe i rób tyle samo wcięć dla instrukcji, które mają się wykonywać jedna po drugiej. Dobrze jest nie pozwolić edytorowi na zamianę tabulacji na spacje.

Postaram się poprawić. Mam świadomość,że czytelny kod ułatwia pomoc i pracę. Na moje usprawiedliwienie mogę tylko napisać,że niestety ten program muszę skończyć jak najszybciej(ostatnia zalka na uczelni - czyli termin do 20 września). Z javą mam do czynienia dopiero od maja,i niewiele zdążyliśmy się nauczyć przez 2 miesiące. Resztę po prostu czytam w przerwach miedzy pracą a domem. Wcześniej z programowaniem miałem do czynienia w podstawówce ,gdy jeszcze wchodził ZX Spectrum , Basic i Logo :) [rotfl]

0

No to przynajmniej wiadomo o co chodzi. Jeżeli dobrze zrozumiałem, to musisz po prostu wczytać kod html strony i jeżeli znajdziesz w nim jakieś frazy ze swojego słownika fraz zabronionych, to cały kod strony ma zostać zamieniony na podstawiony przez Ciebie inny kod.

Algorytm będzie więc np. taki:

  1. Wykonujesz poniższe kroki dopóki nie otrzymasz od użytkownika polecenia zakończenia programu.
  2. Wczytujesz cały kod strony (od <html>, aż do </html>).
  3. Wyszukujesz w kodzie wczytanej strony każdą pozycję ze słownika fraz zakazanych
  4. Jeżeli żadna pozycja słownikowa nie zostanie znaleziona, to na wyjściu wyrzucasz wczytaną stronę, w przeciwnym wypadku na wyjście podajesz zupełnie inną przygotowaną wcześniej stronę zastępczą.

Zauważ, że ani razu nie użyłem słowa zmienna, pętla czy jakiejkolwiek nazwy klasy czy metody.
Teraz trzeba podzielić na mniejsze części użyte tutaj sformułowania (metody lub klasy to odpowiedniki czasowników i rzeczowników) takie jak:

  • wczytywanie kodu strony
  • wczytana strona
  • słownik
  • pozycja słownika
  • wyszukiwanie w kodzie
  • przygotowana wcześniej strona zastępcza
  • otrzymanie polecenia zakończenia programu
    i ewentualnie zamienić je na metody i klasy Javy jeżeli jest to już możliwe za pomocą języka.

Tak więc:

  • wczytywanie kodu strony będzie metodą. Można ją nawet na żywca nazwać wczytywanieKoduStrony().
  • wczytana strona będzie jakimś obiektem (być może jednym długim napisem typu String), a zmienna, która będzie go reprezentować może nazywać się kolejnaStrona.
  • słownik zakazanych tekstów może być tablicą napisów (np. String[] jeżeli zakazane frazy nie mają być zmieniane podczas działania programu)
  • pozycja słownika pojedynczym napisem klasy String i może to być zmienna o nazwie frazaZakazana.
  • wyszukiwanie w kodzie powinno być metodą, która na wejściu powinna mieć kolejną stronę Web oraz frazę do wyszukania, a na wyjściu powinna zwracać wartość logiczną true jeżeli strona zawiera frazę i false jeżeli jej nie zawiera.
  • przygotowana wcześniej strona zastępcza powinna być po prostu długim przygotowanym wcześniej napisem (np. typu String).
  • polecenie zakończenia programu powinno być metodą, która zwraca logiczne true jeżeli klawiatura, mysz lub inne urządzenie wejściowe zgłosiło potrzebę zakończenia filtrowania.

Po zebraniu wszystkiego mógłbyś zapisać taki algorytm już w Javie (którego trzeba by oczywiście uzupełnić):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Proxy implements Runnable
{
	//ustalasz skąd bierzesz dane
	public Proxy(InputStream strumieńWejściowy)
	{
		InputStreamReader in = new InputStreamReader(strumieńWejściowy);
		bred = new BufferedReader(in);
	}

	//właściwy program filtrowania proxy
	@Override public void run()
	{
		String kolejnaStrona = wczytywanieKoduStrony();
		while(!koniec() && kolejnaStrona != null)
		{	//to będzie wynik jeżeli nic nie zostanie znalezione
			String stronaWyjściowa = kolejnaStrona;
			for(String frazaZakazana: słownikZakazanych)
				if(znaleziono(frazaZakazana, kolejnaStrona))
				{	//koniec przeszukiwania i podmiana strony
					stronaWyjściowa = stronaZastępcza;
					break;
				}
			WypuszczenieStrony(stronaWyjściowa);
			kolejnaStrona = wczytywanieKoduStrony();
		}
	}

	/*
	 * Tutaj trzeba wpisać kod sprawdzający warunki zakończenia działania
	 * programu i zwracający true jeżeli jeden z warunków będzie prawdziwy
	 */
	private boolean koniec()
	{
		Boolean koniecZKlawiatury = false;
		Boolean koniecOdMyszy = false;
		Boolean koniecZInnegoPowodu = false;
		return koniecZKlawiatury || koniecOdMyszy || koniecZInnegoPowodu;
	}

	/**
	 * Wczytanie pojedynczej strony html, uwzględnia tagi html i /html
	 * w dowolnym miejscu błędy wielokrotnych tagów olewa
	 */
	private String wczytywanieKoduStrony()
	{
		int ts, te; //indeksy początków tagów <html> i </html>
		StringBuilder stronaWeb = new StringBuilder();
		CharSequence wycinek = null; //zawartość wiersza między tagami html

		String wiersz = nowyWiersz(this.bred); //kolejny wczytany wiersz
		while(wiersz != null)
		{	//szukanie tagów
			ts = wiersz.indexOf(htmlStart);
			te = wiersz.indexOf(htmlEnd);
			//dodaje do strony cały wiersz lub jego fragment ograniczony tagami
			//jeżeli tagu nie ma, to pobiera wiersz od początku lub do końca
			wycinek = wiersz.subSequence( ts >= 0 ? ts : 0,
				te >= 0 ? te + htmlEnd.length() : wiersz.length() );
			stronaWeb.append(wycinek); //cały wiersz lub jego część

			if(te < 0) //pobiera kolejny jeżeli nie napotkano końca strony
				wiersz = nowyWiersz(this.bred);
			else
			{	//reszta wiersza do przyszłego przeszukiwania kolejnej strony
				this.ostatniWiersz =
					wiersz.substring(te + htmlEnd.length(), wiersz.length());
				wiersz = null; //lub po prostu break;
			}
		}
		return stronaWeb.toString();
	}

	/**
	 * Wczytanie kolejnego wiersza ze strumienia lub końcówki ostatnio
	 * wczytanego
	 */
	private String nowyWiersz(BufferedReader bred)
	{
		String wiersz = null;
		if(this.ostatniWiersz != null)
		{
			wiersz = this.ostatniWiersz;
			this.ostatniWiersz = null;
		}
		else
			try { wiersz = this.bred.readLine(); }
			catch(IOException ex) { wiersz = null; }
		return wiersz;
	}

	/**
	 * @return true jeżeli strona zawiera zakazaną frazę
	 */
	private boolean znaleziono(String frazaZakazana, String kolejnaStrona)
	{	//najpierw cała strona na małe litery, a potem pozbawiona elementów
		//html - tagów, znaków specjalnych np. &nbsp i komentarzy
		String tekstDoPrzeszukania = usuńTagi(kolejnaStrona.toLowerCase());
		//przeszukujemy goły tekst wyciągnięty ze strony Web
		return tekstDoPrzeszukania.contains(frazaZakazana.toLowerCase());
	}

	private void WypuszczenieStrony(String stronaWyjściowa)
	{
		Zapis zap = new Zapis();
		zap.wpis(stronaWyjściowa);
	}

	private String usuńTagi(String kolejnaStrona)
	{
		//tu trzeba odfiltrować ze stringa kolejnaStrona wszelkie śmiecie
		//inaczej mówiąc odczytać z niego tylko tekst i ponownie zapisać
		//... do zrobienia lub zostawienia
		return kolejnaStrona;
	}

	private final String htmlStart = "<html>";
	private final String htmlEnd = "</html>";
	private final String stronaZastępcza =
		"<html><body><p>Strona Zakazana</p></body></html>";
	private final String[] słownikZakazanych =
	{
		"lalala", "bebebe", "bardzo brzydkie sformułowanie", /*...*/
	};
	private BufferedReader bred; //czytnik strumienia
	//odrzucona końcówka wiersza z poprzedniej strony html
	private String ostatniWiersz = null;
}

class Zapis
{
	public void wpis(String stronaWyjściowa)
	{
		throw new UnsupportedOperationException("Not yet implemented");
	}

}
0

Wielkie dzięki za odpowiedź Olamagato, wygląda to b. ładnie i przejrzyście. Wybacz mi moją ignorancję ,ale błagam powiedz ,jak to uruchomić? I jak zaimplementować,żeby InputStream był stroną,którą poda z palca użytkownik?Próbowałem uruchomić(dodając extends Thread) jako wątek,ale krzyczy,że klasa Proxy nie ma konstruktora. Zdaję sobie sprawę,że to jest błaha sprawa mając już algorytm napisany przez Ciebie,ale ,jak pisałem wyżej, w javie dopiero raczkuję,szybciej idzie mi pisanie jakiejś niezbyt zaawansowanej bazy w sqlu(wypożyczalnia,czy cuś:P),niż to. Jeszcze raz dzięki za zainteresowanie i poświęcony czas. Będę niezmiernie wdzięczny za wszelkie wskazówki /uwagi/porady/{kody też :-) [browar] }.

0

To nie jest kod, który można uruchomić, a tylko kawałek kodu, który pokazuje to co w zamyśle miał robić kawałek kodu z pierwszego posta. Dwie ostatnie metody tej klasy są do uzupełnienia tak samo jak i klasa Zapis do napisania.
Ta klasa Proxy ma konstruktor biorący na wejściu strumień jako argument. Implementuje interfejs Runnable, ale tylko po to aby główny kod był w metodzie Run. Thread też implementuje ten sam interfejs, ale i rzadko kiedy potrzeba coś dziedziczyć po Thread. A to dlatego, że klasa ta ma konstruktor z argumentem Runnable, więc możnaby stworzyć wątek przez wywołanie np. new Thread(new Proxy(input), "Pośrednik"), gdzie input jest zmienną strumienia.

Co do tego jak to wykorzystać, to musisz sobie poczytać jak działa w ogóle serwer proxy i jak skonfigurować przeglądarkę, żeby go używać i jak zablokować możliwość jego ominięcia przez przeglądarkę. Na pewno nie chodzi o to, żeby stworzyć program, w którym użytkownik wpisuje adres bo to powinien robić w przeglądarce. Podejrzewam, że w tym wypadku chodzi o stworzenie filtra dzięki któremu dzieci używający przeglądarki mogłyby surfować po sieci.

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