y = sqrt(x);
#include <math.h> double sqrt(double x) x : 倍精度浮動小数点数
double x = 3.14, y; y = sqrt(x); // y = sqrt(3.14) としても良い
double d_data;
int i_data;
char c_data[10];
scanf("%lf %d %s", &d_data, &i_data, c_data);
3.141592654 123 abc
3.141592654 123 abc
double d_data;
int i_data;
char c_data[10];
・・・・・
printf("結果は %f %10.3f %d %5d %s %c\n", d_data, d_data, i_data, i_data, c_data, c_data[1]);
結果は 3.141593 3.142 123 123 abc b
/****************************/
/* 文字列操作の例 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
#include <string.h>
int main()
{
char abc[] = "abc";
char *defgh = "defgh";
char emp[20] = "", *str;
int i1, c1, c2, len1, len2, len3;
// 現在の文字列の内容を出力
printf("-abc- %s\n", abc); // 文字列として出力
printf("-abc- "); // 1文字ずつ出力
for (i1 = 0; i1 < 3; i1++)
printf("%c", abc[i1]);
printf("\n");
// 文字列の長さ
len1 = strlen(abc);
len2 = strlen(defgh);
len3 = strlen(emp);
printf("各文字列の長さ %d %d %d\n", len1, len2, len3);
// 文字列のコピー
str = strcpy(emp, abc);
len1 = strlen(emp);
printf("-str- %s -emp- %s 長さ %d\n", str, emp, len1);
// 文字列の比較
c1 = strcmp(emp, abc);
c2 = strcmp(emp, defgh);
printf("-empとabc- %d -empとdefgh- %d\n", c1, c2);
// 文字列の結合
str = strcat(emp, " ");
str = strcat(emp, defgh);
len1 = strlen(emp);
printf("-str- %s -emp- %s 長さ %d\n", str, emp, len1);
// 文字列の検索
str = strstr(emp, "ef");
len1 = strlen(str);
printf("-str- %s 長さ %d -emp- %s\n", str, len1, emp);
return 0;
}
-abc- abc -abc- abc 各文字列の長さ 3 5 0 -str- abc -emp- abc 長さ 3 -empとabc- 0 -empとdefgh- -1 -str- abc defgh -emp- abc defgh 長さ 9 -str- efgh 長さ 4 -emp- abc defgh
関数の型 関数名 ( 引数リスト )
/****************************/
/* nの階乗の計算 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
int main()
{
double kai;
int i1, n;
/*
データの入力
*/
printf("nの値を入力して下さい ");
scanf("%d", &n);
/*
階乗の計算
*/
kai = 1.0; /* 初期設定 */
for (i1 = 1; i1 <= n; i1++)
kai *= (double)i1;
/*
結果の出力
*/
printf(" %dの階乗は=%f\n", n, kai);
return 0;
}
01 /****************************/
02 /* nの階乗の計算 */
03 /* coded by Y.Suganuma */
04 /****************************/
05 #include <stdio.h>
06
07 double kaijo(int);
08
09 int main()
10 {
11 double kai;
12 int n;
13 /*
14 データの入力
15 */
16 printf("nの値を入力して下さい ");
17 scanf("%d", &n);
18 /*
19 階乗の計算
20 */
21 kai = kaijo(n);
22 /*
23 結果の出力
24 */
25 printf(" %dの階乗は=%f\n",n,kai);
26
27 return 0;
28 }
29
30 /**************************/
31 /* mの階乗 */
32 /* m : データ */
33 /* return : mの階乗 */
34 /**************************/
35 double kaijo(int m)
36 {
37 double s;
38 int i1;
39
40 s = 1.0;
41 for (i1 = 1; i1 <= m; i1++)
42 s *= (double)i1;
43
44 return s;
45 }
printf(" %dの階乗は=%f\n", n, kaijo(n));
/****************************/
/* nの階乗の計算 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
double kaijo(int);
int main()
{
double kai;
int n;
/*
データの入力
*/
printf("nの値を入力して下さい ");
scanf("%d", &n);
/*
階乗の計算
*/
kai = kaijo(n);
/*
結果の出力
*/
printf(" %dの階乗は=%f\n",n,kai);
return 0;
}
/**************************/
/* mの階乗 */
/* m : データ */
/* return : nの階乗 */
/**************************/
double kaijo(int m)
{
double s;
if (m > 1)
s = m * kaijo(m-1); /* 自分自身を呼んでいる */
else
s = 1;
return s;
}
/****************************/
/* nCrの計算 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
double kaijo(int);
int main()
{
double sn, sr, snr;
int n, r;
/*
データの入力
*/
printf("nとrの値を入力して下さい ");
scanf("%d %d", &n, &r);
/*
nCrの計算と出力
*/
sn = kaijo(n);
sr = kaijo(r);
snr = kaijo(n-r);
printf(" %dC%dは=%f\n", n, r, sn/(sr*snr));
return 0;
}
/**************************/
/* mの階乗 */
/* m : データ */
/* return : nの階乗 */
/**************************/
double kaijo(int m)
{
double s;
int i1;
s = 1.0;
for (i1 = 1; i1 <= m; i1++)
s *= (double)i1;
return s;
}
[記憶クラス] [型修飾]データ型 変数名, 配列名, 関数名, ・・・
auto :内部 register:内部 static :内部,外部 extern :内部,外部
const volatile
const int n = 10; double x[n];
y = ::x;
01 /**********************************/
02 /* 変数の有効範囲(同じファイル) */
03 /* coded by Y.Suganuma */
04 /**********************************/
05 #include <stdio.h>
06
07 void sub3(void);
08
09 extern int j; // 26 行目で宣言された j
10
11 void sub1(void)
12 {
13 extern int i; // 25 行目で宣言された i
14 int k = 3;
15 printf("%d %d %d\n", i, j, k);
16 }
17
18 void sub2(void)
19 {
20 int i = 5;
21 int k = 6;
22 printf("%d %d %d\n",i,j,k);
23 }
24
25 int i = 1;
26 int j = 2;
27
28 int main()
29 {
30 sub2();
31 sub1();
32 sub3();
33
34 return 0;
35 }
36
37 void sub3(void)
38 {
39 int k = 7;
40 printf("%d %d %d\n", i, j, k);
41 }
------------------------file 1----------------------------
/************************************/
/* 変数の有効範囲(別々のファイル) */
/* coded by Y.Suganuma */
/************************************/
void sub1(void);
void sub2(void);
void sub3(void);
int i = 1;
int j = 2;
int main()
{
sub2();
sub1();
sub3();
return 0;
}
------------------------file 2----------------------------
#include <stdio.h>
void sub1(void)
{
extern int i; // file 1 で宣言された i
extern int j; // file 1 で宣言された j
int k = 3;
printf("%d %d %d\n", i, j, k);
}
------------------------file 3----------------------------
#include <stdio.h>
void sub2(void)
{
extern int j; // file 1 で宣言された j
int i = 5;
int k = 6;
printf("%d %d %d\n", i, j, k);
}
------------------------file 4----------------------------
#include <stdio.h>
void sub3(void)
{
extern int i; // file 1 で宣言された i
extern int j; // file 1 で宣言された j
int k = 7;
printf("%d %d %d\n", i, j, k);
}
01 /*****************************/
02 /* C++における変数の有効範囲 */
03 /* coded by Y.Suganuma */
04 /*****************************/
05 #include <stdio.h>
06
07 int x = 10; // 以下に記述されたすべての関数で有効
08
09 int main()
10 {
11 int x = 20; // main 関数内で有効
12 int y; // main 関数内で有効
13
14 y = ::x; // 7 行目の x を参照
15 printf("x %d y %d\n", x, y);
16
17 if (x > 5) {
18 int y = 30; // 18,19 行目だけで有効
19 printf("x %d y %d\n", x, y);
20 }
21
22 printf("x %d y %d\n", x, y);
23
24 for (int x = 1; x <= 3; x++) { // x は 24 〜 27 行目で有効
25 int y = x + 1; // 25,26 行目だけで有効
26 printf("x %d y %d\n", x, y);
27 }
28
29 printf("x %d y %d\n", x, y);
30
31 return 0;
32 }
x 20 y 10 x 20 y 30 x 20 y 10 x 1 y 2 x 2 y 3 x 3 y 4 x 20 y 10
namespace 名前空間名 { リスト };
namespace name1
{
int func1( ・・・ ) { ・・・ }
・・・・・
};
x = name1::func1( ・・・ );
#include <stdio.h>
namespace Test1 {
class Seisu // 2 つの整数の集まりからなる型
{
public:
int k1;
int k2;
};
void print(int k)
{
printf("%d\n", k);
}
}
namespace Test2 {
void print(int k)
{
if (k < 0)
printf("\n");
else
printf(" %d", k);
}
}
/****************/
/* main program */
/****************/
int main()
{
Test1::Seisu kk; // Seisu 型変数 kk を定義
kk.k1 = 10; // 変数 kk の最初の整数の値を設定
kk.k2 = 20; // 変数 kk の 2 番目の整数の値を設定
Test1::print(kk.k1);
Test1::print(kk.k2);
Test2::print(kk.k1);
Test2::print(kk.k2);
Test2::print(-1);
return 0;
}
10 20 10 20
/****************/
/* main program */
/****************/
using namespace Test1;
int main()
{
Seisu kk;
kk.k1 = 10;
kk.k2 = 20;
print(kk.k1);
print(kk.k2);
Test2::print(kk.k1);
Test2::print(kk.k2);
Test2::print(-1);
return 0;
}
{
・・・
b = 5;
n = sub(a, &b);
・・・
}
int sub(int a, int *b)
{
・・・
*b = 10;
・・・
}
/****************************/
/* 複数結果の受け渡し */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
int sub(int, int, int *);
int n; /* 以下の関数にすべて有効 */
int main()
{
int a, b, res, ind;
/*
データの入力
*/
printf("a,b,及び,nの値を入力して下さい ");
scanf("%d %d %d", &a, &b, &n);
/*
関数の呼び出し
*/
ind = sub(a, b, &res); /* 変数resはアドレス渡し */
/*
結果の出力
*/
if (ind == 0)
printf("n %d result %d", n, res);
else
printf("n = 0 (n %d)\n", n);
return 0;
}
/*****************************/
/* (a+b)/nの計算 */
/* a,b : データ */
/* res : 計算結果 */
/* return : =0 : normal */
/* =1 : n = 0 */
/*****************************/
int sub(int a, int b, int *res)
{
extern int n;
int ind;
if (n == 0) {
ind = 1;
n = 100;
}
else {
ind = 0;
*res = (a + b) / n;
}
return ind;
}
n 3 result 2 n = 0 (n 100)
sub(a, b, &res, &ind);
void sub(int a, int b, int *res, int *ind)
/****************************/
/* 複数結果の受け渡し */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
int *sub(int, int);
int n; /* 以下の関数にすべて有効 */
int main()
{
int a, b, *res;
/*
データの入力
*/
printf("a,b,及び,nの値を入力して下さい ");
scanf("%d %d %d", &a, &b, &n);
/*
関数の呼び出し
*/
res = sub(a, b); /* resに結果が入る */
/*
結果の出力
*/
if (res[0] == 0)
printf("n %d result %d", n, res[1]);
else
printf("n = 0 (n %d)\n", n);
delete [] res;
return 0;
}
/**************************************/
/* (a+b)/nの計算 */
/* a,b : データ */
/* return : res[0] : =0 : normal */
/* =1 : n = 0 */
/* res[1] : 計算結果 */
/**************************************/
int *sub(int a, int b)
{
extern int n;
int *res = new int [2];
if (n == 0) {
res[0] = 1;
n = 100;
}
else {
res[0] = 0;
res[1] = (a + b) / n;
}
return res;
}
int res[2]
sub(a, b, res);
void sub(int a, int b, int *res) // void sub(int a, int b, int res[]) でも良い
int func(int, int = 5, char * = "test");
func(x) func(x, 10);
func(x, 5, "test") func(x, 10, "test");
01 /****************************/
02 /* デフォルト引数 */
03 /* coded by Y.Suganuma */
04 /****************************/
05 #include <stdio.h>
06
07 void sub(int, int = 5, FILE * = stdout);
08
09 int main()
10 {
11 sub(10); // sub(10, 5, stdout)と解釈
12 sub(10, 10); // sub(10, 10, stdout)と解釈
13 sub(10, 20, stdout);
14 return 0;
15 }
16 /*********************************/
17 /* 整数の足し算 */
18 /* x,y : データ */
19 /* fp : 出力先 */
20 /* coded by Y.Suganuma */
21 /*********************************/
22 void sub(int x, int y, FILE *fp)
23 //void sub(int x, int y = 5, FILE *fp = stdout)
24 {
25 fprintf(fp, "結果は=%d\n", x+y);
26 }
{
int b[5];
・・・
n = sub(・・・, b, ・・・);
・・・
}
int sub(・・・, int c[], ・・・)
{
・・・
}
int sub(・・・, int *c, ・・・)
/****************************/
/* 1次元配列の受け渡し */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
void wa(int, int *, int *, int *);
int main()
{
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int i1, b[3];
/*
関数の呼び出し
*/
wa(3, &(a[0][0]), &(a[1][0]), b); /* 1行目と2行目のベクトル和の計算 */
/*
結果の出力
*/
for (i1 = 0; i1 < 3; i1++)
printf("%d ", b[i1]);
printf("\n");
return 0;
}
/***********************************/
/* n次元ベクトルの和 */
/* n : 次元数 */
/* a,b : 和を計算するベクトル */
/* c : 計算結果が入るベクトル */
/***********************************/
void wa(int n, int *a, int *b, int *c)
{
int i1;
for (i1 = 0; i1 < n; i1++)
c[i1] = a[i1] + b[i1];
}
int b[4][10];
int sub(・・・, int c[][10], ・・・)
int sub(・・・, int (*c)[10], ・・・)
/**********************************/
/* 2次元配列の受け渡し(方法1) */
/* coded by Y.Suganuma */
/**********************************/
#include <stdio.h>
void seki(int, int, int, int [][3], int [][2], int [][2]);
int main()
{
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int b[3][2] = {{1, 0}, {0, 1}, {0, 0}};
int i1, i2, c[2][2];
/*
関数の呼び出し
*/
seki(2, 3, 2, a, b, c);
/*
結果の出力
*/
for (i1 = 0; i1 < 2; i1++) {
for (i2 = 0; i2 < 2; i2++)
printf("%d ", c[i1][i2]);
printf("\n");
}
return 0;
}
/**************************************/
/* 行列の積 */
/* n,m,l : 次元数 */
/* a : n x m */
/* b : m x l */
/* c : 計算結果が入る行列,n x l */
/**************************************/
void seki(int n, int m, int l, int a[][3], int b[][2], int c[][2])
{
int i1, i2, i3;
for (i1 = 0; i1 < n; i1++) {
for (i2 = 0; i2 < l; i2++) {
c[i1][i2] = 0;
for (i3 = 0; i3 < m; i3++)
c[i1][i2] += a[i1][i3] * b[i3][i2];
}
}
}
/**********************************/
/* 2次元配列の受け渡し(方法2) */
/* coded by Y.Suganuma */
/**********************************/
#include <stdio.h>
void seki(int, int, int, int **, int **, int **);
int main()
{
int i1, i2, **a, **b, **c;
/*
領域の確保と値の設定
*/
a = new int * [2];
b = new int * [3];
c = new int * [2];
for (i1 = 0; i1 < 2; i1++) {
a[i1] = new int [3];
c[i1] = new int [2];
if (i1 == 0) {
a[i1][0] = 1;
a[i1][1] = 2;
a[i1][2] = 3;
}
else {
a[i1][0] = 4;
a[i1][1] = 5;
a[i1][2] = 6;
}
}
for (i1 = 0; i1 < 3; i1++) {
b[i1] = new int [2];
if (i1 == 0) {
b[i1][0] = 1;
b[i1][1] = 0;
}
else {
if (i1 == 1) {
b[i1][0] = 0;
b[i1][1] = 1;
}
else {
b[i1][0] = 0;
b[i1][1] = 0;
}
}
}
/*
関数の呼び出し
*/
seki(2, 3, 2, a, b, c);
/*
結果の出力
*/
for (i1 = 0; i1 < 2; i1++) {
for (i2 = 0; i2 < 2; i2++)
printf("%d ", c[i1][i2]);
printf("\n");
}
return 0;
}
/**************************************/
/* 行列の積 */
/* n,m,l : 次元数 */
/* a : n x m */
/* b : m x l */
/* c : 計算結果が入る行列,n x l */
/**************************************/
void seki(int n, int m, int l, int **a, int **b, int **c)
{
int i1, i2, i3;
for (i1 = 0; i1 < n; i1++) {
for (i2 = 0; i2 < l; i2++) {
c[i1][i2] = 0;
for (i3 = 0; i3 < m; i3++)
c[i1][i2] += a[i1][i3] * b[i3][i2];
}
}
}
/**********************************/
/* 2次元配列の受け渡し(方法3) */
/* coded by Y.Suganuma */
/**********************************/
#include <stdio.h>
void seki(int, int, int, int *, int *, int *);
int main()
{
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int b[3][2] = {{1, 0}, {0, 1}, {0, 0}};
int i1, i2, c[2][2];
/*
関数の呼び出し
*/
seki(2, 3, 2, &a[0][0], &b[0][0], &c[0][0]);
/*
結果の出力
*/
for (i1 = 0; i1 < 2; i1++) {
for (i2 = 0; i2 < 2; i2++)
printf("%d ", c[i1][i2]);
printf("\n");
}
return 0;
}
/**************************************/
/* 行列の積 */
/* n,m,l : 次元数 */
/* a : n x m */
/* b : m x l */
/* c : 計算結果が入る行列,n x l */
/**************************************/
void seki(int n, int m, int l, int *a, int *b, int *c)
{
int i1, i2, i3;
for (i1 = 0; i1 < n; i1++) {
for (i2 = 0; i2 < l; i2++) {
c[l*i1+i2] = 0;
for (i3 = 0; i3 < m; i3++)
c[l*i1+i2] += a[m*i1+i3] * b[l*i3+i2]; /* 添え字に注意 */
}
}
}
#include <stdio.h>
#define row 3
#define col 6
#define n13 2
#define n12 6
unsigned int set(int, int, int, int, int, int, int, int, unsigned int, int a[][col]);
int main()
{
int i1, i2, i3, i4, i5, i6, k, k3, k2, s, a[row][col];
unsigned int n;
for (i1 = 0; i1 <= n13; i1++) {
if (i1 == 0) {
k = 1;
k3 = 0;
k2 = 1;
s = 1;
}
else {
k = 0;
k3 = 1;
k2 = 0;
s = 0;
}
for (i2 = k; i2 <= n12; i2++) {
for (i3 = 0; i3 < row; i3++) {
for (i4 = 0; i4 < col; i4++)
a[i3][i4] = 0;
}
n = 0;
for (i5 = 0; i5 < row; i5++) {
for (i6 = 0; i6 < col; i6++) {
n = set(i1, i2, k3, k2, s, 0, i5, i6, n, a);
n = set(i1, i2, k3, k2, s, 1, i5, i6, n, a);
}
}
printf(" %d (%d %d)\n", n, i1, i2);
}
}
return 0;
}
/*******************************/
/* タイルの設定 */
/* n3 : 1 x 3 の枚数 */
/* n2 : 1 x 2 の枚数 */
/* k3 : 1 x 3 の設定数 */
/* k2 : 1 x 2 の設定数 */
/* s : =0 : 1 x 3 の設定 */
/* =1 : 1 x 2 の設定 */
/* vh : =0 : 縦 */
/* =1 : 横 */
/* y,x : 設定位置(行と列) */
/* m : 現時点の場合の数 */
/* a : 設定状況 */
/*******************************/
unsigned int set(int n3, int n2, int k3, int k2, int s, int vh, int y, int x, unsigned int m, int a[][col])
{
int i1, i2, k, kk, b[row][col], sw = 0;
unsigned int n = m;
// 初期設定
for (i1 = 0; i1 < row; i1++) {
for (i2 = 0; i2 < col; i2++)
b[i1][i2] = a[i1][i2];
}
// タイルの設定
// 1 x 3 の設定
if (s == 0) {
if (vh == 0) { // 縦
if (y < row-2) {
if (b[y][x] == 0 && b[y+1][x] == 0 && b[y+2][x] == 0) {
b[y][x] = 1;
b[y+1][x] = 1;
b[y+2][x] = 1;
sw = 1;
}
}
}
else { // 横
if (x < col-2) {
if (b[y][x] == 0 && b[y][x+1] == 0 && b[y][x+2] == 0) {
b[y][x] = 1;
b[y][x+1] = 1;
b[y][x+2] = 1;
sw = 1;
}
}
}
}
// 1 x 2 の設定
else {
if (vh == 0) { // 縦
if (y < row-1) {
if (b[y][x] == 0 && b[y+1][x] == 0) {
b[y][x] = 1;
b[y+1][x] = 1;
sw = 1;
}
}
}
else { // 横
if (x < col-1) {
if (b[y][x] == 0 && b[y][x+1] == 0) {
b[y][x] = 1;
b[y][x+1] = 1;
sw = 1;
}
}
}
}
// 設定できた場合
if (sw > 0) {
// すべてのタイル設定終了
if (k3 == n3 && k2 == n2)
n++;
// 次のタイル
else {
k = col * y + x + 1;
kk = row * col - k;
sw = 0;
if (k3 < n3) {
for (i1 = k; i1 < row * col; i1++) {
if (b[i1/col][i1%col] > 0)
kk--;
}
if (3*(n3-k3) > kk)
sw = -1;
else
k3++;
}
else {
if (s == 0) {
sw = 1;
s = 1;
k2++;
}
else {
for (i1 = k; i1 < row * col; i1++) {
if (b[i1/col][i1%col] > 0)
kk--;
}
if (2*(n2-k2) > kk)
sw = -1;
else
k2++;
}
}
if (sw > 0) {
for (i1 = 0; i1 < row; i1++) {
for (i2 = 0; i2 < col; i2++) {
n = set(n3, n2, k3, k2, s, 0, i1, i2, n, b);
n = set(n3, n2, k3, k2, s, 1, i1, i2, n, b);
}
}
}
else if (sw == 0) {
for (i1 = k; i1 < row * col; i1++) {
n = set(n3, n2, k3, k2, s, 0, i1/col, i1%col, n, b);
n = set(n3, n2, k3, k2, s, 1, i1/col, i1%col, n, b);
}
}
}
}
return n;
}
int (*sub)(double, char *)
xn+1 = xn - f(xn) / f'(xn)
/****************************/
/* 関数名の受け渡し */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
double newton(double(*)(double), double(*)(double), double, double,
double, int, int *);
double snx(double);
double dsnx(double);
int main()
{
double eps1, eps2, x, x0;
int max, ind;
eps1 = 1.0e-7;
eps2 = 1.0e-10;
max = 20;
x0 = 0.0;
x = newton(snx, dsnx, x0, eps1, eps2, max, &ind);
printf("ind=%d x=%f f=%f df=%f\n",ind,x,snx(x),dsnx(x));
return 0;
}
/*****************************************************/
/* Newton法による非線形方程式(f(x)=0)の解 */
/* fn : f(x)を計算する関数名 */
/* dfn : f(x)の微分を計算する関数名 */
/* x0 : 初期値 */
/* eps1 : 終了条件1(|x(k+1)-x(k)|<eps1) */
/* eps2 : 終了条件2(|f(x(k))|<eps2) */
/* max : 最大試行回数 */
/* ind : 実際の試行回数 */
/* (負の時は解を得ることができなかった) */
/* return : 解 */
/*****************************************************/
#include <math.h>
double newton(double(*f)(double), double(*df)(double), double x0,
double eps1, double eps2, int max, int *ind)
{
double g, dg, x, x1;
int sw;
x1 = x0;
x = x1;
*ind = 0;
sw = 0;
while (sw == 0 && *ind >= 0) {
sw = 1;
*ind += 1;
g = (*f)(x1);
if (fabs(g) > eps2) {
if (*ind <= max) {
dg = (*df)(x1);
if (fabs(dg) > eps2) {
x = x1 - g / dg;
if (fabs(x-x1) > eps1 && fabs(x-x1) > eps1*fabs(x)) {
x1 = x;
sw = 0;
}
}
else
*ind = -1;
}
else
*ind = -1;
}
}
return x;
}
/************************/
/* 関数値(f(x))の計算 */
/************************/
double snx(double x)
{
double y;
y = exp(x) - 3.0 * x;
return y;
}
/********************/
/* 関数の微分の計算 */
/********************/
double dsnx(double x)
{
double y;
y = exp(x) - 3.0;
return y;
}
/****************************/
/* 関数名の配列 */
/* coded by y.suganuma */
/****************************/
#include <stdio.h>
/*
FPは2つのintの引数をもらいintを帰す関数へのポインタであると宣言
*/
typedef int (*FP) (int, int);
/*
4つの関数を宣言
*/
int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);
int main()
{
int i1, x = 12;
FP f_tb[] = {&add, &sub, &mul, &div}; /* 関数へのポインタ配列 */
for (i1 = 0; i1 < 4; i1++)
printf("result %d\n", f_tb[i1](x, i1+1));
return 0;
}
/********/
/* 加算 */
/********/
int add(int x, int y)
{
return (x + y);
}
/********/
/* 減算 */
/********/
int sub(int x, int y)
{
return (x - y);
}
/********/
/* 乗算 */
/********/
int mul(int x, int y)
{
return (x * y);
}
/********/
/* 除算 */
/********/
int div(int x, int y)
{
return (x / y);
}
result 13 result 10 result 36 result 3
データ型 &別名 = 式;
int &y = x;
x = 10; y = 10;
const
/****************************/
/* 参照渡し */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
void sub(int &, int, int *, char *&, char *);
int main()
{
int x = 10, y = 20, z = 0;
char *data1 = "data1", *data2 = "data2";
printf("x %d y %d z %d data1 %s data2 %s\n", x, y, z, data1, data2);
sub(x, y, &z, data1, data2);
printf("x %d y %d z %d data1 %s data2 %s\n", x, y, z, data1, data2);
return 0;
}
/****************************/
/* 参照渡しの例 */
/* a : 参照渡し */
/* b : データ渡し */
/* c : アドレス渡し */
/* c1 : 配列の参照渡し */
/* c2 : 通常の配列渡し */
/****************************/
void sub(int &a, int b, int *c, char *&c1, char *c2)
{
a += 5;
b += 5;
c1++;
c2++;
*c = a + b;
printf("a %d b %d c %d c1 %s c2 %s\n", a, b, *c, c1, c2);
}
x 10 y 20 z 0 data1 data1 data2 data2 a 15 b 25 c 40 c1 ata1 c2 ata2 x 15 y 20 z 40 data1 ata1 data2 data2
/****************************/
/* 参照渡し(参照型関数) */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
int x = 10;
int &sub(int);
int main()
{
int y = 20;
printf("x %d y %d\n", x, y);
/*
現在の変数xの値の参照(式を右辺)
*/
y = sub(5);
printf("x %d y %d\n", x, y);
/*
変数xに結果を代入(式を右辺)
*/
sub(100) += 3;
printf("x %d y %d\n", x, y);
return 0;
}
/*********************/
/* 関数が変数xの別名 */
/*********************/
int &sub(int a)
{
x += a;
return x;
}
x 10 y 20
x 15 y 15
x 118 y 15
int main()
add 2 3
int main ( int argc, char *argv[], char *envp[] )
/******************************/
/* main関数の引数(数字の和) */
/* coded by Y.Suganuma */
/******************************/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[], char *envp[])
{
int i1, k, sum = 0;
/*
引数の内容の出力
*/
printf(" 引数の数 %d\n",argc);
printf(" プログラム名 %s\n",argv[0]);
for (i1 = 1; i1 < argc; i1++) {
k = atoi(argv[i1]); /* 文字を整数に変換 */
printf(" %d 番目の引数 %d\n", i1+1, k);
sum += k;
}
/*
結果の表示
*/
printf("結果=%d\n", sum);
return 0;
}
引数の数 3 プログラム名 b:/temp/add.exe 1番目の引数 2 2番目の引数 3 結果=5
/*******************************/
/* main関数(環境変数の出力) */
/* coded by Y.Suganuma */
/*******************************/
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
int i1 = 0;
while (envp[i1] != NULL) {
printf("%d %s\n", i1+1, envp[i1]);
i1++;
}
return 0;
}
/****************************/
/* 関数名のオーバーロード */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
/****************/
/* 文字列の出力 */
/****************/
void print(char *moji)
{
printf("%s\n", moji);
}
/*****************/
/* double の出力 */
/*****************/
void print(double dbd)
{
printf("%f\n", dbd);
}
/**************/
/* int の出力 */
/**************/
void print(int ind)
{
printf("%d\n", ind);
}
/********/
/* main */
/********/
int main()
{
print("moji-retu"); // 以下,データの型に対応した関数が選択される
print(3.14);
print(100);
return 0;
}
inline int sub(int x, ・・・)
/*********************************/
/* インライン関数と#defineマクロ */
/* coded by Y.Suganuma */
/*********************************/
#include <stdio.h>
#include <math.h>
#include <time.h>
#define ookisa(x, y) sqrt(x * x + y * y) /* マクロによる計算 */
inline double length1(double, double);
double length2(double, double);
int main()
{
double a = 3.0;
double b = 4.0;
double x;
long i1;
clock_t c1, c2;
/*
マクロによる計算
*/
c1 = clock();
for (i1 = 0; i1 < 1000000; i1++)
x = ookisa(a, b);
c2 = clock();
printf("計算時間は %f 秒です(マクロ)\n", (double)(c2-c1)/CLOCKS_PER_SEC);
/*
インライン関数
*/
c1 = c2;
for (i1 = 0; i1 < 1000000; i1++)
x = length1(a, b);
c2 = clock();
printf("計算時間は %f 秒です(インライン関数)\n", (double)(c2-c1)/CLOCKS_PER_SEC);
/*
普通の関数
*/
c1 = c2;
for (i1 = 0; i1 < 1000000; i1++)
x = length2(a, b);
c2 = clock();
printf("計算時間は %f 秒です(普通の関数)\n", (double)(c2-c1)/CLOCKS_PER_SEC);
return 0;
}
/***************************/
/* sqrt(x*x+y*y)(inline) */
/* x,y : 2つのデータ */
/* return : 結果 */
/***************************/
inline double length1(double x, double y)
{
return sqrt(x * x + y * y);
}
/*******************************/
/* sqrt(x*x+y*y)(普通の関数) */
/* x,y : 2つのデータ */
/* return : 結果 */
/*******************************/
double length2(double x, double y)
{
return sqrt(x * x + y * y);
}
計算時間は 35 秒です(マクロ) 計算時間は 39 秒です(インライン関数) 計算時間は 40 秒です(普通の関数)
/****************************/
/* 例外処理 */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <math.h>
void sq(double x, double y)
{
double z;
if (x < 0.0 && y < 0.0)
throw "両方とも負\n";
else {
if (x < 0.0 || y < 0.0)
throw "片方が負\n";
}
z = sqrt(x+y);
std::cout << z << std::endl;
}
int main()
{
try {
sq(1.0, 2.0);
sq(-1.0, 2.0);
sq(-1.0, -2.0);
}
catch (char *str)
{
std::cout << str;
}
return 0;
}
1.73205 片方が負
/****************************/
/* 例外処理 */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <math.h>
class Negative {
public:
Negative(char *str, double x, double y) {
std::cout << str << " " << x << " " << y << std::endl;
}
void message() {
std::cout << " データを修正してください\n";
}
};
void sq(double x, double y)
{
double z;
if (x < 0.0 && y < 0.0)
throw Negative("両方とも負", x, y);
else {
if (x < 0.0 || y < 0.0)
throw Negative("片方が負", x, y);
}
z = sqrt(x+y);
std::cout << z << std::endl;
}
int main()
{
try {
sq(1.0, 2.0);
sq(-1.0, 2.0);
sq(-1.0, -2.0);
}
catch (Negative &ng)
{
ng.message();
}
return 0;
}
1.73205 片方が負 -1 2 データを修正してください
| ホームページ | 目次 | 演習解答例目次 | 付録目次 | 索引 |