トップ->C言語入門

あなたは

人目のC(C++)言語入門受講生です。

C言語入門内検索

目次
C言語入門〜トップ
C++言語入門〜トップ
0. はじめに

1. 基本的な決まり
   1. 書式
   2. 予約語
   3. 構成
   4. データの形と宣言
   5. 定数と変数
   6. 簡単な演算

2. 入出力
   1. printf
   2. scanf
   3. 練習問題1
   4. 1文字入出力
   5. エスケープシーケンス

3. 制御文
   1. 順次構造
   2. 単一分岐
   3. 多重分岐
   4. ケース構造
   5. 反復構造(while)
   6. 反復構造(do)
   7. 反復構造(for)
   8. 補助制御文
   9. 練習問題
   10.練習問題

4. 配列
   1. 配列とは
   2. 配列の宣言と初期化
   3. 配列の使用法
   4. 練習問題
   5. 文字列
   6. 2次配列と多次元配列
   7. 練習問題

5. 演算子
   1. 演算子の種類
   2. インクリメント演算子とデクリメント演算子
   3. 複合代入演算子
   4. ビット演算子
   5. シフト演算子
   6. キャスト演算子
   7. 順次演算子
   8. 条件演算子(三項演算子)
   9. sizeof演算子
   10.演算子の優先順位
   11.式と値
   12.条件式と値
   13.練習問題

6. ポインタ
   1. ポインタとは
   2. 配列とポインタ
   3. 文字列とポインタ
   4. ポインタのメリット

7. 関数
   1. 関数の作り方
   2. プロトタイプ宣言
   3. 配列とポインタ
   4. 値渡しとアドレス渡し
   5. main関数の引数
   6. 練習問題
   7. 標準関数
   8. 再帰関数

8. プリプロセッサ
   1. プリプロセッサとは
   2. #define, #undef
   3. #include
   4. #if
   5. #error、#warning
   6. マクロ
   7. 定義済みマクロ

9. 変数の有効範囲
   1. 変数の種類
   2. グローバル変数の有効範囲
   3. オート変数の有効範囲
   4. スタティック変数の有効範囲

10. 構造体
   1. 構造体とは
   2. 構造体の宣言
   3. 構造体の使用法
   4. 構造体のポインタ
   5. 構造体の構造体
   6. 構造体と関数
   7. 練習問題

11. 共用体
   1. 共用体とは
   2. 共用体の宣言
   3. 共用体の使用法

12. ファイル
   1. ファイル
   2. ファイル構造体
   3. ファイル作成・オープン
   4. ファイル読み込み
   5. ファイル書き込み
   6. ファイルクローズ
   7. ファイルエラー
   8. ランダムアクセス
   9. 標準入出力
   10. 練習問題
   11. ファイルの検索
   12. ファイルの削除
   13. ファイル名変更
   14. ディレクトリ操作

13. 低水準入出力関数
   1. 高水準入出力関数との違い
   2. ファイル作成
   3. ファイルオープン
   4. ファイル読み込み
   5. ファイル書き込み
   6. ファイルクローズ
   7. 標準入出力
   8. ランダムアクセス
   9. ファイルポインタとファイルディスクリプタ
   10. 練習問題

14. データ構造
   1. データ構造とは
   2. データ構造の種類
   3. 線形リスト
     4. 単方向リスト
     5. 双方向リスト
     6. 環状リスト
   7. ベクター
   8. 木
     9. 二分検索木
   10. スタック
   11. キュー

15 標準関数
   1. 文字分類・文字変換
   2. 文字列操作
   3. データ変換
   4. メモリー操作
   5. 数値演算
   6. ファイル操作(高水準入出力関数)
   7. ファイル操作(低水準入出力関数)
   8. プロセス関係

16 関数ポインタ
   1. 関数ポインタとは
   2. 関数ポインタ
   3. 関数ポインタと引数・戻り値
   4. 関数ポインタの配列

17. そしてその後は (PR)
   1. ヒューマンアカデミー C言語講座
   2. el school C言語講座
   3. C++入門


・ このページの先頭に戻る
・ トップページに戻る


・ このページの先頭に戻る
・ トップページに戻る

トップ-> C言語入門:データ構造-> 14-7. ベクター

←前ページへ :  トップへ :  次ページへ→


例題

  名前、電話番号、住所からなる住所録構造体を定義する。これをベクター構造 (要素数5)を用いて管理する。キーボードから入力された名簿を何番目の要素に 追加するかを入力し、ベクターのその要素に格納する。何も入力されなかったら、 0〜4番目の要素をディスプレイに表示して終了する。   そのほかに、このベクターを操作する関数群を作れ。関数群は以下の通り。

void changebuffersize(int n); バッファーサイズを変更する
増やす場合は現在のバッファーをコピーし、増えた部分は空のままにする
減らす場合は、足りない部分は削除する
int size(); バッファーサイズを返す
void setat(int n, struct meibo newdata); ベクターのn番目の要素をnewdataで置き換える
struct meibo getat(int n); ベクターのn番目の要素を返す


解答


#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; }


←前ページへ :  トップへ :  次ページへ→