| 情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |

[記憶クラス] 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

| 情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |