Tablice jednowymiarowe Gdy mamy do czynienia z zestawem zmiennych, to można z nich zrobić tablicę. Tablica jest ciągiem elementów tego samego typu, który zajmuje ciągły obszar pamięci. Korzyść z zastosowania tablicy jest taka, że zamiast nazywania każdej zmiennej osobno, wystarczy odnieść się do k tego elementu danej tablicy. Deklaracja tablicy typ_elementów nazwa tablicy[liczba_elementów]; 1 Jeśli chcemy mieć elementy typu całkowitego (int), to definicja tablicy o nazwie tablica wygląda następująco: int tablica[]; Elementami tej tablicy są tablica[0] tablica[1] tablica[2] tablica[3] Uwaga: Numeracja elementów tablicy w języku C++ zaczyna się od zera Inicjalizacja tablic Tablicę można zadeklarować i od razu nadać wartości jej elementom np. za pomocą instrukcji: float tab[]=0.5,, 2.17, 100.0101 przy czym nie trzeba określać rozmiaru tablicy, gdyż kompilator rozpozna go po liczbie elementów. Innym sposobem inicjacji tablic jest przypisanie każdemu jej elementowi wartości, np.: float tab[]; tab[0]=0.5; tab[1]=; tab[2]=2.17; tab[3]=100.0101; Przekazywanie tablic do funkcji Funkcja po otrzymaniu tablicy jako argumentu, ma pełen dostęp do zawartości komórek, w których przechowywane są elementy tablicy działa bezpośrednio na tablicy. 2 void wypelnij (int tab[10]) for (int i=0;i<8;i++) cout << Podaj wartość elementu ; cin >>tab[i]; Jeśli chcemy operować na tablicach o różnych rozmiarach, to musimy oprócz tablicy przekazać jeszcze liczbę jej elementów, np.: 3 void wypelnij2 (int tab[], int rozmiar) for (int i=0;i<rozmiar;i++) cout << Podaj wartość elementu ; cin >>tab[i]; -1-
Tablice przesyła się podając tylko jej nazwę, która jest zarazem adresem początku tej tablicy. Dla przykładu 2 wywołanie funkcji będzie wyglądało następująco: wypełnij(tablica); UWAGA: Skoro nazwa tablicy jest równocześnie ADRESEM ZEROWEGO elementu, więc poniższe odwołania są sobie równoważne: Tab + 3 Tab[3] &Tab[3] Tablice dwuwymiarowe Elementami tablicy dwuwymiarowej są jednowymiarowe tablice, z których każda ma tą samą liczbę elementów tego samego typu. Deklaracja tablicy dwuwymiarowej typ_elementów nazwa tablicy[liczba_wierszy][liczba_kolumn]; 3 int liczby[2][3] //deklaracja tablicy o 2 wierszach i 3 kolumnach Zadania Zadanie 1 Odwrotnie Napisz program, który wczytuje n liczb naturalnych większych od zera i mniejszych od 1000 i wypisze je w kolejności odwrotnej. Pierwszy wiersz zawiera liczbę n ilość elementów do wczytania. W drugim wierszu podano po spacji n liczb. Ciąg liczb podanych na wyjściu w odwrotnej kolejności. Dla danych: 2 1 7 11 poprawną odpowiedzią jest: 11 7 1 2 Zadanie 2 Liczba Dany jest ciąg n (n>1 i n<6500) liczb naturalnych nie większych od 1000. Napisz program, który wyznaczy (o ile istnieje) najmniejszą liczbę naturalną, która w nim nie występuje). Jeśli każda z liczb od 1 do 1000 występuje w podanym ciągu program powinien wypisać wówczas liczbę zero. Dla danych: 5 2 1 3 7 poprawną odpowiedzią jest liczba: 5 Zadanie 3 Moda (wartość występująca najczęściej) Danych jest n liczb naturalnych nie większych od 100. Napisz program, który wyznaczy liczbę, która pojawiła się najczęściej. Jeśli istnieje kilka liczb występujących najczęściej wypisz najmniejszą z nich. Dla danych: 7 1 7 1-2-
poprawną odpowiedzią jest wynik: 1 Język C++ Zadanie Zamiana Napisz program, który wczytuje ciąg liczb do 20 elementowej tablicy jednowymiarowej zamienia miejscami element pierwszy z ostatnim, drugi z przedostatnim, itd: Pierwszy wiersz wejścia zawiera liczbę całkowitą n z przedziału 2 20, będąca ilością elementów tablicy. Następny wiersz zawiera oddzielone pojedynczą spacją n liczb z zakresu: -32768 32767 W kolejnych wierszach wyjścia należy zapisać elementy pozamieniane miejscami. Dla pliku wejściowego: 2 3 1 poprawną odpowiedzią jest wynik: 1 3 2 Zadanie 5 Losowe Utwórz program, który do tablicy o nazwie A 100 elementowej zapisze liczby losowe z przedziału 0 100 i wypisze je na ekranie monitora. Wskazówka: Do generowania liczb losowych służy funkcja rand(). Generuje ona liczbę całkowitą od 0 do RAND_MAX. Aby wygenerować liczbę z przedziału <0,a>, napiszemy: d= rand() % (a+1), czyli użyjemy reszty z dzielenia wygenerowanej liczby przez a+1. Aby za każdym razem po uruchomieniu programu otrzymać inną sekwencję liczb losowych należy zainicjować rand() funkcją srand(time(null)). Argument w funkcji srand w postaci time(null) oznacza, że wartość bazową w procesie generowania liczby przyjmowany jest odczytany z zegara czas, jaki upłynął w sekundach od roku 1970. Funkcja rand znajduje się w bibliotece cstdlib. Pierwszy i jedyny wiersz wejścia zawiera liczbę całkowitą k z zakresu 2..100. W k wierszu wyjścia ma pojawić się k ty element tablicy. Dla danej wejściowej: 3 Jedną z możliwych odpowiedzi jest:: A[0]= A[1]= A[2]= Zadanie 6 Helikopter Między miastem A a miastem B odległość wynosi S kilometrów. W tym samym dniu, w tym samym czasie wyjeżdżają z obu miast ku sobie na spotkanie dwaj rowerzyści bez zatrzymywania się z prędkością Vr kilometrów na godzinę, a równocześnie z nimi wylatuje z miejscowości A helikopter lecący z prędkością Vh kilometrów na godzinę. Helikopter, wyprzedziwszy rowerzystę jadącego z miejscowości A, leci na spotkanie drugiego, który wyjechał z miejscowości B. W momencie spotkania go zawraca natychmiast i leci ku pierwszemu, doleciawszy doń znów zawraca i zmierza ku drugiemu i tak powtarza swój lot naprzód i wstecz tak długo, aż się rowerzyści spotkają. Ile kilometrów przeleci helikopter? W pierwszym wierszu standardowego wejścia zapisano trzy wartości Vr(5<=Vr<=100), S(100<=S<=500000) i Vh (100<=Vh<=5000) oddzielone spacją. -3-
W jedynym wierszu standardowego wyjścia zapisz ile kilometrów przeleciał helikopter z dokładnością do dwóch miejsc po kropce. Dla danych 50 300 100 poprawna odpowiedź 300.00 Zadanie 7 Wypełnij Utwórz program z użyciem funkcji, który znajduje średnią ocen zapisanych w jednowymiarowej dwunastoelementowej. Wykorzystaj 3 funkcje: 1. void wypelnij(float tab[], int ilosc) 2. float sumuj (float tab[], int ilosc) 3. void wypisz(float tab[], int ilosc) Pierwszy wiersz wejścia zawiera liczbę całkowitą n ilość ocen. Następne wiersz zawiera n liczb rzeczywistych przedzielonych spacją ocen z poszczególnych przedmiotów W pierwszym wierszu wyjścia ma pojawić się liczba rzeczywista będąca średnią ocen, w następnych wierszach mają być wypisane wszystkie oceny, których wyliczona została średnia.. 3 5 2 poprawną odpowiedzią jest: 3.5 3 5 2 Zadanie 8 Największy Napisz program, który w tablicy o nazwie TAB 100 elementowej zawierającej liczby losowe z przedziału - 100 100 znajdzie element największy. Pierwszy wiersz wejścia zawiera liczbę całkowitą n z zakresu 2..100 ilość elementów tablicy. W pierwszym wierszu wyjścia należy wypisać: Numer komórki tabeli, w której znajduje się element największy Dla n=, p=10 i liczb losowych TAB[0]=23; TAB[1]=10;TAB[2]= -87; TAB[3]=56 poprawną odpowiedzią jest odpowiedź: 3 Zadanie 9 Wyróżniony Napisz program, który w tablicy o nazwie TAB 100 elementowej zawierającej liczby losowe z przedziału - 100 100 znajdzie element wyróżniony (szukany). Pierwszy wiersz wejścia zawiera liczbę całkowitą n z zakresu 2..100 ilość elementów tablicy. Drugi wiersz zawiera szukany element - p W pierwszym wierszu wyjścia należy wypisać: Numer komórki tabeli, w której znajduje się podany element lub słowo NIE, jeśli element nie występuje --
Dla n=3, p=10 i liczb losowych TAB[0]=23; TAB[1]=10;TAB[2]=-87;: poprawną odpowiedzią jest odpowiedź: 1 Zadanie 10 Stok Stokiem rosnącym w tablicy A nazywamy ciąg kolejnych elementów, takich że A[i]<A[i+1] (czyli, każdy kolejny element musi być większy od poprzedniego). Długość stoku rosnącego jest to liczba jego elementów. Dla podanego ciągu liczb wyznacz maksymalną długość stoku rosnącego. Pierwszy wiersz wejścia zawiera liczbę naturalną n z przedziału 3 100 oznaczającą ilość danych. W kolejnym wierszu zapisano n liczb całkowitych z przedziału -2 15 2 15-1 Długość największego stoku rosnącego. 8 1 2 5 3 5 9 8 Poprawną odpowiedzią jest liczba: Zadanie 11 Maksymalna suma Dany jest ciąg liczb całkowitych X 1, X 2,..., X N. Opracuj program znajdujący w tym ciągu spójnego fragmentu tzn. podciągu złożonego z pewnej ilości kolejnych elementów X K, X K+1,..., X J (gdzie 1 <= k <= j <= n) o największej możliwej sumie. W wierszu wejścia zapisane są wartości ciągu z przedziału od -30000 do 30000 oddzielone pojedynczą spacją. Liczba elementów ciągu nie przekracza 60000. Ostatnim znakiem zbioru jest znak końca zbioru EOF. W standardowym wyjściu w jedynym wierszu zapisana jest maksymalna suma fragmentu. Dla danych 2 5-9 3 9-1 2 10 poprawna odpowiedź to 23 Zadanie 12 Zamiana cyfr Jaka największa liczba może być uzyskana z podanej liczby naturalnej, jeżeli dopuszczamy co najwyżej jedną operację zamiany miejscami dwóch cyfr? Napisz algorytm, który rozwiąże to zadanie. W pierwszym wierszu standardowego wejścia zapisano jedną liczbę naturalną mieszczącą się w typie int. W jedynym wierszu standardowego wyjścia powinna znaleźć się odpowiedź Dla danej 255 poprawnym wynikiem jest 552-5-
Zadanie 13 divide and conquer Napisz program, który w tablicy o nazwie TAB 100 elementowej zawierającej liczby losowe z przedziału - 100 100 znajdzie element największy i najmniejszy. Pierwszy wiersz wejścia zawiera liczbę całkowitą n z zakresu 2..100 ilość elementów tablicy. W pierwszym wierszu wyjścia należy wypisać dwie liczby oddzielone spacją: Element największy i najmniejszy Dla n=, p=10 i liczb losowych TAB[0]=23; TAB[1]=10;TAB[2]= -87; TAB[3]=56 poprawną odpowiedzią jest odpowiedź: 56-87 Wskazówka Wykorzystaj tutaj poniższy algorytm: Krok1: Podział zbioru na dzw podzbiory: M zbiór kandydatów na minimum i N zbiór kandydatów na maksimum. Na początku zbiory te są puste. Jeśli n jest liczbą nieparzystą to za a n+1 =a n. Dla i=1, 3, 5,, n-1 wykonaj: Jeśli x i <=x i+1, to dołącz x i do M, a x i+1 do N, A w przeciwnym razie dołącz x i do N, a x i+1 do M Krok 2: Znajdź w zbiorze M element najmniejszy Krok 3: Znajdź w zbiorze N element największy. Oblicz ile porównań wykonuje powyższy algorytm. Zadanie 1 Sito Eratostenesa Napisz program, który wypisze kolejne liczby pierwsze. Skorzystaj z poniższego algorytmu, zwanego sitem Eratostenesa: Dla danego ciągu kolejnych liczb naturalnych począwszy od 2 do n Przyjmujemy, że liczba 2 jest pierwsza, następnie wykreślamy wszystkie wielokrotności liczby 2. Następna nie wykreślona liczba, czyli 3 jest pierwsza. Wykreślamy teraz wszystkie wielokrotności liczby 3. Następna niewykreślona liczba, czyli 5 jest pierwsza, itd. Wykorzystaj tablicę liczb całkowitych o 1000 elementach W pierwszym wierszu wejścia zapisano jedną liczbe n z przedziału 2 1000 ilość liczb w tablicy Na standardowym wyjściowym należy zapisać kolejne liczby pierwsze rozdzielone pojedynczą spacją. Dla danej wejściowej: 20 poprawną odpowiedzią jest ciąg liczb: 2 3 5 7 11 13 17 Zadanie 15 Podział Napisz program, który dla danej tablicy 100 elementowej podzieli ją według elementu wybranego na dwie części: lewą gdzie znajdują się elementy nie większe od wskazanego i prawą gdzie są elementy mniejsze. W pierwszym wierszu wejścia zapisano dwie liczby: liczbę n z przedziału 2 100 ilość liczb w tablicy oraz liczbę k indeks elementu wskazanego Drugi wiersz zawiera n liczb całkowitych elementów tablicy Zgodne z przykładem 6 2-6-
2 3 8 1 5 Poprawna odpowiedzią jest ciąg: 2 3 1 8 5 Język C++ Zadanie 16 Scalanie posortowanych tablic Napisz program, który scali dwie posortowane rosnąco tablice o w jedną uporządkowaną niemalejąco. W pierwszym wierszu wejścia zapisane są dwie liczby naturalne z przedziału od 5 do 100 ilość elementów każdej z posortowanych tablic. Kolejne dwa wiersze zawierają elementy poszczególnych tablic w kolejności rosnącej. Elementy tablicy są niewielkimi liczbami całkowitymi. Ciąg liczb posortowanych niemalejąco 5 1 2 5 9 1 3 7 9 Poprawną odpowiedzią jest ciąg: 1 1 2 3 5 7 9 9-7-