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

Rysunki Bajtelka, SPOJ, SIGSEGV

VPS Starter Arubacloud
0 głosów
714 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ź 116 wizyt
pytanie zadane 28 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 932 wizyt
pytanie zadane 9 marca 2018 w C i C++ przez Lucash Nowicjusz (240 p.)
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 17 grudnia 2017 w SPOJ przez niezalogowany

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...