情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |
[記憶クラス] struct [構造体名] [{メンバー}] [変数名の並び];
[記憶クラス] struct 構造体名 [変数名の並び];
struct student { char name[20]; char sei[3]; int kokugo; int sansu; } x = {"山田太郎", "男", 100, 80};
struct student { char name[20]; char sei[3]; int kokugo; int sansu; }; struct student x = {"山田太郎", "男", 100, 80};
x.name
struct student *pt; pt = &x;
pt->name または (*pt).name
struct student { char name[20]; char sei[3]; int kokugo; int sansu; }; struct student x[50] = { {"山田太郎", "男", 100, 80}, {"鈴木次郎", "男", 90, 100}, {"齋藤花子", "女", 90, 90} }
------------------(C++)構造体宣言--------------------
/****************************/ /* C++ における構造体 */ /* coded by Y.Suganuma */ /****************************/ #include#include using namespace std; struct Data { string name; int nen; // コンストラクタ Data(string a, int b) { name = a; nen = b; } }; int main(int argc, char *argv[]) { struct Data x("Taro", 20); // Data x("Taro", 20); で可 cout << "name: " << x.name << ", nen: " << x.nen << endl; return 0; }
----------------(C++)構造体宣言終わり-----------------
/****************************/ /* 構造体(定義と参照) */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> int main() { /* 構造体の定義と初期化 */ struct student { char name[20]; char sei[3]; int kokugo; int sansu; }; struct student x = {"山田太郎", "男", 100, 80}; struct student y = {"山田花子", "女", 95, 90}; /* 直接的参照 */ printf("%s %s %d %d\n", x.name, x.sei, x.kokugo, x.sansu); printf("%s %s %d %d\n", y.name, y.sei, y.kokugo, y.sansu); /* 間接的参照 */ struct student *z = &x; printf("%s %s %d %d\n", z->name, z->sei, z->kokugo, z->sansu); z = &y; printf("%s %s %d %d\n", (*z).name, (*z).sei, (*z).kokugo, (*z).sansu); return 0; }
山田太郎 男 100 80 山田花子 女 95 90 山田太郎 男 100 80 山田花子 女 95 90
/****************************/ /* 構造体(ネスト,方法1) */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> int main() { struct student { char name[20]; char sei[3]; struct shiken { int kokugo; int sansu; } kekka; }; struct student x = {"山田太郎", "男", {100, 80}}; printf("名前 %s 性 %s 国語 %d 算数 %d\n", x.name, x.sei, x.kekka.kokugo, x.kekka.sansu); return 0; }
名前 山田太郎 性 男 国語 100 算数 80
/****************************/ /* 構造体(ネスト,方法2) */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> int main() { struct shiken { int kokugo; int sansu; }; struct student { char name[20]; char sei[3]; struct shiken kekka; }; struct student x = {"山田太郎", "男", {100, 80}}; printf("名前 %s 性 %s 国語 %d 算数 %d\n", x.name, x.sei, x.kekka.kokugo, x.kekka.sansu); return 0; }
/****************************/ /* 構造体(関数の引数) */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> #include <string.h> struct student { char name[20]; char sei[3]; int kokugo; int sansu; }; void print1(student x) // 構造体のコピーが渡される { x.sansu = 50; strcpy(x.name, "山田次郎"); printf(" print1 %s %s %d %d\n", x.name, x.sei, x.kokugo, x.sansu); } void print2(student *x) // 構造体のアドレスが渡される { x->sansu = 100; strcpy(x->name, "山田三郎"); printf(" print2 %s %s %d %d\n", x->name, x->sei, x->kokugo, x->sansu); } void print3(student &x) // 参照渡し { x.sansu = 70; strcpy(x.name, "山田四郎"); printf(" print3 %s %s %d %d\n", x.name, x.sei, x.kokugo, x.sansu); } int main() { student x = {"山田太郎", "男", 100, 80}; printf("main %s %s %d %d\n", x.name, x.sei, x.kokugo, x.sansu); print1(x); printf("main %s %s %d %d\n", x.name, x.sei, x.kokugo, x.sansu); print2(&x); printf("main %s %s %d %d\n", x.name, x.sei, x.kokugo, x.sansu); print3(x); printf("main %s %s %d %d\n", x.name, x.sei, x.kokugo, x.sansu); }
main 山田太郎 男 100 80 print1 山田次郎 男 100 50 main 山田太郎 男 100 80 print2 山田三郎 男 100 100 main 山田三郎 男 100 100 print3 山田四郎 男 100 70 main 山田四郎 男 100 70
void print3(const student &x) // 参照渡し
/****************************/ /* リスト処理 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> #include <string.h> /****************/ /* 構造体の定義 */ /****************/ struct List { char *st; struct List *next; }; /****************************************/ /* データの追加 */ /* base : 先頭の構造体へのアドレス */ /* dt : 追加する構造体へのアドレス */ /****************************************/ void add(struct List *base, struct List *dt) { struct List *lt2 = base; int sw = 1; while (sw > 0) { // 最後に追加 if (lt2->next == NULL) { lt2->next = dt; sw = 0; } // 比較し,途中に追加 else { struct List *lt1 = lt2; lt2 = lt2->next; int k = strcmp(dt->st, lt2->st); // 比較 if (k < 0) { // 追加 dt->next = lt2; lt1->next = dt; sw = 0; } } } } /****************************************/ /* データの削除 */ /* base : 先頭の構造体へのアドレス */ /* st1 : 文字列 */ /****************************************/ void del(struct List *base, char *st1) { struct List *lt2 = base; int sw = 1; while (sw > 0) { // データが存在しない場合 if (lt2->next == NULL) { printf(" 指定されたデータがありません!\n"); sw = 0; } // 比較し,削除 else { struct List *lt1 = lt2; lt2 = lt2->next; int k = strcmp(st1, lt2->st); // 比較 if (k == 0) { // 削除 lt1->next = lt2->next; sw = 0; } } } } /****************************************/ /* リストデータの出力 */ /* base : 先頭の構造体へのアドレス */ /****************************************/ void output(struct List *base) { struct List *nt = base->next; while (nt != NULL) { printf(" data = %s\n", nt->st); nt = nt->next; } } /****************/ /* main program */ /****************/ int main () { int sw = 1; char st[100]; struct List base, *lt; base.next = NULL; while (sw > 0) { printf("1:追加,2:削除,3:出力,0:終了? "); scanf("%d", &sw); switch (sw) { case 1: // 追加 printf(" データを入力してください "); scanf("%s", st); lt = new struct List; lt->next = NULL; lt->st = new char [strlen(st)+1]; strcpy(lt->st, st); add(&base, lt); break; case 2: // 削除 printf(" データを入力してください "); scanf("%s", st); del(&base, st); break; case 3: // 出力 output(&base); break; default : sw = 0; break; } } return 0; }
1:追加,2:削除,3:出力,0:終了? 1 データを入力してください 190 1:追加,2:削除,3:出力,0:終了? 1 データを入力してください 100 1:追加,2:削除,3:出力,0:終了? 1 データを入力してください 10 1:追加,2:削除,3:出力,0:終了? 2 データを入力してください 100 1:追加,2:削除,3:出力,0:終了? 3 data = 10 data = 190 1:追加,2:削除,3:出力,0:終了? 0
/****************************/ /* リスト処理 */ /* coded by Y.Suganuma */ /****************************/ #include <iostream> #include <set> #include <string> using namespace std; /**********************/ /* リストデータの出力 */ /* lt : リスト */ /**********************/ void output(set<string> &s) { set<string>::iterator it; cout << "要素数: " << s.size() << "\n"; for (it = s.begin(); it != s.end(); it++) cout << " " << *it; cout << "\n"; } /****************/ /* main program */ /****************/ int main () { int sw = 1; string str; set <string> s; while (sw > 0) { cout << "1:追加,2:削除,3:出力,0:終了? "; cin >> sw; switch (sw) { case 1: // 追加 cout << " データを入力してください "; cin >> str; s.insert(str); break; case 2: // 削除 cout << " データを入力してください "; cin >> str; s.erase(str); break; case 3: // 出力 output(s); break; default : sw = 0; break; } } return 0; }
union [共用体名] {メンバーのリスト} [変数名の並び];
/*****************************/ /* 共用体 */ /* coded by Y.Suganuma */ /*****************************/ #include <stdio.h> int main() { int i1; /* 共用体の定義(初期設定は文字) */ union smp { char ch[8]; long lg[2]; double db; } uni = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; /* 文字として記憶 */ printf("-----char----------\n"); for (i1 = 0; i1 < 8; i1++) printf("%c ", uni.ch[i1]); printf("\n"); printf("%5ld %5ld\n", uni.lg[0], uni.lg[1]); printf("%10.1f\n", uni.db); /* long型整数として記憶 */ printf("-----long----------\n"); uni.lg[0] = 10; uni.lg[1] = 20; for (i1 = 0; i1 < 8; i1++) printf("%c ", uni.ch[i1]); printf("\n"); printf("%5ld %5ld\n", uni.lg[0], uni.lg[1]); printf("%10.1f\n", uni.db); /* double型として記憶 */ printf("-----double----------\n"); uni.db = 50.0; for (i1 = 0; i1 < 8; i1++) printf("%c ", uni.ch[i1]); printf("\n"); printf("%5ld %5ld\n", uni.lg[0], uni.lg[1]); printf("%10.1f\n", uni.db); return 0; }
-----char---------- a b c d e f g h 1684234849 1751606885 854088322303612440000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000.0 -----long---------- 10 20 0.0 -----double---------- I @ 0 1078525952 50.0
情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |