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なのでカンマを忘れずに







構造体名を定義
初期化,数値格納






画面に表示する関数
ファイルに書き出しの関数