, 外積, ベクトルへの行列の演算など)
ただし, 演算を行う部分は関数で実現すること. また, 配列と構造体のそれぞれの場合について, 関数に値を渡す場合と, アドレスを渡す場合のそれぞれのプログラムを作成すること.
作成したプログラム(.cが付くファイル)をメールで提出する. さらに課題1で用いた入力ファイルを提出すること. 本文に, 学籍番号, 氏名を明記すること.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double x, y;
x = 3.0;
y = x;
printf("y=%f\n", y);
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
int main(void)
{
VECTOR x = {1.0, 2.0, 3.0}; // 初期化
VECTOR y;
y = x; // 代入
printf("y.v1=%f\n", y.v1);
printf("y.v2=%f\n", y.v2);
printf("y.v3=%f\n", y.v3);
return EXIT_SUCCESS;
}
関数に渡す.
#include <stdio.h>
#include <stdlib.h>
void func(double y) // y = x; のように代入される.
{
printf("y=%f\n", y);
y=10.0;
}
int main(void)
{
double x = 3.0;
func(x);
printf("x=%f\n", x); // x の値は変わらない.
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
void func(VECTOR y) // y = x; のように代入される.
{
printf("y.v1=%f\n", y.v1);
printf("y.v2=%f\n", y.v2);
printf("y.v3=%f\n", y.v3);
y.v1 = 10.0;
}
int main(void)
{
VECTOR x = {1.0, 2.0, 3.0};
func(x);
printf("x.v1=%f\n", x.v1); // x.v1の値は変わらない.
return EXIT_SUCCESS;
}
関数から返す.
#include <stdio.h>
#include <stdlib.h>
double func(void)
{
double x;
x = 3.0;
return x;
}
int main(void)
{
double y;
y = func();
printf("y=%f\n", y);
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
VECTOR func(void)
{
VECTOR x = {1.0, 2.0, 3.0};
return x; // 関数は 構造体を返すことができる.
}
int main(void)
{
VECTOR y;
y = func();
printf("y.v1=%f\n", y.v1);
printf("y.v2=%f\n", y.v2);
printf("y.v3=%f\n", y.v3);
return EXIT_SUCCESS;
}
main 関数内で用いる.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double x;
double *y;
x = 3.0;
y = &x;
printf("y=%f\n", *y);
*y = 10.0;
printf("x=%f\n", x); // の値は書き換えれていにことに注意.
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
int main(void)
{
VECTOR x = {1.0, 2.0, 3.0};
VECTOR *y;
y = &x;
printf("y.v1=%f\n", y->v1); // y.v1 ではないことに注意.
printf("y.v2=%f\n", y->v2);
printf("y.v3=%f\n", y->v3);
y->v1 = 10.0;
printf("x.v1 = %f\n", x.v1); // x.v1 の値が書き換えられていることに注意.
return EXIT_SUCCESS;
}
関数に渡す.
#include <stdio.h>
#include <stdlib.h>
// y = x; のように代入される.
// x のアドレスを受け取ることになる.
void func(double *y)
{
printf("y=%f\n", *y); // ポインタ変数の復習をしておきましょう.
*y=10.0;
}
int main(void)
{
double x = 3.0;
func(&x); // アドレスを渡す.
printf("x=%f\n", x); // x の値は変わる.
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
void func(VECTOR *y) // アドレスを受け取る. y = x; のように代入される.
{
printf("y->v1=%f\n", y->v1); // y はポインタ変数であるので
printf("y->v2=%f\n", y->v2); // y.v2 ではなく,
printf("y->v3=%f\n", y->v3); // y->v2 または (*y).v2
y->v1 = 10.0; // アドレスを受け取っているので x.v1 に代入していることになる.
}
int main(void)
{
VECTOR x = {1.0, 2.0, 3.0};
func(&x); // アドレスを渡す.
printf("x.v1=%f\n", x.v1); // x.v1の値は変わる.
return EXIT_SUCCESS;
}
関数から返す.
#include <stdio.h>
#include <stdlib.h>
double a;
double *func(void)
{
a = 10.0;
return &a; // アドレスを返す.
}
// この関数は誤り.
double *func_wrong(void)
{
double x; // このx はこの関数内でのみ使用できる.
x = 10.0;
return &x;
// アドレスを返すことはできるが, そのアドレス上の領域は,
// この関数から戻ったときに別の変数に使われる.
}
int main(void)
{
double y;
y = *func(); // 返されたアドレス上の値を得る.
printf("y=%f\n", y);
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
VECTOR a;
VECTOR *func(void)
{
a.v1 = 1.0;
a.v2 = 2.0;
a.v3 = 3.0;
return &a; // アドレスを返す
}
int main(void)
{
VECTOR y;
y = *func(); // 返されたアドレス上の値を得る.
// もし func 内で変数を宣言し, その変数のアドレスを返されても
// ここでは その変数の値は使用できない.
printf("y.v1=%f\n", y.v1);
return EXIT_SUCCESS;
}
main関数内で使う.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double x[3] = {1.0, 2.0, 3.0}; // 初期化
double y[3];
y[0] = x[0]; // 代入
y[1] = x[1];
y[2] = x[2];
printf("y[0]=%f\n", y[0]);
printf("y[1]=%f\n", y[1]);
printf("y[2]=%f\n", y[2]);
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
int main(void)
{
VECTOR x[2] = {{1.0, 2.0, 3.0}, {10.0, 20.0, 30.0}};
printf("x[0].v1=%f\n", x[0].v1);
printf("x[1].v1=%f\n", x[1].v1);
return EXIT_SUCCESS;
}
関数に渡す. 配列のコピーを渡しているのではなく, アドレスを渡していることに注意.
#include <stdio.h>
#include <stdlib.h>
// 配列の先頭要素のアドレスを受け取る.
// ポインタ変数と同じ.
void func(double y[])
{
printf("y[0]=%f\n", y[0]);
y[0] = 10.0;
}
int main(void)
{
double x[3] = {1.0, 2.0, 3.0};
func(x);
printf("x[0] = %f\n", x[0]); // 値が書き換わることに注意.
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
void func(VECTOR y[]) // アドレスを受け取る. y = x; のように代入される.
{
printf("y[0].v1=%f\n", y[0].v1);
y[0].v1 = 10.0;
}
int main(void)
{
VECTOR x[2] = {{1.0, 2.0, 3.0}, {10.0, 20.0, 30.0}};
func(x); // アドレスを渡す.
printf("x[0].v1=%f\n", x[0].v1); // x[0].v1の値は変わる.
return EXIT_SUCCESS;
}
関数から返すことはできない.
#include <stdio.h>
#include <stdlib.h>
double *func(void)
{
double a[3] = {1.0, 2.0, 3.0};
return a; // 関数は配列を返すことはできないので誤り.
}
int main(void)
{
double *p;
p = func();
printf("p[0] = %f\n", p[0]);
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
double x[3] = {1.0, 2.0, 3.0};
double *y;
y = x; // 配列名は配列の先頭の要素のアドレスを表す.
printf("y[0]=%f\n", y[0]); // *(y+i) と y[i] は同じ意味.
printf("y[1]=%f\n", y[1]);
printf("y[2]=%f\n", y[2]);
y[0] = 10.0;
printf("x[0] = %f\n", x[0]); // x[0] の値は書き換えられていることに注意.
return EXIT_SUCCESS;
}
関数に渡す.
#include <stdio.h>
#include <stdlib.h>
// 配列の先頭要素のアドレスを受け取る.
// 配列と同様に扱うことができる.
void func(double *y)
{
printf("y[0]=%f\n", y[0]);
printf("*y=%f\n", *y);
y[0] = 10.0;
}
int main(void)
{
double x[3] = {1.0, 2.0, 3.0};
func(x);
printf("x[0] = %f\n", x[0]); // 値が書き換わることに注意.
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
void func(VECTOR *y) // アドレスを受け取る. y = x; のように代入される.
{
printf("y[1].v1=%f\n", (y+1)->v1);
// printf("y[1].v1=%f\n", (*(y+1)).v1);
// printf("y[1].v1=%f\n", y[1].v1); と同等.
(y+1)->v1 = 10.0;
// y[1].v1 = 10.0; と同等.
}
int main(void)
{
VECTOR x[2] = {{1.0, 2.0, 3.0}, {10.0, 20.0, 30.0}};
func(x); // アドレスを渡す.
printf("x[0].v1=%f\n", x[0].v1); // x[0].v1の値は変わる.
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// ポインタ変数はy = &x;のようにアドレスを代入してから使う.
printf("*y=%f\n", *y); // 誤り.
*y = 10.0; // 誤り.
printf("*y=%f\n", *y); // 誤り
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double v1;
double v2;
double v3;
} VECTOR;
// ポインタ変数は, VECTOR x = {1.0, 2.0, 3.0}; y = &x; のように
// アドレスを代入してから用いる必要がある.
int main(void)
{
VECTOR *y;
y->v1 = 10.0; // 誤り.
printf("x.v1 = %f\n", x->v1); // 誤り.
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <stdlib.h>
// ポインタ変数はアドレスを代入してから使う.
// double x[3] = {1.0, 2.0, 3.0}; のように記憶域上の領域を用意しておいてから,
// y = x; のようにアドレスを代入する必要がある.
int main(void)
{
double *y;
y[0] = 10.0; // 誤り.
printf("y[0] = %f\n", y[0]); //誤り.
return EXIT_SUCCESS;
}