材料と加工覚え書き

 こんばんは。畑耕したんですが、なぜかいきなり梅雨入りしました。天に振り回される仕事、それが、アグリカルチャー。

材料の特徴
木材と金属とプラスチックを観点別に比較。

①じょうぶさ
木材:比較的軽くてじょうぶ
金属:重くてじょうぶ
プラ:軽くてじょうぶ。弱いものもあり。

②外観
木材:木目がある。
金属:金属光沢がある。
プラ:光沢がある。透明なものもある。

③におい
木材:特定の香りがある。
金属:におわない。
プラ:におわない。

④水による変形
木材:膨張、収縮する。
金属:変形しない。
プラ:変形しない。

⑤熱伝導性
木材:伝わりにくい。
金属:よく伝わる。
プラ:伝わりにくい。

⑥電気伝導性
木材:通さない。
金属:よく通す。
プラ:通さない。

⑦作り方
木材:樹木から取り出す。
金属:鉱物を精製する。
プラ:石油などから化学的に合成する。

⑧劣化
木材:水で腐る。
金属:水でさびる。
プラ:光や熱で劣化する。

材料と環境
木材:二酸化炭素を吸収&固定。作るのにタイムスパンがかかる。
金属:有限。回収して再利用ができる物が多い。ただエネルギーがかかる物がある。
プラ:有限。自然界で分解されない。

木材の特徴

こば(木端)
繊維方向と平行の面。

こぐち(木口)
繊維方向と垂直の面。

板目板
木目が放物線状の板。樹皮側に反り返る(樹皮側は乾燥しやすい)。

まさ目板
木目がまっすぐな板。反り返らない。

繊維方向
繊維に沿った向きのこと。
これに並行だとよく折れる。垂直だと折れない。
四季があると冬に成長が止まるため、木目ができる。
したがって常夏のジャングルの木には木目がない。

木材の種類①針葉樹
軽くてやわらかいものが多い。建築材に向いている。

スギ
やわらかく、家から割り箸まで使い勝手が良いため、たくさん植えられ、みんなを花粉症にした。

ヒノキ
独特の良いにおいがする。耐久性がよく、神社やお寺、お風呂などに使用。

パイン
英語で松という意味。やわらかい。楽器材や紙のパルプなど。

木材の種類②広葉樹
色や重さにバラエティがある。家具材に向いている。

ケヤキ
色がきれいなので内装に。

コクタン
南アジアから輸入。重いので水に沈む。仏壇や楽器に。

バルサ
中米から輸入。最も軽い木材。

キリ
比較的軽く、耐火性。たんすや下駄など。

木材の種類③木質材料
合板:板を重ねる際に繊維方向を変えて強度アップ。
集成材:小さな板を繊維方向を合わせて接着。
バーティクルボード:木材のかけらを接着剤と熱と圧力でくっつけた。
ファイバーボード:木材の繊維を接着剤と熱と圧力でくっつけた。

金属の特徴

弾性
軽く曲げても元に戻る。

塑性
強い力をかけると形を変えられる。

展性
叩くと薄くひろがる。

延性
引っぱると細長く伸びる。

加工硬化
曲げられた部分が硬くなる。

※かなとこを用意して、はんだをハンマーで叩いてみる。

成型方法
鍛造:叩いて変形。
鋳造:溶かして型に流す。
圧延:ローラーで押しつぶす。
切削:旋盤などで削る。
接合:金属を部分的に溶かしてくっつける。

金属の種類

鉄(アイアン)
じょうぶ。日本は製鉄技術が古代から高い。ただしよくさびる。

銅(コッパー)
やわらかく電気をよく通す。使い勝手が非常によい。

アルミ
すごい軽い。加工しやすい。

ニッケル
すごい軽い。耐久性が高い。さびにくい。

クロム
耐食性がずば抜けて高い。

錫(ティン)
やわいが、元にも戻しやすい。熱ですぐに溶ける。
空気中でもさびず(イオン化傾向が小さい)、布で磨くとぴかぴかに戻る。

鉛(リード)
じょうぶで比重が大きい。バッテリーや弾丸など。
毒性有り。古代ローマ人は鉛の器でワインを甘くしたため、金属中毒に。最近のハンダには鉛が含まれてないものもある。

合金
異なる種類の金属を混ぜ合わせてパワーアップさせたもの。

鋼(スチール)
鉄+炭素。炭素の含有量によって硬さが変わる(多いと硬い=もろい)。

ステンレス
鉄+クロム+ニッケル。さびにくくじょうぶ。キッチンなど。

真鍮(ブラス)
銅+亜鉛。ねじやカギ、楽器、5円玉など。

トタン
鋼に亜鉛のメッキをしたもの。屋根になったりするが、酸や塩基にはめっぽう弱い。

ブリキ
鋼にスズのメッキ。おもちゃなど。

ハンダ
鉛+スズ。接合に用いる。ファラオの時点ですでにやっていたらしい。

ジュラルミン
アルミと、わずかな亜鉛とマグネシウムと銅。超軽いのにすごいじょうぶ。
もともとは薬莢に。アタッシュケースやちょっと前までの飛行機など。
ただし耐食性が低い(海水に弱い)。

プラスチック
石油(原油)は混合物で、比重や沸点の違いによって、軽い順からガソリン、ナフサ、灯油(ストーブに使用)、軽油(ディーゼルエンジンに使用)、重油(ビルや発電所のボイラーや大型船舶に使用)、アスファルト(道路の舗装に使用)などに分けることができる(蒸留=分留)。
この中でナフサと呼ばれる成分に800℃の熱を加えると、エチレンやプロピレンのガスや、液体のベンゼンなどのプラスチックの原料がゲットでき、この分子を反応器を使って、1000気圧以上の圧力と、200℃以上の熱、触媒などによってつなぎ合わせることで、固体の粉にする(重合)。
この材料に添加剤(柔らかくしたり壊れにくくするもの)を加えたペレットという米粒っぽいフレークを成形機に入れてプラ製品を作る。

熱可塑性プラスチック
熱を加えれば何度も変形できる。いわばチョコレート。

熱硬化性プラスチック
いちど成型すると、熱をくわえてもやわらかくならない。いわばクッキー。

射出成型
液状のプラをホイップクリームのように型に搾る成型方法。

生物育成覚え書き②

 宴もおしまいですね。カインズホームなどのDIY用品店の面白さがなんとなくわかってきました。しかし技術は守備範囲が広すぎるよな、工業、農業、ITだろ・・・トライアスロンか。

教材になっている作物一覧
ほかにもスイカやメロンなどもあった。
ここでは比較的難易度が低い奴をリストアップしました。

リーフレタス(収穫まで2ヶ月)
暑さダメ(30℃以上は生育不良)

ミニトマト(収穫まで3ヶ月)
雨ダメ(空梅雨が望ましい)

ナス(収穫まで4ヶ月)
多くの水と肥料が必要!

豆苗(収穫まで2~3週間)
いつでも育つ。が、いかんせん知名度が低い。
ただ栄養価が高く(ビタミン豊富)、天然のサプリの二つ名を持つ。

ラディッシュ(収穫まで2ヶ月弱)
発芽適温が15~30℃とレンジが広い。

サラダホウレンソウ(収穫まで2ヶ月)
アクの強さの原因であるシュウ酸が少なく食べやすい。

ハーブ(収穫まで5ヶ月)
ミント、ローズマリー、ラベンダー、レモンバームなど。
おしゃれな感じだが、もともとは痩せた土地にも自生するほど逞しき野草なので、栽培の手間はそこまで。だが、栽培期間が意外と長い。夏休みをまたぐ可能性が。

ワイルドストロベリー(収穫まで半年)
いわゆる野いちご。キク級に栽培期間が長い。

ダイコン(収穫まで2ヶ月半)
春まき、秋まきどちらにも対応。
ただし子ども受けが悪いらしい。

ニンジン(収穫まで2ヶ月半)
春まき、秋まきどちらにも対応。

ネギ(収穫まで2ヶ月)
春まき、秋まきどちらにも対応。

キノコ(収穫まで1ヶ月)
種まき期間は10~3月下旬まで。
23℃を越えるとカビる。28℃を越えるとキノコは死滅。
冬季限定と考えて良い。

ミニトマトの栽培方法
乾燥に強く、多少放置しても勝手に育つため初心者向け。
太陽光が強く、昼夜の温度差が大きく、湿度が低い環境が好き。雨が嫌い。

主産地:熊本、北海道、愛知
生育適温:25~26℃(昼)15~16℃(夜)
土壌:深く耕し元肥が入った水はけの良い土。

3月
①たねまき
種をうめる深さは、種の厚さの1.5倍。
軽く指で押すくらいで良い。

4月
②鉢上げ
一回り大きな鉢(ポット)に移す。浅植えにする。

5月
③定植
花壇や畑に定植する。
垂直でもいいが、斜めに植えて根の発育を促したりもできる(土に埋まった茎から根ができる)。
 
④支柱立て・誘引
定植から2週間ほどしたら付近に支柱を立てる。
基礎部分にブロックを使うと棒が倒れない。

6月
⑤摘芽
栄養分を花や実に集中させるため、メインの茎以外の余分なえき芽をへし折って取り除く。
病気の葉ははさみで除去する。
害虫はセロテープでくっつけて捕まえる。

⑥追肥
最初の実がふくらんだ頃から2週間で3回ほどペレット状の有機質肥料を追加する。

7月
⑦摘しん
実の肥大、成熟をうながすため、メインの茎の先端(茎頂部)を除去する。

⑧収穫
大きさ、色、やわらかさから判断。

ナスの栽培方法
5月上旬に植え付けると7~10月まで収穫可能。
ナスは水で育てると言われ、朝、こまめに水やりをする。
また、栽培期間に肥料が途絶えないように、たっぷり元肥を投入し、定期的に追肥をする(肥料が多すぎてもトマトのように実がつかないことはない)。

注意点
・植え付け2週間前までに土を耕しておく。
追肥のタイミングはめしべがおしべよりも短いとき。追肥の仕方は、苗の両サイドを移植ごてで軽く掘り返し、握りこぶし程度の化学肥料を埋める。
・茎が弱くて折れやすいので、定植と同時に支柱を立てる。
パセリを一緒に植えると、そのにおいでナスにつく害虫を追っ払ってくれる。
・株元に稲わらやビニールを敷いておくと、土の乾燥を防ぎ、同時に病気を予防できる(マルチング)。
・その際、マルチングシートには空気穴のような小さな穴を開けて、土に水が染み込むようにする。
・一番花が咲いたら、花がついた枝とその上下の枝以外を切り取ってしまう(三本仕立て)。これにより栄養が分散することを防げるが収穫量は減る(実は大きく育つ)。特に下生えの葉はよく取るが、一度に切りすぎるとダメージが大きく、軽く枯れるので注意。
・各枝で一番大きな花がナスになるので、それ以外のえき芽は摘んでしまうこと。

リーフレタスの栽培方法
生育の適温は15~20℃。
夏まき秋取りしたい場合は8月に種をまくと11月に収穫。9月では12月収穫。

注意点
・花芽分化(つぼみをつけること)は高温長日で起こる(つまり日光がかなり必要)。
根が浅いことから有機質に富み通気性、排水性、保水性に優れた土地が適する。
・土壌の酸性に弱いためpHの矯正は十分行う。
・育て方(鉢植えなのかプランターなのか畑なのか)にあわせて品種を選ぶことが重要である。
・苗の葉っぱが密集してきたら葉の部分だけ間引きして食べちゃう。
・定植した後は週に一度成長の様子を観察し記録する。

土で育てる(容器栽培)
①キットの土壌タブレットに水をかけて4倍に膨らませる。ただしすぐには膨らまず、数時間かかる。
②育苗トレイにタブレット(保水性と保肥性を併せ持つヴェルデナイト)の土を入れて、種をまく。この場合あまり深く種を埋めると日光不足で芽が出ないので注意。
③プランターに用土と肥料を入れてシャベルでかき混ぜる。
④苗が育ったら特に元気がいいものを、育苗トレイからプランターに定植する。

土なしで育てる(養液栽培)
①育苗スポンジに水をたっぷり染みこませる。
②種は2ミリくらいの深さでスポンジに押し込む(押し込みすぎると日光が当たらない)。
③芽や根が出るまではスプレーなどで1日1回水をやる(乾燥させない)。
④成長は早く、2~7日で発芽する。
⑤苗が高さ3センチほどに育ったら、スポンジごと植え付けプレートにセットし、キットを組み立て養液で栽培する。
⑥培地に使う粒は砕かないようにスプーンで優しくすくう。

どちらも試してみたが、圧倒的に溶液栽培の方が楽。水に混ぜた養分がドーピング的にレタスをでかくしてくれる。
しかし、土にせよ、溶液にせよ、秋に種をまくと、季節的に日照時間が減少していくので、光エネルギー不足でひょろひょろになってしまう(徒長する)。
逆に、日光が出て晴れると、それはそれで枯れる。というわけで、葉物はかなり手がかかる。

土作り
作付けの3週間前にやるのが望ましいため、作物収穫後の冬の時期にやることが多い。
家庭菜園レベルならシャベルや鍬を使って行なうが、かつて参加させていただいた特別支援教室の畑ではホンダ耕運機を使った。あれはタイヤの代わりに鉄製の鍬がついたバイク。
あとは、ひたすらザルで土を細くする。かなりの重労働で半日は潰れてしまうが、できれば授業でやらせたい。

①堆肥を投入(作付け3週間前)
繊維分と土壌生物が多く含まれ、ふかふかな土を作るために行う。
一時的に土が乾きやすくなる。
投入量は1平方メートルあたりに2リットルで、畑の土とよく混ぜ合わせる。

②苦土石灰を投入(作付け2週間前)
土のpHバランスを整える。効果が現れるまでに時間がかかるため、まくのは作付けの2週間前。
消石灰は水酸化カルシウム(pH12)のことで、植物の栄養分はないので、マグネシウムを含んだ苦土石灰をまくのが一般的。
ちなみに苦土石灰はドロマイトという鉱物をくだいたもの。
投入量は1平方メートルあたりに200グラム。

③元肥を投入(作付け1週間前)
栄養豊かな肥料をまく。畑全体に投入し、鍬でもう一度よく耕す。
最後に畑にうねを作って完成。

プログラミング基礎覚え書き⑪(ファイルデータの入出力)

 ついにC言語最後の単元。本当にC言語でゴールデンウィーク終わっちゃいそうです。行楽ゼロ。お絵かきゼロ。いや~『きびしいC』だったよ、マナちゃん。(馴れ馴れしい)

参考文献:高橋麻奈著『やさしいC第5版』

gets文
ダンディ。いままでのscanfでは間に空白が入った文字列は入力できなかったが、ゲッツ(本当はゲット・エスという読み方らしい)を使うと改行までの文章がまるまる入力できるようになる。

puts文
ゲッツが読み込んだ文字列を、そのまんま出力するための文。
\nをつけなくても、文字列の最後にはちゃんと改行してくれる。
しかし、今までお世話になったprintfが使えず、変換仕様による書式をつけられない。

EOF
エンド・オブ・ファイルの略。stdio.hに定義されているマクロやファイルの終端を表す。

文字を続けて入力し、それを出力するコード
文字列ではなく、一文字ずつ入出力したい場合はgetcharとputcharを用いる。

int ch;
printf("文字を続けて入力してください。\n")

while((ch = getchar()) != EOF)
{
putchar(ch);
}

バッファリング
ハードディスクなどにデータの入出力を行う際、時間を短縮するため一文字一文字ではなく、まとめておこなうこと。

gets関数とputs関数を使って、アルファベットの小文字を大文字にするコード
ちなみにgets関数は、バッファ・オーバーフロー(コンピュータのキャパシティを超えた膨大なデータの書き込み)を起こしやすく、現在のバージョンでは禁止されているらしい。禁じられし古の呪文。
逆に言えば、システムを破壊したいクラッカーなどが悪用していたりする。

#include

int main(void)
{

int i;
char test[100];

printf("一行の英文を入力してください。\n");
gets(test);
//testを文字の配列とする。

for(i=0; test[i]!='\0'; i++)
if(97 <= test[i] && test[i] <= 122)
test[i] -= 32; //前にもやったように小文字の文字コードから32を引くと大文字となる。

puts(test);

return 0;
}

getchar関数とputchar関数を使って、アルファベットの小文字を大文字にするコード
1行まとめてではなく、一文字一文字小文字を大文字に変換させたい場合。コンパイル結果はさっきのコードと同じ。

#include

int main(void)
{
int ch;

printf("文字を続けて入力してください。\n");

while((ch=getchar())!=EOF){
if(ch>=97&&ch<=122)ch-=32;
putchar(ch);
}

return 0;
}

ファイルの入出力
ファイルを扱う際には、①ファイルを開く(fopen)、②ファイルを編集する、③ファイルを閉じる(fclose)の3つの手順を踏む。

fopen(ファイルを開く)
ファイル名とオープンモードを指定して実行し、実行結果をファイルポインタに受け取る。
構文 FILE *ファイルポインタ = fopen("ファイル名","オープンモード");
例 FILE *fp = fopen("test.txt","w");

ファイルポインタ(ストリームポインタ)
ポインタを授業では割愛していて、いきなり言われても意味不明なのだが、変数のデータをメモリに記憶させる際、どの領域に格納されたかの所在地をアドレスといい、このアドレスを記憶する変数をポインタというらしい。
メモリの中のデータを編集する際に使用する。
何らかの理由でファイルがオープンできなかった場合(ハードディスクの容量が足りなくなったなど)は、ファイルポインタにはNULLポインタというポインタが返ってくる(NULL文字とは別物なので注意!)。

オープンモード
ファイルをオープンする際の設定のようなもの。
"w" ライト。書き込み用にテキストファイルを白紙で開く。
"r" リード。読み込み用にテキストファイルを開く。
"a" アペンド。追記用にテキストファイルを開く。

"w+" 更新用にテキストファイルを開く(新規作成)。
"r+" 更新用にテキストファイルを開く。
"a+" 更新のため追記用のテキストファイルを開く。
"wb" 書き込み用にバイナリファイル(テキストファイル以外のファイル)を開く。
"rb" 読み込み用にバイナリファイルを開く。
"ab" 追記用にバイナリファイルを開く。

fclose(ファイルを閉じる)
ファイルを閉じる構文は割とシンプルで助かる。
構文 fclose(ファイルポインタ);
例 fclose( fp );

fputs(ファイルへの出力)
1行の文字列をファイルに書き込む。
ややこしいのは、putsのときのように、自動的に改行をしてくれないので\nをつけなければならない。だったら全部\nアリで統一してくれ!
構文 fputs( 文字列, ファイルポインタ );
例 fputs("Hello!", fp);

fgets(ファイルからの入力)
1行の文字列をファイルから読み取る。
構文 fgets( 変数, 読み込む最大文字数, ファイルポインタ );
例 fgets(str, 256, fp);

test1.txtの内容をそのままtest2.txtにコピーするコード
2つのテキストファイルがあり、1つは読み込み用として、もう一つは書き込み用として開く必要がある。
ファイルには10行のテキストが入っているという設定なので、マクロのNUMは10にする。

#include
#define NUM 10

int main(void)
{

int i;
FILE *fp1, *fp2;
char test[NUM];

//ファイル1は読み込み用として開く
fp1 = fopen("test1.txt","r");

//ファイル2は書き込み用として開く
fp2 = fopen("test2.txt","w");

if(fp1==NULL || fp2==NULL)
{
printf("ファイルを開けませんでした。\n");
return 1;
}

for(i=0; i<10; i++) //for文を使ってコピーを10行分繰り返す。
{
fgets(test, NUM-1, fp1);
fputs(test, fp2);
}

fclose(fp1);
fclose(fp2);

return 0;
}

受験者数と人数分の点数が保存されているファイル1から最高点数、最低点数、点数の合計、平均をファイル2に出力するプログラム
出力するデータに変換仕様(%dなど)が必要なので、そもまま文字列を出力しちゃうfputsではなく、fprintfを用いる。

#include

int main(void)
{

int i,num,tmp,max,min,sum;
FILE *fp1, *fp2;

fp1 = fopen("file1.txt","r");
fp2 = fopen("file2.txt","w");

if(fp1==NULL || fp2==NULL)
{
printf("ファイルを開けませんでした。\n");
return 1;
}

fscanf(fp1,"%d",&num);
max = -1000000;
min = 1000000;
sum = 0;

for(i=0; i {
fscanf(fp1,"%d",&tmp);
if(max < tmp)
max = tmp;
if(min > tmp)
min = tmp;
sum = sum + tmp;
}

fprintf(fp2,"最高点数:%d\n",max);
fprintf(fp2,"最低点数:%d\n",min);
fprintf(fp2,"最高合計:%d\n",sum);
fprintf(fp2,"平均点数:%.1f\n",(double)sum/(double)num);

fclose(fp1);
fclose(fp2);

return 0;
}

個人情報が保存されたtext.txtというテキストファイルのデータを出力するコード
最後の課題。コンパイル数が恐ろしいことになった。

#include < stdio.h >
#include < stdlib.h >

int main(void){

FILE *fp;
char name[256];
int age;
double weight;
char e_mail[256];

//ファイルのデータの読み込み
fp = fopen("text.txt", "r");
if(fp == NULL)
{
printf( "ファイルが開けませんでした.\n");
}
fscanf(fp, "name: %255[^\n]\n" , name);
fscanf(fp, "age: %d\n" , &age);
fscanf(fp, "weight: %lf\n" , &weight);
fscanf(fp, "e-mail: %255[^\n]\n" , e_mail);
fclose(fp);

//ファイルのデータの出力
printf("氏名: %s\n", name);
printf("年齢: %d\n", age);
printf("体重: %.1f\n", weight);
printf("Eメール: %s\n", e_mail);

return 0;
}

 理系分補充ということで、コンピュータやったわけだけど、いざやってみたら、勉強してる印象は英語に近かった…(´;ω;`)

プログラミング基礎覚え書き⑩(共用体unionと列挙enum)

参考文献:高橋麻奈著『やさしいC第5版』

共用体型(union構文)
複数の変数でひとつのメモリ領域を共有するもの。
共用体のメンバーはメモリをシェアしているため一つの値しか記憶させることができない。
宣言は構造体に似ているが、機能はかなり違う。
共用体型は次のような構文を書いて宣言する。

union 共用体名

型名 識別子;
型名 識別子;
・・・・・・


構造体Carと構造体Busを含むVehicle共用体
とりあえずストラクト・カーもストラクト・バスもユニオン・ビークルもtypedef構文であだ名をつけている。
乗用車にはナンバーと排気量のデータが、バスにはナンバーと乗車定員のデータが入っており、これらを収める共用体のデータのサイズは、収められたメンバーの中で最もサイズが大きい値と一致する。

#include

typedef struct Car {
int num; //ナンバー
double gas; //ガソリン
} Car; //乗用車構造体

typedef struct Bus {
int num; //ナンバー
int capacity; //乗車定員
} Bus; //バス構造体

//------------------------------
//ここにVehicle共用体を宣言

typedef union Vehicle{
Car car;
Bus bus;
} Vehicle;

//------------------------------

int main(void)
{
Car c = {1234, 25.5};
Bus b = {4567, 50};

Vehicle v;

v.car = c;
printf("v.car.num=%d, v.car.gas=%.1f\n", v.car.num, v.car.gas);
v.bus = b;
printf("v.bus.num=%d, v.bus.capacity=%d\n", v.bus.num, v.bus.capacity);

return 0;
}

列挙型(enum構文)
列挙型は識別子の値を格納できる型。
識別子の値(一般的に全て大文字で記述する)は、普通に文章で記述できるので、ソースコードが分かりやすいという利点もある。

列挙型は次のような構文を書いて宣言する。

enum 列挙型名 {識別子1, 識別子2, 識別子3 ・・・};

ちなみに{ }の中にない識別子は除外するという機能もある。

列挙型Week
enum Week{SUN,MON,TUE,WED,THU,FRI,SAT};

また、これらの識別子は、C言語のプログラムにおいては自動的に0からの数字に置き換えられて処理される。

enum Week{SUN,MON,TUE,WED,THU,FRI,SAT};

SUN・・・0
MON・・・1
TUE・・・2
WED・・・3
THU・・・4
FRI・・・5
SAT・・・6

さらに、識別子の数字を自分で指定することもできる。
enum Week{SUN,MON=0,TUE=5,WED,THU,FRI,SAT};

この場合は
SUN・・・0
MON・・・0
TUE・・・5
WED・・・6
THU・・・7
FRI・・・8
SAT・・・9
と、数字を重複させたり、スキップさせることができる。

列挙の識別子をswitch文のcaseにしたコード
今まではcaseは数字だったが、case CARなどと文章(=識別子名)で行けるので、人間の文章としてかなり読みやすい。

#include

//------------------------------
//ここにVType列挙を宣言

typedef enum VType{CAR, BUS} VType;

//------------------------------

int main(void)
{
int i;
VType vehicles[] = {BUS, CAR, BUS, BUS, CAR};

for (i=0;i<5;i++) {
switch (vehicles[i]) {
case CAR: printf("%d番目は乗用車です.\n",i); break;
case BUS: printf("%d番目はバスです.\n",i); break;
}
}

return 0;
}

花の列挙型Flower
ここでは、アイリス、チューリップ、ユリ、タンポポの4つの種類の識別子を格納している。

#include

typedef enum Flower_t {
IRIS,
TULIP,
LILY,
DANDELION
} Flower;

int main(void)
{
int i;
Flower flowers[] = {2, 3, 0, 1};

for (i=0;i<4;i++) {
switch(flowers[i]) {
case IRIS:
printf("アヤメ\n");
break;
case TULIP:
printf("チューリップ\n");
break;
case LILY:
printf("ユリ\n");
break;
case DANDELION:
printf("タンポポ\n");
break;
}
}

return 0;
}

構造体の中に共用体と列挙を含んだコード
全部乗せみたいなコード。

#include

typedef struct Car {
int num; //ナンバー
double gas; //ガソリン
} Car; //乗用車構造体

typedef struct Bus {
int num; //ナンバー
int capacity; //乗車定員
} Bus; //バス構造体

typedef enum VType {CAR,BUS} VType; //VType列挙

//------------------------------
//ここにVehicle構造体を宣言

typedef struct Vehicle{

VType type;
union{Car car;Bus bus;}data;

} Vehicle;

//Vehicle構造体の中にVType列挙とdata共用体が入っている!
※dataは構造体でもいいが、一回の処理でCarかBusのどちらか一方しか扱わないので、データのサイズを落とすために共用体がよい。

//------------------------------

int main(void)
{
int t;
Vehicle v;

printf("乗用車(0)ですか?バス(1)ですか?: ");
scanf("%d", &t);
if (t==CAR) {
v.type=CAR;
printf("ナンバーは?: ");
scanf("%d",&v.data.car.num);
printf("ガソリンは?: ");
scanf("%lf",&v.data.car.gas);
} else if (t==BUS) {
v.type=BUS;
printf("ナンバーは?: ");
scanf("%d",&v.data.bus.num);
printf("乗車定員は?: ");
scanf("%d",&v.data.bus.capacity);
}

switch(v.type) {
case CAR:
printf("乗用車:num=%d, gas=%.1f\n",
v.data.car.num,v.data.car.gas);
break;
case BUS:
printf("バス:num=%d, capacity=%d\n",
v.data.bus.num,v.data.bus.capacity);
break;
}

return 0;
}

配列の全てのデータを表示するコード
先ほどのVehicle構造体のコードを改造したもの。

#include

typedef struct Car {
int num; //ナンバー
double gas; //ガソリン
} Car; //乗用車構造体

typedef struct Bus {
int num; //ナンバー
int capacity; //乗車定員
} Bus; //バス構造体

typedef enum VType {CAR,BUS} VType;

//--------------------------------------------------
//ここにVehicle構造体を宣言

typedef struct Vehicle{

VType type;
union{Car car;Bus bus;}data;

} Vehicle;

//--------------------------------------------------

int main(void)
{
int i;
Car c1 = {1234,25.5};
Car c2 = {4567,52.2};
Bus b1 = {6789,50};
Vehicle vs[3];

vs[0].type = CAR;
vs[0].data.car = c1;
vs[1].type = CAR;
vs[1].data.car = c2;
vs[2].type = BUS;
vs[2].data.bus = b1;

//----------------------------------------
//ここに配列内の全ての要素を表示する処理
表示させたいデータの変数が(vs[i].data.車種.ナンバーなど,)と、非常に長くなるのに注意。

for(i=0; i<3; i++){

switch(vs[i].type){

case CAR:
printf("乗用車:num=%d, gas=%.1f\n",
vs[i].data.car.num, vs[i].data.car.gas);
break;

case BUS:
printf("バス:num=%d, capacity=%d\n",
vs[i].data.bus.num, vs[i].data.bus.capacity);
break;
}

}

//----------------------------------------

return 0;
}

プログラミング基礎覚え書き⑨(構造体struct)

 リポDで頑張っているけど、本当に辛い。なんかレヴィ=ストロースみたいなやつ出てきた(´;ω;`)

参考文献:高橋麻奈著『やさしいC第5版』

構造体(struct構文)
文字型や数値型などの異なるデータ型の変数を、まとめてひとつの型として定義したもの。
これを使うと、車という構造体に、セダンやカローラのデータを入れたりと、図鑑的なデータベースが作れる。

メンバー
構造体の中に定義した変数はメンバーと呼ばれる。
構造体名 .(ドット) メンバー=そのメンバーに格納したい値 ;
でメンバーのデータを操作することができる。

名前、年齢、性別の3つのメンバーを持つ構造体Person
ただし性別は、男性=M、女性=Fと一文字に置き換える。

#include

struct Person //構造体personと3つのメンバーの宣言
{
char name[100];
int age;
char gender;
};

int main(void)
{

struct Person p1;

printf("名前を入力:");
scanf("%s", p1.name); //文字列では&はいらない!

printf("年齢を入力:");
scanf("%d", &p1.age);

printf("性別を入力:");
scanf("\n%c",&p1.gender); //一文字だけの場合は%c

printf
("{name=%s, age=%d, gender=%c}\n",p1.name,p1.age,p1.gender);

return 0;
}

書名、価格、ページ数の3つのメンバーを持つ構造体Book
聖書のデータを入れているんだけど、聖書って定価は1365円もするんだな・・・だいたい教会の人が「クイアラタメヨ!」ってタダでくれるからな(^_^;)

#include

typedef struct book
{
char title[ 20 ];
int value, pages;
} Book;

int main(void) {

Book book1 = { "Bible", 1365, 687 };

printf( "{title=%s,Value=%d,pages=%d}", book1.title, book1.value, book1.pages );

return 0;
}

3冊の書籍のデータを格納する構造体Book
さらにさっきの構造体のコードを改造して、3冊の本のデータを入力し、構造体の配列に格納できるようにしたもの。

typedef struct Book {
char title[100];
int value;
int pages;
} Book;

#include
int main(void){
Book p1[3];
int i;

for(i=0;i<3;i++){
printf("%d冊目タイトル\n",i+1);
scanf( "%s", p1[i].title );
printf("%d冊目ページ数\n",i+1);
scanf( "%d", &p1[i].pages );
printf("%d冊目価格\n",i+1);
scanf( "%d", &p1[i].value );
}

for(i=0;i<3;i++){
printf("{title=%s,value=%d,pages=%d}\n",
p1[i].title,p1[i].pages,p1[i].value);
}

return 0;
}

typedef構文
構造体の型名を短縮するために用いるキーワード。簡単に説明すると、構造体名にあだ名をつける感じ。
typedef 型名 識別子; の順で記述する。

typedef struct Car{
int num;
double gus;
}Car;

と書くと、struct Carという長い構造体名が、以降はCarだけで済むようになる。

構造体Personをさらにまとめる構造体Couple
構造体のネスト文を作る。

#include

//構造体struct Personをtypedef構文で構造体名をPersonに短縮。
typedef struct Person
{
char name[100];
int age;
char gender;
}Person;

//構造体struct Coupleをtypedef構文で構造体名をCoupleに短縮。さらに構造体personを構造体Coupleの中に取り込み。
typedef struct Couple
{
Person boy;
Person girl;
}Couple;

int main(void)
{
Person Ichiro = {"Ichiro",20,'M'};
Person hanako = {"Hanako",19,'F'};

Couple c1;
c1.boy = Ichiro;
c1.girl = hanako;

printf("Couple:\n");
printf(" boy:{name=%s, age=%d, gender=%c}\n",
c1.boy.name, c1.boy.age, c1.boy.gender);

printf(" girl:{name=%s, age=%d, gender=%c}\n",
c1.girl.name, c1.girl.age, c1.girl.gender);

return 0;
}

sizeof構文
データの大きさ(サイズ)を何バイトか計算する構文。
構造体のサイズは各メンバーのサイズの合計値か、それ以上となる(無駄なメモリの隙間パディングができることが多いため)。

#include

#define NUM 100 //☚マクロのこの数字(配列の要素数)を変えることでサイズも変わっていく。

typedef struct Person {
char name[NUM];
int age;
char gender;
} Person;

int main(void)
{
printf("%d, %d\n",NUM,sizeof(Person)); //Person構造体のサイズを計算したものを表示。

return 0;
}

構造体の配列のソート
任意のメンバー(ここでは年齢)でソートする。

#include

typedef struct Person {
char name[100];
int age;
char gender;
} Person;

int main(void)
{
int i,j;
Person tmp;

Person test[3] = { {"Ichiro",20,'M'},
{"Jiro",21,'M'},
{"Hanako",19,'F'} };

for(i=0; i<2; i++)
{

for(j=i+1; j<3; j++)
{if(test[i].age > test[j].age)

{
tmp = test[i];
test[i] = test[j]; //この3行が君の名は。
test[j] = tmp;
}

}

}

for(i=0; i<3; i++)
{
printf("{name=%s, age=%d, gender=%c}\n",
test[i].name, test[i].age, test[i].gender );
}

return 0;
}
Calendar
<< March 2024 >>
SunMonTueWedThuFriSat
     12
3456789
10111213141516
17181920212223
24252627282930
31
search this site.
tags
archives
recent comment
recent trackback
others
にほんブログ村 科学ブログへ にほんブログ村 科学ブログ 恐竜へ カウンター
admin
  • 管理者ページ
  • 記事を書く
  • ログアウト

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332