1次元配列を関数に渡す


#include <stdio.h>

int sumA( int* a )
{
 int sum = 0;
 while ( *a != -999 ) {
  sum += *a;
  a++;
 }
 return sum;
}

int sumB( int* a )
{
 int i = 0, sum = 0;
 while ( a[ i ] != -999 ) {
  sum += a[ i ];
  i++;
 }
 return sum;
}

void main()
{
 int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -999 };

 printf( "%d\n", sumA( a ) );
 printf( "%d\n", sumB( a ) );
}

C > 関数 | comments (0) | trackbacks (0)

ポインタ配列


#include <stdio.h>
void main()
{
 char *str[] = { "Candy", "Nancy", "Eluza", "Ann" };
 int i, j;

 // 1行ずつ出力
 for ( i=0; i<4; i++ )
  printf( "%s\n", str[ i ] );

 // 1文字ずつ出力
 for ( i=0; i<4; i++ ) {
  j = 0;
  while ( str[ i ][ j ] != '\0' ) {
   putchar( str[ i ][ j ] );
   j++;
  }
  putchar( '\n' );
 }
}

C > ポインタ | comments (0) | trackbacks (0)

ポインタと2次元配列


#include <stdio.h>
void main()
{
 int a[][4] = { { 1, 2, 3, 0 }
        , { 4, 5, 6, 0 }
        , { 7, 8, 9, -999 } };

 int *pa = a[0];

 while ( *pa != -999 ) {
  printf( "%d ", *pa );
  pa++;
 }
}


a[0]は2次元配列の先頭アドレスを示すポインタ定数と考えらる。
C > ポインタ | comments (0) | trackbacks (0)

アドレス計算


#include <stdio.h>
void main()
{
 char* str = "hello";
 int i;

 for ( i=0; i<5; i++ ) {
  putchar( *( str + i ) );
  putchar( str[ i ] ); // 配列としての実体はない
 }
}

C > ポインタ | comments (0) | trackbacks (0)

配列のデータ数に依存しないプログラム

一般にデータ数は場合によって異なります。
そこで配列のデータの終わりに-999という値を置き
これをデータの終わりの印として扱えば
配列のデータに依存しないプログラムを作れます。


#include <stdio.h>
void main()
{
 int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -999 };
 int sum = 0;
 int i = 0;

 while ( a[i] != -999 ) {
  sum += a[i];
  i++;
 }
 printf( "合計:%d\n", sum );
}

C > 配列 | comments (0) | trackbacks (0)

fclose

int fclose( FILE* fp )

正常の時は0、エラーの場合EOFが返される。
C > 標準関数 > ファイル入出力関数 | comments (0) | trackbacks (0)

fopen

FILE* fopen( char* filename, char* openmode )

ファイルが正しくオープンされると、ファイルポインタが返される。
エラーの時はNULLが返される。


FILE *fp;
fp = fopen( "sample.txt", "r" );
・・・
fclose( fp );


fopenのオープンモード
"r"既存ファイルを読み込み。ファイルがないとエラーになる。
"w"既存ファイルに新規書き込み。元の記録内容は消去される。ファイルがない場合は新規作成される。
"a"既存ファイルに追加書き込み。ファイルがない場合は新規作成される。
"r+"既存ファイルに読み込みと書き込み。ファイルがないとエラーになる。
"w+"既存ファイルに新規書き込み。読み込みも可能。ファイルがない場合は新規作成される。
"a+"既存ファイルに追加書き込み。読み込みは先頭から。ファイルがない場合は新規作成される。
"rb"バイナリファイルの読み込み。
"wb"バイナリファイルの新規書き込み。
"ab"バイナリファイルの追加書き込み。
C > 標準関数 > ファイル入出力関数 | comments (0) | trackbacks (0)

exit

任意の場所で処理を終了させる時に使う。
exit(0);
という記述に出会うと、そこで処理を終了し、OSに処理を戻す。
この時OSに整数値(終了コード)を返すことができる。
規定はされていないが、一般に正常終了なら0、
異常終了なら1以上という値が用いられている。
C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

log10

double log10( double x )

a = log10( b )

bの常用対数をaに入れる
C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

sqrt

double sqrt( double x )

xの平方根を計算する

d = sqrt( 2.0 )

dは1.41421になる
C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

pow

double pow( double x, double y )

xのy乗を計算する

d = pow( 2.0, 3.0 )

dは8.000000になる
C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

system

プログラムの中からOSのコマンドを実行させたい時に使う。
system関数は、コマンドプロセッサを読み込んでから
該当コマンドを実行する為、ディスク上にコマンドプロセッサが
必要である。


#include <stdlib.h>

void main()
{
 system( "dir" );
 system( "ipconfig /all" );
 system( "start notepad.exe" );
}

C > 標準関数 > 一般ユーティリティ | comments (0) | trackbacks (0)

エスケープ文字列

\a警報音
\n復改
\tタブコード
\0778進数
\xff16進数
\0文字コード0
C > 基礎 | comments (0) | trackbacks (0)

数学関数を使う時の注意点

・数学関数の戻り値はdoubleである。
・関数の引数はdoubleである。(例外有)
・角度はラジアンで示す。(引数にそのまま角度を入れてもダメって事)

サンプル

#include <stdio.h>
#include <math.h>

#define PI 3.14159
#define RAD(x) ( (x) * PI / 180.0 )

void main()
{
 double r;
 printf( "x sin(r) cos(r) tan(r)\n" );

 for ( r=0.l; r<=180.l; r+=10.l )
  printf( "%4.1f %12.5f %12.5f %12.5f\n", r, sin(RAD(r)), cos(RAD(r)), tan(RAD(r)) );
}

C > 標準関数 > 数学関数 | comments (0) | trackbacks (0)

文字検査/変換マクロ

isalnum(c)文字cが英数字(A〜Z、a〜z、0〜9)なら真
isalpha(c)文字cが英文字(A〜Z、a〜z)なら真
isascii(c)文字cがASCIIコード(0x00〜0x7f)なら真
iscntrl(c)文字cが制御文字(0x00〜0x1f、0x7f)なら真
isdigit(c)文字cが数字(0〜9)なら真
isgraph(c)文字cが空白を除く印字可能文字(0x21〜0x7e)なら真
islower(c)文字cが小文字(a〜z)なら真
isprint(c)文字cが印字可能文字(0x20〜0x7e)なら真
ispunct(c)文字cが句読点(0x21〜0x2f、0x30〜0x40、0x5b〜0x60、0x7b〜0x7e)なら真
isspace(c)文字cが空白、タブ、復帰、改行、垂直タブ、改頁(0x09〜0x0d、0x20)なら真
isupper(c)文字cが大文字(A〜Z)なら真
isxdigit(c)文字cが16進表示文字(0〜9、A〜F、a〜f)なら真
tolower(c)文字cが大文字なら小文字に変換した値を返す
toupper(c)文字cが小文字なら大文字に変換した値を返す


サンプル

#include <stdio.h>
#include <ctype.h>

void main()
{
 int c;

 for ( c=0; c<=127; c++ ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isalnumの結果" );
 for ( c=0; c<=127; c++ ) if ( isalnum(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isalphaの結果" );
 for ( c=0; c<=127; c++ ) if ( isalpha(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isasciiの結果" );
 for ( c=0; c<=127; c++ ) if ( isascii(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "iscntrlの結果" );
 for ( c=0; c<=127; c++ ) if ( iscntrl(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isdigitの結果" );
 for ( c=0; c<=127; c++ ) if ( isdigit(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isgraphの結果" );
 for ( c=0; c<=127; c++ ) if ( isgraph(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "islowerの結果" );
 for ( c=0; c<=127; c++ ) if ( islower(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isprintの結果" );
 for ( c=0; c<=127; c++ ) if ( isprint(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "ispunctの結果" );
 for ( c=0; c<=127; c++ ) if ( ispunct(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isspaceの結果" );
 for ( c=0; c<=127; c++ ) if ( isspace(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isupperの結果" );
 for ( c=0; c<=127; c++ ) if ( isupper(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "isxdigitの結果" );
 for ( c=0; c<=127; c++ ) if ( isxdigit(c) ) printf( "%d:%c ", c, c );
 puts( "\n" );
 puts( "tolowerの結果\n" );
 for ( c=0; c<=127; c++ ) if ( isupper(c) ) printf( "%d:%c ", c, tolower(c) );
 puts( "\n" );
 puts( "toupperの結果\n" );
 for ( c=0; c<=127; c++ ) if ( islower(c) ) printf( "%d:%c ", c, toupper(c) );
 puts( "\n" );
}

C > 標準関数 > 文字検査/変換マクロ | comments (0) | trackbacks (0)