・ハッシュ探索法
ハッシュテーブルの配列による実装(かぶり無し)
ハッシュテーブルをリストで実装
・リスト構造の話(連結リスト、リンクリスト、リンクトリスト)
→単方向リスト forward_list(単方向、前方追加型リスト)
→双方向リスト list(双方向、前方・後方追加型リスト)
→循環リスト ????
⇒前方追加型
常に前にデータを追加
⇒後方追加型
常に後ろにデータを追加
・構造体(C/C++でレコード型を表現するモノ)
複数の型をパックして新しい型として使える
例)
ベクトル型 座標(整数)と長さ(原点からの長さ)
struct vector2D{
int x, y; //座標
double l; //長さ
};
vector2D p1,p2,p3;
vector2D p[5];
トランプを表してみようよ
トランプ
・マーク(♥♦♣♠:suit)
・数字 (A,2~10,J,Q,K)
⇒コンピュータプログラムの上でどのような表し方をするか
モデリング:現実世界のものをコンピュータの中でどう表現するか?
struct card{
int suit; //0~4 ♥:0 ♦:1 ♣:2 ♠:3 B:4
int number; //0~13 B:0 A:1 2~10 J:11 Q:12 K:13
}
表示の工夫
suit 0 ⇒"♥", 1 ⇒"♦", 2 ⇒"♣", 3 ⇒"♠", 4 ⇒"B"
number 1 ⇒"A",11 ⇒"J",12 ⇒"Q",13 ⇒"K" 0 ⇒"B"
card c = {2, 1};
c.suit で cのsuirにアクセス(代入、参照)
c.number で cのnumberにアクセス
♣A←これを表示したい
if(c.suit == 0)
cout << "♥";
else if(c.suit == 1)
cout << "♦";
else if(c.suit == 2)
cout << "♣";
else if(c.suit == 3)
cout << "♠";
else
cout << "B";
switch(c.suit)
{
case 0:cout << "♥";break;
case 1:cout << "♦";break;
case 2:cout << "♣";break;
case 3:cout << "♠";break;
case 4:cout << "B";break;
}
cout << mark[0]; ♥
cout << mark[1]; ♦
cout << mark[2]; ♣
cout << mark[3]; ♠
cout << mark[4]; B
string mark[5] = {"♥","♦","♣","♠","B"};
スタックとキュー
スタック(後入れ先出し(LIFO Last-in First-out))
深さ7のスタック(整数)
上|_|_|_|_|_|_|_|底
プッシュ(データをスタックに入れる)
5をプッシュ
上|_|_|_|_|_|_|5|底
push(3)
上|_|_|_|_|_|3|5|底
push(7)
上|_|_|_|_|7|3|5|底
ポップ(データをスタックから削除)
一番上のデータが消える
pop()
7←上|_|_|_|_|_|3|5|底
pop()
3←上|_|_|_|_|_|_|5|底
キュー(行列で並ぶ人 待ち行列)
キュー(先入先出 FIFO(First-in First-out)
長さ7のキュー
出|_|_|_|_|_|_|_|入 待:3,5,7,9
enque(3) エンキュー
出|3|_|_|_|_|_|_|入 待:5,7,9
enque(5) エンキュー
出|3|5|_|_|_|_|_|入 待:7,9
deque() デキュー
3←出|5|_|_|_|_|_|_|入 待:7,9
enque(7) エンキュー
出|5|7|_|_|_|_|_|入 待:9
今のところのトランプゲーム
#include <iostream>
#include <forward_list> //双方向リスト
#include <string>
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::forward_list;
string mark[5] = { u8"♥", u8"♦", u8"♣", u8"♠", u8"B" };
//A 2~10 J Q K, Bで表示
string num[14] = { "B","A","2","3","4","5","6",
"7","8","9","10","J","Q","K" };//最後まで書いてみる
struct card
{
int suit; //スート 0:H 1:D 2:C 3:S 4:B 0~4
int number; //数字 0:J 1:A 2:2 ... 11:J 12:Q 13:K 0~13
};
void printCard(card _dat)
{
cout << mark[_dat.suit] << num[_dat.number];
}
int irand(int _num)
{
return(rand() % _num);
}
void shuffle(card _dat[], int _cnum)
{
for (int i = 0; i < 100; i++)
{
int n1 = irand(_cnum);
int n2 = irand(_cnum);
std::swap(_dat[n1], _dat[n2]);
}
}
void printMydeck(forward_list<card>& _dat)
{
for (auto theI = _dat.begin(); theI != _dat.end(); theI = std::next(theI))
{
printCard(*theI);
cout << " ";
}
}
//card dat;
//dat.suit = 2;
//dat.number = 12;
//"♦Q"を表示! したいけどうまくいかないから DQ
int main() {
system("chcp 65001");
system("cls");
//配列でやってみる cards[13*4+2]
//for分とかを組み合わせて
//各マーク4×13枚+ジョーカー2枚でカードを初期化してみよう
const int card_num = 4 * 13 + 2;
card mycard[card_num];
int i = 0;
for (int mk = 0; mk < 4; mk++) //mk(スートの種類を表す変数)0~3
{
for (int nb = 1; nb <= 13; nb++)//トランプの番号
{
//mycard[13 * mk +(nb-1)].suit = mk ;
//mycard[13 * mk +(nb-1)].number = nb ;
mycard[i].suit = mk;
mycard[i].number = nb;
i++;
}
}
//多分 iは 52になっている 通常カード index 0~ index 51 の13x4=52枚
mycard[i].suit = 4;//ババ一枚目 index 52
mycard[i].number = 0;
i++;
mycard[i].suit = 4;//ババ二枚目 index 53
mycard[i].number = 0;
shuffle(mycard, card_num);
forward_list<card> mydeck;\
const int deck_size = 15; //デッキサイズを指定する定数
for (int i = 0; i < deck_size; i++)
{
mydeck.push_front(mycard[i]);
}
//iterator くり返し用の、「アドレスを入れる」変数
forward_list<card>::iterator theI = mydeck.begin(); //listの先頭要素のアドレス
while (true)
{
if (theI == mydeck.end())
{
break;
}
else
{
printCard(*theI); //
cout << " ";
theI = std::next(theI);//forward_list, list 両方可能
//theI = std::prev(theI);//listのみ可能
}
}
cout << endl;
card p1[2], p2[2];
p1[0] = mydeck.front();//先頭データをp1の1枚目として配る
mydeck.pop_front();//先頭データを削除
printMydeck(mydeck);
//p1とp2に2枚ずつカードを配る p1p2p1p2
//P1、P2の持ってる2枚のカードの数字の和 BBは0点を得点として
//、得点の多いほうが勝ち
//Aは14点として数えましょう
//2人のプレーヤーの手札を公開して、
//どちらが勝ちか判定して表示する
//できちゃった人は追加課題として、デッキの枚数を増やして、3回勝負にする
//とかやってみてください。
}