• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rysunki Bajtelka, SPOJ, SIGSEGV

Object Storage Arubacloud
0 głosów
745 wizyt
pytanie zadane 30 lipca 2016 w C i C++ przez Blue Obywatel (1,180 p.)
edycja 30 lipca 2016 przez Blue
Witam, od pewnego czasu próbuję rozwiązać zadanie: http://pl.spoj.com/problems/BAJTELEK/ .
Skorzystałem ze wzoru pozwalającego na obliczenia pola dowolnego wielokąta prostego na podstawie 
współrzędnych jego wierzchołków. Program wyświetla poprawne odpowiedzi dla danych z przykładu, ale 
wciąż dostaję błąd SIGSEGV. Użycie dynamicznej alokacji pamięci nie pomogło. Wie ktoś, w czym leży 
problem?
 

{\displaystyle A={\frac {1}{2}}\sum _{i=0}^{n-1}(x_{i}y_{i+1}-x_{i+1}y_{i}),\,}


#include<iostream>
 
using namespace std;
 
int main () {
 
    int m; // liczba zestawow danych
     
    int x[1000], y[1000]; // wspolrzedne wierzcholkow
     
    int n; // liczba wierzcholkow
     
    float S[2]; // pola wielokatow
     
    int T; // liczba potrzebnych bitokul
     
    cin>>m;
 
    for (int i=0; i<m; i++) {
 
        for (int j=0; j<2; j++) {
             
            n=0;
 
            cin>>x[0]>>y[0];
 
            do {
                 
                n++;
                cin>>x[n]>>y[n];
                 
            } while ( x[n]!=x[0] || y[n]!=y[0] );
             
            S[j]=0;
             
            for (int k=0; k<n; k++) {
                 
                S[j] = S[j] + ( x[k] * y[k+1] - x[k+1] * y[k] );
                 
            }
             
            S[j]=S[j]/2;
 
        }
         
        T = S[0] * 10 + ( S[1] - S[0] ) * 6;
         
        cout<<T<<endl;
 
    }
 
    system ("pause");
    return 0;
     
}

 

1 odpowiedź

0 głosów
odpowiedź 30 lipca 2016 przez manjaro Nałogowiec (37,390 p.)

Po co Ci ta pauza? Wyrzuć ją.

komentarz 30 lipca 2016 przez Blue Obywatel (1,180 p.)
Masz na myśli system ("pause")? Niestety, wyrzucenie nie pomogło.
komentarz 30 lipca 2016 przez manjaro Nałogowiec (37,390 p.)
Tak chodzi o system pause. Sędzia raczej nie pracuje na Windows ;)

Błędów faktycznie jest chyba więcej.

Kolejne co rzuca mi się w oczy to nie ma ustalonej kolejności wczytywania obszarów np. że najpierw czarny potem szary. Równie dobrze mogą być podawane odwrotnie. Program musi być na to odporny.

Sposób wczytywania danych na pewno też nie jest najlepszy. Powinien być raczej dynamicznie a nie z góry ustalone [1000].
komentarz 30 lipca 2016 przez Blue Obywatel (1,180 p.)

Poprawiłem program, ale używając wskaźników znowu musiałem zarezerwować te [10000]. Podobno można rezerwować pamięć dynamicznie za pomocą vectorów, czy o nie Ci chodziło? Tak w ogóle dzięki za zainteresowanie :)

 

#include<iostream>

using namespace std;

int main () {

	int m; // liczba zestawow danych

	int *x, *y; // wspolrzedne wierzcholkow

	int n; // liczba wierzcholkow

	float *S; // pola wielokatow

	int T; // liczba potrzebnych bitokul

	cin>>m;

	for (int i=0; i<m; i++) {

		S=new float [2];

		for (int j=0; j<2; j++) {

			x=new int [10000];
			y=new int [10000];

			n=0;

			cin>>*(x)>>*(y);

			do {

				n++;
				cin>>*(x+n)>>*(y+n);

			} while ( *(x+n)!=*(x) || *(y+n)!=*(y) );

			*(S+j)=0;

			for (int k=0; k<n; k++) {

				*(S+j) = *(S+j) + ( ( *(x+k) * (*(y+k+1)) ) - ( *(x+k+1) * (*(y+k)) ) );

			}

			*(S+j)=*(S+j)/2;

			delete [] x;
			delete [] y;

		}

		if ( *(S+1)>*(S) ) {

			T = *(S) * 10 + ( *(S+1) - *(S) ) * 6;

			cout<<T<<endl;

		}

        if ( *(S)>*(S+1) ) {

			T = *(S+1) * 10 + ( *(S) - *(S+1) ) * 6;

			cout<<T<<endl;

		}

		delete [] S;

	}

	return 0;

}

 

komentarz 30 lipca 2016 przez manjaro Nałogowiec (37,390 p.)
Chodzi mi o to że najpierw wczytujesz ciąg liczb i na podstawie ich ilości tworzysz dynamicznie tablicę.

Ale jak dostałeś AC to już nieistotne, mimo wszystko na przyszłość korzystaj z dynamicznej alokacji pamięci.
komentarz 30 lipca 2016 przez Blue Obywatel (1,180 p.)
AC wciąż nie dostałem. Nie za bardzo rozumiem: mam wczytać współrzędne wierzchołków, zliczyć ich ilość, utworzyć dynamiczną tablicą, a potem znów wczytywać te współrzędne?
komentarz 30 lipca 2016 przez Blue Obywatel (1,180 p.)

OK., to było najbardziej irytujące zadanie jakie kiedykolwiek robiłem. Po dziesiątkach prób zamieszczam działający kod. Być może oszczędzi to komuś nerwów.

#include<iostream>
#include<vector>
#include<cmath>

using namespace std;

int main () {

	long long m; // liczba zestawow danych

	long long a, b; // wspolrzedne wierzcholkow

	vector <long long> x, y;

	long long n; // liczba wierzcholkow

	vector <long long> S; // pola wielokatow

	vector <long long> T; // liczba potrzebnych bitokul

	cin>>m;

	for (int i=0; i<m; i++) {

		for (int j=0; j<2; j++) {

			n=0;

			cin>>a>>b;

			x.push_back(a);
			y.push_back(b);

			do {

				n++;

				cin>>a>>b;

				x.push_back(a);
				y.push_back(b);

			} while ( x[n]!=x[0] || y[n]!=y[0] );

			S.push_back(0);

			for (int k=0; k<n; k++) {

				S[j] = S[j] + ( ( x[k] * y[k+1] ) - ( x[k+1] * y[k] ) );

			}

			S[j]=abs(S[j]);

			x.clear();
			y.clear();

		}
		
		if (S[1]>=S[0]) {
			
			T.push_back( S[0] * 5 + ( S[1] - S[0] ) * 3 );
			
		}
		
		else {
			
			T.push_back( S[1] * 5 + ( S[0] - S[1] ) * 3 );
			
		}

		S.clear();
        
        cout<<endl;

	}
	
	for(int i=0; i<m; i++) cout<<T[i]<<endl;

	return 0;

}

 

Podobne pytania

0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 28 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 958 wizyt
pytanie zadane 9 marca 2018 w C i C++ przez Lucash Nowicjusz (240 p.)
0 głosów
1 odpowiedź 189 wizyt
pytanie zadane 17 grudnia 2017 w SPOJ przez niezalogowany

92,578 zapytań

141,426 odpowiedzi

319,653 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...