演習
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; //クラス
};