Najlepszą metodą nauki programowania jest rozwiązywanie zadań. Poniżej znajduje się kilka problemów programistycznych oraz przykładowych sposobów ich rozwiązania.
Dana jest tablica szarpana tab. Należy na jej podstawie utworzyć tablicę prostokątną w puste miejsca wstawiając wartość -5
W treści zadania nie ma nic na temat pisania funkcji, wyświetlania itp, więc wystarczy stworzyć nową tablicę wypełnioną odpowiednimi wartościami. A więc co trzeba zrobić? Na pewno trzeba stworzyć tablicę. Pytanie tylko o jakich wymiarach. Ilość wierszy będzie taka sama jak w tablicy wejściowej. Ilość kolumn trzeba wyliczyć. Jeśli tablica początkowa jest szarpana a wyjściowa ma być prostokątna, to oczywiste jest że ilość kolum w tablicy wyjściowej musi być taka sama jak w najdłuższym wierszu tablicy początkowej. No to tablica już jest, teraz trzeba ją jakoś wypełnić. Potrzebna będzie na pewno jedna pętla przechodząca wiersz po wierszu.
for(int i = 0; i < tabWejsciowa.lenght ; i++){
W Å›rodku tej pÄ™tli trzeba najpierw przepisać wszystkie elementy z tablicy wejÅ›ciowej – mniej wiecej tak:
for(int j = 0; j < tabWejsciowa[i].length ; j++){
tabWyjsciowa[i][j] = tabWejscjowa[i][j];
}
No i teraz trzeba tylko w pozostałe elementy wpisać -5. Tu będzie trochę liczenia. Na pewno trzeba to zrobić pętlą. Pętla musi zaczynać się od pierwszego elementu ponad wielkość tego wiersza z tablicy początkowej. To znaczy że jeśli ten wiersz w tablicy początkowej miał długość 5, to trzeba zacząć od 5 elementu w tej tablicy (tutaj trzeba pamiętać o przesunięciu w numerowaniu tablic). Pętla ma się kończyć na elemencie o jeden mniejszym niż długość tablicy wyjściowej. Trochę to wygląda skomplikowanie, ale po zapisaniu wygląda już lepiej:
for(int j = tabWejsciowa[i].lenght; j < tabWyjsciowa[i].lenght ; j++){
No i w tej pętli każdemu elementowi przypisujemy wartośc -5:
tabWyjsciowa[i][j] = -5;
Tu trzeba zauważyć, że w przypadku tego najdłuższego wiersza, gdzie żaden z elementów nie ma być wypełniony wartością -5, ta pętla nie wykona się wcale, bo od razu długość tabWejsciowa[i] jest równa tabWyjsciowa[i], więc warunek od razu jest fałszywy. No i to jest w zasadzie koniec zadania.
Dane są dwie tablice kwadratwe i takich samych rozmiarach. Należy zaimplementować mnożenie macierzy traktując tablice wejściowe jako macierze.
Mnożenie macierzy byÅ‚o na wykÅ‚adach i ćwiczeniach z algebry, wiÄ™c każdy powinien wiedzieć jak to ma wyglÄ…dać. Na poczÄ…tek trzeba sobie zdefiniować jakÄ…Å› tablicÄ™ wyjÅ›ciowÄ…. Wielkość tablicy wyjÅ›ciowej wylicza siÄ™ z wielkoÅ›ci tablic wejÅ›ciowych, ze wzoru na mnożenie macierzy. IloÅ›c wierszy w tablicy wyjÅ›ciowej ma być taka jak ilość wierszy w pierwszej tablicy wejÅ›ciowej, a ilość kolumn w tablicy wyjÅ›ciowej ma być taka jak ilość kolumn w drugiej tablicy wejÅ›ciowej. Dalej mnożenie ma być wykonane kilkoma pÄ™tlami. Nie jest to najprostsze – trzeba zastanowić siÄ™ jak po kolei trzeba mnożyć elementy. Powinno to wyglÄ…dać mniej wiÄ™cej tak (nie sprawdzaÅ‚em czy dziaÅ‚a):
for(int i = 0; i < wyjsciowa.lenght ; i++){
for(int j = 0; i < wyjsciowa[i].lenght ; j++){
wyjsciowa[i][j] = 0;
for( int k = 0; i < wejsciowa1.lenght ; k++){
wyjsciowa[i][j] += wejsciowa1[i][k] * wejsciowa2[k][j];
}
}
}
Nie jestem pewien czy to dobrze działa, więc może wyjaśnię jak to ma działać. Po kolei przechodzimy przez całą tablicę wyjściową. Dla pierwszego wiersza i pierwszej kolumny tablicy wyjściowej trzeba wymnażać i dodawać elementy pierwszego wiersza pierwszej tablicy wejściowej z elementami z pierwszej kolumny drugiej tablicy wyjściowej tak, że pierwszy element wiersza jest mnożony z pierwszym elementem kolumny. A więc teoretycznie powinno to działać.
Napisać funkcję int findAll(int wrt, int[][] tab) która policzy ile jest w tablicy tab wartości takich samych jak wrt i zwróci tę informację.
To zadanie jest prawie identyczne jak wyszukiwanie wartości parzystych w przykładach z artykułu Java: Funkcje, z tym, że sprawdzanie czy element jest parzysty trzeba zamienić na sprawdzenie, czy element jest równy wartości wrt. Reszta jest identyczna.
Napisać funkcję void mirror(int[][] tab), która odwróci tablicę tab najpierw względem pionowej osi tablicy, a następnie względem jej osi pionowej.
Nie bardzo wiadomo, co tu trzeba zrobić z tÄ… tablicÄ…, bo funkcja nic nie zwraca ani nic w treÅ›ci zadania nie jest powiedziane, czy ma ona być wyÅ›wietlana, wiÄ™c załóżmy, że ma być poprostu przeksztaÅ‚cona do innej zmiennej. W takim przypadku zadanie polega na napisaniu pÄ™tli kopiujÄ…cej tablicÄ™, ale od koÅ„ca – najpierw od koÅ„ca w drugiej pÄ™tli, a później od koÅ„ca w pierwszej pÄ™tli. PÄ™tlÄ™ od koÅ„ca pisze siÄ™ tak jak przy wyÅ›wietlaniu stringa od koÅ„ca. Utrudnieniem jest tutaj to, że wewnÄ…trz jednej pÄ™tli jedne wartoÅ›ci rosnÄ… a drugie malejÄ… – można to rozwiÄ…zać Å‚atwym wyliczeniem: jeÅ›li wartoÅ›ci malejÄ…, to wartość rosnÄ…cÄ… oblicz siÄ™ od maksymalnej odejmuje siÄ™ tÄ… wartość malejÄ…cÄ…. WyglÄ…dać ma to mniej wiÄ™cej tak:
int[][] out = new int[tab.lenght][tab[0].lenght];
int[][] out2 = new int[tab.lenght][tab[0].lenght];
// Przekształcanie według osi pionowej
for(int i = 0; i < tab.lenght ; i++){
for(int j = tab[i].lenght - 1; j >= 0; j--){
out[i][tab[i].lenght - j - 1] = out[i][j];
}
}
for(int i = tab.lenght - 1; i >= 0 ; i--){
for(int j = 0; j <= tab.lenght; j++){
out[tab[i].lenght - i - 1][j] = out[i][j];
}
}
Napisać funkcję int[][] subTab(int[][] tab, int x, int y, int sizeX, int sizeY), która z wybranej tablicy tab wyekstrachuje od elementu opisanego zmiennymi x, y podtablice o rozmiarach sizeX na sizeY.
Tutaj sprawa polega po prostu na odpowiednim napisaniu pętli kopiującej. Poprostu pierwsza pętla ma się zaczynać od x i trwać do x+sizeX-1 a druga pętla ma zaczynać się od y i trwać do y+sizeY-1. Trzeba jednak pamiętać, że element o indeksie x z tablicy wejściowej ma mieć indeks 0 w tablicy wyjściowej. Tabela wyjściowa ma mieć rozmiary sizeXxsizeY. A pętle mają wyglądać mniej więcej tak:
for(int i = x; i < x + sizeX ; i++){
for(int j = y; j < y + sizeY ; j++){
out[i - x][j - y] = tab[i][j];
}
}
I tyle. Wystarczy teraz zwrócić tablicę out.
Napisać funkcję rekurencyjną void fun1(String str), która odwróci dowolny ciąg znaków
Nie jest napisane co ma siÄ™ dziać z tym odwróconym ciÄ…giem znaków, wiÄ™c chyba trzeba go wyÅ›wietlić. Jest pewnie kilka sposobów na wykonanie tego zadania, ale ja wymyÅ›liÅ‚em takie coÅ›. Jako że ta funkcja ma wykonywać coÅ› od koÅ„ca, to wywoÅ‚anie przez funkcjÄ™ samej siebie musi być dokonane na poczÄ…tku, przed wyÅ›wietleniem literki. A wiÄ™c bÄ™dziemy upraszczać string co raz bardziej. Jako że mamy wyÅ›wietlić tekst od koÅ„ca, to trzeba dążyć do tego, żeby w stringu byÅ‚a tylko jedna litera – ostatnia. JeÅ›li w stringu jest wiÄ™cej niż jedna litera, to trzeba go uproÅ›cić, czyli funkcja ma wykonać samÄ… siebiÄ™ z uproszczonym stringiem, z obciÄ™tÄ… pierwszÄ… literÄ…. Czyli:
if(str.lenght() > 1){
fun1(str.substr(1));
}
A wiÄ™c dla wywoÅ‚ania funkcji fun1(“test”) funkcja ta bÄ™dzie siÄ™ wywoÅ‚ywać rekurencyjnie tak:
fun1("test");
fun1("est");
fun1("st");
fun1("t");
Po dojÅ›ciu do ostatniego wywoÅ‚ania, funkcja zacznie wykonywać to co jest po tym warunku, który jest napisany wyżej, a później siÄ™ “zwijać”, a wiÄ™c najpierw wykona siÄ™ to co jest po powyższym warunku dla wywoÅ‚ania fun1(“t”), później dla fun1(“st”) i tak dalej. Jak widać, żeby wyÅ›wietlić tekst od koÅ„ca funkcja musi wyÅ›wietlać pierwszÄ… literkÄ™ stringa który dostaÅ‚a. Jako że najpierw wykona siÄ™ to co jest w fun1(“t”), to wyÅ›wietli siÄ™ pierwsza literka stringu “t”, później wykona siÄ™ to co jest w wywoÅ‚aniu fun1(“st”) i tak dalej. A wiÄ™c funkcja musi wyÅ›wietlić pierwszÄ… literÄ™ stringa. Czyli:
System.out.print(str.charAt(0));
I teraz trzeba posklejać tą funkcję:
void fun1(String str){
if(str.lenght() > 1){
fun1(str.substr(1));
}
System.out.print(str.charAt(0));
}


Tagi:
Zostaw komentarz