/****************************/
/* 名前,給与,年齢 */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
// クラスTestの定義
class Test {
char name[20];
int kyuyo, nenrei;
public:
// 入力
void input()
{
std::cout << "名前は? ";
std::cin >> name;
std::cout << "給与は? ";
std::cin >> kyuyo;
std::cout << "年齢は? ";
std::cin >> nenrei;
}
// 出力
void print()
{
std::cout << "名前 " << name;
std::cout << " 給与 " << kyuyo;
std::cout << " 年齢 " << nenrei << std::endl;
}
};
// main
int main()
{
Test x;
x.input();
x.print();
return 0;
}
/****************************/
/* 3次元空間の点 */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <math.h>
// クラスTestの定義
class Test {
double x, y, z;
public:
double r;
// 点の座標の入力
void input()
{
std::cout << " 点の座標は(x y z)? ";
std::cin >> x >> y >> z;
}
// 原点までの距離の計算
void range()
{
r = sqrt(x*x + y*y + z*z);
}
};
// main
int main()
{
double mean = 0.0;
int i1, kosu = 0, n;
// 入力
std::cout << "点の数は? ";
std::cin >> n;
Test *p = new Test [n];
for (i1 = 0; i1 < n; i1++) {
p[i1].input();
p[i1].range();
mean += p[i1].r;
}
// 点の個数
mean /= n;
for (i1 = 0; i1 < n; i1++) {
if (p[i1].r >= mean)
kosu++;
}
std::cout << " 平均距離 " << mean;
std::cout << " 個数は " << kosu << std::endl;
return 0;
}
/****************************/
/* 名前,住所,電話番号 */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <string.h>
// クラスTestの定義
class Test {
char name[20];
char jusho[50];
char tel[15];
public:
// 入力
void input()
{
std::cout << " 名前は? ";
std::cin >> name;
std::cout << " 住所は? ";
std::cin >> jusho;
std::cout << " 電話番号は? ";
std::cin >> tel;
}
// 探索
char *search(char *na)
{
int sw = strcmp(na, name);
if (sw == 0)
return tel;
else
return 0;
}
};
// main
int main()
{
char *c, name[20];
int i1, n, sw = 1;
/*
入力(データベースの作成)
*/
std::cout << "人数は? ";
std::cin >> n;
Test *p = new Test [n];
for (i1 = 0; i1 < n; i1++) {
std::cout << std::endl;
p[i1].input();
}
/*
探索
*/
std::cout << "探索\n";
while (sw > 0) {
std::cout << " 名前は?(endで終了) ";
std::cin >> name;
sw = strcmp(name, "end");
if (sw != 0) {
for (i1 = 0; i1 < n && sw != 0; i1++) {
c = p[i1].search(name);
if (c != 0) {
std::cout << " 電話番号は " << c << std::endl;
sw = 0;
}
}
if (sw != 0)
std::cout << " 見つかりません\n";
sw = 1;
}
}
return 0;
}
/****************************/
/* 待ち行列 */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <stdlib.h>
// クラスTestの定義
class Test {
int *que;
int size;
int now;
public:
// コンストラクタ
Test(int n = 10)
{
size = n;
now = 0;
que = new int [n];
}
// デストラクタ
~Test(){delete [] que;};
// 待ち行列に追加
void put(int num)
{
now++;
if (now > size) {
std::cout << "***error 待ち行列オーバーフロー\n";
exit(1);
}
que[now-1] = num;
}
// 待ち行列から取り除く
int get()
{
int i1, num = 0;
if (now > 0) {
num = que[0];
for (i1 = 1; i1 < now; i1++)
que[i1-1] = que[i1];
now--;
}
return num;
}
// 待ち行列の状態を出力
void qprint()
{
int i1;
std::cout << " 数 " << now;
if (now > 0) {
std::cout << " 内容";
for (i1 = 0; i1 < now; i1++)
std::cout << " " << que[i1];
}
std::cout << std::endl;
}
};
// main
int main()
{
Test q(2);
std::cout << "3を追加\n";
q.put(3);
q.qprint();
std::cout << "1を追加\n";
q.put(1);
q.qprint();
std::cout << "先頭を取り除く\n";
q.get();
q.qprint();
std::cout << "2を追加\n";
q.put(2);
q.qprint();
std::cout << "5を追加\n";
q.put(5);
q.qprint();
return 0;
}
/****************************/
/* ハッシュテーブル */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <string.h>
// 前送りのクラス宣言
class Test;
// クラスRecord
class Record {
public:
char *data;
// コンストラクタ
Record(char *str)
{
data = new char [strlen(str)+1];
strcpy(data, str);
}
// デストラクタ
~Record() {delete [] data;}
};
// クラスClist(衝突リスト)
class Clist {
Record *r;
Clist *next;
public:
// コンストラクタ
Clist () { next = 0; }
friend Test;
};
// クラスTest(ハッシュテーブル)
class Test {
int size; // ハッシュテーブルの大きさ
Clist **table; // 衝突リストへのポインタ
// ハッシュ関数
int hash(char *s)
{
unsigned int hash = 0, g;
int i1, len;
len = strlen(s);
for (i1 = 0; i1 < len; i1++ ) {
hash = (hash << 4) + s[i1]; // 左に4ビットシフトし文字を加える
g = hash & 0xf0000000; // ビット毎のAND
if (g != 0) {
hash ^= g >> 24; // 排他的論理和
hash ^= g;
}
}
return hash % size;
}
public:
// コンストラクタ
Test(int sz)
{
int i1;
size = sz;
table = new Clist * [size];
for (i1 = 0; i1 < size; i1++)
table[i1] = 0;
}
// デストラクタ
~Test()
{
int i1;
Clist *p, *q;
for (i1 = 0; i1 < size; i1++) {
p = table[i1];
while (p != 0) {
q = p;
p = p->next;
delete q;
}
}
delete [] table;
}
// レコードの探索
// 成功:レコードへのポインタ,失敗:0
Record *search(char *str)
{
Clist *p;
for (p = table[hash(str)]; p != 0; p = p->next) {
if (strcmp(str, (p->r)->data) == 0)
return p->r;
}
return 0;
}
// レコードの追加
// 成功:レコードへのポインタ,失敗:0
Record *add(Record *rec)
{
if (search(rec->data) != 0) // 既に存在
return 0;
else { // 付加
int i = hash(rec->data);
Clist *p = new Clist;
p->r = rec;
p->next = table[i];
table[i] = p;
return rec;
}
}
// レコードの削除
// 成功:レコードへのポインタ,失敗:0
Record *remove(char *str)
{
int i = hash(str);
Clist *p = table[i];
Clist *q = 0;
while ((p != 0) && (strcmp((p->r)->data, str) != 0)) {
q = p;
p = p->next;
}
if (p != 0) {
if (q != 0)
q->next = p->next;
else
table[i] = p->next;
Record *r = p->r;
delete p;
return r;
}
else
return 0;
}
};
// main
int main()
{
Test H(100);
Record rec1("test1"), rec2("test2"), *p1, *p2;
// データ "test1", "test2" の追加
p1 = H.add(&rec1);
p2 = H.add(&rec2);
if (p1 != 0)
std::cout << "データ " << p1->data << " の追加\n";
if (p2 != 0)
std::cout << "データ " << p2->data << " の追加\n";
// データ "test1" の削除
std::cout << "データ test1 の削除\n";
p1 = H.remove("test1");
// データの検索
std::cout << "データ test1 の検索\n";
p1 = H.search("test1");
if (p1 == 0)
std::cout << " データ test1 は見つかりません\n";
std::cout << "データ test2 の検索\n";
p2 = H.search("test2");
if (p2 != 0)
std::cout << " データ " << p2->data << " は見つかりました\n";
return 0;
}

/****************************/
/* リスト処理 */
/* coded by Y.Suganuma */
/****************************/
#include <iostream>
#include <string.h>
/**************/
/* クラスTest */
/**************/
class Test {
char *name;
Test *mae;
Test *ato;
public:
static Test *head;
/******************/
/* コンストラクタ */
/******************/
Test() { head = 0; };
Test(char *tango)
{
int len;
len = strlen(tango) + 1;
name = new char [len];
mae = 0;
ato = 0;
strcpy(name, tango);
}
/***************************************************************/
/* 単語の探索 */
/* tango : 入力された単語 */
/* base : 単語が入っているオブジェクトのアドレスへのポインタ */
/* same : =0 : 単語を追加 */
/* =1 : 既に同じ単語がリスト上にある */
/* return : 追加するオブジェクトのアドレスに対するポインタ */
/***************************************************************/
Test **search(char *tango, Test **base, int *same)
{
Test **add_a;
int sw;
*same = 0;
/*
最初の単語
*/
if (*base == 0)
return base;
/*
単語の比較
*/
sw = strcmp(tango, (*base)->name);
// 同じ単語
if (sw == 0) {
*same = 1;
return base;
}
// 異なる単語
else {
if (sw < 0)
add_a = search(tango, &((*base)->mae), same); // 左
else
add_a = search(tango, &((*base)->ato), same); // 右
return add_a;
}
}
/***************************************************************/
/* 単語の追加 */
/* tango : 入力された単語 */
/* base : 単語が入っているオブジェクトのアドレスへのポインタ */
/***************************************************************/
void add(char *tango, Test **base)
{
*base = new Test(tango);
}
/*************************************************************/
/* 単語の出力 */
/* base : 対象とする単語が入っているオブジェクトのアドレス */
/* dep : リストの深さ */
/*************************************************************/
void output(Test *base, int dep)
{
int i1;
if (base != 0) {
for (i1 = 0; i1 < dep; i1++)
std::cout << " ";
std::cout << base->name << std::endl;
dep++;
output(base->mae, dep);
output(base->ato, dep);
}
}
};
// static変数の定義
Test *Test::head;
/********/
/* main */
/********/
int main()
{
Test tree, **add_a;
int sw = 1, same;
char tango[50];
/*
単語の入力とリストの作成
*/
while (sw != 0) {
// 単語入力
std::cout << "単語を入力して下さい(終了はピリオド) ";
std::cin >> tango;
// 終了判定
sw = strcmp(tango, ".");
// リスト作成
if (sw != 0) {
add_a = tree.search(tango, &(Test::head), &same); // 探索
if (same == 0)
tree.add(tango, add_a); // 追加
}
}
/*
リストの出力
*/
tree.output(Test::head, 0);
return 0;
}
| 菅沼ホーム | 演習解答例目次 | 本文目次 | 付録 | 索引 |