Language: C++

/**計算幾何学の問題を解く際に利用するクラス******/
//http://skyblueryu.blog54.fc2.com/blog-entry-27.html
#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>
#define EPS (pow(M_E,(double)-10))
//マクロの書式については 
//http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01030.html
#define equals(a, b) (fabs((a) - (b)) < EPS)
using namespace std;

class Point{
public:
	double x,y;

	//以下の記法に関しては
	//http://ameblo.jp/nana-2007-july/entry-10037680575.html
	Point(double x = 0,double y = 0): x(x), y(y) {};

	/***演算子のオーバーロード***********/
	Point operator + (Point p) { return Point(x + p.x,y + p.y);}
	Point operator - (Point p) { return Point(x - p.x,y - p.y);}
	Point operator * (double a) { return Point(a*x,a*y);}//スカラー倍
	Point operator / (double a) { return Point(x/a,y/a);}//スカラー倍
	/***********************************/

	double norm() { return x*x+y*y;}//ベクトルのノルムを返す
	double abs() { return sqrt(norm());}//ベクトルの長さを返す

	/***演算子のオーバーロード2***********/
	//Pointはクラスオブジェクトなのでサイズが大きく値渡しは適さない
	//Point &pという記法は参照渡しでポインタでない変数
	//に対してアドレスを引数にとりたい場合に使う．
	//参照渡しとポインタ渡しについては以下
	//http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1320144958
	//http://homepage2.nifty.com/well/Reference.html#PASS_BY_REFERENCE
	//
	//Point &pの前のconst修飾子は関数内で引数のオブジェクトの内容を
	//勝手に書き換えないようにするために付けている．(const Point &p)
	//の後のconstはこの関数がconstメンバ関数であることを意味する．
	//constメンバ関数に関して詳しくは以下
	//http://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/const.html

	bool operator < (const Point &p) const{
		//(条件)?(処理1):(処理2)
		//条件が真なら処理1，偽なら処理2が実行される
		return x != p.x ? x < p.x :y < p.y;
	}

	bool operator == (const Point &p) const{
		return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
	}
	/*************************************/

};

typedef Point Vector;

//ベクトルaとbの内積を計算する関数
//これは参照渡しじゃなくていいんかいという疑問は正直ある
double dot(Vector a,Vector b){
	//double dot(const Vector& a,const Vector& b){
	return a.x*b.x + a.y*b.y;
}

//ベクトルaとbの外積を計算する関数
double cross(Vector a,Vector b){
	//double cross(const Vector& a,const Vector& b){
	return a.x*b.y - a.y*b.x;
}



//線分を表す構造体
struct Segment{
	Point p1, p2;
};
typedef Segment Line;

//円を表すクラス
class Circle {
public:
	Point c;
	double r;
	Circle(Point c = Point(),double r = 0.0):c(c), r(r) {}
};

//多角形の表現(多角形は点の列で表現できる)
typedef vector<Point> Polygon;


int Q;//クエリ数

int main(){
	scanf("%d",&Q);

	Point s1,s2,t1,t2;
	Vector d1,d2;//方向ベクトル

	for(int q = 0;q < Q;q++){
		scanf("%lf %lf",&s1.x,&s1.y);
		scanf("%lf %lf",&s2.x,&s2.y);
		scanf("%lf %lf",&t1.x,&t1.y);
		scanf("%lf %lf",&t2.x,&t2.y);

		//l1の方向ベクトル
		d1.x = (s1.x - s2.x);
		d1.y = (s1.y - s2.y);

		//l2の方向ベクトル
		d2.x = (t1.x - t2.x);
		d2.y = (t1.y - t2.y);

		//l1とl2が直行しているか調べる(内積を計算して0かどうか調べる)
		if(equals(dot(d1,d2),0.0)){
			printf("1\n");
			continue;
		}else if(equals(d1.x*d2.y,d1.y*d2.x)){
			printf("2\n");
			continue;
		}else{
			printf("0\n");
			continue;
		}
	}

	return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:95:9: error: 'scanf' was not declared in this scope
   95 |         scanf("%d",&Q);
      |         ^~~~~
a.cc:116:25: error: 'printf' was not declared in this scope
  116 |                         printf("1\n");
      |                         ^~~~~~
a.cc:6:1: note: 'printf' is defined in header '<cstdio>'; this is probably fixable by adding '#include <cstdio>'
    5 | #include <vector>
  +++ |+#include <cstdio>
    6 | #define EPS (pow(M_E,(double)-10))
a.cc:119:25: error: 'printf' was not declared in this scope
  119 |                         printf("2\n");
      |                         ^~~~~~
a.cc:119:25: note: 'printf' is defined in header '<cstdio>'; this is probably fixable by adding '#include <cstdio>'
a.cc:122:25: error: 'printf' was not declared in this scope
  122 |                         printf("0\n");
      |                         ^~~~~~
a.cc:122:25: note: 'printf' is defined in header '<cstdio>'; this is probably fixable by adding '#include <cstdio>'