Problem:
Area of Polygons

Polygons are the most fundamental objects in geometric processing.
Complex figures are often represented and handled as polygons
with many short sides.
If you are interested in the processing of geometric data,
you'd better try some programming exercises about basic
operations on polygons.

Your job in this problem is to write a program that computes the area of polygons.

A polygon is represented by a sequence of points that are its vertices.
If the vertices p1, p2, ..., pn are given, line segments connecting
pi and pi+1 (1 <= i <= n-1) are sides of the polygon.
The line segment connecting pn and p1 is also a side of the polygon.

You can assume that the polygon is not degenerate.
Namely, the following facts can be assumed without any input data checking.

No point will occur as a vertex more than once.

Two sides can intersect only at a common endpoint (vertex).

The polygon has at least 3 vertices.

Note that the polygon is not necessarily convex.
In other words, an inner angle may be larger than 180 degrees.

Input

The input contains multiple data sets, each representing a polygon.
A data set is given in the following format.

n
x1 y1
x2 y2
...
xn yn

The first integer n is the number of vertices,
such that 3 <= n <= 50.
The coordinate of a vertex pi is given by (xi, yi).
xi and yi are integers between 0 and 1000 inclusive.
The coordinates of vertices are given in the order
of clockwise visit of them.

The end of input is indicated by a data set with 0 as the value of n.

Output

For each data set, your program should output its sequence number
(1 for the first data set, 2 for the second, etc.) and the area of the polygon separated by a single space. The area should be printed with one digit to the right of the decimal point.

The sequence number and the area should be printed on the same line.
Since your result is checked by an automatic grading program,
you should not insert any extra characters nor lines on the output.

Sample Input

3
1 1
3 4
6 0

7
0 0
10 10
0 20
10 30
0 40
100 40
100 0

0

Output for the Sample Input

1 8.5
2 3800.0

Solution in JAVA (judge verdict: Accepted)

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.DecimalFormat;

public class Main {
	static boolean debug = false;

	public static void main(String[] args) throws IOException {

		UserScanner scan = new UserScanner();
		PrintWriter pwriter = new PrintWriter(System.out);
		for (int seq = 1; true; seq++) {
			int q = scan.nextInt();
			if (q == 0)
				break;
			Geometry gm = new Geometry();
			for (int i = 0; i < q; i++) {
				gm.polygon(scan.nextInt(), scan.nextInt());
			}
			double area = gm.polygonEnd();
			DecimalFormat df = new DecimalFormat("#######.0");
			pwriter.println(seq + " " + df.format(area));
		}

		pwriter.flush();
		scan.close();
		System.exit(0);
	}
}

class Geometry {

	boolean polygonDo;
	double firstX, firstY, preX, preY;
	double area;

	public void polygon(double x, double y) {
		if (polygonDo)
			calcCross(preX, preY, x, y);
		else {
			polygonDo = true;
			firstX = x;
			firstY = y;
		}
		preX = x;
		preY = y;
	}

	public double polygonEnd() {
		calcCross(preX, preY, firstX, firstY);
		polygonDo = false;
		double ret = area;
		area = 0;
		return ret;
	}

	private void calcCross(double x1, double y1, double x2, double y2) {
		area += (x2 * y1 - x1 * y2) / 2;
		//System.out.println(area);
	}
}

class UserScanner {
	private final InputStream in = System.in;
	private final byte[] buffer = new byte[1024];
	private int ptr = 0;
	private int buflen = 0;

	private boolean read() throws IOException {
		ptr = 0;
		buflen = in.read(buffer);
		if (buflen <= 0)
			return false;
		else
			return true;
	}

	private byte getByte() throws IOException {
		if (ptr >= buflen)
			read();
		if (isCtlSpace(buffer[ptr])) {
			return -1;
		} else
			return buffer[ptr++];
	}

	private void skipCtlSpace() throws IOException {
		if (ptr >= buflen)
			read();
		if (isCtlSpace(buffer[ptr])) {
			ptr++;
			skipCtlSpace();
		}
	}

	private boolean isCtlSpace(byte b) {
		if (b <= ' ' || b > '~')
			return true;
		else
			return false;
	}

	public void close() throws IOException {
		in.close();
	}

	public String next() throws IOException {
		skipCtlSpace();
		StringBuilder sb = new StringBuilder();
		byte b;
		while ((b = getByte()) != -1) {
			sb.appendCodePoint(b);
		}
		return sb.toString();
	}

	public int nextInt() throws IOException {
		skipCtlSpace();
		int n = 0;
		boolean minus = false;
		byte b;
		while ((b = getByte()) != -1) {
			if (b == '-')
				minus = true;
			else {
				n *= 10;
				n += (b - '0');
			}
		}
		if (minus)
			return n * -1;
		else
			return n;
	}
}