#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <memory.h>
//
// 構造体定義
struct meibo{
char name[20];
char tel[15];
char address[30];
};
//
// プロトタイプ宣言
struct meibo input();
void disp(struct meibo data);
void changebuffersize(int n);
int size();
void setat(int n, struct meibo newdata);
struct meibo getat(int n);
//
// ベクター用の変数
struct meibo *pmeibo;
int nmeibo;
//
// メイン関数
void main(){
struct meibo indata;
int i;
int flag = 1;
// ベクターを作る
changebuffersize(5);
while(flag){
char buffer[10];
// 名簿入力
indata = input();
if ( indata.name[0] != '\0' ){
int no = -1;
printf("何番目の要素に入力しますか? : ");
gets(buffer);
no = atoi(buffer);
// 要素を代入
setat(no, indata);
}
// 名前が入力されなかったらループから抜ける
else
flag = 0;
// 改行
printf("\n");
}
// 改行
printf("\n\n");
// 表示する
for ( i = 0 ; i < 5 ; i++ )
disp(getat(i));
// ベクターを解放する
changebuffersize(0);
}
//
// バッファーサイズを変更する
void changebuffersize(int n){
int currentsize = nmeibo;
struct meibo *pcurrentbuffer = pmeibo;
// 0の場合の処理
if( n <= 0 ){
nmeibo = 0;
pmeibo = 0;
// 古い領域解放
if( pcurrentbuffer != 0 )
free( pcurrentbuffer );
return;
}
// 新しい領域を作る
pmeibo = (struct meibo *)malloc(n * sizeof(struct meibo));
// 前の領域を新しい領域にコピーする
if ( currentsize <= n ){
memcpy(pmeibo, pcurrentbuffer, currentsize * sizeof(struct meibo));
// 残った領域をきれいにする
memset(pmeibo + currentsize * sizeof(struct meibo), 0, (n - currentsize) * sizeof(struct meibo));
}
else
memcpy(pmeibo, pcurrentbuffer, n * sizeof(struct meibo));
// 新しい要素数
nmeibo = n;
// 古い領域解放
if( pcurrentbuffer != 0 )
free( pcurrentbuffer );
}
//
// バッファーサイズを返す
int size(){
return nmeibo;
}
//
// ベクターのn番目の要素をnewdataで置き換える
void setat(int n, struct meibo newdata){
// nが範囲外
if ( n < 0 || nmeibo < n )
return;
// データを代入
pmeibo[n] = newdata;
}
//
// ベクターのn番目の要素を返す
struct meibo getat(int n){
// nが範囲外
if ( n < 0 || nmeibo < n ){
struct meibo ret;
// 戻り値用名簿をきれいにする
memset(&ret, 0, sizeof(struct meibo));
return ret;
}
return *(pmeibo + n);
}
//
// 名簿表示する
void disp(struct meibo data){
printf("name : %s\n", data.name);
printf("tel : %s\n", data.tel);
printf("address : %s\n\n", data.address);
}
//
// 名簿入力
struct meibo input(){
struct meibo indata;
// 戻り値用名簿をきれいにする
memset(&indata, 0, sizeof(struct meibo));
printf("名前を入力してください : ");
gets(indata.name);
// 名前が入力されなかったら帰る
if ( indata.name[0] == '\0' )
return indata;
printf("電話番号を入力してください : ");
gets(indata.tel);
printf("住所を入力してください : ");
gets(indata.address);
return indata;
}
|