5月30日 Amazonタイムセール 注目の商品は?

Amazon.co.jpにて毎日、タイムセールが開催されています。本日5月30日のタイムセールでぜひ買っておきたい筆者おすすめの商品を紹介していこう。

目次

 1:Echo Dot 第3世代 - スマートスピーカー with Alexa

現在、人気のスマートスピーカーのEcho Dot。話しかけるだけで天気、ニュース、家電の操作、商品の注文、音楽、ラジオなどなど、、、こんな便利なアイテムがなんと、2台買うと5980円OFF、つまり2台買うと1台無料なのだ。Echo Dotのセールは6月1日まで行われているのでぜひ手に入れたいところだ。

ラインナップは画像の左から、チャコールサンドストーンプラムヘザーグレーの4種類だ。

購入はこちら:https://amzn.to/3eyzJ6F

 

2:Fire HD 10 タブレット ブラック 32GB 【純正カバー (チャコールブラック) 付き】

この商品は、Amazonの高解像度フルHDディスプレイ搭載の最新のタブレットとカバーがセットになった商品になります。前世代から30%の性能UP、約12時間の連続使用可能、デュアルバンド対応によるWi-Fiの安定化などなど、大幅に性能アップしています。そんな、最新世代のタブレット1000円引きで購入可能だ。カバーのカラーラインナップは全9種類である。

購入はこちら:https://amzn.to/3dgaupz

 

3:Anker PowerCore Speed 20000 PD (20100mAh 超大容量モバイルバッテリー)

こちらは、AnkerのUSB-PD充電対応の大容量モバイルバッテリーである。急速充電対応でUSB-PDにも対応ということで、Type-c搭載のノートパソコンの充電を行うことができる。この、ネット社会において持っておいて損はない商品だ。そんな、Anker PowerCore Speed 20000 PD (20100mAh 超大容量モバイルバッテリー)【PSE認証済 / 最軽量 / Power Delivery対応 / USB-C急速充電器付属】が定価より2000安く買い求めることができる。

購入はこちら:https://amzn.to/3chZZ3J

 

その他の注目セール品

 

自作PCのすすめ!Fortnite(フォートナイト)に必要なPCのスペックは?2020年5月30日最新版

EPIC Gamesからリリースされている無料ゲーム、Fortnite(フォートナイト)。2020年5月にプレイヤー数が3億5000万人を突破した世界的にも大人気のゲームです。

現在FortniteはPC、PlayStation4、XboxOne、Nintendo SwitchiOSAndroidのプラットホームに対応しています。今回の記事では、この中のPC(パソコン)を自作する際に、「このぐらいのPCを組みたいけど、どのぐらいの性能の部品を選べばいいのか?」、「FortniteをしたいけどPCってどれぐらいお金がかかるの?」といった悩みに答えれるように、用途に合わせて部品ごとにどれを選べばいいのかを解説します。

Fortnite公式ページ:https://www.epicgames.com/fortnite/ja/home

Fortniteをダウンロードする!:https://www.epicgames.com/fortnite/ja/download

目次

 

まず始めに

自作PCを組むうえで重要な要素が2つあります。

 ・用途

 ・予算                   の2つです。

まず用途ですが、自分がどのぐらいの設定(画質やFPSなど、)で遊びたいのか、ゲームのほかに何をしたいかというのを押さえておくのは部品を選ぶうえでかなり重要になってきます(最高スペックで組む人は、別だよ!)。そして自分の欲しい性能を踏まえてその性能を出すための部品を買う予算が必要になってきます。高い買い物なので予算をケチって後で後悔するなんてもともこもありませんから(いくらでも出せる人は、別だよ!)。

この二つを踏まえておけばできるだけ後悔することなく、自作PCを組んで楽しいゲーム生活を送ることができるでしょう!!

部品選び(グラフィックボード編)

ゲームをするうえで最も重要になってくるのがグラフィックボード(GPU)です。

このグラフィックボードがゲームプレイに影響するのは主に映像品質、fps(映像の滑らかさ)の二つでしょう。ゲームプレイに最も直結する部品ですので予算を一番割くべきでしょう。

最高画質、240fpsでプレイしたい人!

GeForse RTX2070 SUPER (イチオシ!)

玄人志向 NVIDIA GeForce RTX 2070 SUPER 搭載 グラフィックボード 8GB デュアルファン GALAKURO GAMINGシリーズ GG-RTX2070SP-E8GB/DF GIGABYTE NVIDIA GeForce RTX2070Super搭載グラフィックボード GDDR6 8GB 【国内正規代理店品】 GV-N207SGAMING OC-8GD

このグラボは非常に優秀でGeForceのグラボを選ぶならまずこの製品が選択肢に入るでしょう。Fortniteだけでなくその他のほとんどのゲームでも最高品質でプレイできるのも魅力です。

AMD RADEON RX 5700XT(イチオシ!)

玄人志向 AMD Radeon RX5700XT 搭載 グラフィックボード GDDR6 オリジナルファンモデル RD-RX5700XT-E8GB/DF SAPPHIRE NITRO+ RADEON RX 5700 XT 8G グラフィックスボード 11293-03-40G VD7077

このグラボはAMD社製のもので、2070superより高い性能ながら値段が1万円ほど安いという超高コスパなグラボです。ただ少しだけ消費電力は高いです。

GeForse RTX2080 Ti(一般向け最高性能) 

玄人志向 NVIDIA GeForce RTX 2080Ti 搭載 グラフィックボード 11GB トリプルファン GALAKURO GAMINGシリーズ GG-RTX2080Ti-E11GB/TP

ASUS NVIDIA RTX2080Ti 搭載 トリプルファンモデル 11GB ROG-STRIX-RTX2080TI-O11G-GAMING

このグラボは一般向けに展開されているものの中では間違いなく最高性能でしょう。後で紹介するTITANには少し性能は劣りますが、最高のグラボであるのは間違いないでしょう。

 

NVIDEA TITAN RTX(現行GPU最高性能品)

NVIDIA Titan RTX Graphics Card

このグラフィックボードは現行品の中でも最高額・最高性能の品です(なんと約30万円)。このグラボがあればどのような場面でも不満は出ないでしょう。(無敵です)

 

 

高画質、144fpsでプレイしたい人!

GeForse RTX2060(おススメ!)

玄人志向 NVIDIA GeForce RTX 2060 搭載 グラフィックボード 6GB デュアルファン GALAKURO GAMINGシリーズ GG-RTX2060-E6GB/DF ZOTAC GAMING GeForce RTX 2060 Twin Fan グラフィックスボード VD6860 ZTRTX2060-6GGDR6TWIN ZTRTX2060-6GGDR6TWIN/ZT-T20600F-10M

このグラボは価格・性能ともに優れており高画質・高品質でプレイしたい人にはもってこいのグラボです。

GeForse RTX2060 SUPER

MSI GeForce RTX 2060 SUPER VENTUS XS J OC グラフィックスボード VD7099 GIGABYTE NVIDIA GeForce RTX2060Super搭載グラフィックボード GDDR6 8GB 【国内正規代理店品】 GV-N206SWF2OC-8GD

このグラボは先ほど紹介したRTX2060の上位機種でこちらの商品も価格・性能に優れておりまず問題なくゲームプレイできるでしょう。

中画質、60fpsでプレイしたい人!

AMD RADEON RX570(現行最強コスパ!)

MSI Radeon RX 570 8GT OC A グラフィックスボード VD7262

ASRock AMD Radeon RX580 搭載 グラフィックボード Phantom gaming モデル PG D Radeon RX580 8G OC

このグラボは間違いなく同価格帯では最高性能・最強コスパでしょう。この品質でプレイするのに十分な性能があります。

GeForse GTX1650(低消費電力・低価格)

玄人志向 NVIDIA GeForce GTX 1650 搭載 グラフィックボード 4GB デュアルファン GF-GTX1650-E4GB/OC/DF MSI GeForce GTX 1650 AERO ITX 4G OC グラフィックスボード VD6936

このグラボは性能が少し低いですが低消費電力・低価格という財布にやさしい仕様であまりお金を使えない人におすすめです。

 

 

部品選び(CPU・マザーボード編)

PCを動作させる中枢を担うのがCPUです。なのでCPUの性能が低いと動作がもっさりしたり、グラボの性能を最大限引き出せないという事態に陥ります。そこそこの性能は欲しいところです。そしてCPUのメーカー・世代ごとに対応しているマザーボードが異なりますので注意が必要です。一般的にはグラボの性能が高いほど性能の高いCPUが必要になります。マザーボードは乗っているチップセットごとにインターフェースの数やOC(オーバークロック)ができるかなどが変わってくるのでよく調べて好みのものを選ぶのがベストです。

現行AMD製CPU対応マザボ

・ ソケットAM4(A320,B450,X570チップセット等)

ASRock AMD Ryzen AM4 対応 A320 チップ搭載 MicroATX マザーボード A320M-HDV R4.0 MSI B450 GAMING PLUS MAX ATX マザーボード MB4821 ASUS AMD AM4対応 マザーボード ROG STRIX X570-F GAMING 【ATX】

 

現行AMD製CPU対応マザボ(RyzenThreadripper)

・TR4(X399チップセット等)

ASRock AMD Threadripper対応X399チップセット搭載 ハイエンドATXマザーボード X399 Taichi

 

現行Intel製CPU対応マザボ(第10世代)

 ・LGA1200(Z490チップセット等)

ASUS INTEL Z490 搭載 LGA1200 対応 ROG STRIX Z490-E GAMING 【 ATX 】 GIGABYTE Z490 AORUS XTREME WATERFORCE マザーボード E-ATX [Intel Z490チップセット搭載] MB4930

 

 現行Intel製CPU対応マザボ(第9世代)

   ・LGA1151(Z390,その他300番台チップセット等)

   *一部BIOSの更新が必要なマザー有り。

ASUS Intel® Z390 搭載 LGA1151対応 マザーボード TUF Z390-PLUS GAMING 【ATX】 MSI Z390-A PRO ATX マザーボード [Intel Z390チップセット搭載] MB4617

ハイエンドCPU

AMD Ryzen 9 3950X

AMD Ryzen 9 3950X, without cooler 3.5GHz 16コア / 32スレッド 70MB 105W【国内正規代理店品】100-100000051WOF

AM4ソケット対応CPUの中ではこのCPUが最も高性能です。

性能:16C32T,70MB,3.5GHz,105w

 

AMD Ryzen Threadripper3990WX

AMD Ryzen Threadripper 3990X 2.9GHz 64コア / 128スレッド 288MB 280W【国内正規代理店品】100-100000163WOF

TR4ソケット対応のCPUで一般向けのCPUの中では金額も性能もトップクラスです。

性能:64C128T,288MB,2.9GHz,280W

 

Intel Core i9-10900k

 

INTEL CPU BX8070110900K Core i9-10900K プロセッサー 3.7GHz 20MB キャッシュ 10コア 日本正規流通商品

LGA1200対応のCPUで最新最上位製品でゲーミング向きの製品です。

性能:10C20T,20MB,3.7GHz,125w

 

ミドルレンジCPU

Intel Core i7-9700k

INTEL インテル CPU Corei7-9700K INTEL300シリーズ Chipsetマザーボード対応 BX80684I79700K【BOX】【日本正規流通品】

LGA1151対応のCPUで、最もポピュラーなCPUでしょう。

性能:8C8T,12MB,3.6GHz,95w

AMD Ryzen5 3600

AMD Ryzen 5 3600 with Wraith Stealth cooler 3.6GHz 6コア / 12スレッド 35MB 65W【国内正規代理店品】 100-100000031BOX

AM4対応のCPUで低価格・高性能を実現した製品です。

性能:6C12T,35MB,3.6GHz,65w

AMD Ryzen5 3500

AMD Ryzen 5 3500 with Wraith Spire cooler 3.6GHz 6コア / 6スレッド 19MB 65W【国内正規代理店品】 100-100000050BOX

 AM4対応のCPUで、3600の低価格版です。

性能:6C6T,19MB,3.6GHz,65w

超高コスパ・低価格CPU

Intel Core i5-9400F

INTEL インテル Core i5 9400F 6コア / 9MBキャッシュ / LGA1151 CPU BX80684I59400F 【BOX】【日本正規流通品】

LGA1151対応のCPUで、Intelの高コスパ代表です。

性能:6C6T,9MB,2.9GHz,65w

AMD Ryzen5 1600AF 

AMD Ryzen 5 1600 AF, with Wraith Stealth cooler 3.2GHz 6コア / 12スレッド 16MB 【国内正規代理店品】 YD1600BBAFBOX

AM4対応のCPUで、約1万円でミドルクラスのCPUが手に入るという最強コスパ品です。(品薄で高額転売されている可能性があるので注意してください!)

性能:6C12T,16MB,3.2GHz,65w

 

部品選び(CPUクーラー編)

CPUが決まったらそれを冷やすためのクーラー選びです。純正のクーラーが付属している場合は、それを使用しても構いませんが見た目が悪かったり冷えにくかったりする場合があります。(高性能のものには付属していないことが多い。)その場合には自分の好みのCPUクーラーを買うことをお勧めします。CPUクーラーには水冷と空冷があり、さらに水冷の中に簡易水冷と本格水冷があります。一般的には本格水冷、簡易水冷、空冷の順で安定して冷やすことができ、見た目もよいです。(本格水冷はメンテナンス性があまりよくない、リスクが高く高価・高難易度なためあまりお勧めしません。)一つだけ注意してほしいのが使うマザーボードのタイプにクーラーが対応しているかという点です。それ以外は気にせず好きなものを選ぶといいです。また同時に、クーラーに付属しているグリスはあまり高性能でないことが多いので、良いグリスを買っておくことをお勧めします。

おススメの空冷クーラー

サイズ オリジナルCPUクーラー 虎徹 Mark II

おススメの簡易水冷クーラー

NZXT KRAKEN X53 水冷システム [ ラジエーターサイズ 123x275x30mm : 120mm・ファン2基 ] RL-KRX53-01

おススメの本格水冷クーラーキット

Thermaltake Pacific M360 Plus D5 Hard Tube RGB Water Cooling Kit 水冷CPUクーラーキット [Intel/AMD両対応] HS1311

 

 おすすめのグリス

【正規品 親和産業】 ドイツ Thermal Grizzly オーバークロック用特別設計高性能熱伝導グリス Kryonaut 1g

 

部品選び(メモリ編)

メモリは机の広さなどに例えられるように、容量が多ければ多いほどたくさんのことを同時にできるようになります。(2画面で動画を見ながらゲームをするなど。)そしてもう一つ、メモリ速度も見ておくといいでしょう。

AMD社製のCPUを選んでいる場合、相性問題などがあるのでできるだけポピュラーなものを選んでください。)

容量の目安として

一般ゲーム用途:8GB

マルチタスク:16GB

動画編集:32GB ぐらいとされています。

おススメのメモリ(DDR4)

CORSAIR DDR4-2666MHz デスクトップPC用 メモリモジュール VENGEANCE LPX Series 8GB×2枚キット

 

CMK16GX4M2A2666C16 G.Skill Trident Z RGB F4-3200C16D-16GTZR (DDR4-3200 CL16 8GB×2)

キングストン Kingston デスクトップPC用メモリ 16GB DDR4-3200 8GBx2枚 HyperX Predator RGB HX432C16PB3AK2/16 RGB LED

 

部品選び(ストレージ編)

ストレージはOSをインストールしたり、ゲームをダウンロードする場所になります。最近では安価・高速・大容量のものが多いので好きなものを選んでよいでしょう。ゲーム用途であれば、おすすめはM.2SSDの256GB以上のものを選ぶとよいでしょう。(安いものがいい場合、M.2スロットがない場合はSATAのものでも全く問題ありません。)

おススメのストレージ

Samsung 860 EVO 500GB SATA 2.5" 内蔵 SSD MZ-76E500B/EC 国内正規保証品 Western Digital SSD 1TB WD Blue PC M.2-2280 SATA WDS100T2B0B-EC 【国内正規代理店品】

 

部品選び(電源編)

次に選ぶのは電源です。電源は重要でできるだけ電源効率のいい良いものを選んで下さい。電源にはケーブルの抜き差しができるプラグイン電源とそうでない電源があります。できるだけキレイにまとめる場合はプラグイン電源をお勧めします。そして電源容量ですが大体(CPUの消費電力+GPUの消費電力+50W)×2の容量以上のものを選ぶのが目安です。たまにケースが一般的な大きさのATX電源でなく、小型のSFX電源に対応してるものがあるので注意です。

おススメのATX電源

Corsair RM750x -2018-750W PC電源ユニット[80PLUS GOLD] PS794 CP-9020179-JP

おススメのSFX電源

Corsair SF600 -PLATINUM- 600W PC電源ユニット [80PLUS PLATINUM] PS807 CP-9020182-JP

 

部品選び(ケース・装飾編)

ここまで部品が決まったらケース選びです。ケースを選ぶときの注意点としては、通気性がよく、部品が収まる大きさ、マザーボードの規格が対応しているかです。ここさえ気を付ければピカピカ光るケースや、中が見えるケース、超コンパクトなケースなど自分の好みに合わせて選んで大丈夫です。またケースに合わせて、RGBファンやLEDテープなどで装飾するのもおすすめです。

おススメの激安ケース

Thermaltake Versa H17 ミニタワー型PCケース CS7096 CA-1J1-00S1NN-00

 おススメのおしゃれケース

NZXT h500 ATXコンピュータケース、ca-h500b-w1、ホワイト/ブラック

 おススメのコンパクトなケース

RAIJINTEK METIS PLUSシリーズ キューブ型アルミニウム製Mini-ITXケース 0R200061 (METIS PLUS WHITE)

 おススメの装飾品

VAWcornic 4X0.5m LEDテープライト テレビ TVバックライト PC照明 USB LEDテープ 車内装飾用 SMD5050RGBテープライト 高輝度 イルミネーションライト 間接照明 切断可能 フットライト 携帯しやすい 両面テープ 看板照明 棚下照明 <Corsair LL120 RGB -White- Triple Pack PCケースファン 12cm FN1280 CO-9050092-WWp> 

 

 

 

部品選び(OS編)

最後にOS(オペレーティングシステム)です。OSはWindows10home 64bitかWindows10pro 64bitの二択なので好きなほうを選んでもらって構いません。

設定の自由度が高いproのほうをお勧めします。

おススメのOS

Windows10 home

【旧パッケージ】Microsoft Windows 10 Home April 2018 Update適用32bit/64bit 日本語版|パッケージ版

Windows10 pro

【新パッケージ】Windows 10 Pro 日本語版/May 2019 Update適用/パッケージ版

 

最後に

ここまでいろいろな部品を紹介してきましたがいかがだったでしょうか?ここまで記事を読んでいただきありがとうございます。ぜひ楽しいゲーム生活を送ってください!

 

 

新・明解C言語 入門編 演習問題の解答(回答)

この記事では、C言語入門書の定番!柴田望洋さんの著書、新・明解C言語 入門編の演習問題に対する回答を載せていこうと思います。すべての問題に回答できておりませんが、随時更新していきますのでよろしくお願いします。

Amazon.comで新・明解C言語 入門編(著・柴田望洋)を購入する。https://amzn.to/3cKXDeM

 おすすめのwebコンパイラ(C言語対応)のリンク

repl.it(https://repl.it/languages/c)

paiza.io(https://paiza.io/projects/new)

ideon(http://ideone.com)

 

なぜか、表示されている順番が前後しているのと記事が長いことから、目次からお求めの回答を探すことをお勧めします。

目次

 

本編

第1章:まずは慣れよう

演習1-1

#include <stdio.h>

int main(void)
{
printf("15から37を引いた値は%dです。\n", 15 - 37);

return 0;
}

演習1-2

#include <stdio.h>

int main(void)
{
printf("風\n林\n火\n山\n");

return 0;
}

演習1-3

#include <stdio.h>

int main(void)
{
printf("もしもし。\nこんにちは。\n\nそれでは。\n");

return 0;
}

演習1-4

#include <stdio.h>

int main(void)
{
int d;

printf("整数を入力してください:"); scanf("%d", &d);
printf("その数に10を加えると%dです。\n", d + 10);

return 0;
}

演習1-5

#include <stdio.h>

int main(void)
{
int d;

printf("整数を入力してください:"); scanf("%d", &d);
printf("その数から10を減すと%dです。\n", d - 10);

return 0;
}

演習1-6

#include <stdio.h>

int main(void)
{
puts("風\n林\n火\n山");

return 0;
}

演習1-7

#include <stdio.h>

int main(void)
{
int a,b;

puts("二つの整数を入力してください。");
printf("整数1:"); scanf("%d", &a);
printf("整数2:"); scanf("%d", &b);
printf("それらの積は%dです。\n", a * b);

return 0;
}

演習1-8

#include <stdio.h>

int main(void)
{
int a,b,c;

puts("三つの整数を入力してください。");
printf("整数1:"); scanf("%d", &a);
printf("整数2:"); scanf("%d", &b);
printf("整数3:"); scanf("%d", &c);
printf("それらの和は%dです。\n", a + b + c);

return 0;
}

第2章:演算と型

演習2-1

#include <stdio.h>

int main(void)
{
int a,b;

puts("二つの整数を入力してください。");
printf("整数A:"); scanf("%d", &a);
printf("整数B:"); scanf("%d", &b);
printf("Aの値はBの%d%%です。\n",a / b * 100);

return 0;
}

演習2-2

#include <stdio.h>

int main(void)
{
int a,b;

puts("二つの整数を入力してください。");
printf("整数A:"); scanf("%d", &a);
printf("整数B:"); scanf("%d", &b);
printf("それらの和は%dで積は%dです。\n", a + b, a * b);

return 0;
}

演習2-3

#include <stdio.h>

int main(void)
{
double a;

printf("実数を入力してください:");
scanf("%lf", &a);
printf("あなたは%fと入力しましたね。\n", a);

return 0;
}

演習2-4

#include <stdio.h>

int main(void)
{
int a1,a2,a3,a4,c1,c2,c3,c4;
double b1,b2,b3,b4,d1,d2,d3,d4;

a1 = 5 * 2;
a2 = 5.0 * 2.0;
a3 = 5.0 * 2;
a4 = 5 * 2.0;

b1 = 5 * 2;
b2 = 5.0 * 2.0;
b3 = 5.0 * 2;
b4 = 5 * 2.0;

c1 = 5 / 2;
c2 = 5.0 / 2.0;
c3 = 5.0 / 2;
c4 = 5 / 2.0;

d1 = 5 / 2;
d2 = 5.0 / 2.0;
d3 = 5.0 / 2;
d4 = 5 / 2.0;

printf("a1:%d\n",a1);
printf("a2:%d\n",a2);
printf("a3:%d\n",a3);
printf("a4:%d\n\n",a4);

printf("b1:%f\n",b1);
printf("b2:%f\n",b2);
printf("b3:%f\n",b3);
printf("b4:%f\n\n",b4);

printf("c1:%d\n",c1);
printf("c2:%d\n",c2);
printf("c3:%d\n",c3);
printf("c4:%d\n\n",c4);

printf("d1:%f\n",d1);
printf("d2:%f\n",d2);
printf("d3:%f\n",d3);
printf("d4:%f\n",d4);

return 0;
}

演習2-5

#include <stdio.h>

int main(void)
{
int a,b;

puts("二つの整数を入力してください。");
printf("整数A:"); scanf("%d", &a);
printf("整数B:"); scanf("%d", &b);

printf("Aの値はBの%f%%です。\n",(double)a / (double)b);

return 0;
}

演習2-6

#include <stdio.h>

int main(void)
{
int height;
double weight;

printf("身長を入力して下さい > ");
scanf("%d", &height);

weight = (double)*1
{
printf("%d ", i);
}
i++;
}
if (no > 0)
putchar('\n');

return (0);
}

演習4-10

#include <stdio.h>

int main (void)
{
int i,no;

printf("正の整数を入力して下さい:");
scanf("%d", &no);

i = 2;
while (i <= no)
{
printf("%d ", i);
i *= 2;
}
if (no > 0)
putchar('\n');

return (0);
}

演習4-11

#include <stdio.h>

int main(void)
{
int no;

printf("正の整数を入力して下さい:");
scanf("%d", &no);

while (no-- > 0)
puts("*");
if (no > 0)
putchar('\n');

return (0);
}

演習4-12

#include <stdio.h>

int main(void)
{
int no = 1;
int sum = 0;

for (; no <= 5; no++)
sum += no;

printf(" 1 から 5 までを足した値は %d です。\n", sum);

return (0);
}

演習4-13

#include <stdio.h>

int main(void)
{
unsigned i, no;

printf("整数を入力して下さい:");
scanf("%d", &no);

for (i = 1; i <= no; i++)
printf("%d", i % 10);
putchar('\n');

return (0);
}

演習4-14

#include <stdio.h>

int main(void)
{
int height;
double weight;
int max, min, space;

printf("何cmから:"); scanf("%d", &min);
printf("何cmまで:"); scanf("%d", &max);
printf("何cmごと:"); scanf("%d", &space);

for (height = min; height <= max; height += space)
{
weight = (double)*2;

return 0;
}

演習6-2

#include <stdio.h>

int min3(int x, int y, int z)
{
int min = x;

if ( y < min )
min = y;
if ( z < min )
min = z;

return min;
}

int main(void)
{
int na, nb, nc;

puts("三つの整数を入力して下さい。");
printf("整数1:"); scanf("%d", &na);
printf("整数2:"); scanf("%d", &nb);
printf("整数3:"); scanf("%d", &nc);

printf("最も小さい値は%dです。\n", min3( na, nb, nc ));

return 0;
}

演習6-3

#include <stdio.h>

int sqr(int x)
{
return ( x * x * x );
}
int diff(int x, int y)
{
return ( x > y ? x - y : y - x );
}

int main(void)
{
int kx, ky;

puts("二つの整数を入力して下さい。");
printf("整数1:"); scanf("%d", &kx);
printf("整数2:"); scanf("%d", &ky);

printf("整数1の三乗と整数2の三乗の差は%dです。\n", diff( sqr(kx), sqr(ky) ));

return 0;
}

演習6-4

#include <stdio.h>

int sqr(int x)
{
return (x * x);
}

int pow4(int x)
{
return (sqr(x) * sqr(x));
}

int main(void)
{
int no;

printf("整数を入力して下さい:"); scanf("%d", &no);

printf("%dの4乗値は%dです。\n", no, pow4(no));

return 0;
}

演習6-5

#include <stdio.h>

void alert(int no)
{
while(no-- > 0)
putchar('\a');
}

int main(void)
{
int n;

printf("回数を入力して下さい:"); scanf("%d", &n);

alert(n);

return 0;
}

演習6-6

#include <stdio.h>

void hello(void)
{
printf("こんにちは。");
putchar('\n');
}

int main(void)
{
hello();

return 0;
}

演習6-7

#include <stdio.h>

#define NUMBER 5

int min_of(const int vc, int no)
{
int i;
int min = vc[0];

for( i = 1; i < no; i++ )
if (vc[i] < min)
min = vc[i];
return min;
}

int main(void)
{
int i;
int eng[NUMBER];
int mat[NUMBER];
int min_e, min_m;

printf("%d人の点数を入力して下さい\n", NUMBER);
for ( i = 0; i < NUMBER; i++ ) {
printf("[%d] 英語:", i + 1); scanf("%d", &eng[i]);
printf("   数学:"); scanf("%d", &mat[i]);
}

min_e = min_of(eng, NUMBER);
min_m = min_of(mat, NUMBER);

printf("英語の最低点=%d\n", min_e);
printf("数学の最低点=%d\n", min_m);

return 0;
}

演習6-8

#include <stdio.h>

#define NUMBER 5

void rev_intary(int vc, int no)
{
int i, temp;

for ( i = 0; i < ( no / 2 ); i++ ) {
temp = vc[i];
vc[i] = vc[(no - 1) - i];
vc[(no - 1) - i] = temp;
}
}

int main(void)
{
int i;
int a[NUMBER];

printf("%d\n", NUMBER);
for ( i = 0; i < NUMBER; i++ ) {
printf("a[%d] <= ", i); scanf("%d", &a[i]);
}

rev_intary(a, NUMBER);

for ( i = 0; i < NUMBER; i++ )
printf("a[%d] => %d\n", i, a[i]);

return 0;
}

演習6-9

#include <stdio.h>

#define NUMBER 5

void intary_rcpy(int v1, const int v2, int no)
{
int i, temp;

for ( i = 0; i < no; i++ )
v1[i] = v2[i];

for ( i = 0; i < ( no / 2 ); i++ ) {
temp = v1[i];
v1[i] = v1[(no - 1) - i];
v1[(no - 1) - i] = temp;
}
}

int main(void)
{
int i;
int a[NUMBER];
int b[NUMBER] = {0};

printf("%d個の数字を入力してください\n", NUMBER);
for ( i = 0; i < NUMBER; i++ ) {
printf("a[%d] <= "); scanf("%d", &a[i]);
}
for ( i = 0; i < NUMBER; i++ )
printf("b[%d] => %d\n", i, b[i]);

puts("順序を逆にすると");
intary_rcpy(b, a, NUMBER);

for ( i = 0; i < NUMBER; i++ )
printf("b[%d] => %d\n", i, b[i]);

return 0;
}

演習6-10

#include <stdio.h>

void mul(const int ma[2][3], const int mb[3][2], int mc[2][2])
{
int i, j, k;

for ( k = 0; k < 2; k++ )
for( i = 0; i < 2; i++ )
for ( j = 0; j < 3; j++ )
mc[i][k] += ma[i][j] * mb[j][k];
}

int main(void)
{
int i, j;
int ma[2][3] = {{ 1, 2, 3 }, { 4, 5, 6 }};
int mb[3][2] = {{ 6, 3 }, { 4, 5 }, { 1, 2 }};
int mc[2][2] = { 0 };

mul(ma, mb, mc);

for ( i = 0; i < 2; i++ ) {
for ( j = 0; j < 2; j++ )
printf("%3d", mc[i][j]);
putchar('\n');
}

return 0;
}

演習6-11

#include <stdio.h>

#define NINZU 5
#define KYOKA 3

void max(const int ma[NINZU][KYOKA], int no, int mb[KYOKA])
{
int i, j;

for ( i = 0; i < KYOKA; i++ ) {
mb[i] = ma[0][i];
}

for ( i = 1; i < no; i++ )
for ( j = 0; j < KYOKA; j++ )
if ( mb[j] < ma[i][j] )
mb[j] = ma[i][j];
}

void avg(const int va[NINZU][KYOKA], int no, int vc[KYOKA])
{
int i, j;
for ( i = 0; i < no; i++ )
for( j = 0; j < KYOKA; j++ )
vc[j] += va[i][j];

for ( i = 0; i < KYOKA; i++ )
vc[i] /= no;
}

int main(void)
{
int i;
int a[NINZU][KYOKA] = { 0 };
int b[KYOKA] = { 0 };
int c[KYOKA] = { 0 };

printf("%d人の国語、数学、英語の点数を入力して下さい。\n", NINZU);
for ( i = 0; i < NINZU ; i++ ) {
printf("[%02d] 国語:", i + 1); scanf("%d", &a[i][0]);
printf("   数学:"); scanf("%d", &a[i][1]);
printf("   英語:"); scanf("%d", &a[i][2]);
}

max(a, NINZU, b);
avg(a, NINZU, c);

printf("国語の最高点:%d\n", b[0]);
printf("国語の平均点:%d\n", c[0]);
printf("数学の最高点:%d\n", b[1]);
printf("数学の平均点:%d\n", c[1]);
printf("英語の最高点:%d\n", b[2]);
printf("英語の平均点:%d\n", c[2]);

return 0;
}

第7章:基本型

演習7-1

#include <stdio.h>

int main(void)
{
unsigned no, no1, no2;
int i, x;

printf("非負の整数を入力してください:");
scanf("%u", &no);
printf("何ビットシフト(乗除)しますか:");
scanf("%d", &x);

no1 = no2 = no;
for( i = 0; i < x; i++ ) {
no1 <<= 1;
no2 *= 2;
}
printf("左にシフトした数:%u\n", no1);
printf("乗算した数:%u\n", no2);

no1 = no2 = no;
for( i = 0; i < x; i++ ) {
no1 >>= 1;
no2 /= 2;
}
printf("右にシフトした数:%u\n", no1);
printf("除算した数:%u\n", no2);

return 0;
}

演習7-2

#include <stdio.h>


int count_bits(unsigned x)
{
int count = 0;
while(x){
if ( x & 1U ) count++;
x >>= 1;
}
return count;
}


int int_bits(void)
{
return count_bits(~0U);
}


void print_bits(unsigned x)
{
int i;
for ( i = int_bits() - 1; i >= 0; i-- )
putchar((( x >> i ) & 1U ) ? '1' : '0');
putchar('\n');
}


unsigned rrotate(unsigned x, int n)
{
int width = int_bits();
return x >> n % width | x << (width - n % width);
}


unsigned lrotate(unsigned x, int n)
{
int width = int_bits();
return x << n % width | x >> (width - n % width);

}

int main(void)
{
unsigned no, nor, nol;
int n;
printf("非負の整数を入力してください:");
scanf("%u", &no);

puts("ビットの中身");
print_bits(no);

printf("何ビットシフトしますか:");
scanf("%d", &n);

puts("右にシフトした後の内容");
nor = rrotate(no, n);
print_bits(nor);

puts("左にシフトした後の内容");
nol = lrotate(no, n);
print_bits(nol);

return 0;
}

演習7-3

#include <stdio.h>


int count_bits(unsigned x)
{
int count = 0;
while(x){
if ( x & 1U ) count++;
x >>= 1;
}
return count;
}


int int_bits(void)
{
return count_bits(~0U);
}


void print_bits(unsigned x)
{
int i;
for ( i = int_bits() - 1; i >= 0; i-- )
putchar((( x >> i ) & 1U ) ? '1' : '0');
putchar('\n');
}


unsigned set(unsigned x, int pos)
{
unsigned i = 1U;
int width = int_bits();
i <<= pos % width - 1;
return i | x;
}


unsigned reset(unsigned x, int pos)
{
unsigned i = 1U;
int width = int_bits();
i <<= pos % width - 1;
i = ~i;
return i & x;
}


unsigned inverse(unsigned x, int pos)
{
unsigned i = 1U;
int width = int_bits();
i <<= pos % width - 1;
return i ^ x;
}

int main(void)
{
unsigned no;
int bit;

printf("整数を入力してください:"); scanf("%lu", &no);
puts("ビットの中身");
print_bits(no);
printf("何ビット目を処理しますか:"); scanf("%d", &bit);
printf("ON:\t");
print_bits(set(no, bit));
printf("OFF:\t");
print_bits(reset(no, bit));
printf("INVERSE:");
print_bits(inverse(no, bit));

return 0;
}

演習7-4

#include <stdio.h>


int count_bits(unsigned x)
{
int count = 0;
while(x) {
if ( x & 1U ) count++;
x >>= 1;
}
return count;
}


int int_bits(void)
{
return count_bits(~0U);
}


void print_bits(unsigned x)
{
int i;
for ( i = int_bits() - 1; i >= 0; i-- )
putchar((( x >> i ) & 1U ) ? '1' : '0');
putchar('\n');
}


unsigned set_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j,no,po;
po = pos % int_bits();
no = n % po;
for ( j = 0; j < no - 1; j++ ) {
i <<= 1;
i += 1;
}
i <<= po - no;
return i | x;
}


unsigned reset_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j,no,po;
po = pos % int_bits();
no = n % po;
for ( j = 0; j < no - 1; j++ ) {
i <<= 1;
i += 1;
}
i <<= po - no;
i = ~i;
return i & x;
}


unsigned inverse_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j,no,po;
po = pos % int_bits();
no = n % po;
for ( j = 0; j < no - 1; j++ ) {
i <<= 1;
i += 1;
}
i <<= po - no;
return i ^ x;
}

int main(void)
{
unsigned no;
int bit,n;

printf("整数を入力してください:"); scanf("%lu", &no);
puts("ビットの中身");
print_bits(no);
printf("何ビット目を処理しますか:"); scanf("%d", &bit);
printf("何個処理しますか:"); scanf("%d", &n);
printf("ON_n:\t\t");
print_bits(set_n(no, bit, n));
printf("OFF_n:\t\t");
print_bits(reset_n(no, bit, n));
printf("INVERSE_n:\t");
print_bits(inverse_n(no, bit, n));

return 0;
}

演習7-5

#include <stdio.h>

int main(void)
{
unsigned x = 3000000000000;
unsigned y = 2000000000000;
unsigned z;
z = x + y;

printf("%u\n", z);

return 0;
}

第8章:いろいろなプログラムを作ってみよう

演習8-1

#include <stdio.h>

#define diff(x, y) (((x) > (y)) ? *3 : *4;

return 0;
}

演習8-2

#include <stdio.h>

#define max(x, y) (((x) > (y)) ? (x) : (y))

int main(void)
{
int a, b, c, d;

puts("四つの整数を入力してください");
printf("整数1:"); scanf("%d", &a);
printf("整数2:"); scanf("%d", &b);
printf("整数3:"); scanf("%d", &c);
printf("整数4:"); scanf("%d", &d);

printf("一番大きい値は%dです\n", max(max(max(a, b), c), d));

return 0;
}

演習8-3

#include <stdio.h>

#define swap(type, a, b) { type tmp; tmp = a; a = b; b = tmp; }

int main(void)
{
int x, y;
float i, j;

puts("二つの整数を入力してください");
printf("整数1:"); scanf("%d", &x);
printf("整数2:"); scanf("%d", &y);
swap(int, x, y);
printf("整数1の値:%d\n", x);
printf("整数2の値:%d\n", y);

puts("二つの実数を入力してください");
printf("実数1:"); scanf("%f", &i);
printf("実数2:"); scanf("%f", &j);
swap(float, i, j);
printf("実数1の値:%f\n", i);
printf("実数2の値:%f\n", j);

return 0;
}

演習8-4

#include <stdio.h>

enum season { Spring, Summer, Fall, Winter, Invalid };

int main(void)
{
enum season month;
int tmp;

do {
printf("月を入力してください。:"); scanf("%d", &tmp);
if(tmp >= 3 && tmp <= 5) month = Spring;
else if(tmp >= 6 && tmp <= 8) month = Summer;
else if(tmp >= 9 && tmp <= 11) month = Fall;
else if(tmp == 1 || tmp == 2 || tmp == 12) month = Winter;
else month = Invalid;
if(month == Invalid) puts("不正な月です。");
} while(month == Invalid);

switch(month) {
case Spring : puts("ポカポカして気持ちいいですねぇ"); break;
case Summer : puts("暑い><こんなときは海だね"); break;
case Fall : puts("なんだか寂しいですよね…"); break;
case Winter : puts("寒い><ストーブが欲しいっすね"); break;
}

return 0;
}

演習8-5

#include <stdio.h>

int fact(int n)
{
int i;
unsigned long fct = 1;

for( i = n; i > 0; i-- )
fct *= i;

return (n == 0) ? 1 : fct;
}

int main(void)
{
int no;

printf("整数を入力してください:"); scanf("%d", &no);
printf("階乗した値は%luです\n", fact(no));

return 0;
}

演習8-6

#include <stdio.h>

int combination(int n, int r)
{
if(n == r || r == 0) return 1;
if(r == 1) return n;
return combination(n -1, r - 1) + combination(n - 1, r);
}

int combi(int a, int b)
{
return (a > b) ? combination(a, b) : combination(b, a);
}

int main(void)
{
int dn, dr;

puts("二つの整数を入力してください");
printf("整数1:"); scanf("%d", &dn);
printf("整数2:"); scanf("%d", &dr);

printf("組み合わせの数は%d個です\n", combi(dn, dr));

return 0;
}

演習8-7

#include <stdio.h>

int main(void)
{
int i, ch, j;
int cnt[10] = {0};

while(1) {
ch = getchar();
if( ch == EOF ) break;

if( ch >= '0' && ch <= '9' )
cnt[ch - '0']++;
}

puts("数字文字の出現回数");
for( i = 0; i < 10; i++ ) {
printf("'%d' : ", i);
for( j = 0; j < cnt[i]; j++ )
putchar('*');
putchar('\n');
}

return 0;
}

演習8-8

#include <stdio.h>

int main(void)
{
int str, cnt = 0;

while(1) {
str = getchar();
if( str == EOF ) break;
if( str == '\n') cnt++;
}

printf("入力された行数は%dです。\n", cnt);

return 0;
}

第9章:文字列の基本

演習9-1

#include <stdio.h>

int main(void)
{
char str = "ABC\0DEF";

printf("文字列strは%sです。\n", str);

return 0;
}

演習9-2

#include <stdio.h>

int main(void)
{
char str = "ABC";
int sz, i;

sz = sizeof(str);

for( i = 0; i < sz; i++ )
str[i] = '\0';

for( i = 0; i < sz; i++ )
printf("%c", str[i]);
putchar('\n');

return 0;
}

演習9-3

#include <stdio.h>

int str_char(const char str, int c)
{
int len = 0;

while( str[len] != c ) {
len++;
if( str[len] == '\0' ) {
len = -1;
break;
}
}

return len;
}

int main(void)
{
char str[128];
int c;
int leng;

printf("文字列を入力してください:");
scanf("%s", str);
while(getchar() != '\n' );
printf("検索する文字を入力してください:");
scanf("%c", &c);

if( (leng = str_char(str, c)) == -1 )
printf("指定された文字は見つかりませんでした。\n");
else
printf("%cは%d文字目にありました。\n", c, leng + 1);

return 0;
}

演習9-4

#include <stdio.h>

int str_chnum(const char str, int c)
{
int i = 0, num = 0;

while( str[i] != '\0' ) {
if( str[i] == c )
num++;
i++;
}

return num;
}

int main(void)
{
char str[128];
int c;
int num;

printf("文字列を入力してください:");
scanf("%s", str);
while(getchar() != '\n');
printf("検索する文字を入力してください:");
scanf("%c", &c);


if( (num = str_chnum(str, c)) != 0 )
printf("%cは%d個見つかりました。\n", c, num);
else
printf("指定された文字は見つかりませんでした。\n");

return 0;
}

演習9-5

#include <stdio.h>

void put_string(const char str)
{
printf("%s\n", str);
}

int main(void)
{
char str[128];

printf("文字列を入力してください:");
scanf("%s", str);

put_string(str);

return 0;
}

演習9-6

#include <stdio.h>

void put_stringn(const char str, int no)
{
while(no--)
printf("%s\n", str);
}

int main(void)
{
char str[128];
int no;

printf("文字列を入力してください:");
scanf("%s", str);
while(getchar() != '\n');
printf("表示する回数を入力してください:");
scanf("%d", &no);

put_stringn(str, no);

return 0;
}

演習9-7

#include <stdio.h>

void put_rstring(const char str)
{
unsigned i = 0;

while(str[i]) i++;
i--;
while(str[i])
putchar(str[i--]);
}

int main(void)
{
char str[128];

printf("文字列を入力してください:");
scanf("%s", str);

printf("逆にした文字列は");
put_rstring(str);
printf("です。\n");

return 0;
}

演習9-8

#include <stdio.h>

void rev_string(char str)
{
int i = 0, j = 0;
char tmp;

while(str[i]) i++;
i--;

for( ; j <= (i / 2); j++ ) {
tmp = str[j];
str[j] = str[i - j];
str[i - j] = tmp;
}
}

int main(void)
{
char str[128];

printf("文字列を入力してください:");
scanf("%s", str);

rev_string(str);
printf("逆にした文字列は%sです。\n", str);

return 0;
}

演習9-9

#include <stdio.h>

void null_string(char str)
{
unsigned i = 0;

while(str[i]) {
str[i] = '\0';
i++;
}
}

int main(void)
{
char str[128];

printf("文字列を入力してください:");
scanf("%s", str);

null_string(str);
printf("文字列の内容は%sです。\n", str);

return 0;
}

演習9-10

#include <stdio.h>

void del_digit(char str)
{
unsigned i = 0;

while(str[i]) {
if(str[i] >= '0' && str[i] <= '9') {
unsigned j = i;
while(str[j]) {
str[j] = str[j + 1];
j++;
}
}
else
i++;
}
}

int main(void)
{
char str[128];

printf("文字列を入力してください:");
scanf("%s", str);

del_digit(str);
printf("数字を削除した文字列は%sです。\n", str);

return 0;
}

第10章:ポインタ

演習10-1

#include <stdio.h>

int err = 0;
int IsLeepYear(int y)
{
return (
(((y % 400) == 0) && (((y % 10000) != 0) || *5 ||
(((y % 4) == 0) && *6
) ? 1 : 0;
}


void yesterday(int *y, int *m, int *d)
{

int ld[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };


if(IsLeepYear(*y)) ld[1]++;
if(*d == 1) {
*d = ld[(*m) - 2]; 
if (--(*m) <= 0) { 
*m = 12;
(*y)--; 
}
}
else 
(*d)--;
}


void tomorrow(int *y, int *m, int *d)
{

int ld[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

if(IsLeepYear(*y)) ld[1]++; 
if(*d == ld[(*m) - 1]) {
*d = 1; 
if (++(*m) > 12) { 
*m = 1; 
(*y)++; 
}
}
else
(*d)++; 
}


void syear(int *y)
{
err = 0;
printf("西暦を入力してください:"); scanf("%d", y);
while(getchar() != '\n'); 
if(*y < 1900 || *y > 3000) {
err = 1;
puts("無効な年を入力しないでください!");
}
}


void smanth(int *m)
{
err = 0;
printf("月を入力してください:"); scanf("%d", m);
while(getchar() != '\n'); /*バッファを空にする*/
if(*m < 1 || *m > 12) {
err = 1;
puts("無効な月を入力しないでください!");
}
}


void sday(const int *y, const int *m, int *d)
{

int ld[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
err = 0;

if(IsLeepYear(*y)) ld[1]++; 
printf("日を入力してください:"); scanf("%d", d);
while(getchar() != '\n'); 
if(*d < 1 || *d > ld[*m - 1]) {
err = 1;
puts("無効な日を入力しないでください!");
}
}

int main(void)
{
int y, m, d;
int yy, my, dy; 
int yt, mt, dt; 

do { syear(&y); } while(err);
do { smanth(&m); } while(err);
do { sday(&y, &m, &d); } while(err);

yy = yt = y;
my = mt = m;
dy = dt = d;

printf("%04d/%02d/%02dの前の日は", y, m, d);
yesterday(&yy, &my, &dy);
printf("%04d/%02d/%02dです。\n", yy, my, dy);
printf("%04d/%02d/%02dの次の日は", y, m, d);
tomorrow(&yt, &mt, &dt);
printf("%04d/%02d/%02dです。\n", yt, mt, dt);

return 0;
}

演習10-2

#include <stdio.h>


void swap(int *nx, int *ny)
{
int temp = *nx;
*nx = *ny;
*ny = temp;
}


void sort3(int *n1, int *n2, int *n3)
{
if(*n2 > *n3)
swap(n2, n3);
if(*n1 > *n2)
swap(n1, n2);
if(*n2 > *n3)
swap(n2, n3);
}

int main(void)
{
int na, nb, nc;

puts("三つの整数を入力してください。");
printf("整数A:"); scanf("%d", &na);
while(getchar() != '\n');
printf("整数B:"); scanf("%d", &nb);
while(getchar() != '\n');
printf("整数C:"); scanf("%d", &nc);
while(getchar() != '\n');

sort3(&na, &nb, &nc);

puts("これらの値を昇順に並べ替えました。");
printf("整数Aは%dです。\n", na);
printf("整数Bは%dです。\n", nb);
printf("整数Cは%dです。\n", nc);

return 0;
}

第11章:文字列とポインタ

演習11-1

#include <stdio.h>

void put_string(const char *str)
{
while(*str)
putchar(*str++);
}

int main(void)
{
char str[128];

printf("文字列を入力してください:");
scanf("%s", str);

put_string(str);
putchar('\n');

return 0;
}

演習11-2

#include <stdio.h>

char *str_chr(const char *str, int c)
{
while(*str) {
if(*str == c)
return (char*)str;
str++;
}

return NULL;
}

int main(void)
{
char str[128];
int c;
char *p;

printf("文字列を入力してください:");
scanf("%s", str);
while(getchar() != '\n' );
printf("検索する文字を入力してください:");
scanf("%c", &c);

if( (p = str_chr(str, c)) == NULL )
printf("指定された文字は見つかりませんでした。\n");
else
printf("%cは%d文字目にありました。\n", c, p - &str[0] + 1);

return 0;
}

演習11-3

#include <stdio.h>

int str_chnum(const char *str, int c)
{
unsigned i = 0;

while(*str) {
if(*str == c)
i++;
str++;
}
return i;
}

int main(void)
{
char str[128];
int c;
int num;

printf("文字列を入力してください:");
scanf("%s", str);
while(getchar() != '\n');
printf("検索する文字を入力してください:");
scanf("%c", &c);


if( (num = str_chnum(str, c)) != 0 )
printf("%cは%d個見つかりました。\n", c, num);
else
printf("指定された文字は見つかりませんでした。\n");

return 0;
}

演習11-4

#include <stdio.h>
#include <ctype.h>


void str_toupper(char *str)
{
while(*str) {
*str = toupper(*str);
str++;
}
}


void str_tolower(char *str)
{
while(*str) {
*str = tolower(*str);
str++;
}
}

int main(void)
{
char str[128];

printf("文字列を入力してください:");
scanf("%s", str);

str_toupper(str);
printf("大文字:%s\n", str);

str_tolower(str);
printf("小文字:%s\n", str);

return 0;
}

演習11-5

#include <stdio.h>

void del_digit(char *str)
{
char *sp;

while(*str) {
if(*str >= '1' && *str <= '9') {
sp = str;
while(*sp) {
*sp = *(sp + 1);
sp++;
}
}
else
str++;
}
}

int main(void)
{
char str[128];

printf("文字列を入力してください:");
scanf("%s", str);

del_digit(str);
printf("数字を削除した文字列は%sです。\n", str);

return 0;
}

演習11-6

#include <stdio.h>


int strtoi(const char *nptr)
{
int i = 0;
const char *p = nptr; 

if(*nptr == '-')
nptr++; 
while(*nptr) {
if(*nptr >= '0' && *nptr <= '9') {
i += *nptr - '0';
nptr++;
if(*nptr >= '0' && *nptr <= '9')
i *= 10; 
}
else
break;
}
if(*p == '-')
i = -i; 

return i;
}


long strtol(const char *nptr)
{
int i = 0;
const char *p = nptr; 

if(*nptr == '-')
nptr++;
while(*nptr) {
if(*nptr >= '0' && *nptr <= '9') {
i += *nptr - '0';
nptr++;
if(*nptr >= '0' && *nptr <= '9')
i *= 10; 
}
else
break;
}
if(*p == '-')
i = -i;

return i;
}


double strtof(const char *nptr)
{
double d = 0;
const char *p = nptr;
double i = 10.0;

if(*nptr == '-')
nptr++; 
while(*nptr) {
if(*nptr >= '0' && *nptr <= '9') {
d += *nptr - '0';
nptr++;
if(*nptr >= '0' && *nptr <= '9')
d *= 10; 
}
else
break;
}
if(*nptr == '.') 
nptr++;
while(*nptr) {
if(*nptr >= '0' && *nptr <= '9') {
d += (*nptr - '0') / i;
nptr++;
i *= 10.0;
}
else
break;
}
if(*p == '-')
d = -d;

return d;
}

int main(void)
{
char no[32];

printf("整数文字を入力してください:");
scanf("%s", no);
printf("入力された数字は%dです。\n", strtoi(no));

printf("整数文字を入力してください:");
scanf("%s", no);
printf("入力された数字は%ldです。\n", strtol(no));

printf("実数文字を入力してください:");
scanf("%s", no);
printf("入力された数字は%fです。\n", strtof(no));

return 0;
}

第12章:構造体

演習12-1

#include <stdio.h>
#include <time.h>

void put_time(void)
{
time_t current;
struct tm *local;

time(&current);
local = localtime(&current);
printf("%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec);
}

int main(void)
{
printf("現在の時刻は");
put_time();
printf("です。\n");

return (0);
}

演習12-2

#include <stdio.h>

#define MAX 3

typedef struct {
char addr[128];
char name[32];
char tel[16];
} customer;

int main(void)
{
customer blist[MAX];
int i;

for( i = 0; i < MAX; i++ ) {
printf("%dl–Ú\n", i + 1);
printf("ZŠ‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢F");
scanf("%s", &blist[i].addr);
printf("Ž–¼‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢F");
scanf("%s", &blist[i].name);
printf("“d˜b”Ô†‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢F");
scanf("%s", &blist[i].tel);
}

puts("\n--- ƒuƒ‰ƒbƒNƒŠƒXƒg ---");
puts("ZŠ\tŽ–¼\t“d˜b”Ô†");
for( i = 0; i < MAX; i++ )
printf("%s\t%s\t%s\n", blist[i].addr, blist[i].name, blist[i].tel);

return (0);
}

第13章:ファイル処理

演習13-1

#include <stdio.h>

int main(void)
{
FILE *fp;
char fname[256];

printf("ファイル名を指定してください:");
scanf("%s", fname);

fp = fopen(fname, "r"); /* ファイルのオープン */

if(fp == NULL)
printf("\aファイルをオープンできません。\n");
else {
/* ファイルから読み込みなどを行う */
fclose(fp); /* ファイルのクローズ */
}

return 0;
}

演習13-2

#include <stdio.h>

int main(void)
{
FILE *fp;
char fname[256];

printf("ファイル名を指定してください:");
scanf("%s", fname);

if*7 == NULL)
puts("\aそのファイルは存在しません。");
else {
puts("\aそのファイルは存在します。");
fclose(fp);
}

return 0;
}

演習13-3

未回答

演習13-4

#include <stdio.h>

typedef struct {
char name[128];
double height;
double weight;
} nhw;

int main(void)
{
FILE *wfp;
nhw people;
char fname[256] = "hw2.dat";

if*8 == NULL)
puts("\aファイルをオープンできません。");
else {
printf("名前を入力してください:");
scanf("%s", &people.name);
printf("身長を入力してください:");
scanf("%lf", &people.height);
printf("体重を入力してください:");
scanf("%lf", &people.weight);
fprintf(wfp, "%s %.0lf %.1lf", people.name, people.height, people.weight);
fclose(wfp);
}

return 0;
}

演習13-5

#include <stdio.h>
#include <time.h>

char data_file = "datetime.dat";
void get_data(void)
{
FILE *fp;
int y, mo, d, h, m, s;
char feel[64];

if((fp = fopen(data_file, "r")) == NULL)
puts("本プログラムを実行するのは初めてですね。");
else {
fscanf(fp, "%d%d%d%d%d%d%s", &y, &mo, &d, &h, &m, &s, feel);
printf("前回は%4d年%02d月%02d日%02d時%02d分%02d秒で、"
"気分は%sでした。\n", y, mo, d, h, m, s, feel);
fclose(fp);
}
}


void put_data(void)
{
FILE *fp;
time_t t;
struct tm *local;
char feel[64] = "普通";

time(&t);
local = localtime(&t);
if((fp = fopen(data_file, "w")) == NULL)
puts("\aファイルをオープン出来ません。");
else {
printf("現在の気分は:"); scanf("%s", feel);
fprintf(fp, "%d %d %d %d %d %d %s\n",
local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
local->tm_hour, local->tm_min, local->tm_sec, feel);
fclose(fp);
}
}

int main(void)
{
get_data();
put_data();

return 0;
}

演習13-6

#include <stdio.h>

int main(void)
{
FILE *fp;
char fname[256];
int ch;
int cnt = 0;

printf("ファイル名を指定してください:");
scanf("%s", fname);

if((fp = fopen(fname, "r")) == NULL)
puts("\aファイルをオープン出来ません。");
else {
while((ch = fgetc(fp)) != EOF)
if(ch == '\n') cnt++;
fclose(fp);
printf("指定されたファイルは%d個改行がありました。\n", cnt);
}

return 0;
}

演習13-7

#include <stdio.h>

int main(void)
{
FILE *fp;
char fname[256];
int ch;
int cnt = 0;

printf("ファイル名を指定してください:");
scanf("%s", fname);

if((fp = fopen(fname, "r")) == NULL)
puts("\aファイルをオープン出来ません。");
else {
while((ch = fgetc(fp)) != EOF)
if(ch >= '0' && ch <= '9') cnt++;
fclose(fp);
printf("指定されたファイルは%d個数字文字がありました。\n", cnt);
}

return 0;
}

演習13-8

#include <stdio.h>

int main(void)
{
int ch;
FILE *rfp, *wfp;
char rname[64], wname[64];

printf("コピー元ファイル名:"); scanf("%s", rname);
printf("コピー先ファイル名:"); scanf("%s", wname);

if((rfp = fopen(rname, "r")) == NULL)
puts("\aコピー元ファイルをオープン出来ません。");
else {
if((wfp = fopen(wname, "w")) == NULL)
puts("\aコピー先ファイルをオープン出来ません。");
else {
while((ch = fgetc(rfp)) != EOF) {
putchar(ch);
fputc(ch, wfp);
}
fclose(wfp);
}
fclose(rfp);
}
putchar('\n');

return 0;
}

演習13-9

#include <stdio.h>
#include <ctype.h>

int main(void)
{
int ch;
FILE *rfp, *wfp;
char rname[64], wname[64];

printf("コピー元ファイル名:"); scanf("%s", rname);
printf("コピー先ファイル名:"); scanf("%s", wname);

if((rfp = fopen(rname, "r")) == NULL)
puts("\aコピー元ファイルをオープン出来ません。");
else {
if((wfp = fopen(wname, "w")) == NULL)
puts("\aコピー先ファイルをオープン出来ません。");
else {
while((ch = fgetc(rfp)) != EOF) {
ch = toupper(ch);
fputc(ch, wfp);
}
fclose(wfp);
}
fclose(rfp);
}

return 0;
}

演習13-10

#include <stdio.h>
#include <ctype.h>

int main(void)
{
int ch;
FILE *rfp, *wfp;
char rname[64], wname[64];

printf("コピー元ファイル名:"); scanf("%s", rname);
printf("コピー先ファイル名:"); scanf("%s", wname);

if((rfp = fopen(rname, "r")) == NULL)
puts("\aコピー元ファイルをオープン出来ません。");
else {
if((wfp = fopen(wname, "w")) == NULL)
puts("\aコピー先ファイルをオープン出来ません。");
else {
while((ch = fgetc(rfp)) != EOF) {
ch = tolower(ch);
fputc(ch, wfp);
}
fclose(wfp);
}
fclose(rfp);
}

return 0;
}

演習13-11

#include <stdio.h>

#define N 10

int main(void)
{
double dx[N] = {
3.141592653589793238,
3.142,
3.1,
3.1416,
3.14159,
3.14,
3.141593,
1.41421356,
1.7320508,
1.111111111111110001010
};
FILE *fp;
int i;

if((fp = fopen("float.dat", "wb")) == NULL)
puts("\aファイルをオープン出来ません。");
else {
fwrite(dx, sizeof(double), N, fp);
fclose(fp);
}

if((fp = fopen("float.dat", "rb")) == NULL)
puts("\aファイルをオープン出来ません。");
else {
fread(dx, sizeof(double), N, fp);
puts("配列の内容は:");
for( i = 0; i < N; i++ )
printf("%.21lf\n", dx[i]);
fclose(fp);
}

return 0;
}

演習13-12

#include <stdio.h>
#include <time.h>

char data_file = "datetime.bin";

void get_bdata(void)
{
FILE *fp;
struct tm times;

if*9 == NULL)
puts("\a本プログラムを実行するのは初めてですね。");
else {
fread(&times, sizeof(struct tm), 1, fp);
printf("前回は%4d年%02d月%02d日%02d時%02d分%02d秒でした。\n",
times.tm_year + 1900, times.tm_mon + 1, times.tm_mday,
times.tm_hour, times.tm_min, times.tm_sec);
fclose(fp);
}
}

void put_bdata(void)
{
FILE *fp;
time_t t;
struct tm *local;

time(&t);
local = localtime(&t);

if*10 == NULL)
puts("\aファイルをオープン出来ません。");
else {
fwrite(local, sizeof(struct tm), 1, fp);
fclose(fp);
}
}

int main(void)
{
get_bdata();
put_bdata();

return 0;
}

*1:height - 100) * 0.9);

printf("標準体重は%.1fです。\n", weight);

return 0;
}

第3章:プログラムの流れの分岐

演習3-1

#include <stdio.h>

int main(void)
{
int a,b;

puts("二つの整数を入力して下さい。");
printf("整数A:"); scanf("%d",&a);
printf("整数B:"); scanf("%d",&b);

if(a % b)
{
puts("BはAの約数ではありません。");
}
else
{
puts("BはAの約数です。");
}

return 0;
}

演習3-2

未回答

演習3-3

#include <stdio.h>

int main(void)
{
int num;

printf("整数を入力してください:"); scanf("%d",&num);

if(num < 0)
{
num = -num;
}

printf("その数の絶対値は%dです。\n", num);

return 0;
}

演習3-4

#include <stdio.h>

int main(void)
{
int a,b;

puts("二つの整数を入力してください。");
printf("整数A:"); scanf("%d",&a);
printf("整数B:"); scanf("%d",&b);

if(a == b)
{
puts("AとBは等しいです。");
}
else if(a > b)
{
puts("AはBより大きいです。");
}
else
{
puts("AはBより小さいです。");
}

return 0;
}

演習3-5

#include <stdio.h>

int main(void)
{
int one,two,three,min;

puts("三つの整数を入力してください。");
printf("整数1:"); scanf("%d", &one);
printf("整数2:"); scanf("%d", &two);
printf("整数3:"); scanf("%d", &three);

min = one;
if(two < min)
{
min = two;
}
if(three < min)
{
min = three;
}

printf("最小値は%dです。\n", min);

return 0;
}

演習3-6

#include <stdio.h>

int main(void)
{
int one,two,three,four,max;

puts("三つの整数を入力してください。");
printf("整数1:"); scanf("%d", &one);
printf("整数2:"); scanf("%d", &two);
printf("整数3:"); scanf("%d", &three);
printf("整数4:"); scanf("%d", &four);

max = one;
if(two > max)
{
max = two;
}
if(three > max)
{
max = three;
}
if(four > max)
{
max = four;
}

printf("最大値は%dです。\n", max);

return 0;
}

演習3-7

#include <stdio.h>

int main(void)
{
int n1, n2, max;

puts("二つの整数を入力して下さい。");
printf("整数1:"); scanf("%d", &n1);
printf("整数2:"); scanf("%d", &n2);

if(n1 > n2)
{
max = n1;
}
else
{
max = n2;
}

printf("大きい方の値は%dです。\n", max);

return 0;
}

演習3-8

#include <stdio.h>

int main(void)
{
int one,two,three,min;

puts("三つの整数を入力してください。");
printf("整数1:"); scanf("%d", &one);
printf("整数2:"); scanf("%d", &two);
printf("整数3:"); scanf("%d", &three);

min = one;
min = (two < min) ? two : (three < min) ? three : one;

printf("最小値は%dです。\n", min);

return 0;
}

演習3-9

#include <stdio.h>

int main(void)
{
int a, b, c;

puts("三つの整数を入力して下さい。");
printf("整数A:"); scanf("%d", &a);
printf("整数B:"); scanf("%d", &b);
printf("整数C:"); scanf("%d", &c);

if(a == b == c)
{
puts("三つの値は等しいです。");
}
else if(a == b || b == c || a == c)
{
puts("二つの値が等しいです。");
}
else
{
puts("三つの値は異なります。");
}

return 0;
}

演習3-10

#include <stdio.h>

int main(void)
{
int a, b;

puts("二つの整数を入力してください。");
printf("整数A:"); scanf("%d", &a);
printf("整数B:"); scanf("%d", &b);

if((a - b) > 10 || (a - b) < -10) puts("それらの差は11以上です。");
else puts("それらの差は10以下です。");

return 0;
}

演習3-11

未回答

演習3-12

#include <stdio.h>

int main(void)
{
int month;

printf("何月ですか:"); scanf("%d", &month);

switch(month)
{
case 1: puts("冬です。"); break;
case 2: puts("冬です。"); break;
case 3: puts("春です。"); break;
case 4: puts("春です。"); break;
case 5: puts("春です。"); break;
case 6: puts("夏です。"); break;
case 7: puts("夏です。"); break;
case 8: puts("夏です。"); break;
case 9: puts("秋です。"); break;
case 10:puts("秋です。"); break;
case 11:puts("秋です。"); break;
case 12:puts("冬です。"); break;
default : puts("そんな月有りませんよ!\a"); break;
}

return 0;
}

第4章:プログラムの流れの繰り返し

演習4-1

#include <stdio.h>

int main(void)
{
int num1, num2;

do
{
printf("非負の整数を入力して下さい:");
scanf("%d", &num1);
if(num1 < 0)
puts("\a負の数を入力しないでください。");
} while(num1 < 0);

num2 = num1;

printf("%dを逆から読むと", num2);
do
{
printf("%d", num1 % 10);
num1 = num1 / 10;
} while(num1 > 0);
puts("です。");

return 0;
}

演習4-2

#include <stdio.h>

int main(void)
{
int num1,num2;
int dig;

do {
printf("非負の整数を入力して下さい:");
scanf("%d", &num1);
if (num1 < 0)
puts("\a負の数を入力しないで下さい。");

} while (num1 < 0);

num2 = num1;
dig = 0;
do {
num1 = num1 / 10;
dig = dig + 1;
} while (num1 > 0);
printf("%dは%d桁です。\n", num2, dig);

return (0);
}

演習4-3

#include <stdio.h>

int main (void)
{
int num1,num2;
int sum = 0;
int tmp1,tmp2;

do {
puts("二つの整数を入力して下さい。");
printf("整数1:"); scanf("%d", &num1);
printf("整数2:"); scanf("%d", &num2);
if (num1 == num2)
puts("同じ数値を入力しないで下さい!");
} while (num1 == num2);

//整数1より整数2の方が大きかったらnum1とnum2を入れ替える
if (num1 > num2)
{
tmp1 = num1;
num1 = num2;
num2 = tmp1;
}

tmp2 = num1;

do {
sum = sum + tmp2;
tmp2++;
} while (tmp2 <= num2);

printf(" %d 以上 %d 以下の全整数の和は %d です。\n", num1, num2, sum);

return (0);
}

演習4-4

#include <stdio.h>

int main(void)
{
int num;

do {
printf("非負の整数を入力して下さい:");
scanf("%d", &num);
if (num < 0)
puts("\a負の数を入力しないで下さい。");
} while (num < 0);

printf("その数を逆から読むと");
do {
printf("%d", num % 10);
num /= 10;
} while (num > 0);
puts("です。");

return (0);
}

演習4-5

#include <stdio.h>

int main (void)
{
int num;
int dig;

do {
printf("非負の整数を入力して下さい:");
scanf("%d", &num);
if (num < 0)
puts("\a負の数を入力しないで下さい。");
} while (num < 0);

dig = 0;
do {
num /= 10;
dig++;
} while (num > 0);
printf("その数は%d桁です。\n", dig);

return (0);
}

演習4-6

#include <stdio.h>

int main (void)
{
int no;

printf("整数を入力して下さい:");
scanf("%d", &no);

if (no >= 0)
{
while (no >= 0)
{
printf("%d ", no);
no--;
}
putchar('\n');
}

return (0);
}

演習4-7

#include <stdio.h>

int main (void)
{
int no;

printf("正の整数を入力して下さい:");
scanf("%d", &no);

while (no > 0)
printf("%d ", no--);
putchar('\n');

return (0);
}

演習4-8

#include <stdio.h>

int main (void)
{
int i,no;

printf("正の整数を入力して下さい:");
scanf("%d", &no);

i = 1;
while (i <= no)
printf("%d ", i++);
if (no > 0)
putchar('\n');

return (0);
}

演習4-9

#include <stdio.h>

int main (void)
{
int i,no;

printf("正の整数を入力して下さい:");
scanf("%d", &no);

i = 1;
while (i <= no)
{
if (!(i % 2

*2:height - 100) * 0.9);
printf("%dcm\t%.2fkg\n", height, weight);
}

return 0;
}

演習4-15

#include <stdio.h>

int main(void)
{
int i, j;

for (i = 1; i <= 9; i++)
{
if (i == 1)
{
printf(" |");
for (j = 1; j <= 9; j++)
printf("%3d", j);
putchar('\n');
puts("-------------------------------");
}
printf(" %d |", i);
for (j = 1; j <= 9; j++)
printf("%3d", i * j);
putchar('\n');
}

return (0);
}

演習4-16

#include <stdio.h>

int main(void)
{
int i, j;
int width, height;

puts("長方形を作りましょう");
printf("一辺(その1):"); scanf("%d", &height);
printf("一辺(その2):"); scanf("%d", &width);

for (i = 1; i <= height; i++)
{
for (j = 1; j <= width; j++)
putchar('*');
putchar('\n');
}

return (0);
}

演習4-17-1

#include <stdio.h>

int main(void)
{
int i, j, In;

printf("何段ですか:");
scanf("%d", &In);

for (i = 0; i < In; i++)
{
for (j = 0; j < In - i; j++)
putchar('*');
putchar('\n');
}

return (0);
}

演習4-17-2

#include <stdio.h>

int main(void)
{
int i, j, In;

printf("何段ですか:");
scanf("%d", &In);

for (i = 0; i < In; i++)
{
for (j = 0; j < i; j++)
putchar(' ');
for (j = 0; j < In - i; j++)
putchar('*');
putchar('\n');
}

return (0);
}

演習4-18

#include <stdio.h>

int main(void)
{
int i, j, no;

printf("何段ですか:");
scanf("%d", &no);

for (i = 1; i <= no; i++)
{
for (j = 0; j < no - i; j++)
putchar(' ');
for (j = 0; j < (i * 2) - 1; j++)
putchar('*');
putchar('\n');
}

return (0);
}

第5章:配列

演習5-1

#include <stdio.h>

int main(void)
{
int i;
int vc[5];

for (i = 0; i < 5; i++)
vc[i] = i;

for (i = 0; i < 5; i++)
printf("vc[%d] = %d\n", i, vc[i]);

return(0);
}

演習5-2

#include <stdio.h>

int main(void)
{
int i;
int vc[5];

for (i = 0; i < 5; i++)
vc[i] = 5 - i;

for (i = 0; i < 5; i++)
printf("vc[%d] = %d\n", i, vc[i]);

return(0);
}

演習5-3

#include <stdio.h>

int main(void)
{
int i;
int vc[5] = {5, 4, 3, 2 ,1};

for (i = 0; i < 5; i++)
printf("vc[%d] = %d\n", i, vc[i]);

return (0);
}

演習5-4

#include <stdio.h>

int main(void)
{
int i;
int va[5] = {15, 20, 30};
int vb[5];

for(i = 0; i < 5; i++)
vb[i] = va[5 - i - 1];

puts(" va vb");
puts("------");
for(i = 0; i < 5; i++)
printf("%3d%3d\n", va[i], vb[i]);

return (0);
}

演習5-5

#include <stdio.h>

int main(void)
{
int i;
int vx[8];

for (i = 0; i < 8; i++)
{
printf("vx[%d]", i);
scanf("%d", &vx[i]);
}

for (i = 0; i < 4; i++)
{
int temp = vx[i];
vx[i] = vx[7 - i];
vx[7 - i] = temp;
}

for(i = 0; i < 8; i++)
printf("vx[%d]、%d\n", i, vx[i]);

return (0);
}

演習5-6

未回答

演習5-7

#include <stdio.h>

int main(void)
{
int i, j, k;
int ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
int mb[3][2] = { {1, 5}, {5, 3}, {8, 1} };
int mc[2][2] = { 0 };

for (i = 0; i < 2; i++)
{
for (k = 0; k < 2; k++)
for (j = 0; j < 3; j++)
mc[i][k] += ma[i][j] * mb[j][k];
}

for (i = 0; i < 2; i++)
{
for (j = 0; j < 2; j++)
printf("%3d", mc[i][j]);
putchar('\n');
}

return (0);
}

第6章:関数

演習6-1

#include <stdio.h>

int minof(int x, int y)
{
int min;
min = x;

if ( y < min )
min = y;

return min;
}

int main(void)
{
int na, nb;

puts("二つの整数を入力して下さい。");
printf("整数1:"); scanf("%d", &na);
printf("整数2:"); scanf("%d", &nb);

printf("小さい方の値は%dです。\n", minof( na, nb

*3:x) - (y

*4:y) - (x)))

int main(void)
{
int a, b;

puts("二つの整数を入力してください");
printf("整数1:"); scanf("%d", &a);
printf("整数2:"); scanf("%d", &b);

printf("二つの整数の差は%dです\n", diff(a, b

*5:y % 4000) != 0))) ||
(((y % 100) == 0) && ((y % 400) == 0

*6:y % 100) != 0

*7:fp = fopen(fname, "r"

*8:wfp = fopen(fname, "w"

*9:fp = fopen(data_file, "rb"

*10:fp = fopen(data_file, "wb"