Problemy z wyświetlaniem powierzchni działek

0

Witam
W zadaniu chodzi o to, by po wpisaniu przez użytkownika liczby działek (n) i wymiarów n działek x1, y1, x2, y2 (x1 i y1 to lewy dolny róg prostokąta w układzie współrzędnych, x2 i y2 to prawy górny róg) obliczało powierzchnie wszystkich działek i wyświetlało je na ekranie.

Moje pytania są następujące:

  1. Wzór na powierzchnię użyłem w kodzie. Po kompilacji i podaniu wymiarów np. dwóch działek, o wymiarach np. 1 2 3 4 i 5 7 14 10 powierzchnia w tym przypadku pierwszej działki wynosi 0, a druga się liczy już normalnie. Gdzie może być błąd?

  2. Na koniec użytkownik ma podać K, czyli jeśli poda 1, a działek jest 6, to wyświetlić mają mu się wymiary 1-szej działki pod względem powierzchni, czyli o największej powierzchni. Gdy mam już powierzchnię np. 10 działek, jaki napisać kod, by po podaniu K, np. powierzchni 5-tej działki wypisało mi jej wymiary?

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int n;
    cout << "Podaj ilosc dzialek (od 1 do 10 000): " << endl;
    cin >> n;

    int tab[n][4];
    int k = 0;
    cout << "Podaj wspolrzedne kartezjanskie dzialek" << endl;

    for(int i = 0; i < n; i++)
    {   //x1,y1 - lewy dolny rog prostokata
        //x2,y2 - prawy gorny rog prostokata

        int x1, y1, x2, y2;
        cin >> x1  >>  y1 >> x2 >> y2;
        tab[i][0] = x1;
        tab[i][1] = y1;
        tab[i][2] = x2;
        tab[i][3] = y2;
    }

    // powierzchnia
    int powierzchnia[n];
    int i = 0;
    for (int i = 0; i < n; i++)
    {
        powierzchnia [i] = (tab[i][2] - tab[i][0] ) * (tab[i][3] - tab[i][1]);
        cin >> powierzchnia [i];
        cout << "powierzchnia dzialki to: " << powierzchnia [i];
    }

    cout << "Podaj k: " << endl;
    cin >> k;

    return 0;
}
2

Prawidłowym wzorcem dla zestawów czterech danych, dających się bardzo wyraźnie określić, i niewymiennych miedzy sobą jest struktura (*w tym: nie ma potzerby je indeksować)

w C *) by to było

struct Dzialka {
  int x1,y1, x2, y2;
}

//a tablica
struct Dzialka tab[n]

Do tego piękne funkcje obliczajace powierzchnię, czy co chcesz dla const * Dzialka

int powierzchnia(const struct Dzialka * arg)
{
   return arg.x1 ... 
}

Zauważyłeś, że trudno / niemożliwe napisac taką fajną funkcję, gdy masz int[4] ?

Z czteroelementową tabliczką sie sam męczysz (wczytywanie), jest to nieczytelne itd

*) używasz w rzeczywistości C, z dodatkiem strumieni cin, cout
Nie mam energii pisać w nocy, kiedy by to było prawdziwe C++

2
kvaradona724 napisał(a):

powierzchnia w tym przypadku pierwszej działki wynosi 0, a druga się liczy już normalnie. Gdzie może być błąd?

Debugger twoim przyjacielem jest. Pora się zapoznać.

3
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int main()
{
	size_t count;
	cout<<"Podaj ilosc dzialek (od 1 do 10 000): "; //jeżeli to sprawdzarka to bez tego
	cin>>count;
	vector<unsigned long> tab(count);
	cout<<"Podaj wspolrzedne kartezjanskie dzialek"<<endl;
	for(int i=0;i<count;++i)
	{
		unsigned ax,ay,bx,by;
    	cin>>ax>>ay>>bx>>by;
    	tab[i]=llabs(bx-ax)*llabs(by-ay);
	    cout<<"powierzchnia dzialki to: "<<tab[i]<<endl;
	}
	sort(tab.rbegin(),tab.rend());
	size_t k;
	cout<<"Podaj k: ";
	cin>>k;
	cout<<tab[k-1]<<endl; // -1 jeżeli numeracja tego "k" od 1
	return 0;
}
2
// (Debian 10.2.1-6) Code::Blocks 20.03 -std=c++17 or higher
// g++ -Wall -fexceptions -g -std=gnu++17 -c main.cpp -o main.o

#include <iostream>
#include <tuple>        // tuple
#include <vector>       // vector
#include <cmath>        //
#include <algorithm>    // sort

using namespace std;

bool sortbyresult(const tuple<unsigned,unsigned,unsigned,unsigned,unsigned long>& x,
                  const tuple<unsigned,unsigned,unsigned,unsigned,unsigned long>& y)
{
    return (get<4>(x) > get<4>(y));
}

int main()
{
    int counter;
    cout << "Podaj ilosc dzialek : ";
    cin >> counter;

    std::vector<std::tuple<unsigned,unsigned,unsigned,unsigned,unsigned long> > item;
    for(int i=0; i<counter; ++i)
    {
        cout << "Podaj wspolrzedne kartezjanskie dla " << i+1 << " dzialki\n";
        unsigned ax,ay,bx,by,result;
        cout<<(char)97<<(char)0x78<<(char)0x20;
        cin>>ax;
        cout<<(char)97<<(char)0x79<<(char)0x20;
        cin>>ay;
        cout<<(char)98<<(char)0x78<<(char)0x20;
        cin>>bx;
        cout<<(char)98<<(char)0x79<<(char)0x20;
        cin>>by;
        result=((bx-ax)*(by-ay)+(bx-ax)*(by-ay))>>1;
        item.push_back(std::make_tuple(ax,ay,bx,by,result) );
    }
    cout << '\n';

    sort(item.begin(), item.end(), sortbyresult);
    for(const auto [v1, v2, v3, v4, result] : item)
    {
        cout << "Dzialka o wspolrzednych " << v1 << " " << v2 << " " << v3 << " " << v4 << " ";
        cout << "powierzchnia dzialki to: " << result << "\n";
    }
    cout << '\n';

    for(int nr{0}; (cout<<"Enter No. : ")&&(cin>>nr);)
    {
        nr-=1;
        if( (nr<0)||(nr>=counter))
        {
            cout<<"out of index"<<"\n";
        }
        else
        {
            cout << "Dzialka nr: " << nr+1 << " (" << get<0>(item[nr]) << ", " << get<1>(item[nr])
                 << ", " << get<2>(item[nr]) << ", " << get<3>(item[nr]) << ") powierzchnia = " << get<4>(item[nr]) << "\n";
        }
    }

    cout << '\n';
    return 0;
}

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