7/23(木)〜8/15(土) の学習ログです(主にプログラミングの成り立ち)

こんにちは。

いつもありがとうございます。

安藤です。

 

プログラミングの学習は分かるまでのハードルの高さ、そして、できるようになるまでのハードルの高さがなかなかなので、コツコツ進めて行くことがとても大切だと実感しています。

 さて、学習ログです。今回は3週間分なので長いです。

 

引き続き、意識は高く、でも行動は地道に、コツコツ謙虚な気持ちで頑張っていきたいと思います。

 

 

2020.7.23(木)

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第4章 デザイン・パターンについて
・パターンと動的言語の関係
・Prototypeパターン
・Template Methodパターン
・Observerパターン

 


◎今日のビジネス関連の読書
・D2C 「世界観」と「テクノロジー」で勝つブランド戦略 著:佐々木康裕
・ハウスワイフ2.0 著:エミリーマッチャー
・僕たちは、地味な起業で食っていく。今の会社にいても、辞めても一生食いっぱぐれない最強の生存戦略 著:田中祐一
・才能を磨く 自分の素質の生き方、殺し方 著:ケン・ロビンソン、ルー・アロニカ

 

 

 

2020.7.24(金) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第4章 デザイン・パターンについて
・OCPについて

◎今日のビジネス関連の読書
・本屋、はじめました 新刊書店Titleの冒険 著:辻山良雄
鬼滅の刃 21巻

 

 

 

2020.7.25(土) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第4章 デザイン・パターンについて
デザイン・パターン⑶
デザインパターンとOCPについて


◎今日のビジネス関連の読書
・NEVER LOST AGAIN グーグルマップ誕生 著:ビル・キルデイ


英語の勉強も兼ねて観ていた「プリズンブレイク」シーズン5まで全部観終わってしまい、あまりの面白さにプリズンブレイクロスになっています。笑

 

 

2020.7.26(日) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第5章 Ajaxについて
AjaxJavaScript(前編)
XMLについて
YAMLについて
JSONについて
・DHTMLについて


Netflix、次の海外ドラマは「SUITS」にしました。

海外の文化と英語のお勉強。

 

2020.7.27(月)
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第5章 Ajaxについて
・DHTML
・ドキュメント・ノードの取得
・タグ・データの取得・変更
・イベント・ハンドラの設定
・タグ・ノードの追加
・サーバーとの通信
Prototype.jsのメリット
・Webアプリケーションと脆弱性
 
◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之 
 

 

 

 

2020.7.28(火) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
MVCの役割について

Railsの具体的な学習に入りました。
知らないことを学ぶことも楽しいですが、少し知っていることをさらに深く掘っていくことも楽しいです。

 

◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之

 

2020.7.29(水) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
MVCRuby on Rails
ストップウォッチからMVCを学ぶ
簡単なストップウォッチ・プログラムを例にMVCについて学びました。


◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之

 

 

2020.7.30(木) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
ビューとコントローラ について
 
 
◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之
・小さなチーム、大きな仕事 働き方の新スタンダード 著:ジェイソン・フリード、デイヴィット・ハイネマイヤ
 

 

2020.7.31(金) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
GUIツール・キットとMVCの比較について
 
 
◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之
・小さなチーム、大きな仕事 働き方の新スタンダード 著:ジェイソン・フリード、デイヴィット・ハイネマイヤ

 

 

 

2020.8.1(土) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」第6章 

Ruby on Rails についてMVCの利点と欠点に

ついて

 


◎今日のビジネス関連の読書

・起業の科学 スタートアップサイエンス 著:田所雅之

・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤ

 

2020.8.2(日) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
オープンクラスとモンキーパッチングについて

MVCについて学んでおります。
1978年に発明された技術など知らないことばかりでした。
引き続き頑張って参ります。


◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.3(月) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
オープンクラスを活用したライブラリについて


◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.4(火) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
モンキーパッチングの問題点について


◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.5(水) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

第6章 Ruby on Rails について

Ruby on Railsオープンクラス

ActiveSupportライブラリについて

 

◎今日のビジネス関連の読書

・起業の科学 スタートアップサイエンス 著:田所雅之

・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.6(木) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
バイト単位系について
複数形と序数について


◎今日のビジネス関連の読書
・起業の科学 スタートアップサイエンス 著:田所雅之
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

2020.8.7(金) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第6章 Ruby on Rails について
大規模開発とRubyについて
信頼というモデルについて
モンキーパッチングの将来について
Ruby on Railsの秘密について


◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.8(土)

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第7章 文字コードについて
< 文字コードの種類 >
初期の文字コードについて

Matzさんの本、新章に入りました。今度は文字列について深めていきたいと思います。
少しずつですがコツコツ頑張っていきたいと思います。

 

◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

 2020.8.9(日)

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第7章 文字コードについて
< 文字コードの種類 >
紙テープと文字表現
1966年放映された初代の「ウルトラマン」、計算機から吐き出される穴のあいた「紙テープ」を見ながら、オペレータが「東京湾に怪獣出現!」などと読み上げているシーン。
実はこの紙テープの1列には8つの穴が開いていて、1列が1バイトを表現している。各列が文字に対応するパターンになっていたのです。オペレータは各文字に対応する穴のパターンを覚えていて読み上げることができたclock 、というわけ。コンソール・スクリーンどころかプリンタさえも一般的でなかった頃には、紙テープは立派な出力デバイスだった。
さらに紙テープは「紙テープ・リーダー」を通じて再度コンピュータに読み込ませることができたから、記憶媒体としても有効だった。当時のプログラムの多くは紙テープを読み込ませることで実行されていた。1度紙テープ化したプログラムにバグがあった時には、紙テープをハサミで切り、再度繋ぎ直すことで修正していた。文字通り「パッチを当てる」わけ。「バグ」という言葉も、計算機のリレー(継電器)に虫が挟まった事件に由来するそう。

 

プログラムの記憶媒体が紙テープだった時代のことを学べて楽しかったです!
バグの言葉の由来もなるほどでした!

 

◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.10(月) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第7章 文字コードについて
< 文字コードの種類 >
「文字とは何か」について
普段使っている「UTF-8」の他にも、
Unicodeに対する符号化方式にも「UTF-8」,「UTF-16BE」,「UTF-16LE」,「UTF-32BE」,「UTF-32LE」などがあることを知りました。


◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.11(火) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第7章 文字コードについて
< 文字コードの種類 >
ヨーロッパやアジアの文字コードについて

 

◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

◎RWC2016 基調講演まつもとゆきひろRubyが可能にしてきたこと」
Matzさんのお話面白かったです!

 

 

 

2020.8.12(水) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第7章 文字コードについて
< 文字コードの種類 >
Unicode、その問題点について


◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.13(木) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第7章 文字コードについて
< 文字コードの種類 >
Unicodeの符号化方式について
UTF-8, UTF-16, UTF-32などについて

 

◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

 

2020.8.14(金) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

第7章 文字コードについて
< プログラムでの文字の扱い >
プログラムの中で文字をどのように取り扱ってきたのか、その歴史や仕組みの理解が日々進んでおります。


◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

 

2020.8.15(土) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第7章 文字コードについて
< プログラムでの文字の扱い >
文字変換について。
なぜ「\」と「¥」は同じ機能を果たしていたのか、
なぜ携帯電話、スマホで以前は絵文字がそのキャリアの絵文字に変換されてしまってしたのかが、分かってきました。
文字コードはなかなかヘビーですがコツコツ進めていきたいと思います。

 


◎今日のビジネス関連の読書
・強いチームはオフィスを捨てる 著:ジェイソン・フリード、デイヴィット・ハイネマイヤー・ハンソン

 

7/12(日)〜7/22(水) の学習ログです(主にプログラミングの成り立ち)

こんばんは!

いつもありがとうございます。

安藤です。

 

学習ログです。

急がば回れ」や「コツコツ」という言葉が好きです。

 

まつもとゆきひろさん著の 「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」を使って勉強しています。すごい良い本です。

昨日、第4章に入りました。全14章なので、先は長いけど毎日少しずつでも頑張っていきたいと思います。

 

 

2020.7.12(日) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
メタプログラミングについて
DSLについて

 

第2章が終わり、明日から第3章に入ります。
楽しみです。

 

◎今日のビジネス関連の読書
言語化力 著:三浦崇宏
・NOを言える人になる 他人のルールに縛られず、自分のルールで生きる方法 著:鈴木裕介

 

 

2020.7.13(月) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

ブロックについて


◎今日のビジネス関連の読書
・世界一ワクワクするリーダーの教科書 著:大嶋啓介
・新規事業の実践論 一生食える普遍的スキルが身につく 著:麻生要一

 

 

 

2020.7.14(火) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

第3章 <ブロックについて>
内部イテレータと外部イテレータについて

 
◎今日のビジネス関連の読書
・ニューロテクノロジー 最新脳科学が未来のビジネスを生み出す 著:茨木拓也
・共感資本社会を生きる 共感が「お金」になる時代の新しい生き方 著:新井和宏、高橋博
・文系AI人材になる 統計・プログラム知識は不要 著:野口竜
・2060年未来創造の白地図 人類史上最高にエキサイティングな冒険が始める 著:川口伸明
・感性思考 デザインスクールで学ぶMBAより論理思考より大切なスキル 著:佐々木康裕
・世界観をつくる「感性×知性」の仕事術 著:山口周、水野学

 

 

2020.7.15(水) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第3章 <ブロックについて>
ブロックによる制御構造について
 
◎今日のビジネス関連の読書
・時間とテクノロジー「因果の物語」から「共時の物語」へ 著:佐々木俊尚
 
 

2020.7.16(木) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

第3章 <ブロックについて>

・ブロックによる繰り返しについて
・ブレースとdo~endについて

Rubyのブロックは元々、繰り返しの抽象化として誕生したもの。
現在では繰り返しを越えて様々な利用をされているブロックだが、その原点が繰り返しの実現であることには変わりない。


◎今日のビジネス関連の読書
・ピック・スリー 完璧なアンバランスのすすめ 著:ランディ・ザッカーバーグ

 
 

2020.7.17(金) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
今日もブロックについて学びました。
ブロックをRubyに取り入れたMATZさんの背景的なことが少しずつ分かってきました。
プログラミングに当てる時間が少なくなっていますが、少しでも手を頭を動かしていきたいと思います。

 
◎今日のビジネス関連の読書
・ピボット・ストラテジー 未来をつくる経営軸の定め方、動かし方 著:オマール・アボッシュ、ポール・ヌーンズ、ラリー・ダウンズ
・P&Gウェイ 世界最大の消費財メーカーP&Gのブランディングの軌跡 著:デーヴィス・ダイアー、フレデリック・ダルゼル、ロウェナ・オレガリ
TikTok最強のSNSは中国から生まれる 著:黄未来

 

 

2020.7.18(土) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

第3章 <ブロックについて>

繰り返しについて


◎今日のビジネス関連の読書
・ベゾス・レター アマゾンに学ぶ14カ条の成長原則 著:スティーブ・アンダーソン、カレン・アンダーソン
・テンセント 知られざる中国デジタル革命トップランナーの全貌 著:呉暁波
・パン屋ではおにぎりを売れ 想像以上の答えが見つかる思考法 著:柿内尚文

 

 

 

2020.7.19(日) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第3章 <ブロックについて>
・内部イテレータ、外部イテレータについて
 
 
◎今日のビジネス関連の読書
・東京改造計画 著:堀江貴文
・テクノロジー思考 技術の価値を理解するための「現代の教養」 著:蛯原健
 
 
 
 
2020.7.20(月) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第3章 ブロックについて
 
コレクション、配列、ハッシュについて
 
 
◎今日のビジネス関連の読書
・D2C 「世界観」と「テクノロジー」で勝つブランド戦略 著:佐々木康裕
 
 
 
2020.7.21(火) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第3章 ブロックについて
コレクション、ハッシュについて。
 
◎今日のビジネス関連の読書
・驚異の「紙1枚!」プレゼン 説明0秒!一発OK! 著:浅田すぐる
・理不尽に逆らえ。 真の自由を手に入れる生き方 著:堀江貴文
・ハウスワイフ2.0 著:エミリーマッチャー
 
 
2020.7.22(水)
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
第3章 ブロックについて
<コレクションを使いこなす>
イテレータ
・ブロック
第4章 デザイン・パターンについて
デザインパターン
 
◎今日のビジネス関連の読書
・D2C 「世界観」と「テクノロジー」で勝つブランド戦略 著:佐々木康裕
・ハウスワイフ2.0 著:エミリーマッチャー
 
 

7/3(金)〜7/11(土) の学習ログです(主にプログラミングの成り立ち)

おはようございます、安藤です。

いつもありがとうございます。

私の学習ログです。

 

 

2020.7.4(土)

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
 

ポリモーフィズム、抽象データ、継承などについて。

プログラミングの歴史を学びました。

1960年代から、ということを踏まえて、先人に感謝で明日も頑張ります。

 

 

 

2020.7.5(日) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
・データの抽象化
・プロトタイプ型と鋳型
・単一継承と多重継承
・静的型言語と動的型言語

◎今日のビジネス関連の読書
・旅の効用 人はなぜ移動するのか 著:ペール・アンデション

引き続き基礎の勉強を頑張ります!

 

 

 

 

2020.7.6(月) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

継承について学びました。
Rubyは多重継承の問題をモジュールを使ったMix-inというテクニックで対応して感動しました。
Pythonは「気をつけて使ってね」というスタンスで清々しかったです。笑

 

◎今日のビジネス関連の読書
・養生訓 すこやかに生きる知恵 著:前田信弘

 

 

 

2020.7.7(火) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」

オブジェクト指向にまつわる誤解について
・多重継承について
・構造化プログラミングとオブジェクト指向プログラミングについて
・クラスとモジュールについて
・静的型言語と動的型言語について

 

◎今日のビジネス関連の読書
・こころの相続 著:五木寛之
・日本文化の核心「ジャパンスタイル」を読み解く 著:松岡正剛

 

 

2020.7.8(水) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
・静的型と動的型の特性、メリット、デメリット

プログラミングの本質について深掘りをする日々ですが、新鮮な学びばかりで楽しいです。
仕様、アルゴリズムとデータの取り扱いの理解が進み、良い感じです。


◎今日のビジネス関連の読書
・フューチャーワーク 新時代で成果を2倍にする思考とスキル 著:高砂哲男

 

2020.7.9(木) 
◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
 
動的型プログラミングについて
 
 
◎今日のビジネス関連の読書
・あえて、数字からおりる働き方 個人がつながる時代の生存戦略 著:尾原和啓
・人間心理を徹底的に考え抜いた「強い会社」に変わる仕組み 著:松岡保昌
 
 
 

2020.7.10(金) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
メタプログラミングについて
・リフレクションについて


◎今日のビジネス関連の読書
・食の歴史 著:ジャック・アタリ
フィンランド人はなぜ午後4時に仕事が終わるのか 著:堀内都喜子
・身銭を切れ「リスクを生きる」人だけが知っている人生の本質 著:ナシーム・ニコラス・タレブ

 

 

2020.7.11(土) 

◎「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
メタプログラミングについて

 

◎今日のビジネス関連の読書
・言葉を減らせば文章は分かりやすくなる 著:山口謠司
・面白いとは何か?面白く生きるには? 著:森博嗣

 

6/26(金)〜7/3(金) の学習ログです(主にC言語)

おはようございます。安藤です。

いつもありがとうございます。

私の学習ログです。

 

 

 

2020.6.26(金) 
C言語(web記事「苦しんで覚えるC言語」)
第3部 アルゴリズム入門編
アルゴリズム入門編
アルゴリズムの概要
アルゴリズムとは
アルゴリズムとは、ある問題を解くための手順、即ち、公式のこと。
言い方を変えると、明確で有限個の手順を有限回繰り返す計算方法のこと。


「冷蔵庫からヨーグルトを取ってきて」というのは不明確な命令。
「18度回転、182cm前進、36度回転、腕を90度上昇…」は明確な命令。

有限個の手順とは、少し不思議な表現だが、手順が無限になることは一般には考えにくいので、あまり気にしなくていい。

有限回繰り返す計算とは、いつか必ず計算が終わる、ということ。
無限に続く円周率の計算も、ある程度まで計算した段階で強制的に終了させてしまう。

これらの条件はコンピュータに計算させて問題を解く場合には必ず必要。
人間が問題を解く場合には、ある程度経験や勘に頼ったりするが、
コンピュータには、そのような機能はないので明確な手順は必須。

アルゴリズムは原則として、プログラミング言語に依存しない。
Cでも、Javaでも同じアルゴリズムを使うことができる。

アルゴリズムの性能
コンピュータは純粋な理論の世界なので、現実世界と異なり物理的な制約がない。
そのため、問題を解く場合でも、様々な方法を考えることができる。

※コンピュータと宗教
実は、コンピュータ業界は宗教的なところがある。
物理的な制約を無視し、様々な考え方ができるから。
そのため同じことをやるにしても人によって方法が全く異なり、場合によっては、どの方法を信じるのか、というレベルの争いになるため、だから。

ここでどこで優れた方法と判断するするか、つまり、性能評価が問題になる。
アルゴリズムの性能を比べる基準としては、次の基準がよく使われる。
・計算速度(早く終わるほど優秀)
・メモリ使用量(少なく済むほど優秀)
・計算の精度(正確に計算できるほど優秀)
・プログラムの作りやすさ(簡単に作れるほど優秀)

この中で最も注目すべきは、何と言っても計算速度。
というのも、そのほかの基準は、アルゴリズムによる差がさほどないが、計算速度だけは天と地ほどの違いがある。

他の基準について。
メモリ使用量もアルゴリズムによって異なる。
高速なアルゴリズムでは、2〜3倍必要だが、速度ほどの差はない。
計算の精度もアルゴリズムによって異なるが、速度ほどの差はない。
重要なのが、プログラムの作りやすさ、これは、高度なアルゴリズムほど時間がかかりバグが起こりやすいので、無視できる程度の速度差なら簡単な方が良い。

・O(おー)記法
アルゴリズムの比較は、計算回数を元にして行う。
アルゴリズムの計算で時間がかかるのは、繰り返し処理の部分。
繰り返しを行なっていない部分の時間は非常に短いため、無視できる。
計算元のデータの増加に対して繰り返し回数がどれだけ増加するのかが重要。

このような理由から
アルゴリズムの計算速度には、O記法が使われる。

O記法…データ件数に対して繰り返し回数の増加を漸近的に求めた値。

O記法では、n個のデータに対して繰り返し回数がnに比例するなら、O(n)と表す。
ただし、n個のデータに対して繰り返し回数が2nとなる場合でもO(n)と表す。
2乗などに比べ整数倍の影響はたかがしれているため、整数倍は無視する。

※2乗の記号
コンピュータ文字では、2乗を表しにくいので、^2という記号を使う。

O記法を使用すると、コンピュータで実行せずともアルゴリズムの性能がわかる。
しかも、データ件数が増えるとどれだけ計算が遅くするのかが分かるため、アルゴリズムの性能判断に有効。

 


◎今日のビジネス関連の読書
・グーグルが消える日 著:ジョージ・ギルダー
・宇宙と宇宙をつなぐ数学 著:加藤文元
・営業はいらない 著:三戸政和
・ディズニーCEOが実践する10の原則 著:ロバート・アイガー
・次のテクノロジーで世界はどう変わるのか 著:山本康正
・Think Smart 著:ロルフ・マインド

 

 

 

 

2020.6.27(土) 
C言語(web記事「苦しんで覚えるC言語」)


第3部 アルゴリズム入門編
アルゴリズム入門編
アルゴリズムの概要

・データ構造
データ構造とは、一見アルゴリズムと関係がなさそうだが、データ構造とアルゴリズムの関係は重要。

データ構造…情報の表現方法のこと。

データ構造とは、情報を記憶するときにどのような形を取るかを意味する。
配列は、同じ型の変数を複数並べることで、複数の情報を表現している。
構造体は、異なる型の変数をまとめて、関連性のある情報を表現している。
これらは単純なデータ構造だが、いずれも普通の変数では表現は難しい情報。

 

●整列(ソート)
バブルソート

・整列とは
整列とは、デタラメに並べられたデータを順番通りに並び変えること。
ソートアルゴリズムでは、高速性のほか、安定性が必要なことがある。
安定とは、ソート後に同じ値のデータの並び順が変化しないこと。

ソートの目的は、検索のため。
データが揃えられていると目的の値がどこにあるか見当がつき、データがデタラメに並んでいる場合よりも早く検索できる。

 

バブルソート
考え方は、1つ目と2つ目のデータを比べ、2つ目が小さい場合はデータを交換する。
次は、2つ目と3つ目を比較する。これをデータの最後まで繰り返す。
データの最後まできたら、また1つ目から比較と交換を繰り返す。
これをデータの個数回繰り返せば、データが整列される。
速度は遅いので、あまり優秀とは言えない。

 


◎今日のビジネス関連の読書
・昨日も22時に寝たので僕の人生は無敵です 著:井上皓史
・どこでも誰とでも働ける 著:尾原和啓
・トップも知らない星野リゾート 著:前田はるみ

 

 

 

2020.6.28(日) 
C言語(web記事「苦しんで覚えるC言語」)
第3部 アルゴリズム入門編

●暗号化
*シーザー、排他的論理和

・暗号化とは
暗号化とは、元のデータを変形させて、意味が分からないようにする技術。
元に戻せることが前提。
元のデータに戻すことを復号化と呼び、元のデータ自体を平文と呼ぶ。
暗号化の意図は第三者にデータ盗まれないため。
暗号強度が何よりも重視される。

・シーザー暗号
世界で初めて暗号を使用したのは、シーザー・カサエルと言われている。
その方法は、文字を数文字ずつずらすだけ。

排他的論理和暗号
2進数の計算で同じ数が入力された時に出力が0となる。
排他的論理和では、一見するとデタラメな数値になるため、暗号化に適している。
C言語排他的論理和を計算するには、^記号を使う。

・長いパスワード
複数の数値を繰り返して使う。

擬似乱数の応用
排他的論理和の結果は一見デタラメだが、同じ計算は簡単に行われてしまう。
これを防ぐには、擬似乱数を使って計算内容が分からないようにする。


※乱数のアルゴリズム
コンパイラが異なれば標準ライブラリの乱数アルゴリズムも異なる。
そのため、異なるコンパイラでは、計算結果が異なることになる。
これを防ぐには、乱数のアルゴリズムも自分で作る必要がある。

C言語コラム編
*K&R
K&Rとは、世界初のまともなC言語の解説書であり、C言語の開発者自身が執筆していたこともあり、世界中で大ヒットした。
コンピュータ業界最大のベストセラーとも言われている。
細かい部分まで説明してあり、当時はこの本を元にして、コンパイラが作られたほど。

・SWAPマクロ
SWAPとは、2つの変数の値を交換するマクロや関数。

C言語簡易リファレンス
*単語と記号

予約語
auto  break  case  char  const  continue  default  do  double  else  enum  extern  float  for  goto  if   int  long  register  return  short  signed  sizeof  static  struct  switch  typedef  union  unsigned  void  volatile  while

コンパイラによっては、これ以外にも予約語を定義していることもある。

・出力変換指定子
変換指定子の書式
% オプション 長さ.精度 型

これらをつなげて指定する。型以外は省略することができる。

<オプション一覧>
-  左詰めで表示
+  右詰めで表示
# 0、あるいは小数点の抑制を行わない。

<長さと精度の書式>
長さの数値をL、精度の数値をPとする。
L  最低でもL桁で出力する。余白はスペースで埋める。
0L  最低でもL桁で出力する。余白は0で埋める。
L .P  全体を最低でもL桁、小数点以下をP桁で出力。
L .0  全体を最低でもL桁、小数点以下は出力しない。

<型一覧>
d,i  整数の10進数。
o   整数の8進数符号なし。
x,X  整数の16進数符号なし。xは小文字、Xは大文字。
u  整数10進数符号なし。
f  実数。
e,E  実数の指数形式。eは小文字、Eは大文字。
g,G  通常形式か指数形式。
c  char型の文字。
s  空白を含まないchar型の文字列。
p   ポインタの値。
n   これまでに読み込まれた文字数を代入。データを読み込まない。
%  何もしない。無意味な指定。

入力変換指定子は、代入を行うので型の指定が厳しくなる。
上の一覧には、double型はないが、これはサイズ指定子の l  と組み合わせて指定する。

演算子と優先順位
Cの演算子の優先順位はとてもうまく考えられているので、一般的な使用では明示的に()をつける必要はなく、数式の通りに書くことでうまくいくことがほとんど。
ただ、優先順位が不安な時は、この表を見て比べるよりも、()をつけるのが簡単で現実的。

C言語演算子と優先順位>
上にあるものほど優先順位が高くなっている。
区切られた各部分の記号は同じ優先順位となる。
呼び方には特に決まりはないが、一般的だと思われる呼び名を使用した。

名前  記号  機能  結合規則  項数

・配列添字  [ ]   配列の要素番号の指定  左から右  単項
・関数呼び出し  ()  関数を呼び出す  左から右  単項
・要素選択  .   構造体の要素を選択  左から右  単項

・アロー  ->   構造体ポインタの要素を選択  左から右  単項
・後置インクリメント  ++  変数の値を1増やす  なし  単項
・後置デクリメント  ーー  変数の値を1減らす  なし  単項
・前置インクリメント  ++  変数の値を1増やす  なし  単項
・前置デクリメント  ーー  変数の値を1減らす  なし  単項
・参照  ・  ポインタのさす変数にアクセス  なし  単項
・アドレス  &  変数のアドレスにアクセス  なし  単項
・単項プラス  +  正の値にする  なし  単項
・単項マイナス  ー  負の値にする  なし  単項
・論理否定  !  真と偽の状態を反転  なし  単項
・サイズオブ  sizeof  変数や配列や型のサイズを取得  なし  単項
・キャスト  (型)  指定の型に強制変換  右から左  単項

・乗算  *   掛け算  左から右  2項
・除算  /   割り算  左から右  2項
・剰余  %  余り  左から右  2項

・加算  +  足し算  左から右  2項
・減算  ー  引き算  左から右  2項

・左シフト  <<  変数の値を1ビット左にずらす(2倍)  左から右  単項
・右シフト  >>  変数にお値を1ビット右にずらす(半分)  左から右  単項

・小なり  <  左側の値が右より小さい時に真  左から右  2項
・大なり  >  左側の値が右より大きい時に真  左から右  2項
・以下  <=  左側の値が右以下の時に真  左から右  2項
・以上  >=  左側の値が右以上の時に真  左から右  2項

・等価  ==  左と右の値が等しいとき真  左から右  2項
・不等価  !=  左と右の値が異なるとき真  左から右  2項

・ビットAND   &  ANDを取る  左から右  2項

・ビット排他的論理和  ^   排他的論理和を取る  左から右  2項

・ビットOR   |   ORを取る  左から右  2項

・論理AND   &&  左と右の両方が真の時に真  左から右  2項

・論理OR   ||   左と右のどちらかが真の時に真  左から右  2項

・条件  ?と:  真の時は前式を、偽の時は後式を代入  右から左  3項

・代入  =  左の変数に右の式の値を代入  右から左  2項
・代入乗算  *=   左の変数に右の式との値の掛け算を代入  右から左  2項
・代入除算  /=  左の変数に右の式との値の掛け算を代入  右から左  2項
・代入剰余  %=  左の変数に右の式との値の余りを代入  右から左  2項
・代入加算  +=  左の変数に右の式との値を足し算を代入  右から左  2項
・代入除算  -=   左の変数に右の式との値を引き算を代入  右から左  2項
・左シフト代入  <<=   左の変数に右の式との値の左シフトを代入  右から左  2項
・右シフト代入     >>=   左の変数に右の式との値の右シフトを代入  右から左  2項
・ビットAND代入  &=  左の変数に右の式との値のANDを代入  右から左  2項
・ビット排他的論理和代入  ^=   左の変数に右の式との値の排他的論理和を代入  右から左  2項
・ビットOR代入  =  左の変数に右の式との値のORを代入  右から左  2項

・順次  ,   式を結合  左から右  2項


参照演算子とは、ポインタ変数を通常変数モードに切り替える演算子
ポインタ変数を宣言する時につける*とは文法上は関連性はない。

配列添字演算子とは、配列につけられる[ ] のことを意味しており、その機能はアドレスへ変数のバイトサイズ分の足し算を行うこと。
配列を宣言する時につける[ ]とは文法上は関連性はない。

条件演算子とは、条件式を簡単に作るものである。
変数=(条件式)?式1:式2;

条件式が真の時は式1が実行され、偽の時は式2が実行される。
その結果が変数に代入されるが、変数を指定しなくても使える。
if文より条件判断に簡便に書けるので、これを好んで使う人もいる。
この演算子は、C言語で唯一3項を使うので、3項演算子ともいう。

順次演算子とは、2つの式を1つにまとめてしまおうというもの。
j=(I=3,i+2);

この例では、先にi=3が計算され、次にi+2が計算される。
最終的には、jに5が代入される。


・記憶クラス指定子
C言語には、以下の記憶クラス指定子が用意されている。しかし、すでに使われなくなったものも多い。
<記憶クラス指定子>
・auto
・register
・static
・extern
・typedef

<auto指定子>
変数が自動変数であることを意味する。
しかし、関数の内部では自動的に自動変数になるし、関数外ではエラーになるので無意味な指定子。

<register指定子>
その変数が頻繁に使用されることを意味する。
昔はこの変数をレジスタに割り当てることで、処理の高速化を行っていたが、現在ではコンパイラの最適化機能が優先される。

<static指定子>
その変数がプログラム終了まで残り続けることを意味する。
関数内では、変数の値が関数の中で保持されるようになる。
関数外では、変数がそのソースファイルの中だけ有効になる。

<extern指定子>
変数などの定義が他のソースファイルで行われていることを意味する。
ヘッダーファイル内で共通変数を宣言するのに使われる。

<typedef指定子>
新しい型を宣言する。
型宣言を簡単にできる上、コンパイラによるチェックも行える。


エスケープ文字
画面には表示できないけど、文字列の表示などを操作する目的で使われるもの。
改行を行う\nが有名だが、他にも次のようなものがある。

エスケープ文字>
エスケープ文字  16進数  機能

・\a  0x07   ビープ音を鳴らす
・\b    0x08   カーソル位置を1つ後ろにずらす
・\t    0x09   カーソル位置を次のタブ位置に移動する
・\n   0x0A   カーソル位置を次の行に移動(改行)
・\f    0x0C      紙を排出する(プリンタの場合のみ)
・\r    0x0D   カーソル位置を行の1番左に移動(Macでは改行)
・\\    0x5C   \を表示する
・\’    0x2C   ’を表示する
・\”    0x22       “を表示する
・\?    0x3F   ?を表示する
・\数字 8進数で同じ  対応する8進数の文字コードを表示
・\x数字  数字と同じ  対応する16進数の文字コードを表示

この中でよく使われているのは、\nと\t。
\fは、プリンタへの出力の時にのみ使えるが一般的ではない。
\rは、Macでは改行なので、現在では他のOSでも改行となる。

エスケープ文字は、その表記に2文字以上使うが、実際はあくまでも1文字。


・定義済み定数
C言語では、処理系の情報や、デバッグに使える情報などを、定義済みの定数として用意している。

デバッグ用定数>
__LINE__  実行されている行番号
__FILE__  実行されているソースファイル名
__DATE__  コンパイルされた日付
__TIME__  コンパイルされた時刻

__FILE__と__LINE__を使うことで、プログラムの実行時にエラーの発生した行番号を突き止めることができる。
ログファイルに吐いたり、簡易デバッガに使うと便利。


<整数型サイズの定義済み定数>
これらの定数の使用には、#define <limits.h>が必要。

CHAR_BIT      char型のビット単位のサイズ。
CHAR_MAX    char型の最大値。
CHAR_MIN       char型の最小値。
INT_MAX       int型の最大値。
INT_MIN        int型の最小値。
LONG_MAX     long型の最大値。
LONG_MIN      long型の最小値。
SCHAR_MAX      signed char型の最大値。
SCHAR_MIN       singed char型の最小値。
SHART_MAX     short型の最大値。
SHART_MIN      short型の最小値。
UCHAR_MAX     unsigned char型の最大値。
UCHAR_MIN      unsigned char型の最小値。
ULONG_MAX     unsigned long型の最大値。
USHRT_MAX     unsigned short型の最大値。

char型を符号づけにするかはコンパイラ依存。
どちらも文字の記憶には支障はない。

 


◎今日のビジネス関連の読書
・モチベーション革命 著:尾原和啓
ライフハック 人生と仕事を変える小さな習慣250 著:掘正岳
老子 著:老子
・一億三千万人のための「論語」教室 著;高橋源一郎
・スタートアップで働くということ 起業家ではなく参加者(ジョイナー)として会社を立ち上げる 著:ジェフリー・バスギャング
・未来型国家エストニアの挑戦電子政府がひらく世界 著:ラウル・アリキヴィ、前田陽二

 

 

 

2020.6.29(月) 
C言語(web記事「苦しんで覚えるC言語」)
第3部 アルゴリズム入門編

C言語簡易リファレンス
*標準ライブラリ関数一覧

・入出力 <stdio.h>
主にファイルを取り扱う関数。
C言語では、ディスク以外の周辺機器もファイル扱いできる。
また、規定のファイルポインタとしてこれらを扱うことができる。
<規定のファイルポインタ>
stdin  標準入力(普通はキーボード)
stdout    標準出力(普通はディスプレイ)
stderr    標準エラー出力(普通はディスプレイ)

これらはリダイレクトなどの方法でユーザーが変更することもできる、環境によっては、別の機器に関連づけられたり、無効になっていることもある。

<fopen>
関数型:FILE *fopen(const char *filename, const char *mode);
引数:ファイル名、モード文字列
戻り値:開いたファイルポインタ。失敗した場合はNULL。
機能:ファイルを開く。
モード:r読み込み、w新規、a追加。b付加でバイナリ、+付加で入出力両用。

<fclose>
関数型:int close(FILE *fp);
引数:ファイルポインタ
戻り値:成功した場合は0、失敗した時はEOF
機能:ファイルを閉じる。

<fgetc>
関数型:int fletcher(FILE *fp);
引数:ファイルポインタ
戻り値:読み出した文字。失敗したか終わりに到達した場合はEOF。
機能:ファイルから1文字読み出す。

<getc>
機能:fgetcと同じ。
注意:マクロになっていることがあるので副作用に注意。

<fgets>
関数型:char *fgets(char *s, int n, FILE *fp);
引数:文字列を格納するバッファ、バッファサイズ、ファイルポインタ
戻り値:引数で指定したバッファ。失敗したか終わりに到達した場合はNULL。
機能:ファイルから1行読み出す。結果に改行を含む。

<fputc>
関数型:int fputc(int c, FILE *fp);
引数:文字、ファイルポインタ
戻り値:出力文字。失敗した時はEOF。
機能:ファイルに1文字書き込む。

<putc>
機能:fputcと同じ。
注意:マクロになっていることがあるので副作用に注意。

<fputs>
関数型:int puts(const char *s, FILE *fp);
引数:文字列、ファイルポインタ
戻り値:成功した場合は真、失敗した時はEOF。
機能:ファイルに文字を書き込む。

<fread>
関数型:size_t bread(void *ptr, size_t size, size_t Belem, FILE *fp);
引数:読み込み結果を格納するバッファ、1項目のサイズ、項目数、ファイルポインタ
戻り値:読み込んだ項目数。失敗した場合は0。
機能:ファイルから固定サイズの項目を読み込む。

<fwrite>
関数型:size_t write(const void *ptr, size_t size, size_t nelem, FILE *fp);
引数:書き込むバッファ、1項目のサイズ、項目数、ファイルポインタ
戻り値:書き込んだ項目数。失敗した場合は0。
機能:ファイルに固定サイズの項目を書き込む。

<fprintf>
関数型:int fprintf(FILE *fp, const char *fomat, …);
引数:ファイルポインタ、書式付き文字列、可変個の変数
戻り値:出力文字数。失敗した時は負の値。
機能:ファイルに書式付き文字列を書き込む。

<fscanf>
関数型: int fscanf(FILE *fp, const char *format, …);
引数:ファイルポインタ、変換指定文字列、可変個のバッファ
戻り値:変換に成功した後。失敗した場合は-1。
機能:ファイルから文字列を読み込みされた形式に変換する。

<ftell>
関数型:long tell(FILE *fp);
引数:ファイルポインタ
戻り値:現在のファイル位置
機能:ファイル位置を取得する。

<fseek>
関数型:int seek(FILE *fp, long offset, int ptrname);
引数:ファイルポインタ、ファイル位置の移動数、ファイル位置の基準
戻り値:成功した場合は0、失敗した時は0以外。
機能:ファイル位置を変更する。
位置:SEEK_SET 先頭、SEEK_CUR現在の位置、SEEK_END終わり

<fgetpos>
関数型:int fgetpos(FILE *fp, epos_t *ptr);
引数:ファイルポインタ、ファイル位置を格納する変数のポインタ
戻り値:成功した場合は0、失敗した時は0以外。
機能:現在のファイル位置を格納する。

<fsetpos>
関数型:int fsetpos(FILE *fp, const epos_t *ptr);
引数:ファイルポインタ、ファイル位置を格納する変数のポインタ
戻り値:成功した場合は0、失敗した場合は0以外。
機能:ファイル位置を変更する。

<feof>
関数型:int foes(FILE *fp);
引数:ファイルポインタ
戻り値:終わりに到達した場合は真、到達していない場合は偽。
機能:ファイルが終わりに到達したか調べる。

<ferror>
関数型:int error(FILE *fp);
引数:ファイルポインタ
戻り値:エラー発生した場合は真、発生していない場合は偽。
機能:ファイルにエラーが発生したか調べる。

<clearerr>
関数型:void clearers(FILE *fp);
引数:ファイルポインタ
機能:ファイルのエラーの時に回復する。

<fflush>
関数型:int flush(FILE *fp);
引数:ファイルポインタ
戻り値:成功した場合は0、失敗した場合は偽。
機能:出力バッファを強制出力する。
注意:コンパイラによっては入力バッファをクリアできる。ただし邪道。

<freopen>
関数型:FILE *freopen(const char *filename, const char *mode, FILE *fp);
引数:ファイル名、モード文字列、ファイルポインタ
戻り値:引数で指定されたファイルポインタ。失敗した場合はNULL。
機能:ファイルポインタの再割り当て。

<rename>
関数型:int rename(const char *oldname, const char *newname);
引数:現在のファイル名、新しいファイル名
戻り値:成功した場合は0、失敗した場合は0以外。
機能:ファイルの名前を変更する。

<remove>
関数型:int remove(const char *filename);
引数:ファイル名
戻り値:成功した場合は0、失敗した場合は0以外。
機能:ファイルを削除する。

<getchar>
関数型:int getchars(void);
戻り値:読み出した文字。失敗した場合はEOF。
機能:標準入力(キーボード)から1文字読み込む。

<putchar>
関数型:int put char(char c);
引数:文字
戻り値:出力文字。失敗した場合はEOF。
機能:標準出力(ディスプレイ)に1文字書き込む。

<gets>
関数型:char *gets(char *s);
引数:読み込んだ文字列を格納するバッファ
戻り値:引数で指定したバッファ。失敗したか終わりに到達した場合はNULL。
機能:標準入力(キーボード)から1行読み出す。結果に改行は含まれない。
注意:バッファオーバーラン(ウィルス侵入)の原因になるので使ってはいけない。

<puts>
関数型:int puts(const char *s);
引数:文字列
戻り値:成功した場合は0、失敗した場合は0以外。
機能:標準出力(ディスプレイ)に1行書き込む。改行される。

<perror>
関数型:void terror(const char *s);
引数:表示する文字列。
機能:指定した文字列と一緒に直前に発生したエラーを表示する。

<printf>
関数型:int printf(const char *format,  …);
引数:書式付き文字列、可変個の変数。
戻り値:出力文字数。失敗した場合は−1。
機能:標準出力(ディスプレイ)に書式付き文字列を書き込む。

<scanf>
関数型:int scarf(const char *format, …);
引数:変換指定文字列、可変個のバッファ
戻り値:変換に成功した数。失敗した場合は−1。
機能:標準入力(キーボード)から文字列を読み込み指定された形式に変換する。
注意:他の入力関数と一緒に使うと思わぬ動作をすることがある。

  


◎今日のビジネス関連の読書
・筋の良い仮説を生む問題解決の「地図」と「武器」 著:高松康平
・フルライフ 著:石川善樹
・人は、なぜ他人を許せないのか? 著:中野信子
・リーダーとして覚えておいてほしいこと 著:野村克也

 

 

 

2020.6.30(火) 
C言語(web記事「苦しんで覚えるC言語」)
第3部 アルゴリズム入門編

C言語簡易リファレンス
*標準ライブラリ関数一覧

・汎用 <stdlib.h>
特に分類されない汎用的な関数の集まり。
メモリ関連、プロセス関連、変換など。

<malloc>
関数型:void *malloc(size_t n);
引数:確保するメモリサイズ
戻り値:確保したメモリのアドレス。確保できなかった場合はNULL。
機能:メモリを動的に確保する。

<calloc>
関数型:void *calloc(size_t int nelem, size_t elsize);
引数:要素数、1要素のサイズ
戻り値:確保したメモリのアドレス。確保できなかった場合はNULL。
機能:メモリを動的に確保する。確保したメモリはゼロクリアされる。
注意:ゼロクリアされるからバグが減ると勘違いしないこと。

<realloc>
関数型:void *realloc(void *ptr, size_t size);
引数:確保したメモリのアドレス、新しいメモリサイズ。
戻り値:確保したメモリのアドレス。確保できなかった場合はNULL。
機能:確保したメモリサイズに変更する。中身は維持される。
補足:メモリアドレスが変更される可能性があることに注意。

<free>
関数型:void free(void *p);
引数:確保したメモリのアドレス
機能:動的に確保したメモリを解放。

<abs>
関数型:int abs(int n);
引数:数値
戻り値:数値の絶対値
機能:絶対値を求める。

<labs>
関数型:long labs(long n);
引数:数値
戻り値:数値の絶対値
機能:絶対値を求める。

<atof>
関数型:double atop(const char *s);
引数:数字を含む文字列
戻り値:変換後の値。変換できない場合は0。
機能:数字を含む文字列を実数値に変換。

<atoi>
関数型:int atom(const char *s);
引数:数字を含む文字列
戻り値:変換後の値。変換できない場合は0。
機能:数字を含む文字列を整数値に変換。

<atol>
関数型:long atop(const char *s);
引数:数字を含む文字列
戻り値:変換後の値。変換できない場合は0。
機能:数字を含む文字列を整数値に変換。

<strtod>
関数型:double started(const char *s, char **endptr);
引数:数字を含む文字列、終了位置のアドレス
戻り値:変換後の値。変換できない場合は0。
機能:数字を含む文字列を実数値に変換。

<strtol>
関数型:long stratal(const char *s, char **endptr, int base);
引数:数字を含む文字列、終了位置のアドレス、数値の基数(2進数や16進数)
戻り値:変換後の値。変換できない場合は0。
機能:数字を含む文字列を整数値に変換。

<strtoul>
関数型:unsigned long strtoul(const char *s, char **endptr, int base);
引数:数字を含む文字列、終了位置のアドレス、数値の基数(2進数、16進数)
戻り値:変換後の値。変換できない場合は0。
機能:数字を含む文字列を符号なし整数値に変換。

<div>
関数型:div_t div(int num, int denom);
引数:割られる数、割る数。
戻り値:割り算の結果。
機能:商と余りを同時に計算。
構造体:div_t構造体 int quit 商、 int rem 余り。
補足:この関数より、演算子 / や%を使うことを勧める。

<ldiv>
関数型:ldiv_t ldiv(long num, long denom);
引数:割られる数、割る数。
戻り値:割り算の結果。
機能:商と余りを同時に計算。
構造体:ldiv_t構造体 long quit 商、  long rem 余り。
補足:この関数より、演算子 / や%を使うことをお勧め。

<rand>
関数型:int rand(void);
戻り値:ランダムな値。範囲は処理系による。
機能:乱数を得る。
使用方法:#define RAMDOM(MIN,MAX) *1;   が定番。

<exit>
関数型:void exit(int n);
引数:終了コード。一般にEXIT_SUCCESSは正常終了、EXIT_FAILUREは異常終了。
機能:プログラムを終了させる。

<abort>
関数型:void abort(void);
機能;プログラムを異常終了させる。
補足:エラーが発生した時の終了に使用する。

<atexit>
関数型:int ataxia(void (*func)(void));
引数:関数のアドレス
戻り値:成功した場合は0、失敗した場合は0以外。
機能:プログラム終了時に実行する関数を登録する。

<getenv>
関数型:char *getenv(const char *name);
引数:名前
戻り値:値を格納した文字列の先頭アドレス。見つからない場合はNULL。
機能:環境変数を取得する。

<bsearch>
関数型:void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *x, const void *y));
引数:探す値、配列の先頭、探索数、1要素のサイズ、比較関数のアドレス
戻り値:見つかった要素のアドレス。見つからない場合はNULL。
機能:2分探索を行う。データは昇降に整列されていなくてはならない。
比較:比較関数は、x > yの場合は正、x = yの場合は0、x < y の場合は負を返すこと。

<qsort>
関数型:void sort(void *base, size_t nel, size_t width, int(*compar)(const void *x, const void *y));
引数:配列の先頭、整列個数、1要素のサイズ、比較関数のアドレス
機能:配列を昇降に整列する。クイックソートを使っていることが多い。
比較:比較関数は、x > y の場合は正、 x = yの場合は0、 x < y の場合は負を返すこと。

<system>
関数型:int system(const char *string);
引数:コマンド文字列
戻り値:処理系のコマンド依存。コマンドを実行できなかった場合は−1。
機能:処理系が用意しているコマンドを実行する。
補足:コマンドは処理系が異なると互換性がない。
 :NULLを指定すると、コマンドが利用できない環境では0を返す。


・文字処理 <ctype.h>
半角文字1文字を取り扱う関数群。
マクロとして実現されていることがほとんど。

<isalpha>
関数型:int is alpha(int c);
引数:文字
戻り値:文字がアルファベットなら0以外、異なる場合は0。
機能:文字がアルファベットか判定する。

<isupper>
関数型:int sipper(int c);
引数:文字
戻り値:文字が英大文字なら0以外、異なる場合は0。
機能:文字が英大文字か判定する。

<islower>
関数型:int slower(int c);
引数:文字
戻り値:文字が英小文字なら0以外、異なる場合は0。
機能:文字が英小文字か判定する。

<isdigit>
関数型:int isdigit(int c);
引数:文字
戻り値:文字が数字なら0以外、異なる場合は0。
機能:文字が数字か判定する。

<issapce>
関数型:int is space(int c);
引数:文字
戻り値:文字が空白文字なら0以外、異なる場合は0。
機能:文字が空白文字か判定する。

<isalnum>
関数型:int isalnum(int c);
引数:文字
戻り値:文字がアルファベットまたは数字なら0以外、異なる場合は0。
機能:文字がアルファベットまたは数字か判定する。

<iscntrl>
関数型:int iscntrl(int c);
引数:文字
戻り値:文字がコントロール文字なら0以外、異なる場合は0。
機能:文字がコントロール文字か判定する。

<isgraph>
関数型:int is graph(int c);
引数:文字
戻り値:文字がスペース以外の印刷できる文字なら0以外、異なる場合は0。
機能:文字がスペース以外の印刷できる文字か判定する。

<isprint>
関数型:int misprint(int c);
引数:文字
戻り値:文字が印刷できる文字なら0以外、異なる場合は0。
機能:文字が印刷できる文字か判定する。

<ispunct>
関数型:int isounct(int c);
引数:文字
戻り値:文字が区切りなら0以外、異なる場合は0。
機能:文字が区切り文字か判定する。

<isxdigit>
関数型:int isxdigit(int c);
引数:文字
戻り値:文字が16進数用の文字なら0以外、異なる場合は0。
機能:文字が16進数用の文字か判定する。

 

 

◎今日のビジネス関連の読書
・2020年6月30日にまたここで会おう 著:瀧本哲史
統計では、100社のうち3社くらい、ベンチャーで成功するのは。だからたくさんこなすこと。
失敗は織り込んで仮説を試すこと。
QRコードの奇跡 著:小川進
もともと、トヨタの発注先のデンソーが開発した技術。
Quick Responseの略称だったのか。
・未来を創るプレゼン 著:伊藤羊一、澤円
プレゼンはプレゼント。
・不可能を可能にせよ!NET FLIX成功の流儀 著:マーク・ランドルフ
ドラえもんを本気でつくる 著:大澤正彦
・勝利の神髄1928-2016  著:長田渚左

 

 

 

2020.7.1(水) 
C言語(web記事「苦しんで覚えるC言語」)
第3部 アルゴリズム入門編
 
C言語簡易リファレンス
*標準ライブラリ関数一覧
 
・文字処理 <ctype.h>
半角文字1文字を取り扱う関数群。
マクロとして実現されていることがほとんど。
 
<isalpha>
関数型:int is alpha(int c);
引数:文字
戻り値:文字がアルファベットなら0以外、異なる場合は0。
機能:文字がアルファベットか判定する。
 
<isupper>
関数型:int sipper(int c);
引数:文字
戻り値:文字が英大文字なら0以外、異なる場合は0。
機能:文字が英大文字か判定する。
 
<islower>
関数型:int slower(int c);
引数:文字
戻り値:文字が英小文字なら0以外、異なる場合は0。
機能:文字が英小文字か判定する。
 
<isdigit>
関数型:int isdigit(int c);
引数:文字
戻り値:文字が数字なら0以外、異なる場合は0。
機能:文字が数字か判定する。
 
<issapce>
関数型:int is space(int c);
引数:文字
戻り値:文字が空白文字なら0以外、異なる場合は0。
機能:文字が空白文字か判定する。
 
<isalnum>
関数型:int isalnum(int c);
引数:文字
戻り値:文字がアルファベットまたは数字なら0以外、異なる場合は0。
機能:文字がアルファベットまたは数字か判定する。
 
<iscntrl>
関数型:int iscntrl(int c);
引数:文字
戻り値:文字がコントロール文字なら0以外、異なる場合は0。
機能:文字がコントロール文字か判定する。
 
<isgraph>
関数型:int is graph(int c);
引数:文字
戻り値:文字がスペース以外の印刷できる文字なら0以外、異なる場合は0。
機能:文字がスペース以外の印刷できる文字か判定する。
 
<isprint>
関数型:int misprint(int c);
引数:文字
戻り値:文字が印刷できる文字なら0以外、異なる場合は0。
機能:文字が印刷できる文字か判定する。
 
<ispunct>
関数型:int isounct(int c);
引数:文字
戻り値:文字が区切りなら0以外、異なる場合は0。
機能:文字が区切り文字か判定する。
 
<isxdigit>
関数型:int isxdigit(int c);
引数:文字
戻り値:文字が16進数用の文字なら0以外、異なる場合は0。
機能:文字が16進数用の文字か判定する。
 
 
・文字列処理 <string.h>
主に文字列処置を行う関数群。
汎用のメモリ処理と共用できる関数も多い。
半角文字を基準とするので、全角文字の処理には注意。
 
<strcpy>
関数型:char *strcpy(char *s, const char *t);
引数:文字配列、文字列
戻り値:引数の文字配列をそのまま返す
機能:文字配列に文字列をコピーする。文字列の代入に使用する。
 
<strncpy>
関数型:char *strncpy(char *s, const char *t, size_t n);
引数:文字配列、文字列、最大コピー文字数
戻り値:引数の文字配列をそのまま返す。
機能:文字配列に指定文字数だけ文字列をコピーする。
注意:文字数が多い場合にはナル文字を付加しないので、必ず、s[n]=‘\0’;として文字を付加すること。
 
<strcat>
関数型:char *strcat(char *s, const char *t);
引数:文字配列、文字列
戻り値:引数の文字配列をそのまま返す。
機能:文字配列の後ろに文字列をつなげる。
 
<strncat>
関数型:char *strncat(char *s, const char *t, size_t  n);
引数:文字配列、文字列、最大連結文字数
戻り値:引数の文字配列をそのまま返す。
機能:文字配列の後ろに指定文字数だけ文字列をつなげる。
 
<strlen>
関数型:size_t strlen(const char *s);
引数:文字列
戻り値:文字列の長さ。ナル文字は含めない。
機能:文字列の長さを返す。
 
<strcmp>
関数型:int strcmp(const char *s, const char *t);
引数:文字列1、文字列2
戻り値:文字列1が大きい時は正、同じ時は0、文字列2が大きい時は負。
機能:文字列1と文字列2を比較する。
 
<strncmp>
関数型:int strncmp(const char *s, const char *t, size_t n);
引数:文字列1、文字列2、比較文字数
戻り値:文字列1が大きい時は正、同じ時は0、文字列2が大きい時は負。
機能:文字列を指定文字数だけ比較する。
 
<strchr>
関数型:char *strchr(const char *s, int c);
引数:文字列、文字
戻り値:見つかった位置のアドレス、見つかった場合はNULL。
機能:文字列の先頭から文字を検索する。
 
<strrchr>
関数型:char *strrchr(const char *s, int c);
引数:文字列、文字
戻り値:見つかった位置のアドレス、見つからない場合はNULL。
機能:文字列の後ろから文字を検索する。
 
<strcspn>
関数型:size_t strcspn(const char *s, const char *t);
引数:対象文字列、検索文字列
戻り値:見つかった位置までの文字数。
機能:対象文字列の中から検索文字列に含まれる文字を検索する。
 
<strspn>
関数型:size_t strops(const char *s, const char *t);
引数:対象文字列、検索文字列
戻り値:見つからない位置までの文字数。
機能:対象文字列の中から検索文字列に含まれない文字を検索する。
 
<strpbrk>
関数型:char *strpbrk(const char *s, const char *t);
引数:対象文字列、検索文字列
戻り値:見つかった最初の文字へのポインタ、見つからない場合はNULL。
機能:対象文字列の先頭から検索文字列に含まれる文字を検索する。
 
<strstr>
関数型:char *strstr(const char *s, const char *t);
引数:対象文字列、検索文字列
戻り値:見つかった位置へのポインタ、見つからない場合はNULL。
機能:対象文字列から検索文字列を検索する。
 
<strtok>
関数型:char *strtok(char *s, const char *t);
引数:文字配列、区切り文字列
戻り値:区切られた単語へのポインタ。見つからない場合はNULL。
機能:文字配列を、区切り文字列に含まれる文字がある位置で区切る。
 文字配列をNULLにして呼び出すと次の単語を取得できる。
 
<strerror>
関数型:char *sreerror(int n);
引数:エラー番号
戻り値:エラーメッセージが格納された配列。対応するエラーがない時は空文字列。
機能:エラーメッセージを取得する。
注意:取得した配列の中身は書き換えないようにする。
 
<memcpy>
関数型:void *memcpy(void *dest, const void *source, size_t count);
引数:コピー先、コピー元、コピーサイズ
戻り値:引数のコピー先を返す
機能:メモリ内容をコピーする。コピー領域が重なっているとうまくいかない。
 
<memmove>
関数型:void *memmove(void *dest, const void *source, size_t count);
引数:コピー先、コピー元、コピーサイズ
戻り値:引数のコピー先を返す
機能:メモリ内容をコピーする。コピー領域が重なっていても問題ない。
補足:moveという名前だが、移動ではないので注意。
 
<memset>
関数型:void *memset(void *addr, int byte, size_t count);
引数:配列、数値、代入サイズ
戻り値:引数の配列をそのまま返す
機能:メモリ内容の指定サイズ分の要素全てに数値を代入。文字にも使用できる。
 
<memcmp>
関数型:int memcmp(const void *addr1, const void *addr2, size_t n);
引数:配列1、配列2、比較サイズ
戻り値:配列1が大きい時は正、同じ時は0、配列2が大きい時は負。
機能:メモリ同士を比較する。文字列の比較もできる。
 
<memchr>
関数型:void *memchr(const void *addr, int byte, size_t count);
引数:配列、1バイトの数値、検索するサイズ
戻り値:見つかった位置のアドレス、見つからない場合はNULL。
機能:メモリ内から数値を検索する。1文字検索にも使える。
 
 
 
 
◎今日のビジネス関連の読書
・START UP優れた起業家は何を考え、どう行動したか 著:琴坂将広、堀新一郎
・サイバーセキュリティ 著:松原実穂子
・イノベーターズⅡ 著:ウォルター・アイザックソン
 
 
 

2020.7.2(木) 
C言語(web記事「苦しんで覚えるC言語」)
第3部 アルゴリズム入門編

C言語簡易リファレンス
*標準ライブラリ関数一覧

・数学関数 <math.h>
基本的な数学関数群。
角度はラジアンで表されるので注意すること。
度からラジアンへの変換は次の通り。
ラジアン=(度 *3.14159/180)

<fabs>
関数型:double fabs(double x);
引数:実数値
戻り値:絶対値
機能:絶対値を計算する。

<sqrt>
関数型:double sqrt(double x);
引数:任意の実数値
戻り値:平方根
機能:平方根を計算する

<pow>
関数型:double pow(double x, double y);
引数:累乗される値、指数
戻り値:xをy乗した値
機能:累乗を求める。

<fmod>
関数型:double food(double x, double y);
引数:割られる数、割る数
戻り値:余り
機能:実数値の余りを求める。

<sin>
関数型:double sin(double x);
引数:ラジアン単位の角度
戻り値:サイン値
機能:サインを計算する

<cos>
関数型:double cos(double x);
引数:ラジアン単位の角度
戻り値:コサイン値
機能:コサインを計算する

<tan>
関数型:double tan(double x);
引数:ラジアン単位の角度
戻り値:タンジェント
機能:タンジェントを計算する。

<acos>
関数型:double acos(double x);
引数:コサインの値
戻り値:アークコサイン(ラジアン)値
機能:アークコサインを計算する

<asin>
関数型:double asin(double x);
引数:サインの値
戻り値:アークサイン(ラジアン)値
機能:アークサインを計算する。

<atan>
関数型:double atan(double x);
引数:タンジェントの値
戻り値:アークタンジェントを計算する。
機能:アークタンジェントを計算する。値はπ÷2の範囲となる。

<atan2>
関数型:double atan2(double y, double x);
引数:縦の値、横の値
戻り値:アークタンジェントラジアン)値
機能:アークタンジェントを計算する。値はπの範囲となり、引数xが0でも計算できる。


<sinh>
関数型:double sink(double x);
引数:ラジアン単位の角度
戻り値:ハイパボリックサイン値
機能:ハイパボリックサイン値を計算する。(exp(x)-exp(-x))/2 と同じ。

<cosh>
関数型:double cosh(double x);
引数:ラジアン単位の角度
戻り値:ハイパボリックコサイン値を計算する。 (exp(x)+exp(-x))/2 と同じ。

<tanh>
関数型:double tanh(double x);
引数:ラジアン単位の角度
戻り値:ハイパボリックタンジェント
機能:ハイパボリックタンジェント値を計算する。sin(x)/cosh(x)と同じ。

<ceil>
関数型:double ceil(double x);
引数:任意の実数値
戻り値:入力値以上の整数値
機能:実数値を整数値に丸める。

<floor>
関数型:double floor(double x);
引数:任意の実数値
戻り値:入力値以下の整数値
機能:実数値を整数値に丸める。

<exp>
関数型:double exp(double x);
引数:実数値
戻り値:自然対数の底のx乗
機能:指数を計算する。

<log>
関数型:double log(double x);
引数:任意の実数値
戻り値:自然対数を求める
機能:自然対数を求める。

<log10>
関数型:double log(double x);
引数:任意の実数値
戻り値:常用対数値
機能:常用対数を求める。

<modf>
関数型:double mods(double x, double *ip);
引数:任意の実数値、返される整数部の部分の値
戻り値:小数部分の値
機能:実数値を整数部分と小数部分に分ける。

<frexp>
関数型:double fresh(double x, int p*);
引数:任意の実数値、返される指数部分の値
戻り値:仮数部分の値
機能:浮動小数点値の指数部と仮数部を求める。

<ldexp>
関数型:double ldexp(double x, int p);
引数:仮数部、指数部
戻り値:合成された浮動小数点値
機能:仮数部と指数部から浮動小数点値を求める。

 


◎今日のビジネス関連の読書
豊田章男 著:片山修
EU離脱 著:鶴岡路人
・ティム・クック アップルをさらなる高みへと押し上げた天才 著:リーアンダー・ケイニー

 
 
 

 

2020.7.3(金) 
C言語(web記事「苦しんで覚えるC言語」)
第3部 アルゴリズム入門編
 
C言語簡易リファレンス
*標準ライブラリ関数一覧
 
・時間 <time.h>
時刻を取り扱う関数群。これらの関数はUNIXの慣習から世界協定時刻(UTC)における1970年1月1日0時0分0秒を基準としている。
 
<time>
関数型:time_t time(time_t *t);
引数:時刻を格納する変数のアドレス
戻り値:基準時刻からの経過秒数
機能:現在の時刻を基準時刻からの経過秒数で返す。
補足:引数をNULLで呼び出して戻り値だけを取得できる。環境によっては秒以外の単位を使うこともある。
 
<clock>
関数型:clock_t clock(void);
引数:なし
戻り値:使用プロセス時間
機能:プログラムが使用したプロセス時間を返す。
補足:clock()/CLOCKS_PER_SECとすることで秒単位の値を得られる。
注意:マルチスレッド環境では、経過時刻と一致しない。
 
<difftime>
関数型:double difftime(time_t t1,time_t t2);
引数:基準時刻からの経過秒数1、基準時刻からの経過秒数2
戻り値:2つの経過秒数の差
機能:時刻の引き算をする。環境によっては秒以外の単位を使うこともある。
 
<localtime>
関数型:struct tm *localtime(const time_t *t);
引数:基準時刻からの経過秒数
戻り値:秒数を国内時刻情報に変換した構造体
機能:基準時刻からの経過秒数を国内時刻に変換する。
注意:戻り値はシステム全体で共有されたメモリ領域なので、必ず別途宣言した構造体にコピーしておく必要がある。
 
<gmtime>
関数型:struct tm *gmtime(const time_t *t);
引数:基準時刻からの経過秒数
戻り値:秒数を国際時刻情報に変換した構造体
機能:基準時刻からの経過秒数を国際時刻に変換する。
注意:戻り値はシステム全体で共有されたメモリ領域なので必ず別途宣言した構造体にコピーしておく必要がある。
 
<asctime>
関数型:char *asctime(const struct tm *tm);
引数:時刻を格納した構造体
戻り値:時刻を変換した文字列の先頭アドレス
機能:時刻をWed Fed 17 20 : 14:04 1988 のような文字列に変換する。
注意:戻り値はシステム全体で共有されたメモリ領域なので、必ず別途宣言した構造体にコピーしておく必要がある。
 
<ctime>
関数型:char *ctime(const time_t *t);
引数:基準時刻からの経過秒数
戻り値:時刻を変換した文字列の先頭アドレス
機能:時刻をWed Fed 17 20:14:04 1988 のような文字列に変換する。
注意:戻り値はシステム全体で共有されたメモリ領域なので必ず別途宣言した構造体にコピーしておく必要がある。
 
<strftime>
関数型:size_t strftime(char *s, size_t max, const char *fmt, const struct tm *tp);
引数:文字配列、文字配列のサイズ、時刻書式指定文字列、時刻を格納した構造体
戻り値:配列に書き込まれた文字数。失敗した場合は0。
機能:時刻を指定された書式通りに文字列に変換する。
 
 
・制御
主にプログラムの制御を行う関数群。
これらはそれぞれヘッダーファイルが異なる。
 
<assert.h>を必要とする関数群
関数型:void assert(int expreesion);
引数:診断する変数値
戻り値:なし
機能:デバッグのために診断を行う。
補足:引数に設定された値が0の場合、実行中のソースファイル名と行番号を表示して急性終了する。NDEBUG定数しておくとコンパイルの段階で取り除かれる。
 
<signal.h> を必要とする関数群
関数型:int raise(int sig);
引数:送信するシグナル値
戻り値:成功した場合は0、失敗した場合は0以外。
機能:プログラムにシグナルを送信する。
 
関数型:void(*sidnal(int sig, void(*handler)()))();
引数:設定するシグナル値、シグナルを処理する関数のアドレス
戻り値:以前に設定されていた関数のアドレス、失敗した場合はSIG_ERR。
機能:シグナルを処理する関数を設定する。
 
<setjmp.h> を必要とする関数群
関数型:int setup(amp_buf env);
引数:ジャンプ先の状態を格納する変数のアドレス
戻り値:最初に呼ばれた時は0、longjmpで戻った時はその値。
機能:longjmp関数に備えて状態を保存する。
注意:プログラムの流れをぐちゃぐちゃにする凶悪な関数であり、よほどの事情でもない限り使用してはいけない。
 
関数型:void longjmp(amp_buf env, int val);
引数:ジャンプ先の状態が格納された変数のアドレス、任意の戻り値
戻り値:なし
機能:関数間をまたぐ広域ジャンプを行う
注意:プログラムの流れをぐちゃぐちゃにする凶悪な関数であり、よほどの事情がない限り使用してはいけない。
 
 
「苦しんで覚えるC言語」終わったーーー!!!!!
 
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 
 
◎今日のビジネス関連の読書
・アート思考 ビジネスと芸術で人々の幸福を高める方法 著:秋元雄史
・決定版リブラ 著:木内登英
・両効きの組織をつくる 大企業病を打破する「攻めと守りの経営」 著:加藤雅則、チャールズ・A・オライリー、ウリケ・シェーデ
 
 
 
ついに、web記事「苦しんで覚えるC言語」全て学び終えることができました。
関わって下さっている全ての方へ感謝です。
 
次は、「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」を中心に学ばせて頂きたいと思います。
 
それではまた!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

*1:MIN)+(int)(rand()/RAND_MAX*((MAX)-(MIN)+1)))
 とすれば、min〜max間の乱数を得ることができる。

<srand>
関数型:void srand(unsigned int seed);
引数:乱数系列の初期値。
機能:乱数系列の初期値を与える。
使用法:srand((unsigned int)time(0

6/23(火)〜6/25(木) の学習ログです(主にC言語)

こんにちは、安藤です。

いつもありがとうございます。

私の学習ログです。

 

 

2020.6.23(火)

C言語(web記事「苦しんで覚えるC言語」)

●複数のソースファイル*最小限の分割
・複数のファイルを使う理由
これまでプログラムを記述する時には、エディタのウィンドウに書き込んで来たが、その時、常に1つの画面の中に全てのプログラムを記述してきた。

つまり、1つのファイルの中に全てのプログラムを記述してきたことを意味する。

この方法は単純なので規模の小さなプログラムでは有効な方法。

しかし、規模が大きなプログラムでは、1つのファイルに全て書き込んでいると、どこにどのプログラムがあるのか分かりにくくなってしまう。

さらに、何人かで1つのプログラムを作ろうとする場合には、1つのファイルに2人以上の人が同時に書き込むことは基本的に不可能なので、2人以上でのプログラミングは事実上不可能になってしまう。
この問題を解決するには、複数のファイルに分割してプログラムを書く必要がある。

複数のファイルに分割することで、どこにどのプログラムがあるのか分かりやすくなり、複数人での開発も可能になる。


・ソースとヘッダーファイル

printf関数などを使う時は、#include <stdio.h>を先頭に記述する必要があった。

これこそがプログラムを複数のファイルに分割するということ。
#include擬似命令は、指定されたファイルの内容を取り込むという命令。

そして、stdio.hは、printf関数などの様々な関数の宣言を含んでいる。

ここで重要なことは、stdio.hの中には、printf関数の宣言だけが書かれているだけであり、実際のプログラムは書かれていないということ。

printf関数の実際のプログラムは、stdio.hとは別のファイルに記述されている。
stdio.hのような宣言だけが書かれたファイルをヘッダーファイルという。

ヘッダーファイルには、拡張子として、.hをつけることが慣習となっている。
これに対して、実際にプログラムを記述するファイルをソースファイルと呼ぶ。

拡張子は、.cとすることが慣習となっている。
ソースファイルとヘッダーファイルは、通常1対1で対応するように作成する。


・最小限のヘッダーファイル

まずは、sum関数を含むソースファイル、sum.cを作成してみる。
/*sum.c*/

int sum(int min, int max) {

  int num; num = (min + max)* (max - min + 1)/2;

  return num;

}

 

次にsum.c内に含まれる関数を他のソースファイルから使えるようにするために、sum.cから宣言部分を抜き出して、ヘッダーファイルsum.hを作成する。
/*sum.h*/

int sum(int min, int max);

 

これで、sum関数の分割は完了。

しかし、これではmain関数がないのでプログラムを実行できない。

そこで、main関数を含むソースファイル、main.cを作成する。
今回、sum関数のプロトタイプ宣言は、sum.hに記述しているので、sum.hを取り込まない限り、sum関数を使うことはできない。
sum.hを取り組むのは、当然、#include擬似命令を使用する。

ただし、今まではヘッダーファイル名を< > で囲んでいたが、自分で作成したヘッダーファイルを取り込むには、” ” で囲むことになっている。

#include擬似命令でヘッダーファイルを取り込むことを、インクルードという。
/* main.c */

#include <stdio.h>

#include “sum.h”


int main(void) {

  int value;

  value = sum(50,100);

  printf(“%d\n”,value);

  return 0;

}

 

これで、main.cも完成。

なお、main.cのヘッダーファイル、main.hは作成する必要なない。

main.c内に含まれる関数を他のソースファイルから使う必要はないから。
このままではコンパイルできない。

2つ以上のファイルを使う場合には、使うファイルを指定する必要がある。


Borland C++ Compiler と Visual C++ Toolkit 2003 の設定>

メニュー -> 実行 -> コンパイル時パラメータを選択し、コンパイル時パラメータの欄に、-emain main.c sum.c   と打ち込む。

-emainとは、実行ファイルを main.exe という名前で作成させる命令。

後ろの2つは、共にコンパイルするソースファイル名を指定している。

ヘッダーファイルはソースファイルでインクルードしているので不要。


LSI C-86の設定>

メニュー -> 実行 -> コンパイル時パラメータを選択し、コンパイル時パラメータの欄に、-o main.exe main.c sum.c  と打ち込む。

-omain.exeとは、実行ファイルをmain.exeという名前で作成する命令。

後ろの2つは、共にコンパイルするソースファイル名を指定している。

ヘッダーファイルは、ソースファイルでインクルードしているので不要。

 

*分割の定石
・変数の共有宣言には2種類ある。
変数や関数の宣言を行うと、コンパイラがその名前と形を記憶する。

これが宣言と呼ばれる機能。

そして、同時にコンパイラは実際に変数や関数を作成する。

これが定義と呼ばれる機能。これまでの変数では、この宣言と定義を常に同時に行なっていた。
宣言は、変数や関数の形をコンパイラに教えるだけなので、その形さえ同じであれば、何回宣言しても問題はない。

しかし定義は、関数や変数の実態を作成することになる。

同じ関数や変数が何回も作られると区別がつかなくなるため、エラーとなる。


※プロトタイプ宣言は、宣言だけを行い、定義は行わない。


・extern(エクスターン)宣言

宣言だけを行い、定義は行わない宣言方法。

extern宣言の使い方は、宣言の前にexternと記述するだけ。
このextern宣言を使うと、異なるソースファイルで変数を共有することができる。
変数の共有は便利だが、乱用に注意。

本来、複数のファイルに分割するのは、機能毎に独立させるため。

しかし、変数の共有をすると、同じ変数が使えるようになることで機能毎に独立させる意味合いが薄まってしまう。

従って、可能な限り、関数の引数や戻り値を利用して変数の共有は、どうしてもという場合のみとすること。


・ヘッダーファイルの重複防ぎ

ヘッダーファイルの重複インクルードそれ自体を防ぐ方法もある。

それには、#ifndef〜#endif擬似命令を使用する。

#ifndef~#endif擬似命令は、ある記号が定義されていなかった場合だけ、その間に挟まれたプログラムをコンパイルするという記号。


C言語は可能な限り無駄を減らせるように設計されており、プログラマーが意識しなければならないことが多いかわりに、意識さえすれば無駄を大きく減らせるようになっている。


◎今日のビジネス関連の読書

・ズボラPDCA 著:北原孝彦

・他人とうまくやっていく 著:アラン・ピーズ、バーバラ・ピーズ

・日本でいちばん大切にしたい会社5 著:坂本光司

 

 

2020.6.24(水) 

C言語(web記事「苦しんで覚えるC言語」)
第2部:C言語応用編


●汎用計算
*様々な計算


・絶対値
絶対値を計算するにはabs関数を使用する。
#include <stdlib.h>の記述が必要。

絶対値=abs(数値);

 

・累乗
累乗を計算するには、pow関数を使う。
#include <math.h>の記述が必要。

累乗=pow(数値,指数);

 

平方根(√)
平方根を計算するには、sqrt関数を使う。
#include <math.h>の記述が必要。

平方根=sqrt(数値);

 

三角関数
#include <math.h>の記述が必要。

sin(関数名) サイン(三角関数値)
cos  コサイン
tan  タンジェント
asin  アークサイン
acos  アークコサイン
atan  アークタンジェント

 

・アーク系三角関数
アーク系三角関数は、普通の三角関数の逆の計算をする。
普通の三角関数は、角度から辺の長さの割合を求めるが、
アーク系三角関数は、辺の長さから角度を求まる。

これらの関数の使い方はいずれも同じ。
なので、tan関数を例に進める。

使い方は、次の通り。
タンジェント=tan(ラジアン角度);

 

ただし、この角度は普段使用する90度が直角となる角度ではなく、ラジアンと呼ばれる角度の単位を使用する。
次の式で、普通の角度からラジアンへ変換できる。
ラジアン=(度*3.14159/180)

 

ラジアン
円弧と半径の長さが等しくなる位置を1ラジアンとする角度の単位。
コンピュータの世界では、ほとんどの場合ラジアンを使用する。

毎回この計算を行うのは面倒なので、次のようなマクロを作成する。

#define RADIAN(ARC) *1

 

この通りにすれば最小値〜最大値の範囲の乱数を計算できる。

毎回異なる乱数にする
擬似乱数は計算によるものなので、同じ数を元に作った場合は同じ乱数になってしまう。
この問題を解決するには、乱数の計算に使う元の数を変える必要がある。
そのための関数として、srand関数が用意されている。

srand(元の数);

 

ただし、srand関数を使って別の数値を入れたとしても、実行される時に元の数が同じであれば同じ乱数になるので解決にならない。
その解決方法は、現在時刻を入れる方法。
秒単位の現在時刻をsrand関数に入れれば毎回異なる元の数を乱数に使える。

現在時刻を得る関数は、time関数で<time.h>を#includeする必要がある。

srand関数とtime関数を使えば毎回異なる乱数を計算できる。

srand*2;

 

なお、unsigned int という型にキャストしているが、これは符号なしの整数値。
この処理はプログラムを開始する時に1回行えば十分。

 


◎今日のビジネス関連の読書
ブロックチェーン 著:岡嶋裕史
・信用の新世紀 ブロックチェーン後の未来 著:斉藤賢爾

 

  

 

2020.6.25(木) 
C言語(web記事「苦しんで覚えるC言語」)
第2部:C言語応用編
●キーボード入力
*1行の文字列として入力

・gets関数によるキーボード入力
C言語には、キーボードから1行の文字列を入力するgets関数が用意されている。
使うには、<stdio.h> を#includeすること。

gets(文字列);

 

gets関数を実行すると、scanf関数と同じように入力待ち状態になる。
ユーザーがキーボードから入力した文字列は指定した文字列内に格納される。

画面に1行の文字列を表示するputs関数というものもある。
使うには、<stdio.h> を#includeすること。

puts(文字配列);

 

指定した文字列が画面に表示される。
また、文字列の最後で必ず改行される。
printf関数より低機能だが、文字列の表示だけならputs関数の方が簡単。

 

バッファオーバーラン対策
gets関数は要素数を越えた入力があるとバグが生じるので使用しないこと。
その代わりに、fgets関数を使用する。
使うには、<stdio.h> を#includeすること。

fgets(文字配列,配列の要素数,ファイルポインタ);

 

最後でファイルポインタを指定していることからも分かるが、この関数はファイルから文字列を読み込むための関数。

 

C言語では、全ての周辺機器はファイルとして扱うことができる。
キーボードには、stdinという名前のファイルポインタが割り当てらている。
このstdinを指定すれば、ファイルから読み込む関数がキーボード用に早変わりする。

周辺機器のファイル扱いは、UNIXというOSで取り入れられた機能で、現在のコンピュータはほとんど全て同様な仕組みを備えている。

配列の要素数を知るには、sizeof関数を使用するのが簡単で確実。
次のようにすれば、安全なgets関数の代わりが実現する。

fgets(文字配列,sizeof(文字配列),stdin);

 

※改行文字
gets関数は、‘\n’を格納してないけど、fgets関数は格納している。
入力の終わりを調べるには、‘\n’を検索するといい。

・文字列から数値などを取り出す
文字列を数値に読み替える一番良い方法は、atoi関数を使うこと。
実数の場合には、atof関数を使う。
文字列の中から単語を取り出すには、strtok関数を使用する。
使用するには、<string.h> を#includeすること。


◎今日のビジネス関連の読書
・アフター・ビットコイン 著:中島真志
ブロックチェーン・AIで先行くエストニアで見つけたつまらなくない未来 著:小島健

 

 

今回はこれで以上になります。

それでは、また次回。

 

 

 

 

 

 

 

*1:ARC) * 3.14159 / 180 )

 

三角関数でも計算を繰り返すと誤差が出るため注意が必要。

 

 

*乱数
擬似乱数
乱数とは、その名の通りランダムな数のこと。
サイコロのようなもの。

ランダムな数が必要になるゲームには欠かせない。
また、複雑な現象や統計的な性質の解析などを行う場合には、乱数を使うことで手軽に実験を行うことができる。

擬似乱数では、あくまでも計算によってランダムに見える数を作っている。
しかし、実際にかなりバラバラな数値を得ることができるので、ほぼランダムな数であると考えてよい。

擬似乱数には様々な計算方法があるが、C言語で用意されるのは、ほとんどが線形合同法
簡単に言うと、
X=適当な数*X(上位ケタの部分を切り捨てて増加を防ぐ)


をひたすら繰り返すことで毎回異なる値を得る計算。
この方法は単純でそれほどランダムにならず何回か組み合わせてく使うと同じパターンになってしまう。しかし、ゲームなどの用途であれば十分ランダムな値になる。

 

・乱数を作る
C言語には、擬似乱数を作るrand関数が用意されている。
使用するには、<stdlib.h>を#includeすること。

変数= rand();

 

・乱数の範囲を限定する
C言語では、rand関数で得られる最大値はRAND_MAXという定数の値で分かる。
従って、rand関数で得られた値をRAND_MAXを等分した値で割ればいいのだが、そのために計算をするのは面倒なので、公式がある。

 

範囲乱数公式
最小値+(int)(rand()*最大値ー最小値+1.0/(1.0+RAND_MAX

*2:unsigned int)time(NULL

6/18(木)〜6/23(火) の学習ログです(主にC言語)

こんにちは、安藤です。

いつもありがとうございます。

私の学習ログを残しています。

 

 

2020.6.18(木)

C言語(web記事「苦しんで覚えるC言語」)

●マクロ機能

*不変の値の取り扱い

・初めから終わりまで不変の値実行中は変化しない値を定数と呼ぶ。


・数値に名前をつける

C言語には、数値に名前をつける方法が用意されている。それが、#define擬似命令。#define 名前 数値
#define擬似命令では、文の終わりに;をつけてはいけない。

この文はプログラムの先頭に置くのが一般的。

名前には変数と同じ文字が使えるが、大文字のアルファベットが一般的。
・文字列に名前をつける

#define擬似命令では、数値だけでなく、文字列にも名前をつけられる。


*その他の方法による定数

 

・const定数

const定数とは、値を変更できない変数のこと。

変数を宣言するとき、その先頭でconstを指定すると、その変数は宣言時に代入された初期値を変更することができなくなる。
const定数は、定数として使う限りは#defineとほとんど同じ。

一般的には、定数を宣言する時には#defineを使用することがほとんどだが、特定の関数の中だけで使用する定数を宣言したい時などには便利。
・定数を配列の要素数にする

C言語では、const定数を配列の要素数にできないけど、C++やC99では可能になっている。なお、#define擬似命令ならどちらでも可能。


・constの使い道

constは、他に関数の引数の型として使われることもある。

これは、配列を渡す時に、その値を変更させないため。


enum(エナム)定数

C言語には、#defineやconstの他に、enum定数がある。

enum { 名前, 名前, 名前};


enum定数では、数値を指定する必要はなく(指定することもできる)、名前だけで自動的に数値がつけられるので、大量の定数を宣言する場合に便利。

自動的に数値がつけられるのでは、定数として利用できないようにも思えるが、enum定数は、主にフラグ定数として使用される。

enumは整数値しか使えない。文字列も使えない。

実数値を扱う場合には、#defineかconst定数にするしかない。


※最後の,(カンマ)

enumの名前の後につける,は、正式には最後の名前にはつけないが、実際にはつけてもほとんどの場合には問題なく動作する。ただし、組み込み向けコンパイラなどでは動かないこともあるようだ。


・数値指定enum

enum定数では、数値を省略できるが、必要であれば指定することもできる。

数値を省略した場合、1番先頭の名前を0として、以後は1ずつ増やした値がつけられる。どこかで数値を指定した場合、そこは指定した数値、以後は1ずつ増やした値になる。

 

 

<読書>
・これからのテレワーク 著者:片桐あい

・フルライフ 著者:石川善樹

・「仕事ができる」とはどういうことか? 著:楠木建、山口周

・大きな嘘の木の下で 著:田中修治

・うまくやる 熊野森人 著・エンジェル投資家とは何か

大前研一 2020年の世界

 

 

 

2020.6.19(金) 
C言語(web記事「苦しんで覚えるC言語」)
●マクロ機能
*簡易的な関数の実現

・#define擬似命令のこうどな機能
#define擬似命令による定数は、単なる置き換えによって実現されているが、これを利用すると特殊な処理を行わせることも可能。
関数も置き換えることができる。
乱用すると、プログラムがわかりにくくなるけど、この機能は知っておく必要がある。

・マクロという簡易関数
#define擬似命令で簡単に関数を作ることが可能。
名前の後に()で文字を指定すると、以後の置き換える内容で同じアルファベットの部分を置き換えることができる。
この機能は簡易的な関数の変わりに使われており、マクロと呼ばれている。

マクロの使い方は普通の関数と全く同じだが、仕組みは大きく異なる。
関数の場合、その実態は1箇所にあり、必要な時に呼び出されて使われる。
マクロでは、使用している場所のプログラムそれ自体が置き換わり、呼び出しなどの作業が必要ないため若干高速になる。
しかし、マクロを使う場所全てが置き換わるので、あまり巨大なマクロを作ると、その為にプログラムのサイズが極端に大きくなることもある。
そのため、一般的には、マクロは決まりきった数式などに利用される。

・副作用の恐怖
マクロは手軽で便利だが、使い方を間違えると思わぬ現象に遭遇する。
マクロは、単なる置き換え命令でしかないため、置き換えでエラーが生じることがある。
マクロの副作用と呼ぶ。
解決方法は2つあり、1つは、呼び出し時いカッコをつけること。
もう1つは、マクロの方にカッコをつけること。
うっかり忘れると副作用が生じる。なので数式などは普通の関数を使うことが一般的。


◎今日のビジネス書の読書
・不平等と再分配の経済学 著者:トマ・ピケティ
・テクノロジー・スタートアップが未来を創る 著:鎌田富久
・WE ARE LONELY, BUT NOT ALONE. 著:佐渡島庸平
・教養としてのコンピューターサイエンス講義 著:ブライアン・カーニハン
・武器としての「」資本論 著:白井聡
チフスのメアリー 病魔という悪の物語 著:金森修
ネガティブ・ケイパビリティ 著:帚木蓬生
人工知能と銀行経営 著:大久保豊ほか4名
・文系AI人材になる 著:野口竜

 

 

2020.6.20(土) 
C言語(web記事「苦しんで覚えるC言語」)
●動的配列
*配列を自由自在に作る

・配列の欠点
配列の最大の欠点は、要素数をプログラム中で変更できないこと。
配列を宣言する時に、要素数を定数で直接指定するしかない。
実行中にユーザーに入力してもらい、その値を利用するようなことはできない。

※変更できる環境
GCCというコンパイラでは独自の拡張により、要素数をプログラム中で変更できるようになっている。
また、C99という新しいC言語でも同様の機能が追加されている。C++ではできない。

素数を変更できないことは、様々な目的で動作するプログラムを作るのに不便。
例えば、会社の社員の給料を管理するソフトを作る場合、社員の給料を記憶する配列は社員の人数分以上必要になる。ところが、世の中には、社員数人の会社から、数千人の会社まで様々。
もし、要素数を10個とすると、11人以上の会社では使えないし、逆に要素数を1万にすると、10人の会社では残りの9990個が無駄になる。
その無駄な分にもメモリを使用するので、巨大なメモリの無駄となる。

このように、配列の要素数は自由に変更することができないため、メモリを有効利用することが難しく、実用性に欠ける。

 


◎今日のビジネス関連の読書
復活の日 著:小松左京
・ビジネスチャット時短革命 メールは時間泥棒 著:越川慎司
・「数字で考える」は武器になる 著:中尾隆一郎
・2060年未来創造の白地図 著:川口伸明
・ぜんぶ、すてれば 著:中野善壽
・ゼロからはじめる力 著:堀江貴文
・教養として知りたい日本酒 著:八木・ボン・秀峰
・勉強の哲学 来るべきバカのために 著:千葉雅也

 

 

 

2020.6.21(日)

C言語(web記事「苦しんで覚えるC言語」)

●動的配列*配列を自由自在に作る
・メモリの確保配列は自由に要素数を変更できないため、不便である。そのため、自由に配列を作る、malloc(エムアロック)関数が用意されている。

malloc関数を使うには、<stdlib.h>を#includeする必要がある。
ポインタ変数=malloc(必要なメモリのバイトサイズ);

メモリを確保できなかった場合はNULLが返る。


返されるポインタ変数には、確保された配列の先頭アドレスが代入されるので、

これに[ ]演算子を使用すれば配列と同様に使うことができる。
malloc関数で指定できるのは、バイト単位のサイズなので、任意の要素数の配列を確保するには、sizeof演算子を使う。

malloc関数で確保したメモリを、ヒープと呼ぶことがある。

ヒープに確保された配列を、動的配列と呼ぶことがある。
メモリ確保に失敗するとNULLが返される。これをそのままに使用すると当然強制終了するので、malloc関数の戻り値は必ずチェックする必要がある。
わずかなメモリ確保に失敗した場合も、システム全体が深刻なメモリ不足で今にもフリーズ、という状態なので、強制終了以外の対策はない。


ヒープ…長期的に使用される大きなサイズのメモリを格納する領域。
動的配列…malloc関数などを使用してプログラムの実行中に用意された任意のサイズの配列。


malloc関数によって確保されたメモリは、プログラムが終了するまで残るが、そのメモリが不要になった場合、free関数を使って解放する。これを忘れると無駄なメモリが残り続けることになるため、malloc関数を使ったら必ずfree関数を呼び出すこと。


free関数は使い方は、free(ポインタ変数);


・終了時のfree関数free関数を呼ばなくても良い場合がある。

プログラムが終了する直前では、free関数を使わなくても、プログラム終了と同時にOSがメモリを解放する。ただ、free関数を常に呼び出す癖はつけておくこと。


・だんだん動作が遅くなる原因

長時間コンピュータを使っているうちに、だんだん動作が遅くなってきて、再起動することになる、というあれ。

実はあの現象の原因がまさに「free関数の呼び出し忘れ」。

大規模なプログラムでは、malloc関数をたくさん使うことになるので、常に正しくfree関数を呼び出すのは困難で、市販されてて世界中で使われているアプリケーションでもどこかで呼び出し忘れがきっとある。

この呼び出し忘れによってメモリが無駄になることを「メモリリーク」という。


次のプログラムは、int型の要素数10個の配列を動的に確保する。


#include <stdio.h>

#include <stdlib.h>


int main() {

 int i ; int *heap;

 heap = (int*)malloc(sizeof(int)*10);

 if(heap == NULL)exit(0);


 for(I = 0; i < 10; i++ ) {

  heap[ i ] = i ;

  }

 

 printf(“%d\n”, heap[5] );


 free(heap);

 return 0;}

 

sizeof(int)によって、int型変数1つのバイト単位のサイズが求められるので、それを10倍することで、int型変数10個分のメモリを確保している。

malloc関数が返すアドレスは、void型のポインタ。この型は、どんなポインタ変数にも代入できるという型なので、本当は(int*)にキャストする必要はないのだが、C++コンパイラではキャストしないとエラーが出る。

メモリ確保に失敗した場合は、exit関数を呼び出して強制終了させる。

exit関数は、プログラムを強制終了させる関数。

exit関数を使うには、#include <stdlib.h>する必要がある。

エラーによる場合の強制終了は、abort関数を使うこともある。

確保した配列を使い終えたら、free関数で解放する。


malloc関数の実態malloc関数は、好きなサイズの動的配列を作ることができるので、便利だが、その仕組みは、メモリにマークをつけているだけ。

これは、冷蔵庫に入っているスイーツに名前を書いておくのと同じこと。

家族みんながその名前に従い、他人のスイーツを食べなければいいが、勘違いによって誰かに食べられてしまうこともある。このくらいのこと。 

malloc関数にも似たようなところがあって上手に使うのは難しい。

従って、できるだけ、普通の配列を使用して、どうしても必要ってところだけmalloc関数を使う方がいい。

 

 

◎今日のビジネス関連の読書

・ワイルドサイドをほっつき歩け ハマータウンのおっさんたち 著:ブレイディみかこ

・志村流 著:志村けん

・交渉力 著:橋下徹

 

 

 

2020.6.22(月)

C言語(web記事「苦しんで覚えるC言語」)

●動的配列

*配列を自由自在に作る
・動的配列の要素数を拡大する

malloc関数によって要素数の調整ができる、動的配列を作ることができる。

けれど、これでは、「配列の要素数の変更ができない」という問題を完全に解決できたとは言えない。

そこで、要素数を変更する、realloc(リアロック)関数というものが用意されている。


新しいポインタ変数=realloc(以前のポインタ変数,必要なメモリのバイトサイズ);

 

以前のポインタ変数には、malloc関数で確保したメモリのアドレスを指定する。

realloc関数は、中身を維持したまま新しいサイズのメモリを確保する。

新しいポインタ変数には、拡張されたメモリのアドレスが返されるが、特別な理由がなければ以前のポインタ変数と同じ変数を指定できる。


次のプログラムは、realloc関数で動的配列の要素数を変更する。


#include <stdio.h>

#include <stdlib.h>


int main (void) {

  int *heap;

  heap = (int*)malloc(sizeof(int)*10);

  heap = (int*)realloc(heap,sizeof(int)*100);

  free(heap);

  return 0;

}

 


realloc関数で、要素数を10個から100個に増加している。


・呼び出し回数を減らそう

realloc関数を何回も呼び出すメモリが散らかっていく。

このような状態をフラグメンテーションと呼び、不安定になる。

はじめのmaoolc関数である程度大きめに確保しておき、realloc関数を呼び出す場合も、1回で大きめに確保するべき。

 


◎今日のビジネス関連の読書

・新型コロナウィルスの真実 著:岩田健太郎

・日本でいちばん大切にしたい会社7  著:坂本光司

・片づけられない自分がいますぐ変わる本 著:大嶋信頼

・明日の自分が確実に変わる10分読書 著:吉田裕子

・5Gビジネス 著:亀井卓也

・P&G「勝つために戦う」戦略 著:A・G・ラフリー

 

 

 今回は以上です。

それではまた次回。

 

6/12(金)〜6/17(水) の学習ログです(主にC言語)

こんにちは、安藤です。

いつもありがとうございます。 

ここでは私の学習ログを残しています。 

 

 

2020.6.12(金) 

C言語(web記事「苦しんで覚えるC言語」)
●複数の型をまとめる
・構造体の配列
構造体も配列にすることができる。

・構造体配列の引数
構造体配列を引数にして関数に渡すこともできる。配列のような渡し方になる。
構造体配列の最初の要素のアドレスを渡す形になる。
受け取った関数では、配列の引数と同様に扱える。

 


◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」


歴史的な視点でいうと、「オブジェクト指向」という考え方は1960年代末から1970年代にかけて複数の起源から発生した。
オブジェクト指向プログラミングは構造化プログラミングによって導入された制御の構造化を取り込んだものと考えられる。
・どのオブジェクト指向言語にも共通に備わっている機能
①内部構造を見ずにデータを操作する機能(カプセル化、データ抽象)
②データの種類に応じて適切な操作が自動的に選択される機能(ポリモーフィズム多態性

ブラックボックス化はモジュール化の基本原則であり、オブジェクト指向プログラミング言語はこれを個々のデータ単位で施している。

オブジェクト指向プログラミングに限定すれば、カプセル化ポリモーフィズムは生産性を向上させるためのテクニックであると見なしてよい。
構造化プログラミングがデータ・フローを整理し、より生産性や保守性の高いプログラミングの開発を可能にしたのと同じように、オブジェクト指向プログラミングはデータ構造を整理し、生産性や保守性の向上を実現する。
といったように、構造化プログラミングの延長線上としてオブジェクト指向プログラミングをとらえると、オブジェクトが現実世界の存在を反映しているかどうかはどうでもよくなる。

 


◎読書「自分の中に毒を持て」岡本太郎さん著
「食えなきゃ食えなくても、と覚悟すればいいんだ。それが第一歩だ。その方が面白い」
今日も太郎さんかっこいいです。

 

 

2020.6.13(土) 
C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
・テキストファイルの読み書き

ファイルとして保存されたデータは、ディスク上に保存されるので、消えることはなく、コピーや再編集が容易。

・ファイルの開閉
プログラムからファイルを操作する手順は、次の順番で行われる。

ファイルを開く -> ファイルに読み書きする -> ファイルを閉じる

ファイル操作にはファイルの開閉が必須。
そこで、C言語にはファイルを開閉する関数が用意されている。

開く関数がfopen関数、閉じる関数がfclosem関数。
この関数を使うには、stdio.hのインクルードが必要になる。

FILE型のポインタ変数=fopen(ファイル名,モード);
fclose(FILE型のポインタ変数);

モードとは、ファイルを開く目的を表す文字列のこと。
モードには、次の6種類の文字列の内どれか1つを指定する。

r        読み込み。ファイルがない時は失敗。
r+      読み書き。ファイルがない時は失敗。
w       書き込み。ファイルがあっても空のファイルを作る。
w+     読み書き。ファイルがあっても空のファイルを作る。
a       追加書き込み。ファイルがない時は作る。
a+     読み書き。ファイルがない時は作る。

FILE型とは聞き慣れない型だが、その正体は構造体。
fopen関数を実行するとファイル情報を持つFILE型へのポインタが返される。
このポインタは、以後開いたファイルの識別子として使うだけなので、ポインタ特有の操作を行ったり構造体の要素を使うことはない。
FILE型へのポインタ変数を、ファイルポインタと呼ぶ。

次のプログラムは、test,txtという名前のファイルを書き込みするために開く例。

#include<stdio.h>

int main(void) {
FILE*file
file = open(“test.txt”,“w”);
fclose(file);
return 0;
}

このプログラムを実行すると、test.txtという名前のファイルが作成される。
今回の場合は開くだけなので、中身は空。

fcloseの役割
一見、無意味なfopen関数だけど、役割がある。
同時に複数のソフトが動く環境では、もし同じファイルを同時に2つのソフトで書き換えてしまうと、
どちらを反映すれば良いのか分からなくなってしまうので、
fopen関数で書き込みができるように開いたファイルには、他のソフトで書き換えられないように鍵をかけている。
fclose関数は鍵を外して他のソフトから使えるようにする。
その他、ファイルを開いている時は、メモリ内に保存し、fclose関数が実行された時にはじめてディスクに書き込むことで高速化していることもある。

 

 

◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」


オブジェクトの鋳型=クラス
多くのオブジェクト指向言語には、「クラス」と「継承」という2つの機能がある。
これらの機能は抽象データ型によってオブジェクトという形にカプセル化されたデータの性質を効率よくモジュール化するための機能。

クラスとは、オブジェクトの雛形になる存在。
クラスのあるオブジェクト指向言語では、オブジェクトは雛形であるクラスから作り出され、各オブジェクトの性質はクラスによって決定される。クラスによって同種のオブジェクトをひとまとめに管理できる。

オブジェクト指向言語におけるクラスは、手続き型言語の構造体あるいは、レコードの延長線上にあると考えればよい。
クラスはメンバーやフィールドと呼ばれるデータの入れ物だけでなく、それら「データの塊」に対する手続きも内包している点が異なる。
単なるデータをまとめたものである構造体では、メンバーの値を取り出すことと、更新することしかできない。
それに対してクラスでは、メンバー関数(メソッド)と呼ばれる、クラスのオブジェクトを対象とする手続きを呼び出せる。

サブルーチンが一連の手続きをまとめ、処理の中身のブラックボックス化に役立つツールであるように、クラスはデータをブラックボックス化するツール。

データの中身には対応する手続き(メソッド)を経由してアクセスするから将来データの保持の仕方などが変更されても外部に影響は及ばない。これはちょうどサブルーチンによって処理をブラックボックス化すると内部のアルゴリズムが変更されても外部に影響が及ばないのと同じ。
このような内部の詳細を考えずに済むブラックボックス化は、抽象化とも呼ばれ、プログラムの複雑さを低減されるのに有効な手法。



2020.6.14(日) 
C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
・ファイルへの書き込みファイルへテキストを書き込む関数はたくさん用意されている。
fprintf関数の使い方は次の通り
fprintf(ファイルポインタ,書き込み文字列,変数…);使い方はファイルポインタを指定すること以外、printf関数と全く同じだが、
指定した文字列は画面ではなくファイルに書き込まれる。・読み込みと追加の場合
読み込みモードで開いた場合、書き込み用の関数を使っても何も起きない。
追加モードで開いた場合、元のファイルの最後にデータが追加される。・ファイルの読み込み
ファイルのテキストを読み込む関数にも多くの種類が用意されている。
馴染みのscanf関数に似たfscanf関数というものがある。
先頭でファイルポインタを指定すること以外はscanf関数と同じ。
scanf関数はキーボードから読み込むため、実行すると入力待ちになったが、
fscanf関数では、ファイルのテキストを先頭から読み込む。※カンマ(,)で区切って数値や文字列を並べたファイルをCVS形式と呼び、エクセルなどの表計算ソフトで扱える汎用的なファイル形式として知られている。

 

 

2020.6.15(月) 
C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
バイナリファイルの読み書き・テキストとバイナリ
ファイルには様々なものがあるが、基本的な区分として、テキストかバイナリとという違いがある。全てのファイルは本質的にはバイナリファイル。
バイナリを直訳すると、2進数という意味。
その名の通り、2進数で記録されたファイル。
要するに、数値のみで記録されたファイルのことを意味する。
それに対して、テキストファイルは文字列だけが記録されたファイル。
コンピュータの中では、文字列といえども数値で表されているので、テキストファイルも本質的にはバイナリファイル。
しかし、テキストファイルは文字列で記録されているので、テキストエディタなどで修正を行うことが容易。バイナリファイルも特定のエディタで閲覧・修正することができるが、
全てのデータが数値の固まりになっているため、中身を見ても、その意味が全く分からない。しかし、数値を直接書き込むので、サイズは小さく高速。一般に取り扱いを容易にする必要がある場合はテキストファイル、高速性が必要とされる場合にはバイナリファイルを利用することが多いよう。

 

 

 

2020.6.16(火) 
C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
・ファイルの開閉
 
テキストであれ、バイナリであれ、ファイル操作の基本的な手順は変わらない。
バイナリファイルもfopen関数、fclose関数を使って開閉する。
ファイル名、モードの指定方法も全く同じ。
ただし、バイナリファイルを開く時には、モード文字列の最後にbをつける。
 
混同しても使える。
実際にはバイナリで開いてもテキストデータを読み書きできるし、逆も可能だが、改行の扱いなどで不便な点が多くなる。
 
・ファイルへの書き込み
ファイルに数値を直接書き込むには、fwrite関数を使う。
fwrite(書き込むアドレス,1項目のサイズ,項目数,ファイルポインタ);
 
書き込む数値を変数に代入しておき、その変数のアドレスを指定する。
項目のサイズはsizeof演算子を使用して求めることができる。
変数を書き込むだけなら、項目数はとりあえず1で構わない。
 
※数学では、100を16進数に変換すると、0064になる。
しかし、バイナリエディタで閲覧した結果では、6400になっている。
これは、インテル互換CPUの特徴で、リトルエンディアンと呼ばれる。
この表現では、16進数を2桁ずつに区切り逆の順番で保存する。
一方、マッキントッシュでは、IBM製のCPUを使用しており、こちらは16進数の順番通りに表現される方式で、ビッグエンディアンと呼ばれている。
現在では、macインテル製のCPUを使っている。
 
 
fwrite関数による書き込みでは、配列を1度で書き込むことができる。
やり方は、変数の代わりに配列を指定するだけ。
 
 
 

2020.6.17(水)

C言語(web記事「苦しんで覚えるC言語」)
●ファイルの取り扱い
・ファイルの読み込み
ファイルの数値を直接読み込むには、fread関数を使用する。
fread(読み込む変数のポインタ,1項目のサイズ,項目数,ファイルポインタ);

・ドラッグへの対応
ドラッグされたファイル名の取得

C言語には、アプリケーションの起動時にファイル名を渡す機能がある。
それが、コマンドライン引数。

コマンドライン引数とは、アプリケーション起動時に渡される文字列のこと。
主に処理するファイル名や動作オプションを指定する。

main関数の引数はvoid型として宣言してきたが、ここには決められた型の引数を指定することができる。
コマンドライン引数を受け取るためには、次のような引数を指定する。
int main(int argh,char*argv[ ]);

argcはコマンドラインの数、argvは文字列へのポインタ変数。
実際には、次のようにするだけ。
printf(“%s”,argh[0]);

このようにすれば、0番目(1番最初)のコマンドラインを表示できる。
argv[0]の要素数を変えれば、それに対応するコマンドラインにアクセスできる。

コマンドラインの0番目は、アプリケーション自身のファイル名になる。

※fflush(stdio)は邪道
この命令は、出力バッファを強制出力する関数であるfflushで、入力バッファであるstdioをクリアしている。
この使い方は、一部のコンパイラでしか使えない邪道。
この方法は練習段階でのみ、本格的な開発では使わないこと。

・オプションの解析
一般的には、コマンドラインにはファイル名の他に、アプリケーションの動作を指定するオプションを指定することがある。
例えば、Windowsでファイル名を指定して実行でdefragと指定して起動すると、デフラグが起動して何もせずに終了するが、defrag c: と指定すると、Cドライブのデフラグを開始する。
また、defrag c: -a と指定すると、Cドライブの分析結果だけを表示する。
このような使い方は、パソコン上級者にはおなじみのやり方。
この例では、c: と -a という2つの文字列がコマンドラインに渡され、それをアプリケーション内で解析して
動作を決定している。

 

 
 
 

以上です。

引き続き、学習を頑張ります。