Próbna matura z informatyki - pytania dotyczące zadania 5

2

Witam,
Mam problem z zadaniem 5.1 z matury próbnej 2014/2015:

Mateusz cały rok przygotowuje się do zawodów sportowych w skoku w dal. Codziennie
trenuje, a wynik – długość najdłuższego skoku podaną w centymetrach – zapisuje w pliku
tekstowym dziennik.txt. W pliku tym znajduje się 310 liczb odpowiadających
długościom najlepszych skoków Mateusza w kolejnych dniach treningowych. Każda liczba
jest zapisana w osobnym wierszu.

Przykład:
436
571
569
435

Pozytywną serią treningową Mateusz nazywa każdy ciąg kolejnych dni treningowych,
w czasie których uzyskuje on każdego następnego dnia treningu lepszy rezultat niż dnia
poprzedniego i którego to ciągu nie można przedłużyć (jest to ostatni zanotowany wynik albo
wynik z następnego dnia jest gorszy).

Przykład:
478 475 470 480 481 481 475 477 480 482 470
W tym przypadku najdłuższa pozytywna seria treningowa (podkreślona) trwała 4 dni,
a Mateusz w jej trakcie poprawił swój wynik o 482–475=7 centymetrów.

W wybranym przez siebie języku programowania napisz program, za pomocą którego
uzyskasz odpowiedzi na poniższe pytania.

Zadanie 5.1.
Ile Mateusz miał pozytywnych serii treningowych dłuższych niż 3 dni?

http://www.cke.edu.pl/index.p[...]rmatyka-poziom-rozszerzony-em

Napisałem taki kod:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream odczytZPliku("dziennik.txt");

    ofstream zapisDoPliku("wynik5.txt");

    int liczba = 0, poprzedniaLiczba, dlugoscSerii = 1, liczbaSeriiDlugich = 0;
    odczytZPliku >> poprzedniaLiczba;
    while (odczytZPliku >> liczba)
    {
        if (liczba > poprzedniaLiczba)
        {
            dlugoscSerii++;
        }
        else
        {
            if (dlugoscSerii > 3)
            {
                liczbaSeriiDlugich++;
            }
            dlugoscSerii = 1;
        }

        poprzedniaLiczba = liczba;
    }

    zapisDoPliku << liczbaSeriiDlugich;

    odczytZPliku.close();
    zapisDoPliku.close();

    system("pause");
    return 0;
}

W odpowiedziach jest napisane że prawidłowa odpowiedź to 14, a mi wychodzi 11. Czy mogłby ktoś powiedzieć co robie źle?

0

Na pewno zmienił bym warunek if (liczba > poprzedniaLiczba) na if (liczba >= poprzedniaLiczba) - pozytywna seria jest przerwana gdy jest to ostatni zanotowany wynik albo
wynik z następnego dnia jest gorszy - więc może być równy

Jednak w tym przypadku daje nam wynik 12... więc dalej coś jest nie tak :/

0
#include <iostream>
#include <fstream>
using namespace std;

int main()
  {
   ifstream odczytZPliku("dziennik.txt");
   int poprzedniaLiczba,liczba=0,dlugoscSerii=1,liczbaSeriiDlugich=0;
   for(odczytZPliku>>poprzedniaLiczba;odczytZPliku>>liczba;poprzedniaLiczba=liczba)
     {
      if(liczba>=poprzedniaLiczba) ++dlugoscSerii;
      else
        {
         liczbaSeriiDlugich+=(dlugoscSerii>3);
         dlugoscSerii=1;
        }
     }
   ofstream zapisDoPliku("wynik5.txt");
   zapisDoPliku<<(liczbaSeriiDlugich+(dlugoscSerii>3))<<endl;
   return 0;
  }
1

Wydaje mi się, że zadanie jest źle sformułowane albo źle wyliczone albo jedno i drugie. Wychodzi mi 14 jeśli dodam każdą sekwencje równą 4.
Sekwencje są takie:

# 1 linia:35  ->  419,506,555,598
# 2 linia:39  ->  441,455,517,531
# 3 linia:56  ->  421,535,582,598
# 4 linia:165  ->  423,428,496,510,513,581
# 5 linia:172  ->  433,447,567,600
# 6 linia:183  ->  437,440,464,509
# 7 linia:200  ->  453,469,509,568
# 8 linia:238  ->  416,461,558,583
# 9 linia:247  ->  405,433,483,504,512
#10 linia:263  ->  441,472,507,545
#11 linia:289  ->  441,474,565,569

#4 ma 3 sekwencje 4-elementowe, #9 ma 2 4-elementowe w sumie 14 wszystkich.

Jeśli autorowi chodziło o policzenie wszystkich dłuższych niż 3 dni to prawidłowa odpowiedź to 11 - przy założeniu że liczymy sekwencje 1,2,3,4,5 jako jedną a nie jako dwie [1,2,3,4] i [2,3,4,5].
Ale jeżeli chodziło o policzenie każdej dłuższej od 3 nawet mimo tego, że wchodzi w skład innej jeszcze dłuższej to wynikiem będzie 18 (w #4 jest w sumie 6 sekwencji o długości ponad 3, a w #9 - 3), na taką interpretacje może wskazywać zdanie:

Pozytywną serią treningową Mateusz nazywa każdy ciąg kolejnych dni treningowych

nie najdłuższy ciąg ale każdy

Sytuacje dodatkowo komplikują sesje z dniem bez postępu np:
linia:27 -> 410,458,458,480,495
ale prawdopodobnie można je wykluczyć przez to zdanie:

Pozytywną serią treningową Mateusz nazywa każdy ciąg kolejnych dni treningowych,
w czasie których uzyskuje on każdego następnego dnia treningu lepszy rezultat niż dnia
poprzedniego.

Proponuje rozmowę z nauczycielem albo telefon do komisji :P

0

Dziękuję wszystkim za odpowiedź. Ta matura próbna od CKE to jakieś żarty. Mi w szkole powiedzieli, że CKE nie robi próbnej matury z infy. Na matmie w wersji dla słabowidzących było zadanie (zamknięte) do którego nie było prawidłowej odpowiedzi. Nawet w tablicach matematycznych były błędy.
Czy na prawdziwej maturze też zdarzają się takie błędy ?

0
Wielki Szczur napisał(a):

Pozytywną serią treningową Mateusz nazywa każdy ciąg kolejnych dni treningowych

Pozytywną serią treningową Mateusz nazywa każdy ciąg kolejnych dni treningowych w czasie których uzyskuje on każdego następnego dnia treningu lepszy rezultat niż dnia
poprzedniego i którego to ciągu nie można przedłużyć

Więc nie ma szansy na odpowiedź inna niż 11.

0

W kluczu odpowiedzi jest 14 ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0