matura informatyka probna

0

Witam, prosze o wytlumacznie jaki blad robie w tym zadaniu i na czym on polega

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?

 #include<cstdlib>
#include<fstream>
using namespace std;
int main ()
{
	ifstream in ("dziennik.txt");
	ofstream out ("wynik5.txt");
	int tab[310];
	int i=1;
	int ile_s=0;
	int ile_wiekszych3=0;
	while(!in.eof())
	{
		in>>tab[i];
		i++;
	}
/*for(int i=0; i<=309; i++)
{
	cout<<"   "<<tab[i];
}*/
for (int i=0;i<=309;i++)
{
if(tab[i]<tab[i+1])
ile_s++;
if(ile_s>3)
ile_wiekszych3++;
}
cout<<ile_wiekszych3;	
system("pause");
return 0;
}
1

ile_s nie jest zerowane po przerwaniu passy, ile_wiekszych3 jest bez sensu, poza tym inne głupie błędy.

4 dni pozytywnej passy powodują ,że jest ile_s = 4, później powiedzmy 5 dzień jest nie pozytywny i 6 jest znów pozytywny to ile_s = 5.

Polecam ogarnąć sobie jakieś przyjemne środowisko i debugger znacznie szybciej się nauczysz programować.

 
for (int i=0;i<=309;i++)
{
  if(tab[i]<tab[i+1])
  {
    ile_s++;
  }
  else
  {
    if(ile_s>3)
      ile_wiekszych3++;
    ile_s = 0;
  }
}

Tak na szybko skleiłem wydaje się dobrze.

0
feni000 napisał(a):

ile_s nie jest zerowane po przerwaniu passy, ile_wiekszych3 jest bez sensu, poza tym inne głupie błędy.

4 dni pozytywnej passy powodują ,że jest ile_s = 4, później powiedzmy 5 dzień jest nie pozytywny i 6 jest znów pozytywny to ile_s = 5.

Polecam ogarnąć sobie jakieś przyjemne środowisko i debugger znacznie szybciej się nauczysz programować.

 
for (int i=0;i<=309;i++)
{
  if(tab[i]<tab[i+1])
  {
    ile_s++;
  }
  else
  {
    if(ile_s>3)
      ile_wiekszych3++;
    ile_s = 0;
  }
}

Tak na szybko skleiłem wydaje się dobrze.

rozumiem juz swój bład tylko nie do konca ten zapis ja zrobiłbym to tak :

 for (int i=0;i<=309;i++)
{
  if(tab[i]<tab[i+1])
  {
    ile_s++;
}
    if(ile_s>3)
{
      ile_wiekszych3++;
    ile_s = 0;
  }
} 

Tak czy siak Twoja modyfikacja pokazuje nieprawidłowy wynik i "moja" też powinno być 14 serii Twoj 2, moj 39

0

Czyli jak masz tylko 7 dni i cały czas nie ma spadku to poprawny wynik będzie 2?

0

Zastanów się co się stanie ze zmienną ile_s jak będą 2 dni pozytywne pod rząd i następny nie pozytywny.

0
_13th_Dragon napisał(a):

Czyli jak masz tylko 5 dni i cały czas nie ma spadku to poprawny wynik będzie 2?

http://scr.hu/3j5r/bd326

0

wyzeruje sie ?

0

No więc coś jest nie tak, bo ewidentnie wynik jest 1

  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Nie rozumiesz inkrementacji: http://4programmers.net/Forum/1101404
  3. Nie twórz tablic tam gdzie nie jest to potrzebne
  4. Przykładowy sensowny kod:
#include <fstream>
#include <iostream>
using namespace std;

int main ()
  {
   ifstream fin("dziennik.txt");
   unsigned count=0,subcount=0;
   for(int prev=-1,value;fin;prev=value)
     {
      if(!(fin>>value)) value=-1;
      if(prev<value) ++subcount;
      else
        {
         count+=(subcount>=3);
         subcount=0;
        }
     }
   cout<<count<<endl;
   return 0;
  }
0
_13th_Dragon napisał(a):

Więc jaki wynik będzie dla: 401
402
403
404
405
406
407
408

 ?
 jest to seria dluzsza niż 3 wiec ile_wiekszych3=1
0

przepraszam, poprawny wynik to 11 a nie 14

0
Zimny Terrorysta napisał(a):
_13th_Dragon napisał(a):

Więc jaki wynik będzie dla: 401
402
403
404
405
406
407
408

 ?
>  jest to seria dluzsza niż 3 wiec ile_wiekszych3=1
 w takim razie gdzie jest błąd;/ ?
0
_13th_Dragon napisał(a):

No więc coś jest nie tak, bo ewidentnie wynik jest 1

  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Nie rozumiesz inkrementacji: http://4programmers.net/Forum/1101404
  3. Nie twórz tablic tam gdzie nie jest to potrzebne
  4. Przykładowy sensowny kod:
#include <fstream>
#include <iostream>
using namespace std;

int main ()
  {
   ifstream fin("dziennik.txt");
   unsigned count=0,subcount=0;
   for(int prev=-1,value;fin;prev=value)
     {
      if(!(fin>>value)) value=-1;
      if(prev<value) ++subcount;
      else
        {
         ++count+=(subcount>3);
         subcount=0;
        }
     }
   cout<<count<<endl;
   return 0;
  }

doceniam twoje starania i cierpliwość ale ten fragemnt kodu jest dla mnie bardzo nieczytelny i niezrozumiały czy mogłbys przerobic moj fragment kodu tak, aby działał poprawnie ?

0

W wywaleniu przez ciebie else z poprawnego kodu podanego przez @feni000
Przy 4-tym elemencie zerujesz ile_s więc zaczynasz liczyć od początku, ponieważ pozytywny ciąg jest długi to nadążasz doliczyć do czterech jeszcze raz.

0
_13th_Dragon napisał(a):

W wywaleniu przez ciebie else z poprawnego kodu podanego przez @feni000
Przy 4-tym elemencie zerujesz ile_s więc zaczynasz liczyć od początku, ponieważ pozytywny ciąg jest długi to nadążasz doliczyć do czterech jeszcze raz.
skoro kod @feni000 jest poprawny to czemu wynik jest niepoprawny ?

0

napisałem od nowa moim uposledzonym c plusplusem działa :

int main()
{
    int T[310], pmax=0, pmin=0, licznik=0, j=1, jmax=0, r;
    ifstream in("dziennik.txt");

    for(int i=0; i<309; i++)
    in>>T[i];
    in.close();


    int max=T[0];
    int min=T[0];

    for(int i=0; i<309; i++)
    {
    if(T[i]>T[i-1])
    {
    j++;
    if(j>3)
    licznik++;
    }
    else
    {
    if(j>jmax)
    {
    jmax=j;
    r=T[i-1]-T[i-j];
    }

    j=1;
    }

    if(T[i]>max)
    {
    max=T[i];
    pmax=i;
    }
    if(T[i]<min)
    {
    min=T[i];
    pmin=i;
    }
    }

   cout<<"5.1  "<<licznik<<endl;
    cout<<"5.2  max   "<<max<<"  pozycja  "<<pmax+1<<endl;
    cout<<"     min   "<<min<<"  pozycja  "<<pmin+1<<endl;
    cout<<"5.3  najdluzsza  "<<jmax<<endl;
    cout<<"     poprawiono  "<<r<<endl;


    return 0;
}

i co myslicie da sie to napisac w jakis "prostszy" sposob czy jak juz wyszlo to se tylka nie zawracac ?

0

To że przeszło jeden test nie oznacza że działa.
Nawet nie przeczytałeś dokładnie zadania.
http://ideone.com/xHzh2M
A co twój zwraca dla tego zestawu?

0

W pliku napisy.txt znajduje się 1000 napisów o długościach od 2 do 16 znaków, każdy
napis w osobnym wierszu. W każdym napisie mogą wystąpić jedynie dwa znaki: „0” lub „1”.
W wybranym przez siebie języku programowania napisz program, za pomocą którego
uzyskasz odpowiedzi na poniższe polecenia. Odpowiedzi zapisz w pliku zadanie4.txt,
a odpowiedź do każdego podpunktu poprzedź literą oznaczającą ten podpunkt.
a) Podaj, ile jest napisów o parzystej długości.
b) Podaj, ile jest napisów, które zawierają taką samą liczbę zer i jedynek.

ifstream in ("napisy.txt");
	ofstream out("zadanie4.txt");
	string slowo;
	int dl, ile_parzystych=0,ile_1=0,ile_0=0,ile_rownych=0;
	while (!in.eof())
	{
		in>>slowo;
		dl=slowo.size();
	/*	if(dl%2==0)
		ile_parzystych++;	*/
			for ( int i=0; i<=dl-1; i++)
		{
	
			if (slowo[i]=='1') ile_1++;
			else
			if (slowo[i]=='0') ile_0++;
		}
			if (ile_1==ile_0)
			ile_rownych++;	
	}
	
		//cout<<ile_parzystych<<endl;
		cout<<ile_rownych; 

Powie mi ktos gdzie jest błąd w podpukncie b? prawidlowa odpowiedz to 110, moja to 1, dane w załączniku (jeśli masz pisac, swoje żale na temat sposobu nauki programowania młodych adeptow informatyki w szkolach srednich to nie pisz) pozdrawiam ;)

0

brakuje zerowania zmiennych dla każdej linii
ile_1=0,ile_0=0 powinno być w środku pętli while

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