演習
1)任意二つのunsigned int型数値の論理AND, OR, XORを求めなさい(P324)
/* a9-4-1.c */ #include <stdio.h> #include <limits.h> int main(void) { unsigned a, b; printf("0 〜 %u の整数を2つ入力してください。¥n", UINT_MAX); printf("> "); scanf("%u", &a); printf("> "); scanf("%u", &b); printf("%u(%#x) AND %u(%#x) = %#x¥n",__,__,__,__,__); printf("%u(%#x) OR %u(%#x) = %#x¥n",__,__,__,__,__); printf("%u(%#x) XOR %u(%#x) = %#x¥n",__,__,__,__,__); return 0; }
2)任意unsigned int型数値のビットパターンを表示(P328)
/* a9-4-2.c */ #include <stdio.h> #include <limits.h> void show_bit(unsigned dt); int main(void) { unsigned a; printf("0 〜 %#x の16進数を入力してください。> ", UINT_MAX); scanf("%x", &a); show_bit(a); return 0; } /*** ビット表示関数 ***/ /*(仮引数)dt:表示データ */ void show_bit(unsigned dt) { int i, len; len = sizeof(dt) * CHAR_BIT; printf("%#x ---> ", dt); for (i = len - 1; i >= 0; i--){ putchar(( __ >> __ & 1U) ? '1' : '0' ); } putchar('¥n'); }
演習解説
構造体の変数
構造体とは
構造体とは,「いろいろな種類の互いに関連するデータをまとめて, 1つのかたまりにしたもの」である。 たとえば,「氏名,年齢,性別などのデータを一人分だけまとめたもの」 このようなものをいう。
構造体を構成する要素を,構造体のメンバと呼ぶ。上の例では, 「名前」「性別」「年齢」「身長」「体重」などが,メンバにあたる。
構造体の宣言
構造体は,一つのデータ型であり,その型枠をまず始めに宣言する必要がある。 そして,その型枠を型とする変数を宣言する形で構造体の実体(オブジェクト)を宣言し, それを使用することができる。
構造体の型枠の宣言と,その型枠をもつ構造体変数の宣言は次のようになされる.
struct 構造体タグ名 {メンバの並び}; /* 型枠の宣言 */ struct 構造体タグ名 構造体変数名; /* 構造体変数の宣言 */
例えば,次図のような人のデータをまとめた構造体の定義は下のようになる。
struct
_person { /* _person がタグ名 */ char name[20]; /* 文字配列型のメンバ name */ char sex; /* 文字型メンバ sex */ int age; /* 整数型メンバ age */ double height; /* 倍精度実数型メンバ height */ double weight; /* 倍精度実数型メンバ weight */ };
struct
_person p; /* p という名前の struct _person 型変数を宣言 */
構造体の代入
一つの構造体変数の内容全部を 同じ型の別の構造体変数に, 通常の変数を代入するのと同じように,代入することができる.
person_t p1 = {"Tom", 'M', 19, 175.2, 69.5}; person_t p2; p2 = p1;
構造体の配列
構造体を並べた配列も扱える.その宣言定義は通常のようにすればよい.
#define PERSON_NUM 5 typedef struct { char name[20]; char sex; int age; double height; double weight; } person_t;
person_t p[PERSON_NUM]
;
これで,要素数がPERSON_NUM個(5個)の person_t 構造体型配列 p ができる.
たとえば,上の図で色のついてある p[3] の height メンバには, p[3].height でアクセスする.
サンプルプログラム2
#include <stdio.h> #define PERSON_NUM 5 typedef struct { char name[20]; char sex; int age; double height; double weight; } person_t; main() { person_t p[PERSON_NUM] = {{"Bob", 'M', 19, 165.4, 72.5}, {"Alice", 'F', 19, 161.7, 44.2}, {"Tom", 'M', 20, 175.2, 66.3}, {"Stefany", 'F', 18, 159.3, 48.5}, {"Leonardo", 'M', 19, 172.8, 67.2}}; int i; double height_sum, weight_sum, height_ave, weight_ave; height_sum = weight_sum = 0.0; for (i = 0; i < PERSON_NUM; i++) { height_sum += p[i].height; weight_sum += p[i].weight; } height_ave = height_sum / PERSON_NUM; weight_ave = weight_sum / PERSON_NUM; printf("average height = %fn", height_ave); printf("average weight = %fn", weight_ave); return 0; }
構造体のいろいろな宣言の仕方
- 構造体の型枠と実体を同時に宣言する
- 初期化も同時に行う
- 構造体タグ名を記述しないこともできる
- typedefで別名をつけることができる
演習
「学籍番号、氏名、学年、クラス」を含める構造体の宣言、初期化、表示するプロフラムを作る。
演習
struct student
{
char no[10]; //番号
char name[20]; //名前
int s_year; //年
char s_class; //クラス
};