簡易データベース   

情報システム応用I

1. 記述の基本

2. ポインタを理解する

3. 構造体・ファイル入出力

4. 簡易データベースを作ろう

1. 記述の基本

p00.c
#include <stdio.h>
int func1(int);

int main()
{
    int hige1;
    hige1 = func1(10);
    printf( "\nNumber\t%d\n\n", hige1 );
    
    return 0;
}

int func1( int value )
{
    value = value * 2;
    return value;
}

自分で定義した関数の宣言

何はともあれmainから

(自動)変数の宣言






関数を定義する


値(int)を返す.上2行まとめて,return value*2; としてもよい.

 

p00a.c
#include <stdio.h>
double func1(int);

int main(){
    double hige1;
    hige1 = func1(11);
    printf( "\nNumber\t%lf\n\n", hige1 );

    return 0;
}

double func1( int value )
{
    double ret;
	
    ret = (double)value * 1.7;
    return ret;
 
}

func1の型をdouble型とする(引数はint型のままにする)


hige1もdouble型に
右辺と左辺の型が一致してます
書式もdouble型に対応




関数を定義する



「型キャスト」で両辺の型が一致.(今回はその場しのぎ..)
値(double型)を返す

 

コメント:

2. ポインタを理解する

p01.c
#include <stdio.h>

int main()
{
    int value = 10;
    int *a;

    printf("&value\t--> %p\n", &value);
    printf("&a\t--> %p\n", &a );

    a = &value;
    printf("*a\t--> %d\n", *a );

    *a = 25;
    printf("value \t--> %d\n", value );

    return 0;
}







value のアドレスを確認
a のアドレスを確認

valueのアドレスをaに渡す
(ポインタ変数aを経由して)valueの内容を表示する

(ポイント変数aを経由して)valueの内容を書き換える

 

p02.c
#include <stdio.h>
int func1(int *);

int main()
{
    int hige1;
    
    hige1 = 10;
    func1( &hige1 );
    printf( "\nNumber\t%d\n\n", hige1 );
    
    return 0;
}

int func1( int *value )
{
	*value = (*value) * 2;
}

自分で定義した関数の宣言.引数の型に注意!

何はともあれmainから

(自動)変数の宣言

初期値を10としておく.
hige1のアドレスを func1 の引数とする.




関数を定義する.


*value(つまりhige1の値)自身を2倍に更新する.

 

p03.c
#include <stdio.h>

int main()
{
    int value[5], i;
    int *a;

    for ( i = 0 ; i < 5 ; i++ ) { 
        value[i] = 10*(i+1); 
        printf("\n%d", value[i]);
    }

    printf("\n-----");
    for ( a = &value[0] ; a != &value[5] ; a++ ) {
        printf("\n%d", *a);
    }

    printf("\n\n");
    return 0;
}









配列表現 value[i]の内容表示


単なる境界線

ポインタ表現 value[i]の内容表示

 

p04.c
#include <stdio.h>

void swap( int *suwa, int *haru )
{
    int value;

    value = *suwa;	
    *suwa = *haru;
    *haru = value;
}

int main()
{
    int a=5, b=10;
    printf("\n%d\t%d", a, b );

    swap( &a, &b );
    printf("\n-----");
    printf("\n%d\t%d\n\n", a, b );
	
    return 0;
}
swap関数を使って,二つの変数の値を入れ換えます.













入れ換え前

aとbのアドレスを渡す
単なる境界線
入れ換え後

 

p05.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *hige;
    int num=10, i;

    hige = malloc( sizeof( int) * num );

    for ( i = 0 ; i < num ; i++ ) { 
        *(hige +i) = i*10;
        printf("%d\n", hige[i] );
    } 

    return 0;
}

mallocを使うためにインクルードしておく.





malloc関数を使ってメモリを確保する.
  確保する大きさは,int型(4or8バイト)サイズのnum倍.

hige[i]=i*10; と同じ.
*(hige +i) としても同じ

 

3. 構造体・ファイル入出力

p06.c
#include <stdio.h>
#include <stdlib.h>

typedef struct {
  char *name;
  int age;
  double height;
  double weight;
} Person;

int main()
{
    Person p[2];
    int i;

    for ( i = 0 ; i < 2 ; i++ ) 
        p[i].name = (char *)malloc( sizeof(char) * 30 );

    p[0].name = "Kawano";
    p[0].age = 34;
    p[0].height = 170.3;
    p[0].weight = 54.8;

    p[1].name = "Suwa";
    p[1].age = 36;
    p[1].height = 175.3;
    p[1].weight = 68.1;

    for ( i = 0 ; i < 2 ; i++ ) {
        printf("\n%s\t", p[i].name );
        printf("(%d)\t", p[i].age );
        printf("height: %.1lf\t", p[i].height);
        printf("weight: %.1lf\t", p[i].weight );
    }

    printf("\n\n");

    return 0;
}


mallocを使うためにインクルードしておく.

Person型の構造体を定義する.下記4つのメンバ.
  名前 (メモリ確保が必要)
  年齢
  身長
  体重




Person型の変数を2つ用意する.  



名前の格納用にに30バイト分.

データ変数の場合は「.」(ドット)を使ってメンバを参照する.

 

p07.c
#include <stdio.h>

void swap( int *suwa, int *haru )
{
    int value;

    value = *suwa;	
    *suwa = *haru;
    *haru = value;
}

int main()
{
  FILE *fp;
  char filename[100];
  int a, b;

  sprintf( filename, "data.txt");
  printf("[%s]", filename);

  fp = fopen( filename, "r");
  if ( fp == NULL ) {
    fprintf( stderr, "\n\n[%s] cannot open!\n\n", filename );
    return -1;
  }

  fscanf( fp, "%d\t%d", &a, &b );
  fclose( fp);

  swap( &a, &b );

  fp = fopen( filename, "w");
  if ( fp == NULL ) {
    fprintf( stderr, "\n\n[%s] cannot open!\n\n", filename );
    return -1;
  }

  fprintf( fp, "%d %d", a, b );
  fclose( fp);

  return 0;
}


swap関数.p03.c参照のこと.










※ FILE構造体へのポインタ(ファイルポインタ).
   ・ファイル入出力に関する情報を管理する.



   
   
fopen関数でファイルポインタを取得する.readonlyモードで.
読み込みエラーの処理も忘れずに.




データを読み込む.
入出力操作の終了とともに,fclose関数で必ずファイルを閉じる.



writeモードでファイルポインタを取得する.





データを書き込む.
flose()を忘れずに.

 

4. 簡易データベースを作ろう

ファイル構成
para.h (ヘッダファイル)
tdss.c (メインルーチン)
sample.txt (データベースファイル)
※ 同じフォルダ下で作成すること.
実現する機能
データベース・ファイル(テキスト形式)の読み込み
データの新規追加
データの削除
データベースファイルへの書き出し
オプション機能
データの修正
検索(名前,身長の最大値 など)
para.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define Max( x, y ) ((x)>(y))?(x):(y)
#define Min( x, y ) ((x)<(y))?(x):(y)

typedef struct person_tag {
  char *name;
  int age;
  double height;
  double weight;
  struct person_tag *next;
} Person;
ヘッダファイルを取り込んでおく.
新たにstdlib.h(標準ライブラリ)と
string.h(文字列操作ライブラリ),
さらにはmath.h(数学ライブラリ)を追加している.

最大値と最小値を求めるマクロ.


構造体を宣言する.
 名前.文字列
 年齢.整数型
 身長.実数型
 体重.実数型
 次の人のデータを指すためのポインタ
Personという名の"自作の"データ型を定義する.
p08.c
#include "para.h"

void main( )
{
 Person *value;

  value = malloc( sizeof(Person));
  printf("\nSize of *name\t%d", sizeof(value->name) );
  printf("\nSize of age\t%d", sizeof(value->age) );
  printf("\nSize of height\t%d", sizeof(value->height) );
  printf("\nSize of weight\t%d", sizeof(value->weight) );
  printf("\nSize of *next\t%d", sizeof(value->next) );
  printf("\nSize of Person %d\n\n", sizeof( Person) );
}
para.h を取り込む.



Person型のポインタ変数を宣言する.


とりあえず一人分のデータを用意する(メモリ領域確保)
以下,構造体のメンバーの大きさ(サイズ)を表示する.

 

 

 TOP