・ハッシュ探索法  ハッシュテーブルの配列による実装(かぶり無し)  ハッシュテーブルをリストで実装 ・リスト構造の話(連結リスト、リンクリスト、リンクトリスト)  →単方向リスト 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 #include //双方向リスト #include 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& _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 mydeck;\ const int deck_size = 15; //デッキサイズを指定する定数 for (int i = 0; i < deck_size; i++) { mydeck.push_front(mycard[i]); } //iterator くり返し用の、「アドレスを入れる」変数 forward_list::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回勝負にする //とかやってみてください。 }