Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Ig0r

Tablica wielowymiarowa znakowa

Rekomendowane odpowiedzi

Dobry wieczór. Jestem na pewnym etapie kształcenia i nauki programowania, próbuję zrobić pewne zadanie, które nie udaje mi się go zrobić. Jego treść brzmi następująco:

 

Dana jest następująca tablica znaków:
char [ ] [ ] tablica5 = {
{’S’ , ’a’ , ’m’ , ’s’ , ’u’ , ’n’ , ’g’ } ,
{’N’ , ’o’ , ’k’ , ’i’ , ’a’ } ,
{’A’ , ’p’ , ’p’ , ’l’ , ’e’ } ,
{’B’ , ’l’ , ’a’ , ’c’ , ’k’ , ’B’ , ’e’ , ’r’ , ’r’ , ’y’ } ,
{’A’ , ’l’ , ’c’ , ’a’ , ’t’ , ’e’ , ’l’ } ,
{’S’ , ’o’ , ’n’ , ’y’ } ,
{’J’ , ’o’ , ’l’ , ’l’ , ’a’}
}
Utwórz program sprawdzający, które z nazw umieszczonych w powyższej tablicy:
• zawierają przynajmniej dwie takie same litery,
• suma wszystkich znaków w słowie jest większa niż 255,
• zawiera przynajmniej jeden znak ’i’,
• zawiera przynajmniej dwa takie same znaki. Następnie wypisz nazwy spełniające przynajmniej 3 z powyższych warunków.

 

O ile tablice wielowymiarowe sprawiają dla mnie trudności, z tablicą jednowymiarową  raczej nie mam problemów. Tak więc utknąłem już w podpunkcie pierwszym, tj. zawierają przynajmniej dwie takie same litery.

Próbuję najpierw to zrobić przy założeniu, jeśli by to była tablica jednowymiarowa. np.:

 

char [ ] tablica6 = {
{’S’ , ’a’ , ’m’ , ’s’ , ’u’ , ’n’ , ’g’ };

 

Jednak i tutaj spotykam się z problemem, gdyż nie potrafię sprawdzić, czy np. litera s się powtarza min. 2 razy czy też nie, oczywiście zakładamy że s i S to jest ta sama litera. Mój poniższy kod jest błędny, gdyż w pętli jest sprawdzany warunek aktualnego elementu (i) z następnym, w kolejnym iteracji pętli sprawdza ten poprzedni z następnym, co jest źle, bo pętla ma przejść przez cały wyraz i sprawdzić, czy występują dwa razy te same litery.

 

char[] tablica6 = { 'S', 'a', 'm', 's', 'u', 'n', 'g'};
        int licznik2 = 0;
        for (int i = 0; i < tablica6.length; i++) {
            if(tablica6[i] == tablica6[i+1]){
                licznik2++;
            }
        }

 

Czy ktoś mógłby mnie naprowadzić na jakieś wskazówki w przypadku wykonania powyższego przykładu jak i dla podpunktu pierwszego (tablica wielowymiarowa)? Pozdrawiam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

to jest prostsze niż się wydaje

masz jawnie podane, że są to znaki typu char czyli zwykłe ASCII więc odpada UTF

robisz więc tablicę np.

 

int freq[256];

 

po jednym elemencie na znak, inicjalizujesz na zero każdy element

potem lecisz po wyrazach i zwiększasz liczniki częstotliwości występowania znaków (czyli robisz histogram)

 

for( int x = 0 ; x < string.length() ; x++ )

freq[string[x]]++;

 

potem wystarczy sprawdzić, czy we freq któryś element ma wartość większą od 1

oczywiście można to usprawnić, że skanowanie stringa będzie przerwanie po pierwszym wystąpieniu elementu > 1

 

dla wielowymiarowej będzie podobnie - dodatkowa tablica stanu dla każdego stringa (4 podane warunki) a główna pętla iteruje się po wyrazach a nie literach

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja tam nie sądzę, żeby wykładowca wymagał od nich czegoś więcej niż zagnieżdżone pętle do szukania powtórzeń. Z resztą dla pojedynczych wyrazów to będzie nawet szybsze niż sama inicjalizacja tablicy freq ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Eleganckie rozwiązanie byłoby z użyciem mapy Char -> Integer. Wtedy nie trzeba orać kodu, gdy dojdą kolejne znaki do sprawdzenia. Do tego jest czytelniejsze, bo freq.get(p) jest jasne i klarowne, a freq[112] to sorry, ale... Kolejna zaleta mapy to łatwe ujednolicenie wielkich i małych liter w razie potrzeby, a magiczną tablicę trzeba będzie ifować i dodawać/odejmować offset równy 32 - kolejna magiczna liczba.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie jestem jeszcze na takim etapie, żeby zrozumieć freq. Może to dla was wygląda prosto, jednak dla mnie to już jest więcej męczenia z tym.

Jak wspomniał kolega wyżej, trzeba użyć zagnieżdżonych pętli, jednak z tym mam problem, ponieważ łatwo się gubię która pętla co robi, no i oczywiście nie do końca rozumiem działania na tablicy dwuwymiarowej. Czarna magia po prostu. Wiem mniej więcej jak operować na tablicach wielowymiarowych, jednak takie skomplikowane działania powodują, że nic nie rozumiem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Konkretnie co z freq jest nie tak? To jest tylko nazwa. Mogłoby być abcd. To:

 

int freq[] = new int[256];

tworzy nową tablicę intów o długości 256 i przypisuje ją do zmiennej freq. Częściej używa się tej składni:

 

int[] freq = new int[256];

i robi to to samo. Natomiast

 

freq[112];

odczytuje 113. element tej tablicy.

 

A pętla, jak to pętla. Kwestia napisania 20 prostych programów dla wprawy.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość

Mi też to wygląda na proste zadanie sprawdzające czy umie się napisać zagnieżdżone pętle. Czarna magia to nie jest, ale każdy to kiedyś widział pierwszy raz więc można zrozumieć, że ktoś ma z tym problem.

 

Najpierw zrób to dla jednego słowa, tak jak próbowałeś. Dopiero potem owiń to w kolejną pętlę która będzie iterować po każdym elemencie-słowie tablicy. To podejście tyczy się pisania algorytmów w ogóle - rozkładasz problem na jak najmniejsze problemy/kroki. Masz tablicę słów -> rozwiąż problem dla 1 słowa. Masz 1 słowo -> porównaj jego litery.

W rozwiązaniu z 1 posta jest wyraźny błąd, bo sprawdzasz tylko elementy sąsiadujące, może się zdarzyć że powtórzy się 1 i 3 i to już nie zadziała. Więc tak na logikę, będąc w środku pętli musisz zapamiętać dany znak, po czym piszesz kolejną pętlę w której iterujesz po każdym znaku (i pomijasz znak który sprawdzasz) i porównujesz z zapamiętanym. Możesz mieć wiele pętli w pętli, niech cię to nie odstrasza, tylko pamiętaj co robisz w danej chwili.

 

Wszystkie te przykłady to wariacja tego samego problemu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Konkretnie co z freq jest nie tak? To jest tylko nazwa. Mogłoby być abcd. To:

 

int freq[] = new int[256];

tworzy nową tablicę intów o długości 256 i przypisuje ją do zmiennej freq. Częściej używa się tej składni:

 

int[] freq = new int[256];

i robi to to samo. Natomiast

 

freq[112];

odczytuje 113. element tej tablicy.

 

A pętla, jak to pętla. Kwestia napisania 20 prostych programów dla wprawy.

 

Ech, myślałem że chodziło Ci o metodę frequency. Zresztą i tak kolega wcześniej tak chaotycznie wytłumaczył, że go nie zrozumiałem.

 

Mi też to wygląda na proste zadanie sprawdzające czy umie się napisać zagnieżdżone pętle. Czarna magia to nie jest, ale każdy to kiedyś widział pierwszy raz więc można zrozumieć, że ktoś ma z tym problem.

 

Najpierw zrób to dla jednego słowa, tak jak próbowałeś. Dopiero potem owiń to w kolejną pętlę która będzie iterować po każdym elemencie-słowie tablicy. To podejście tyczy się pisania algorytmów w ogóle - rozkładasz problem na jak najmniejsze problemy/kroki. Masz tablicę słów -> rozwiąż problem dla 1 słowa. Masz 1 słowo -> porównaj jego litery.

W rozwiązaniu z 1 posta jest wyraźny błąd, bo sprawdzasz tylko elementy sąsiadujące, może się zdarzyć że powtórzy się 1 i 3 i to już nie zadziała. Więc tak na logikę, będąc w środku pętli musisz zapamiętać dany znak, po czym piszesz kolejną pętlę w której iterujesz po każdym znaku (i pomijasz znak który sprawdzasz) i porównujesz z zapamiętanym. Możesz mieć wiele pętli w pętli, niech cię to nie odstrasza, tylko pamiętaj co robisz w danej chwili.

 

Wszystkie te przykłady to wariacja tego samego problemu.

 

Pomógłbyś napisać warunek? Bo siedzę i tak się zastanawiam i nie wiem o co chodzi.

 

char[] tablica = { 'J', 'e', 'n', 'n', 'e', 'j'};
        
        
        for (int i = 0; i < tablica.length; i++) {
            System.out.print(tablica[i] + " ");
        }
        
        
        int licznik = 0;
        for (int i = 0; i < tablica.length; i++) {
            if(){
                licznik++;
            }
            
        }
        
        System.out.println();
        System.out.println("Litery sie powtarzaja " + licznik + " raz/y");

 

Aha i jeszcze jedna uwaga co do wielkości liter. Jak z tym poradzić?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość

Nie bardzo wiem co próbujesz osiągnąć. Tu masz przykładowe rozwiązanie dla 2 liter przy założeniu, że traktujesz małe i duże litery jako tą samą literę. Oczywiście jeśli nie, to zadanie będzie jeszcze łatwiejsze. No i teraz owijasz to wszystko w pętlę która przejedzie się po wszystkich słowach i tyle. Reszta zadań analogicznie.

 


   char[] word = {'S' , 'a' , 'm' , 's' , 'u' , 'n' , 'g' };
   char c1, c2;

   for (int i = 0; i < word.length; i++) {
       c1 = Character.toLowerCase(word[i]);

       System.out.println("Checking letter: " + c1);

       for (int j = 0; j < word.length; j++) {
           c2 = Character.toLowerCase(word[j]);
           if (i != j && c1 == c2) {

               System.out.println("Found same letter! Letter: " + c2);

               return; // co najmniej 2 litery takie same
           }
       }
   }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W rozwiązaniu tego zadania potrzeba znajomości wyrażeń regularnych które na podstawie wzorca np. spr czy dana literka się powtarza ,można poczytać książki na temat wyrażeń lub przejrzeć kursy np na eduweb.pl które ułatwią ci zrozumienie tego zagadnienia i nie tylko. Odnośnie Javy mają bardzo dużo materiałów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...