Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

Podobne dokumenty
Algorytm selekcji Hoare a. Łukasz Miemus

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Analiza algorytmów zadania podstawowe

Programowanie Proceduralne

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

ALGORYTMY I STRUKTURY DANYCH

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

PDF stworzony przez wersję demonstracyjną pdffactory Pro Program 15

Zasady zaliczania przedmiotu. Wstęp do informatyki, I rok Matematyki, 2015/2016. Na zaliczenie przedmiotu składają się:

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Strategia "dziel i zwyciężaj"

Język C, tablice i funkcje (laboratorium)

Język C, tablice i funkcje (laboratorium, EE1-DI)

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Algorytmy sortujące i wyszukujące

tablica: dane_liczbowe

Wstęp do programowania

Zaawansowane algorytmy i struktury danych

- - Ocena wykonaniu zad3. Brak zad3

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Sortowanie przez wstawianie Insertion Sort

Sortowanie - wybrane algorytmy

Wykład 5_2 Algorytm ograniczania liczby serii za pomocą kopcowego rozdzielania serii początkowych

Lab 9 Podstawy Programowania

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Wskaźniki. Programowanie Proceduralne 1

Tablice jednowymiarowe

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Wybrane algorytmy tablicowe

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

Podstawy informatyki I r.

Wstęp do programowania

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Podstawy Programowania 1 Sortowanie tablic jednowymiarowych. Plan. Sortowanie. Sortowanie Rodzaje sortowania. Notatki. Notatki. Notatki.

Wstęp do programowania

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Podstawy Programowania C++

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Laboratorium nr 7 Sortowanie

Podstawy programowania

Programowanie w VB Proste algorytmy sortowania

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Algorytmy i Struktury Danych

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Algorytmy sortujące. sortowanie kubełkowe, sortowanie grzebieniowe

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Programowanie - wykład 4

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Algorytmy i Struktury Danych. (c) Marcin Sydow. Sortowanie Selection Sort Insertion Sort Merge Sort. Sortowanie 1. Listy dowiązaniowe.

Wstęp do programowania

liniowa - elementy następują jeden za drugim. Graficznie możemy przedstawić to tak:

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Algorytmy. Programowanie Proceduralne 1

Matematyczne Podstawy Informatyki

Metodyki i Techniki Programowania 2

Wskaźniki w C. Anna Gogolińska

Podstawy Informatyki. Sprawność algorytmów

Wstęp do programowania

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Algorytmy i Struktury Danych. (c) Marcin Sydow. Introduction. QuickSort. Sortowanie 2. Limit. CountSort. RadixSort. Summary

Podstawy programowania w języku C++

Stałe, tablice dynamiczne i wielowymiarowe

Algorytmy i Struktury Danych.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Proste algorytmy w języku C

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Metody Metody, parametry, zwracanie wartości

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Algorytmy i Struktury Danych. Anna Paszyńska

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

2 Przygotował: mgr inż. Maciej Lasota

Podstawy programowania w języku C++

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Wykład 2. Poprawność algorytmów

Algorytmy i Struktury Danych, 2. ćwiczenia

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Algorytmy. Programowanie Proceduralne 1

Sortowanie. LABORKA Piotr Ciskowski

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Transkrypt:

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : 15 1 grudnia 005.) 1. Program w C 1 zawiera deklaracje 1 void P1 ( int a, int b) { int i ; 3 for ( i =0;i <10; i++) a [ i ] = b[9 i ] ; 4 } 5 6 void P ( int a, int b [ ] ) { 7 int i ; 8 for ( i =0;i <10; i++) a [ i ] = b[9 i ] ; 9 } 10 11 void P3 ( int a, int b) { 1 int i ; 13 for ( i =1;i <10; i++) b [ i ] = a [ i 1]; 14 } Jaka będzie zawartość tablicy c po wykonaniu instrukcji P1 ( c, c ), P ( c, c ) oraz P3 ( c, c ), jeśli przed wykonaniem każdej z tych instrukcji tablica ta zawiera liczby 1,...,10, tj. c[i-1] = i dla i = 1,...,10? Procedury P1 i P tylko pozornie różnią się sposobem przekazania tablicy b do procedury. Przekazując tablicę jako parametr podprogramu, przekazujemy w istocie wskaźnik (adres) pierwszego elementu. Dlatego w obu przypadkach efekt wywołania będzie taki sam. Aby zabezpieczyć się przed przypadkową modyfikacją zawartości tablicy, można zastosować słowo kluczowe const. 3 void P1 ( int a, int b) { 4 int i ; 5 for ( i =0;i <10; i++) a [ i ] = b[9 i ] ; 6 } 7 8 void P ( int a, int b [ ] ) { 9 int i ; 10 for ( i =0;i <10; i++) a [ i ] = b[9 i ] ; 11 } 1 1 W roku akademickim 005/006 językiem wykładowym był Pascal. Tu zadania z kolokwium zostały przetłumaczone na język C. 13 void P3 ( int a, int b) { 14 int i ; 15 for ( i =1;i <10; i++) b [ i ] = a [ i 1]; 16 } 17 18 void wypisz ( const int c ) { 19 int i ; 0 for ( i =0; i <10; i++) printf ("%d ", c [ i ] ) ; 1 } 3 void i n i c j u j ( int c ){ 4 int i ; 5 for ( i =0; i <10; i++) c [ i ] = i +1; 6 } 7 8 int main () { 9 int c [ 9 ] ; 30 31 i n i c j u j ( c ) ; printf ("P1: ") ; P1(c, c ) ; wypisz ( c ) ; 3 i n i c j u j ( c ) ; printf ("P: ") ; P(c, c ) ; wypisz ( c ) ; 33 i n i c j u j ( c ) ; printf ("P3: ") ; P3(c, c ) ; wypisz ( c ) ; 34 35 return 0; 36 } 37 38 Wynik : 39 P1: 10 9 8 7 6 6 7 8 9 10 40 P: 10 9 8 7 6 6 7 8 9 10 41 P3: 1 1 1 1 1 1 1 1 1 1 4 /. Tablica a na pozycjach od 0 do 9 zawiera liczby od 1 do 10 uporządkowane rosnąco. Liczby w tej tablicy zostały następnie posortowane algorytmem HeapSort (priorytet każdej liczby jest równy tej liczbie). Ile przestawień było wykonanych? Podaj zawartość tablicy po każdym przestawieniu. Opis algorytmu można znaleźć w skrypcie do wykładu. Zamieszczony niżej program nie jest wymaganą częścią rozwiązania, ale może być użyty do sprawdzenia rozwiązania podanego dalej. zamiana elementow / 3 void Swap( int a, int b){ 4 int pom; 5 pom = a ; 6 a = b ; 7 b = pom; 8 }Swap /

9 procedura przywraca porzadek w kopcu / 10 f pozycja elementu, ktory nie j e s t na swoim miejscu / 11 l indeks ostatniego elementu w tablicy / 1 void DownHeap( int tab [ ], int f, int l ) { 13 indeksy korzeni poddrzew wierzcholka f / 14 int i, j, k ; 15 i = f + 1; 16 while ( i <=l ){ 17 j = i +1; 18 i f ( j <= l ) 19 i f ( tab [ j ] > tab [ i ] ) i =j ; 0 1 i f ( tab [ i ] > tab [ f ] ) { Swap( &tab [ i ], &tab [ f ] ) ; } 3 for ( k=0; k<10; k++) printf ("%d ", tab [ k ] ) ; printf ("\n") ; 4 f= i ; 5 i = f +1; 6 i f / 7 e lse break ; 8 while / 9 }DownHeap / 30 31 void HeapSort ( int tab [ ], int n ) { 3 int i, k ; 33 tworzenie kopca / 34 printf ("Tworzenie kopca :\n") ; 35 for ( i = n/ 1; i >=0;i ) 36 DownHeap( tab, i, n 1) ; 37 sortowanie "skopcowanej" tablicy / 38 printf ("Sortowanie :\n") ; 39 for ( i = n 1;i >0;i ) { 40 kopiec zawiera element o najwiekszym priorytecie na pozycji 0 w tablicy / 41 Swap (&tab [0],& tab [ i ] ) ; 4 ustalamy pierwszy element na docelowej pozycji / 43 printf ("Swap : ") ; for ( k=0; k<10; k++) printf ("%d ", tab [ k ] ) ; printf ("\n") ; 44 porzadkujemy mniejszy ko p i ec / 45 DownHeap( tab,0, i 1) ; 46 } 47 }HeapSort / 48 49 Testuejmy rozwiazanie / 50 int main() { 51 int c [ 1 0 ] ; 5 int i ; 53 for ( i =0; i <10; i++) c [ i ] = i +1; 54 HeapSort ( c, 10 ) ; 55 return 0; 56 } 57 58 Wynik dzialania programu 59 60 Tworzenie kopca : 61 1 3 4 10 6 7 8 9 5 6 1 3 9 10 6 7 8 4 5 63 1 7 9 10 6 3 8 4 5 64 1 10 7 9 6 3 8 4 5 65 1 10 7 9 5 6 3 8 4 66 10 1 7 9 5 6 3 8 4 67 10 9 7 1 5 6 3 8 4 68 10 9 7 8 5 6 3 1 4 69 Sortowanie : 70 Swap : 9 7 8 5 6 3 1 4 10 71 9 7 8 5 6 3 1 4 10 7 9 8 7 5 6 3 1 4 10 73 9 8 7 4 5 6 3 1 10 74 Swap : 8 7 4 5 6 3 1 9 10 75 8 7 4 5 6 3 1 9 10 76 8 5 7 4 6 3 1 9 10 77 Swap : 1 5 7 4 6 3 8 9 10 78 7 5 1 4 6 3 8 9 10 79 7 5 6 4 1 3 8 9 10 80 Swap : 3 5 6 4 1 7 8 9 10 81 6 5 3 4 1 7 8 9 10 8 Swap : 1 5 3 4 6 7 8 9 10 83 5 1 3 4 6 7 8 9 10 84 5 4 3 1 6 7 8 9 10 85 Swap : 4 3 1 5 6 7 8 9 10 86 4 3 1 5 6 7 8 9 10 87 Swap : 1 3 4 5 6 7 8 9 10 88 3 1 4 5 6 7 8 9 10 89 Swap : 1 3 4 5 6 7 8 9 10 90 1 3 4 5 6 7 8 9 10 91 Swap : 1 3 4 5 6 7 8 9 10 9 / Całkowita liczba przestawień sklada się z 8 przestawień podczas budowy kopca, 9 przestawień na miejsca docelowe w algorytmie HeapSort (oznaczone Swap) oraz 13 przestawień porządkujacych kopiec. Razem 30 przestawień.

3. Algorytm znajdowania liczb pierwszych został zrealizowany w następujący sposób: 1 #define n 1000 rozmiar tablicy / 3 void Sito ( int tab ) { 4 int i, j ; 5 for ( i =;i<n ; i++) tab [ i ] = 1; 6 7 for ( i =; i < n/; i++) { 8 j = i+i ; 9 while ( j < n ) { 10 tab [ j ] = 0; 11 j += i ; 1 } while / 13 } for / 14 } Sito / Wskaż numer linii z instrukcją, którą można uznać za operację dominującą w tym algorytmie. Oblicz jego koszt. Wiedząc, że n i= 1 i < lnn dla n, oszacuj rząd złożoności tego algorytmu w zależności od n. Wyznaczanie kosztu można sprowadzić do liczenia tzw. operacji dominujących. Operacje dominujące to takie działania w algorytmie, którym można przyporządkować co najwyżej pewną ustaloną liczbę pozostałych operacji. Operacją dominującą jest przypisanie w lini 10. Algorytm znajdowania liczb pierwszych dla każdej liczby d n (pętla for) wykona n d operacji (pętla while). W sumie będzie to n (1 + 1 3 + 1 4 +...+ 1 n). Wiedząc, że n i= 1 i < lnn otrzymujemy: ( n 1 + 1 3 + 1 4 +...+ 1 ) n n ln n. Rząd złożoności algorytmu jest równy nlogn. 1 #include <stdio. h> 3 #include <stdlib. h> 4 5 int liniowe ( int n, int x, const int a) { 6 int i, min, result =0; 7 sprawdzamy po k o l e i wszystko / 8 min = abs (a[0] x) ; 9 for ( i =1;i<n ; i++) { 10 i f ( abs (a [ i ] x)<min) result = i ; 11 } for / 1 return result ; 13 } liniowe / 14 15 optymalne wskazowka rozwiazania / 16 int logartymiczne ( int n, int x, const int a) { 17 int l, r, p ; 18 } 19 osobno sprawdzamy, czy x n i e j e s t miedzy pierwszym i ostatnim, / 0 t j. najmniejszym i najwiekszym / 1 i f ( x <= a [ 0 ] ) return 0; e l se i f ( x >= a [ n 1] ) return n 1; 3 j e s l i j e s t, to wykonujemy wyszukiwanie binarne / 4 l = 0; r = n 1; 5 while ( r l > 1 ) { 6 p = ( r+1)/; 7 (x <= a [ p ] )? r = p : l = p ; 8 while / 9 i f ( l == r ) 30 return l ; 31 e l se 3 return ( abs (a [ l ] x) < abs (a [ r] x ) ) l? r ; 33 }logarytmiczne / 4. Tablica a, indeksowana od 0 do n 1 (n > 0) zawiera ciąg n liczb uporządkowany niemalejąco. Napisz podprogram w C, który dla ustalonego x (podanego jako parametr) znajduje w takiej tablicy liczbę a[i] taką, że x a[i] x a[j] dla j=1,...,n. Indeks i ma być wynikiem. Zrealizowany algorytm ma być możliwie szybki, ale przede wszystkim poprawny i dobrze objaśniony (za pomocą komentarzy w kodzie lub dodatkowego opisu). Podaj złożoność tego algorytmu. Można użyć standardowej w C funkcji abs z biblioteki <stdlib.h>, która oblicza wartość bezwzględną parametru. Typem tej funkcji jest int.

Kolokwium ze Wstępu do Informatyki, I rok Mat. (Ściśle tajne przed godz. 1 : 15 10 grudnia 007.) Proszę bardzo uważnie przeczytać treść zadań. Na ocenę bardzo duży wpływ będzie miała czytelność rozwiązań i poprawność uzasadnienia każdej odpowiedzi. 1. Podany niżej podprogram w C: 1 void SelectionSort ( int n, f l oat tab [ ] ) { int i, j, k ; 3 f loat a ; 4 5 for ( i = n 1; i > 0; i ) { 6 for ( k = i, j = k 1; j >= 0; j ) 7 i f ( tab [ j ] > tab [ k ] ) k = j ; 8 a = tab [ k ] ; 9 tab [ k ] = tab [ i ] ; 10 tab [ i ] = a ; 11 } 1 } SelectionSort / realizuje tzw. algorytm sortowania przez wybieranie. Wskaż operację dominującą w tym algorytmie i oblicz jego złożoność pesymistyczną i optymistyczną w zależności od długości sortowanego ciągu. Co można powiedzieć o złożoności średniej tego algorytmu? Operacją dominującą jest porównanie w lini 7 procedury SelectionSort. Szukamy w zbiorze elementu największego i wymieniamy go z elementem na ostatniej pozycji. W ten sposób element najmniejszy znajdzie się na swojej docelowej pozycji. W identyczny sposób postępujemy z resztą elementów należących do zbioru. Znów wyszukujemy element największy i zamieniamy go z elementem na przedostatniej pozycji. Otrzymamy dwa posortowane elementy. Procedurę kontynuujemy dla pozostałych elementów dotąd, aż wszystkie będą posortowane. W zagnieżdzonej pętli for mamy kolejno n 1,n,...,1 porównań. (n 1)+(n )+...+1 = n (n 1) Algorytm zawsze wykona taką sama liczbę operacji dominujących, więc złożoność pesymistyczna, optymistyczna oraz średnia są sobie równe. Rząd tych wszystkich złożoności jest równy n.. W tablicy tab znajduje się początkowo następujący ciąg liczb: 1,1,11,,10,3,9,4,8,5,7,6 Przyjmujemy, że priorytetem liczby jest ona sama. Rozważamy dwa sposoby uporządkowania kopca zbudowanego z tych liczb: a) for ( i = 1; i < 1; i++ ) UpHeap ( tab, i ); b) for ( i = 5; i >= 0; i-- ) DownHeap ( tab, i, 11 ); Dla każdego z tych sposobów podaj wynik, czyli narysuj uporządkowany kopiec lub napisz wynikowy ciąg elementów w tablicy, oraz podaj liczbę wykonanych operacji porównywania priorytetów. Opis algorytmu można znaleźć w skrypcie do wykładu. Zamieszczony program nie jest częścią rozwiązania, ale może być użyty do jego sprawdzenia. zamiana elementow / 3 void Swap( int a, int b){ 4 int pom; 5 pom = a ; 6 a = b ; 7 b = pom; 8 }Swap / 9 } } 10 procedura przywraca porzadek w kopcu / 11 f pozycja elementu, ktory nie j e s t na swoim miejscu / 1 l indeks ostatniego elementu w tablicy / 13 void DownHeap( int tab [ ], int f, int l ) { 14 indeksy korzeni poddrzew wierzcholka f / 15 int i, j, k ; 16 i = f + 1; 17 while ( i <=l ){ 18 j = i +1; 19 i f ( j <= l ) 0 i f ( tab [ j ] > tab [ i ] ) { 1 i =j ; for ( k=0; k<1; k++) printf ("%d ", tab [ k ] ) ; printf ("\n") ; i f / 3 i f ( tab [ i ] > tab [ f ] ) { 4 Swap( &tab [ i ], &tab [ f ] ) ; 5 for ( k=0; k<1; k++) printf ("%d ", tab [ k ] ) ; printf ("\n") ; 6 f= i ; 7 i = f +1; 8 i f / 9 e lse break ; 30 while / 31 }DownHeap /

3 } 33 procedura przywraca porzadek w kopcu / 34 n indeks ostatniego elementu w tablicy / 35 void UpHeap( int tab [ ], int n) { 36 i indeks wierzcholka "wyzej ", k licznik p e tli for / 37 int i, k ; 38 i = (n 1)/; 39 pniemy s i e w " gore" z konca do indeksu 0 / 40 while (n>0){ 41 porownanie priorytetow / 4 i f ( tab [ n ] > tab [ i ] ) { 43 Swap( &tab [ n ], &tab [ i ] ) ; 44 for ( k=0; k<1; k++) printf ("%d ", tab [ k ] ) ; printf ("\n") ; 45 n = i ; 46 i f / 47 e lse break ; 48 while / 49 }UpHeap / 50 51 Testujemy rozwiazanie / 5 int main() { 53 int tab [ 1 ] = {1,1,11,,10,3,9,4,8,5,7,6}; 54 int i ; 55 printf ("UpHeap:\n") ; 56 for ( i =1; i <1; i++) UpHeap( tab, i ) ; 57 printf ("DownHeap:\n") ; 58 int tab [ 1 ] = {1,1,11,,10,3,9,4,8,5,7,6}; 59 for ( i =5; i >= 0; i ) DownHeap( tab, i,11) ; 60 61 return 0; 6 } 63 64 65 66 Wynik dzialania programu 67 68 UpHeap: 69 1 11 1 10 3 9 4 8 5 7 6 70 1 10 11 1 3 9 4 8 5 7 6 71 1 10 11 4 3 9 1 8 5 7 6 7 1 10 11 8 3 9 1 4 5 7 6 73 1 10 11 8 5 3 9 1 4 7 6 74 1 10 11 8 7 3 9 1 4 5 6 75 1 10 11 8 7 6 9 1 4 5 3 76 DownHeap : 77 1 1 11 10 6 9 4 8 5 7 3 78 1 1 11 10 6 9 4 8 5 7 3 79 1 1 11 10 6 9 4 8 5 7 3 80 1 1 11 8 10 6 9 4 5 7 3 81 1 1 11 8 10 6 9 4 5 7 3 8 1 1 11 8 10 6 9 4 5 7 3 83 1 10 11 8 1 6 9 4 5 7 3 84 1 10 11 8 1 6 9 4 5 7 3 85 1 10 11 8 7 6 9 4 5 1 3 86 / 3. Napisz w języku C (ale czytelnie!) podprogram, którego pierwsze dwa parametry opisują ciąg a 0,...,a n 1 liczb typu float (pierwszy parametr typu int określa długość ciągu, drugi jest tablicą), a następne dwa parametry to wskaźnik m zmiennej typu int i tablica b zmiennych typu int. Zadaniem podprogramu jest znalezienie wszystkich nie dających się wydłużyć podciągów a k,...,a l, złożonych z kolejnych elementów ciągu a 0,...,a n 1, i takich że ciąg iloczynów a k,a k a k+1,...,a k... a l jest ściśle rosnący. Dla każdego takiego podciągu należy do tablicy b wpisać (na kolejnych pozycjach) liczby k i l. Zmiennej wskazywanej przez parametr m należy przypisać liczbę znalezionych podciągów. Należy założyć, że tablica b jest dostatecznie długa. Uwaga: liczby a i nie muszą być dodatnie. #define size_b 1000 zakladamy, ze tablica b j e s t dostatecznie dluga / 3 4 Parametry funkcji zgodnie ze specyfikacja zadania / 5 void Podciagi ( int n, const f l o at a, int m, int b) { 6 int i ; licznik w tabeli a / 7 int j ; licznik konca rosnacego podciagu / 8 int k = 0; licznik w tabeli b / 9 f l o a t pom=0; zmienna pomocnicza / 10 petla po elementach z tabeli a / 11 for ( i =0 ; i<n 1; i++) { 1 czy mamy poczatek ciagu rosnacego? / 13 i f (a [ i ] < a [ i ] a [ i +1]) { 14 wpisujemy indeks poczatku ciagu rosnacego / 15 b [ k ] = i ; k += ; 16 zwiekszamy l i c z b e podciagow rosnacych / 17 m = m +1; 18 19 czy mozemy go przedluzyc? / 0 pom = a [ i ] a [ i +1]; j = i + ; 1 sprawdzamy, jak dlugi j e s t ciag rosnacy / (uwaga na koniec tablicy a) / 3 while (pom < pom a [ j ] && j < n) { 4 pom = a [ j ] ;

5 j++; 6 }while / } 7 wpisujemy indeks konca ciagu rosnacego / 8 b [ k 1] = j 1; 9 i f / 30 for / 31 }Podciagi / 3 33 Procedure Podciagi mozemy przetestowac w programie / 34 int main() 35 { 36 int n=5; rozmiar tablicy tab / 37 f loat tab [ 5 ] = { 1, 1, 1, 1, }; 38 int m = 0, j, l ; 39 int b [ size_d ] ; 40 f o r ( j =0; j<size_d ; j++) 41 b [ j ] = 0; 4 Podciagi (n, tab, &m, b) ; 43 for ( l =0; l<size_d ; l++) 44 printf ("%d ", b [ l ] ) ; 45 printf ("\n") ; 46 } 47 Wynik dzialania programu : 0 1 1 3 3 4 0 0 /