#include <stdio.h> int gcd(int, int); // 最大公約数 int main() { int n, n1, n2; printf("2つの整数を入力してください "); scanf("%d %d", &n1, &n2); n = gcd(n1, n2); printf(" 最大公約数は %d です\n", n); return 0; } /**********************/ /* xとyの最大公約数 */ /* x,y : データ */ /**********************/ int gcd(int x, int y) { int r, g; r = x % y; if (r == 0) g = y; else g = gcd(y, r); return g; }
#include <stdio.h> int prime(int); // 素数の判定 int main() { int n, sw; printf("整数を入力してください "); scanf("%d", &n); sw = prime(n); if (sw > 0) printf(" 与えられた数は素数です\n"); else printf(" 与えられた数は素数ではありません\n"); return 0; } /*********************************/ /* 素数の判定 */ /* n : 整数データ */ /* return : =0 : 素数でない */ /* =1 : 素数 */ /*********************************/ #include <math.h> int prime(int n) { int i1, sw, m; m = (int)sqrt((double)n); sw = (n <= 1) ? 0 : 1; for (i1 = 2; i1 <= m && sw > 0; i1++) { if (n%i1 == 0) sw = 0; } return sw; }
#include <stdio.h> double determinant(int, double **); int main() { double **A, d; int i1, i2, n; printf("次数は? "); scanf("%d", &n); A = new double * [n]; for (i1 = 0; i1 < n; i1++) A[i1] = new double [n]; for (i1 = 0; i1 < n; i1++) { printf("%d 行目\n", i1+1); for (i2 = 0; i2 < n; i2++) { printf(" %d 列目? ", i2+1); scanf("%lf", &A[i1][i2]); } } d = determinant(n, A); printf("行列式の値は %f\n", d); for (i1 = 0; i1 < n; i1++) delete [] A[i1]; delete [] A; return 0; } /****************************/ /* 行列式の値 */ /* n : 行列式の次数 */ /* A : 行列式 */ /* return : 行列式の値 */ /****************************/ double determinant(int n, double **A) { double d = 0.0, **B, s = 1.0; int i1, i2, i3, k, m; if (n == 1) d = A[0][0]; else if (n == 2) d = A[0][0] * A[1][1] - A[1][0] * A[0][1]; else { m = n - 1; B = new double * [m]; for (i1 = 0; i1 < m; i1++) B[i1] = new double [m]; for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < m; i2++) { k = 0; for (i3 = 0; i3 < n; i3++) { if (i3 != i1) { B[i2][k] = A[i2+1][i3]; k++; } } } d += s * A[0][i1] * determinant(m, B); s = -s; } for (i1 = 0; i1 < m; i1++) delete [] B[i1]; delete [] B; } return d; }
#include <stdio.h> #include <math.h> double add(double, double); int main() { double a, a1, b, b1, c, u = atan(1.0) / 45.0; printf("2つの角度を入力して下さい(度) "); scanf("%lf %lf", &a, &b); a1 = u * a; b1 = u * b; c = add(a1, b1) / u; printf(" %f + %f = %f\n", a, b, c); return 0; } /****************************/ /* 角度の和 */ /* a,b : 角度 */ /* return : a+b(±π) */ /****************************/ #include <math.h> double add(double a, double b) { double pi = 4.0 * atan(1.0), x; x = a + b; if (x > pi) x -= 2.0 * pi; else if (x < -pi) x += 2.0 * pi; return x; }
#include <stdio.h> double triangle1(double [][2]); double triangle2(double [][2]); double add(double, double); int main() { double a, x[3][2]; printf("点Aの座標(x1, y1)"); scanf("%lf %lf", &x[0][0], &x[0][1]); printf("点Bの座標(x2, y2)"); scanf("%lf %lf", &x[1][0], &x[1][1]); printf("点Cの座標(x3, y3)"); scanf("%lf %lf", &x[2][0], &x[2][1]); a = triangle1(x); printf(" 三角形ABCの面積: %f\n", a); a = triangle2(x); printf(" 三角形ABCの面積(ヘロンの公式): %f\n", a); return 0; } /*******************************/ /* 三角形ABCの面積 */ /* A : (x[0][0], x[0][1]) */ /* B : (x[1][0], x[1][1]) */ /* C : (x[2][0], x[2][1]) */ /* return : 面積 */ /*******************************/ #include <math.h> double triangle1(double x[][2]) { double area, a1, a2, ang, ba, bc, x1, y1; x1 = x[0][0] - x[1][0]; y1 = x[0][1] - x[1][1]; a1 = atan2(y1, x1); ba = sqrt(x1 * x1 + y1 * y1); x1 = x[2][0] - x[1][0]; y1 = x[2][1] - x[1][1]; a2 = atan2(y1, x1); bc = sqrt(x1 * x1 + y1 * y1); ang = fabs(add(a1, -a2)); area = 0.5 * ba * bc * sin(ang); return area; } /****************************/ /* 角度の和 */ /* a,b : 角度 */ /* return : a+b(±π) */ /****************************/ #include <math.h> double add(double a, double b) { double pi = 4.0 * atan(1.0), x; x = a + b; if (x > pi) x -= 2.0 * pi; else if (x < -pi) x += 2.0 * pi; return x; } /**********************************/ /* 三角形ABCの面積(ヘロンの公式)*/ /* A : (x[0][0], x[0][1]) */ /* B : (x[1][0], x[1][1]) */ /* C : (x[2][0], x[2][1]) */ /* return : 面積 */ /**********************************/ #include <math.h> double triangle2(double x[][2]) { double area, a[3], s, x1, y1; int i1; for (i1 = 0; i1 < 3; i1++) { x1 = x[i1][0] - x[(i1+1)%3][0]; y1 = x[i1][1] - x[(i1+1)%3][1]; a[i1] = sqrt(x1 * x1 + y1 * y1); } s = 0.5 * (a[0] + a[1] + a[2]); area = sqrt(s * (s - a[0]) * (s - a[1]) * (s - a[2])); return area; }
#include <stdio.h> double p_line_2(double, double, double, double, double); // 平面上の点と直線 int main() { double a, b, c, x0, y0, r; printf(" 直線の方程式(a, b, c)? "); scanf("%lf %lf %lf", &a, &b, &c); printf(" 点の座標(x, y)? "); scanf("%lf %lf", &x0, &y0); r = p_line_2(a, b, c, x0, y0); printf(" 距離は %f\n", r); return 0; } /************************************/ /* 平面上の点と直線との距離 */ /* (x0, y0) と ax + by + c = 0 */ /* return : 距離 */ /************************************/ #include <math.h> double p_line_2(double a, double b, double c, double x0, double y0) { double r; r = fabs(a * x0 + b * y0 + c) / sqrt(a * a + b * b); return r; }
#include <stdio.h> int cross(double, double, double, double, double, double, double *); int main() { double a1, a2, b1, b2, c1, c2, x[2]; int sw; printf("直線1の方程式(a1, b1, c1)"); scanf("%lf %lf %lf", &a1, &b1, &c1); printf("直線2の方程式(a2, b2, c2)"); scanf("%lf %lf %lf", &a2, &b2, &c2); sw = cross(a1, b1, c1, a2, b2, c2, x); if (sw == 0) printf(" 交点はありません!\n"); else printf(" 交点の座標:(%f, %f)\n", x[0], x[1]); return 0; } /*********************************/ /* 二直線の交点 */ /* a1 * x + b1 * y + c1 = 0 */ /* a2 * x + b2 * y + c1 = 0 */ /* x : 交点の座標 */ /* return : =0 : 交点なし */ /* =1 : 交点あり */ /*********************************/ #include <math.h> int cross(double a1, double b1, double c1, double a2, double b2, double c2, double *x) { double A[2][2], D, eps = 1.0e-10; int sw = 0; D = a1 * b2 - a2 * b1; if (fabs(D) > eps) { A[0][0] = b2 / D; A[0][1] = -b1 / D; A[1][0] = -a2 / D; A[1][1] = a1 / D; x[0] = -A[0][0] * c1 - A[0][1] * c2; x[1] = -A[1][0] * c1 - A[1][1] * c2; sw = 1; } return sw; }
#include <stdio.h> /*************************/ /* ベクトルの大きさの2乗 */ /*************************/ double norm(double *x) { return x[0] * x[0] + x[1] * x[1]; } /****************************/ /* 2つのベクトルの内積 */ /* a,b : 2つのベクトル */ /****************************/ double dot(double *a, double *b) { return a[0] * b[0] + a[1] * b[1]; } /******************************/ /* 2つのベクトルの外積(z成分) */ /* a,b : 2つのベクトル */ /******************************/ double cross(double *a, double *b) { return a[0] * b[1] - a[1] * b[0]; } /***************************/ /* 点と線分の関係 */ /* p0,p1,p2 : 3つの点 */ /***************************/ int ccw(double *p0, double *p1, double *p2) { int sw = 0; double a[2], b[2], EPS = 1.0e-8; a[0] = p1[0] - p0[0]; a[1] = p1[1] - p0[1]; b[0] = p2[0] - p0[0]; b[1] = p2[1] - p0[1]; if ( cross(a, b) > EPS ) // 点p2は線分p0-p1の反時計方向 sw = 1; else if ( cross(a, b) < -EPS ) // 点p2は線分p0-p1の時計方向 sw = -1; else if ( dot(a, b) < -EPS ) // 点p2は線分p0-p1の手前 sw = 2; else if ( norm(a) < norm(b) ) // 点p2は線分p0-p1の先 sw = -2; return sw; // 点p2は線分p0-p1の上 } int main() { double a[2], b[2], p[2]; int sw; printf("線分ABにおける点Aの座標(x, y)"); scanf("%lf %lf", &a[0], &a[1]); printf("線分ABにおける点Bの座標(x, y)"); scanf("%lf %lf", &b[0], &b[1]); printf("点Pの座標(x, y)"); scanf("%lf %lf", &p[0], &p[1]); sw = ccw(a, b, p); if (sw == 1) printf("点pは線分ABの反時計方向\n"); else if (sw == -1) printf("点pは線分ABの時計方向\n"); else if (sw == 2) printf("点pは線分ABの手前\n"); else if (sw == -2) printf("点pは線分ABの先\n"); else printf("点pは線分ABの上\n"); return 0; }
#include <stdio.h> /*************************/ /* ベクトルの大きさの2乗 */ /*************************/ double norm(double *x) { return x[0] * x[0] + x[1] * x[1]; } /****************************/ /* 2つのベクトルの内積 */ /* a,b : 2つのベクトル */ /****************************/ double dot(double *a, double *b) { return a[0] * b[0] + a[1] * b[1]; } /******************************/ /* 2つのベクトルの外積(z成分) */ /* a,b : 2つのベクトル */ /******************************/ double cross(double *a, double *b) { return a[0] * b[1] - a[1] * b[0]; } /***************************/ /* 点と線分の関係 */ /* p0,p1,p2 : 3つの点 */ /***************************/ int ccw(double *p0, double *p1, double *p2) { int sw = 0; double a[2], b[2], EPS = 1.0e-8; a[0] = p1[0] - p0[0]; a[1] = p1[1] - p0[1]; b[0] = p2[0] - p0[0]; b[1] = p2[1] - p0[1]; if ( cross(a, b) > EPS ) // 点p2は線分p0-p1の反時計方向 sw = 1; else if ( cross(a, b) < -EPS ) // 点p2は線分p0-p1の時計方向 sw = -1; else if ( dot(a, b) < -EPS ) // 点p2は線分p0-p1の手前 sw = 2; else if ( norm(a) < norm(b) ) // 点p2は線分p0-p1の先 sw = -2; return sw; // 点p2は線分p0-p1の上 } /************************************/ /* 線分p1-p2と線分p3-p4の交点の有無 */ /************************************/ int isIntersect(double *p1, double *p2, double *p3, double *p4) { int sw = 0; // 交点なし if ( ccw(p1, p2, p3) * ccw(p1, p2, p4) <= 0 && ccw(p3, p4, p1) * ccw(p3, p4, p2) <= 0 ) sw = 1; // 交点あり return sw; } int main() { double a[2], b[2], c[2], d[2]; int sw; printf("線分ABにおける点Aの座標(x, y)"); scanf("%lf %lf", &a[0], &a[1]); printf("線分ABにおける点Bの座標(x, y)"); scanf("%lf %lf", &b[0], &b[1]); printf("線分CDにおける点Cの座標(x, y)"); scanf("%lf %lf", &c[0], &c[1]); printf("線分CDにおける点Dの座標(x, y)"); scanf("%lf %lf", &d[0], &d[1]); sw = isIntersect(a, b, c, d); if (sw > 0) printf("交点あり\n"); else printf("交点なし\n"); return 0; }
#include <stdio.h> #include <math.h> /*************************************/ /* 2線分の交点 */ /* A + r(B - A) と C + s(D - C) */ /* P : 交点の座標 */ /* return : =-1 : 交点が無い */ /* =0 : 交点が線分の外 */ /* =1 : 交点がある */ /*************************************/ int cross(double *A, double *B, double *C, double *D, double *P) { double r, s, AC[2], BUNBO, EPS = 1.0e-8; int sw = -1; AC[0] = C[0] - A[0]; AC[1] = C[1] - A[1]; BUNBO = (B[0] - A[0]) * (D[1] - C[1]) - (B[1] - A[1]) * (D[0] - C[0]); if (fabs(BUNBO) > EPS) { r = ((D[1] - C[1]) * AC[0] - (D[0] - C[0]) * AC[1]) / BUNBO; s = ((B[1] - A[1]) * AC[0] - (B[0] - A[0]) * AC[1]) / BUNBO; if (r > -EPS && r < 1.0+EPS && s > -EPS && s < 1.0+EPS) { P[0] = A[0] + r * (B[0] - A[0]); P[1] = A[1] + r * (B[1] - A[1]); sw = 1; } else sw = 0; } return sw; } int main() { double a[2], b[2], c[2], d[2], p[2]; int sw; printf("線分ABにおける点Aの座標(x, y)"); scanf("%lf %lf", &a[0], &a[1]); printf("線分ABにおける点Bの座標(x, y)"); scanf("%lf %lf", &b[0], &b[1]); printf("線分CDにおける点Cの座標(x, y)"); scanf("%lf %lf", &c[0], &c[1]); printf("線分CDにおける点Dの座標(x, y)"); scanf("%lf %lf", &d[0], &d[1]); sw = cross(a, b, c, d, p); if (sw <= 0) printf("No! ( %d )\n", sw); else printf("%f %f\n", p[0], p[1]); return 0; }
/****************************/ /* 座標軸の回転 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> #include <math.h> int main() { double a, x = 1.0, y = 1.0, X, Y; // 座標軸を45度回転する a = 45.0 * M_PI / 180.0; X = x * cos(a) + y * sin(a); Y = -x * sin(a) + y * cos(a); printf("x %f y %f\n", x, y); printf("X %f Y %f\n", X, Y); return 0; }
#include <stdio.h> #include <math.h> void plane(double [][3], double []); double determinant(int, double **); int main() { double ABCD[4], x[3][3], eps = 1.0e-10; printf("1番目の点の座標(x1, y1, z1) "); scanf("%lf %lf %lf", &x[0][0], &x[0][1], &x[0][2]); printf("2番目の点の座標(x2, y2, z2) "); scanf("%lf %lf %lf", &x[1][0], &x[1][1], &x[1][2]); printf("3番目の点の座標(x3, y3, z3) "); scanf("%lf %lf %lf", &x[2][0], &x[2][1], &x[2][2]); plane(x, ABCD); if (fabs(ABCD[0]) > eps) { if (ABCD[0] > 0) printf(" %f x", ABCD[0]); else printf(" -%f x", -ABCD[0]); } if (fabs(ABCD[1]) > eps) { if (ABCD[1] > 0) printf(" + %f y", ABCD[1]); else printf(" - %f y", -ABCD[1]); } if (fabs(ABCD[2]) > eps) { if (ABCD[2] > 0) printf(" + %f z", ABCD[2]); else printf(" - %f z", -ABCD[2]); } if (fabs(ABCD[3]) > eps) { if (ABCD[3] > 0) printf(" + %f", ABCD[3]); else printf(" - %f", -ABCD[3]); } printf(" = 0\n"); return 0; } /*****************************/ /* 三点を通る平面 */ /* Ax + Bx + Cx + D = 0 */ /* x : 3点 */ /* ABCD : A, B, C, D */ /*****************************/ void plane(double x[][3], double ABCD[]) { double **A; int i1; A = new double * [3]; for (i1 = 0; i1 < 3; i1++) A[i1] = new double [3]; A[0][0] = x[0][1]; A[0][1] = x[0][2]; A[0][2] = 1.0; A[1][0] = x[1][1]; A[1][1] = x[1][2]; A[1][2] = 1.0; A[2][0] = x[2][1]; A[2][1] = x[2][2]; A[2][2] = 1.0; ABCD[0] = determinant(3, A); A[0][0] = x[0][0]; A[0][1] = x[0][2]; A[0][2] = 1.0; A[1][0] = x[1][0]; A[1][1] = x[1][2]; A[1][2] = 1.0; A[2][0] = x[2][0]; A[2][1] = x[2][2]; A[2][2] = 1.0; ABCD[1] = -determinant(3, A); A[0][0] = x[0][0]; A[0][1] = x[0][1]; A[0][2] = 1.0; A[1][0] = x[1][0]; A[1][1] = x[1][1]; A[1][2] = 1.0; A[2][0] = x[2][0]; A[2][1] = x[2][1]; A[2][2] = 1.0; ABCD[2] = determinant(3, A); A[0][0] = x[0][0]; A[0][1] = x[0][1]; A[0][2] = x[0][2]; A[1][0] = x[1][0]; A[1][1] = x[1][1]; A[1][2] = x[1][2]; A[2][0] = x[2][0]; A[2][1] = x[2][1]; A[2][2] = x[2][2]; ABCD[3] = -determinant(3, A); for (i1 = 0; i1 < 3; i1++) delete [] A[i1]; delete [] A; } /****************************/ /* 行列式の値 */ /* n : 行列式の次数 */ /* A : 行列式 */ /* return : 行列式の値 */ /****************************/ double determinant(int n, double **A) { double d = 0.0, **B, s = 1.0; int i1, i2, i3, k, m; if (n == 1) d = A[0][0]; else if (n == 2) d = A[0][0] * A[1][1] - A[1][0] * A[0][1]; else { m = n - 1; B = new double * [m]; for (i1 = 0; i1 < m; i1++) B[i1] = new double [m]; for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < m; i2++) { k = 0; for (i3 = 0; i3 < n; i3++) { if (i3 != i1) { B[i2][k] = A[i2+1][i3]; k++; } } } d += s * A[0][i1] * determinant(m, B); s = -s; } for (i1 = 0; i1 < m; i1++) delete [] B[i1]; delete [] B; } return d; }
#include <stdio.h> double p_line_3(double, double, double, double, double, double, double, double, double); // 空間内の点と直線 int main() { double x0, x1, y0, y1, z0, z1, ram, myu, nyu, r; printf(" 直線の方程式(x0, y0, z0)? "); scanf("%lf %lf %lf", &x0, &y0, &z0); printf(" (λ, μ, ν)? "); scanf("%lf %lf %lf", &ram, &myu, &nyu); printf(" 点の座標(x1, y1, z1)? "); scanf("%lf %lf %lf", &x1, &y1, &z1); r = p_line_3(x0, y0, z0, ram, myu, nyu, x1, y1, z1); printf(" 距離は %f\n", r); return 0; } /**********************************************************************/ /* 空間内の点と直線の距離 */ /* (x1, y1, z1) と (x - x0) / λ = (y - y0) / μ = (z - z0) / ν */ /* λ,μ,ν:方向余弦 */ /* return : 距離 */ /**********************************************************************/ #include <math.h> double p_line_3(double x0, double y0, double z0, double ram, double myu, double nyu, double x1, double y1, double z1) { double x, y, z, w, r; x = x1 - x0; y = y1 - y0; z = z1 - z0; w = ram * x + myu * y + nyu * z; r = sqrt(fabs(x * x + y * y + z * z - w * w)); return r; }
#include <stdio.h> double p_plane(double [], double []); int main() { double ABCD[4], x[3], h; printf("点の座標(x1, y1, z1) "); scanf("%lf %lf %lf", &x[0], &x[1], &x[2]); printf("平面の方程式(A, B, C, D) "); scanf("%lf %lf %lf %lf", &ABCD[0], &ABCD[1], &ABCD[2], &ABCD[3]); h = p_plane(x, ABCD); printf(" 距離: %f\n", h); return 0; } /*****************************/ /* 点と平面の距離 */ /* Ax + Bx + Cx + D = 0 */ /* x : 点 */ /* ABCD : A, B, C, D */ /*****************************/ #include <math.h> double p_plane(double x[], double ABCD[]) { double h; h = fabs(ABCD[0] * x[0] + ABCD[1] * x[1] + ABCD[2] * x[2] + ABCD[3]) / sqrt(ABCD[0] * ABCD[0] + ABCD[1] * ABCD[1] + ABCD[2] * ABCD[2]); return h; }
#include <stdio.h> double line_line(double, double, double, double, double, double, double, double, double, double, double, double); double determinant(int, double **); double p_line_3(double, double, double, double, double, double, double, double, double); int main() { double x1, x2, y1, y2, z1, z2, u1, u2, v1, v2, w1, w2, r; printf("直線1の方程式\n"); printf(" 点(x1, y1, z1)? "); scanf("%lf %lf %lf", &x1, &y1, &z1); printf(" 方向比(u1, v1, w1)? "); scanf("%lf %lf %lf", &u1, &v1, &w1); printf("直線2の方程式\n"); printf(" 点(x2, y2, z2)? "); scanf("%lf %lf %lf", &x2, &y2, &z2); printf(" 方向比(u2, v2, w2)? "); scanf("%lf %lf %lf", &u2, &v2, &w2); r = line_line(x1, y1, z1, u1, v1, w1, x2, y2, z2, u2, v2, w2); printf(" 距離は %f\n", r); return 0; } /******************************************************/ /* 二直線間の最短距離 */ /* (x - x1) / u1 = (y - y1) / v1 = (z - z1) / w1 */ /* u1,v1,w1:方向比 */ /* (x - x2) / u2 = (y - y2) / v2 = (z - z2) / w2 */ /* u2,v2,w2:方向比 */ /* return : 距離 */ /******************************************************/ #include <math.h> double line_line(double x1, double y1, double z1, double u1, double v1, double w1, double x2, double y2, double z2, double u2, double v2, double w2) { double **A, D, x, y, z, r = 0.0, eps = 1.0e-10, ram, myu, nyu; int i1; x = v1 * w2 - v2 * w1; y = w1 * u2 - w2 * u1; z = u1 * v2 - u2 * v1; D = sqrt(x * x + y * y + z * z); // 2直線が平行でない場合 if (D > eps) { A = new double * [3]; for (i1 = 0; i1 < 3; i1++) A[i1] = new double [3]; A[0][0] = x2 - x1; A[0][1] = y2 - y1; A[0][2] = z2 - z1; A[1][0] = u1; A[1][1] = v1; A[1][2] = w1; A[2][0] = u2; A[2][1] = v2; A[2][2] = w2; r = fabs(determinant(3,A)) / D; for (i1 = 0; i1 < 3; i1++) delete [] A[i1]; delete [] A; } // 2直線が平行な場合 else { x = sqrt(u1 * u1 + v1 * v1 + w1 * w1); ram = u1 / x; myu = v1 / x; nyu = w1 / x; r = p_line_3(x1, y1, z1, ram, myu, nyu, x2, y2, z2); } return r; } /****************************/ /* 行列式の値 */ /* n : 行列式の次数 */ /* A : 行列式 */ /* return : 行列式の値 */ /****************************/ double determinant(int n, double **A) { double d = 0.0, **B, s = 1.0; int i1, i2, i3, k, m; if (n == 1) d = A[0][0]; else if (n == 2) d = A[0][0] * A[1][1] - A[1][0] * A[0][1]; else { m = n - 1; B = new double * [m]; for (i1 = 0; i1 < m; i1++) B[i1] = new double [m]; for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < m; i2++) { k = 0; for (i3 = 0; i3 < n; i3++) { if (i3 != i1) { B[i2][k] = A[i2+1][i3]; k++; } } } d += s * A[0][i1] * determinant(m, B); s = -s; } for (i1 = 0; i1 < m; i1++) delete [] B[i1]; delete [] B; } return d; } /**********************************************************************/ /* 空間内の点と直線との距離 */ /* (x1, y1, z1) と (x - x0) / λ = (y - y0) / μ = (z - z0) / ν */ /* λ,μ,ν:方向余弦 */ /* return : 距離 */ /**********************************************************************/ #include <math.h> double p_line_3(double x0, double y0, double z0, double ram, double myu, double nyu, double x1, double y1, double z1) { double x, y, z, w, r; x = x1 - x0; y = y1 - y0; z = z1 - z0; w = ram * x + myu * y + nyu * z; r = sqrt(fabs(x * x + y * y + z * z - w * w)); return r; }
/***************************************************/ /* 基本入出力 */ /* スペースや改行で区切られたデータの読み込み */ /* (スペースや改行を読み込むことは出来ない) */ /* coded by Y.Suganuma */ /***************************************************/ #include <stdio.h> int main() { double d_data; int i_data; char c, str[5]; FILE *in = fopen("data", "r"); while (fscanf(in, "%lf %d %c %s", &d_data, &i_data, &c, str) != EOF) printf("%.2f %5d %c %s\n", d_data, i_data, c, str); fclose(in); return 0; } /* 入力データ例 3.141592654 123 a ab 1.2 12345 A ABC */
/*********************************************/ /* 1文字ずつ入力 */ /* int fgetc(FILE *stream) */ /* stream : FILE構造体へのポインタ */ /* coded by Y.Suganuma */ /*********************************************/ #include <stdio.h> int main() { int i1 = 0; char str[100]; FILE *in = fopen("data", "r"); while ((str[i1] = fgetc(in)) != EOF) i1++; str[i1] = '\0'; printf("%s", str); fclose(in); return 0; } /* 入力データ例 3.141592654 123 a ab 1.2 12345 A ABC */
/*******************************************************/ /* 1行ずつ入力 */ /* char *fgets(char *string, int n, FILE *stream) */ /* string : 読み込んだデータの格納場所 */ /* n : 読み込む文字数 */ /* stream : FILE構造体へのポインタ */ /* 文字の読込は,改行文字('\n')が現れるか,ファ */ /* イルの終端に達するか,または,読み込んだ文字数 */ /* が(指定された文字数-1)になるまで行われます */ /* 改行文字は読み込み格納されます.文字列の最後に */ /* はNULL文字('\0')が付加されます.fgets関数のス*/ /* トリームを標準入力ストリーム(stdin)とすれば,*/ /* gets関数とほとんど同じですが,gets関数では,改 */ /* 行文字をNULL文字に置き換えます.成功すると読み */ /* 込んだ文字列に対するポインタを返します. */ /* coded by Y.Suganuma */ /*******************************************************/ #include <stdio.h> int main() { char str[25]; FILE *in = fopen("data", "r"); while (fgets(str, 25, in) != NULL) printf("%s", str); fclose(in); return 0; } /* 入力データ例 3.141592654 123 a ab 1.2 12345 A ABC */