Tablice jednowymiarowe
Transkrypt
Tablice jednowymiarowe
Język C++ 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]; Przykład 1 Jeśli chcemy mieć 4 elementy typu całkowitego (int), to definicja tablicy o nazwie tablica wygląda następująco: int tablica[4]; 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, 4, 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[4]; tab[0]=0.5; tab[1]=4; 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. Przykład 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.: Przykład 3 void wypelnij2 (int tab[], int rozmiar) { for (int i=0;i<rozmiar;i++) { cout <<”Podaj wartość elementu”; cin >>tab[i]; } } -1Rafaello Język C++ 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]; Przykład 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. Wejście Pierwszy wiersz zawiera liczbę n – ilość elementów do wczytania. W drugim wierszu podano po spacji n liczb. Wyjście Ciąg liczb podanych na wyjściu w odwrotnej kolejności. Przykład Dla danych: 4 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. Przykład Dla danych: 5 2 1 3 7 4 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. Przykład Dla danych: 4 7 1 7 1 -2Rafaello Język C++ poprawną odpowiedzią jest wynik: 1 Zadanie 4 Zamiana Napisz program, który wczytuje ciąg liczb do 20 elementowej tablicy jednowymiarowej zamienia miejscami element pierwszy z ostatnim, drugi z przedostatnim, itd: Wejście 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 Wyjście W kolejnych wierszach wyjścia należy zapisać elementy pozamieniane miejscami. Przykład Dla pliku wejściowego: 4 2 3 4 1 poprawną odpowiedzią jest wynik: 1 4 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. Wejście Pierwszy i jedyny wiersz wejścia zawiera liczbę całkowitą k z zakresu 2..100. Wyjście W k wierszu wyjścia ma pojawić się k – ty element tablicy. Przykład 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 ? Wejście 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ą. Wyjście -3Rafaello Język C++ W jedynym wierszu standardowego wyjścia zapisz ile kilometrów przeleciał helikopter z dokładnością do dwóch miejsc po kropce. Przykład 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) Wejście 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 Wyjście 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.. Przykład Dla danych wejściowych: 4 4 3 5 2 poprawną odpowiedzią jest: 3.5 4 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. Wejście Pierwszy wiersz wejścia zawiera liczbę całkowitą n z zakresu 2..100 – ilość elementów tablicy. Wyjście W pierwszym wierszu wyjścia należy wypisać: Numer komórki tabeli, w której znajduje się element największy Przykład Dla n=4, 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). Wejście Pierwszy wiersz wejścia zawiera liczbę całkowitą n z zakresu 2..100 – ilość elementów tablicy. Drugi wiersz zawiera szukany element - p Wyjście 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 -4Rafaello Język C++ Przykład 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. Wejście 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 -215… 215-1 Wyjście Długość największego stoku rosnącego. Przykład Dla danych wejściowych: 8 12534598 Poprawną odpowiedzią jest liczba: 4 Zadanie 11 Maksymalna suma Dany jest ciąg liczb całkowitych X1, X2, ..., XN. Opracuj program znajdujący w tym ciągu spójnego fragmentu tzn. podciągu złożonego z pewnej ilości kolejnych elementów XK, XK+1, ..., XJ (gdzie 1 <= k <= j <= n) o największej możliwej sumie. Wejście 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. Wyjście W standardowym wyjściu w jedynym wierszu zapisana jest maksymalna suma fragmentu. Przykład 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. Wejście W pierwszym wierszu standardowego wejścia zapisano jedną liczbę naturalną mieszczącą się w typie int. Wyjście W jedynym wierszu standardowego wyjścia powinna znaleźć się odpowiedź Przykład Dla danej 2545 poprawnym wynikiem jest 5542 -5Rafaello Język C++ 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. Wejście Pierwszy wiersz wejścia zawiera liczbę całkowitą n z zakresu 2..100 – ilość elementów tablicy. Wyjście W pierwszym wierszu wyjścia należy wypisać dwie liczby oddzielone spacją: Element największy i najmniejszy Przykład Dla n=4, 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 an+1=an. Dla i=1, 3, 5, …, n-1 wykonaj: Jeśli xi<=xi+1, to dołącz xi do M, a xi+1 do N, A w przeciwnym razie dołącz xi do N, a xi+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 14 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 Wejście W pierwszym wierszu wejścia zapisano jedną liczbe n z przedziału 2…1000 – ilość liczb w tablicy Wyjście Na standardowym wyjściowym należy zapisać kolejne liczby pierwsze rozdzielone pojedynczą spacją. Przykład 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. Wejście 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 Wyjście Zgodne z przykładem Przykład Dla danych wejściowych: 6 2 -6Rafaello Język C++ 234815 Poprawna odpowiedzią jest ciąg: 231485 Zadanie 16 Scalanie posortowanych tablic Napisz program, który scali dwie posortowane rosnąco tablice o w jedną uporządkowaną niemalejąco. Wejście 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. Wyjście Ciąg liczb posortowanych niemalejąco Przykład Dla danych wejściowych: 45 1259 13479 Poprawną odpowiedzią jest ciąg: 112345799 -7Rafaello