3回目 課題解答・解説
課題1),課題2)に取り組むとひとつのソースにまとまるので,以下のように解説する.
#include <stdio.h> #include <stdlib.h> struct Point2D{ double x; double y; }; |
共通部分 x, yを変数に持つ構造体 |
//課題1(1) void disp_xy(const Point2D* pnt, const int n){ /* この関数内で仮引数を変更しない場合はこのように書く.*/ for(int i = 0; i < n; i++){ printf("%f , %f\n", pnt[i].x, pnt[i].y); } } |
構造体をpntという名前で定義 構造体はポインタでやり取り 配列数nとする |
//課題1(2) void fileout(const Point2D* pnt, const int n){ //点群の座標をcsvファイルに出力する関数 FILE *fp; fp = fopen("153R000000-03-1.csv", "w"); if(fp == NULL){ printf("file cannot open\n"); exit(1); } fprintf(fp, "x, y\n"); for(int i = 0; i < n; i++){ fprintf(fp, "%f , %f\n", pnt[i].x, pnt[i].y); } fclose(fp); } int main(){ const int N = 5; Point2D points[N] = {{-3.5, -2.2}, {-2.2, -0.3}, {-1.0, 1.5}, { 0.2, 1.9}, { 2.3, 2.2}}; double a[N-1] = {0}, b[N-1] = {0}; //傾きと切片を格納する配列 disp_xy(points, N); fileout(points, N); for(int i = 0; i < N-1; i++){ //傾きと切片を各区間において計算し、配列に格納(以下、課題2) a[i] = (points[i].y - points[i+1].y)/(points[i].x - points[i+1].x); b[i] = points[i].y - a[i]*points[i].x; } printf("\n"); printf("\tl傾き\t切片\n"); printf("--------+------------------\n"); for(int i = 0; i < N-1; i++){ printf("区間%d\tl%.3f\t%.3f\n",i+1, a[i], b[i]); } return 0; } |
構造体はポインタでやり取り ファイルポインタ writeモードでファイルを開く csvなのでカンマを忘れずに 構造体名を定義 初期化,数値格納 画面に表示する関数 ファイルに書き出しの関数 |