Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

przecięcia zera, podstawy programowania w C

ruda125 21 Paź 2010 19:00 2682 5
  • #1 21 Paź 2010 19:00
    ruda125
    Poziom 1  

    witaj!
    prosilabym o wytlumaczenie mi tego programu, najbradziej zalez mi na zrozumieniu tresci, a dokladniej o co chodzi z trescia, ktora dalam kursywa. z gory dzieki:)

    Zaproponować i zapisać kompletny algorytm pozwalający na realizację następującego zadania:


    Napisać program, który ma odczytywać sekwencję liczb całkowitych z terminala i wyliczać częstotliwość wystąpień przecięć zera we wczytywanym strumieniu wejściowym. Przecięcie zera następuje każdorazowo, gdy po wartości dodatniej następuje wartość ujemna lub po wartości ujemnej dodatnia (także, gdy między tymi wartościami pojawia się jedno lub więcej zer). W przypadku wykroczenia wyliczanej częstotliwości poza zadany przedział na wyjściu programu powinien pojawić się odpowiedni komunikat. W szczególności:
    -pod uwagę mają być brane jedynie liczby z przedziału od -10 do 10 oraz liczba 99 oznaczająca koniec strumienia danych; pozostałe wartości są uznawane za niepoprawne i pomijane;
    -częstotliwość ma być określana jako liczba wystąpień przecięcia zera w kolejnych grupach złożonych z 99 liczb
    - wartość częstotliwości spoza przedziału od 5 do 8 uznawana jest za niepoprawną i powoduje pojawienie się na wyjściu programu odpowiedniego komunikatu; w pozostałych przypadkach nie jest generowany żaden komunikat.

    Wskazać warunek stopu algorytmu.

    Zaproponować efektywny sposób przetestowania programu realizującego algorytm.

    Zadeklarować stałe symboliczne mające sens w przypadku rozpatrywanego algorytmu zgodnie ze składnią języka ANSI C.

    Zadeklarować zmienne potrzebne do implementacji algorytmu zgodnie ze składnią języka ANSI C.

    Uwagi do wymagań wstępnych

    W celu realizacji określonych powyżej wymagań wstępnych:
    Przeanalizuj kompletność podanego zadania algorytmicznego. Ewentualnie uzupełnij jego specyfikację.
    Zidentyfikuj wszystkie stałe, określone w treści zadania algorytmicznego.
    Zidentyfikuj dane wejściowe i wyjściowe algorytmu.
    W zbiorze danych wejściowych określ te, które są uznawane za poprawne.
    Określ relację pomiędzy poprawnymi danymi wejściowymi a wyjściowymi (zobacz wskazówka 1 poniżej).
    Zaproponuj strukturę danych niezbędną do rozwiązania problemu.
    Zaproponuj algorytm rozwiązujący zadanie bez podziału danych wejściowych na grupy.
    Zmodyfikuj zaproponowany algorytm tak, by uwzględniał konieczność podziału danych wejściowych na grupy (zobacz wskazówka 2). Zapisz ostateczną postać algorytmu za pomocą diagramu algorytmu.

    Wskazówki
    Proszę zauważ, że do poprawnej identyfikacji wystąpienia w danym miejscu przecięcia zera potrzebne są jedynie dwie wartości z podawanej sekwencji i tyle tylko ze strumienia danych wejściowych należy zapamiętywać w programie - przecięcie następuje, jeśli te wartości są przeciwnych znaków.
    Zastanów się, co zaproponowany algorytm będzie robił, gdy przecięcie pojawi się na granicy pomiędzy kolejnymi grupami (np. ostatnia liczba w poprzedniej grupie dodatnia, pierwsza w następnej - ujemna) - takie przecięcie nie powinno zostać zaliczone do żadnej z grup.

    0 5
  • #2 21 Paź 2010 19:56
    s36725
    Poziom 16  

    Program jako wejście ma otrzymać ciągi składające się z 99 liczb z zakresu <-10;10>. Każda liczba spoza zakresu jest pomijana i nie jest wliczana do ciągu.
    Wczytywanie danych kończy się, gdy wczytana zostanie liczba 99 oznaczająca koniec strumienia wejściowego.

    Przykładowy ciąg wygląda następująco:
    1 3 6 2 -3 -2 -6 -4 1 3 (...)

    Program ma określić ile razy w ciągach wystąpiło "przejście przez zero", czyli zmiana znaku z ujemnego na dodatni lub odwrotnie (zobrazowana przeze mnie poprzez zmianę koloru liczb - we wskazanym ciągu 2 razy)

    0
  • #3 21 Paź 2010 20:15
    arnoldziq
    Moderator Programowanie

    Do autora/autorki tematu :
    Proszę przedstawić swoje postępy w wykonaniu tego zadania, albo cały temat wyląduje w koszu.

    0
  • #4 22 Paź 2010 11:54
    nsvinc
    Poziom 35  

    Szarpanko pisane na kolanie:

    Code:

    char litrzba,poprzednialitrzba,przejscia=0;
    do
    {
    litrzba=WezLitrzbe();
    if ((litrzba<(-10))&&(litrzba>10))
    {
    if ((poprzednialitrzba<=0)&&(litrzba>0)) przejscia++;
    if ((poprzednialitrzba>0)&&(litrzba<=0)) przejscia++;
    poprzednialitrzba=litrzba;
    };
    }
    while(litrzba!=99);

    To oczywiście gdzieś ma błędy, chociażby wynik algorytmu za pierwszym obrotem pętli gdy kontrola wejdzie do "dużego" ifa... jedyne co chciałem wskazać to potencjalną trywialność zadanego algorytmu :] Mniej więcej na czymś takim to polega...
    Mogę to napisać od początku do końca, zainteresowani niech piszą pm.

    0
  • #5 22 Paź 2010 13:07
    przemo_wielki
    Poziom 23  

    Nie chciałbym być nie uprzejmy ale notoryczne powtarzanie słowa "litrzba" ...

    0
  • #6 22 Paź 2010 13:14
    nsvinc
    Poziom 35  

    Ale tak miało być :] Ten kod jest demonstracyjny, no a programistycznego poczucia humoru nie moze brakować :D

    0