C言語::Cyta.jp http://cyta.jp Cyta.jpのC言語の講師がブログを通じて、C言語情報を発信! プログラムを作りたい。でもどの言語を選べばいいの? http://cyta.jp/cl/b/75626 <br>そもそもプログラムとは、 人間が行う必要のない定型作業をコンピュータに処理させ、 人間は人間にしかできない創造的な作業に集中できる様にするため、 人間がコンピュータに指示する考え方や方法を規定したものだと考えております。 世の中には約200を超えるプログラム言語が存在します。 その中からあなたが解決したい課題をクリアするのに、 必要十分なプログラミング言語を調査し選択し、 効率よくプログラミングすることが重要です。 では、どんなプログラミング言語を選べはよいのか? 人工知能(AI)などの特殊な研究、 ホームページ作成などに特化したプログラム言語を除き、 世の中で広く利用されているプログラム言語は以下の通りです。 (1) 仮想機械(VM)上のプログラミング言語Javaと、 Microsoft .Net Framework上のプログラミング言語 (Visual BASIC, Visual C#など) (2) C/C++言語(とMicrosoft MFC/+Win32などの拡張ライブラリ) (3) Qt(C++言語仕様を拡張した開発環境) それぞれの言語の特徴は以下の通り。 (1)はソースコードよりコンパイラが、コンピュータを直接動かすことのできない中間コードを生成します。仮想機械(VM)または.NET Frameworkといった別のプログラムが、この中間コードの内容をちくいち解釈し、コンピュータへの命令に翻訳しながら実行します。この別プログラムががWindows OS用、Mac OS用、Linux OS用と別々に存在することで、一度プログラミングした内容がOSの垣根を超えて動作するメリットはあるものの、中間コードの翻訳とコンピュータへの命令変換が実行中は常に行われるので、高速な処理を要求するプログラムには不向きです。 (2)はソースコードよりコンパイラが、コンピュータを直接動かすことが出来る機械語コードを生成します。プログラムの実行スピードは抜群に早いですが、Windows OS用、Mac OS用、Linux OS用のプログラムを生成する場合、原則的にそれぞれのOS用にプログラムのソースを書き直しコンパイルする必要があります。また、C/C++言語とMicrosoft MFC/+Win32などの拡張ライブラリの習得という点で、Javaや.NETプログラミング言語より習得コストが高く、プログラム入門者にはハードルが高く思います。 (3)はソースコードよりコンパイラが、コンピュータを直接動かすことが出来る機械語コードを生成します。プログラムの実行スピードはC/C++同様に早く、一度書いたプログラムは原則的に、Windows OS用、Mac OS用、Linux OS用にコンパイルすることで実行可能なモジュールを生成できます。また、Javaや.NETよりも遥かに洗練されライブラリがはじめから準備されていますので、開発効率はピカイチで、Javaや.NETより自由度の高いプログラミングが可能です。 最後に、 小生のおすすめは、Qtです。 Qtは、携帯電話で有名なフィンランドのNokia社が開発し誕生しました。今は買収もろもろでフィンランドのDigia社がライセンスを所有し、日本国内での代理店はSRA社です。 Qtプログラミングを始めたいかた、習得したいかたは、 何時でもウェルカムです。 是非とも小生のレッスンをご利用ください。 以上、それでは皆様ごきげんよう。 C言語 Sat, 30 Sep 2017 13:45:40 +0900 C言語プログラミング入門講座::C言語プログラミング入門講座 北本 吉司 本日合格発表、国家試験合否の結果は? http://cyta.jp/cl/b/73881 <br>先月受験した第二種電気工事士の筆記試験の合格発表が、 本日の7月4日の9時30分からWEBで公開とのこと。 早朝トレーニングを終え、数時間勉強し気分を整えつつ発表に備える。 既に先月筆記試験の回答が公開されており自己採点済みで、 おそらく合格しているだろうと思いながらも気がかりでした。 まさかの受験番号記入ミスや解答欄のマークミスで不合格はなかろうかと、 恐る恐る受験番号をWEBで入力し合否結果の判定を実施した結果は。 試験種別 平成29年度 第二種電気工事士試験 上期筆記試験 受験番号 XXXXXXXXX 入力した受験番号は合格者一覧にあります。 え? 「おめでとうございます。...は合格しました。」とか、 「残念でした。...は不合格でした。」とか分かりやすい表現でなく、 「..は合格者一覧にあります」ですと。 この国家試験は、そもそも筆記試験と技能試験を共に合格して、 初めて資格取得となるので仕方ないのかもしれませんが、 日本人の言葉の表現と気の配り方は、時に理解に時間がかかりすぎです。 さて前置きはほどほどに、 皆さんは自分の目標や目的を達成できていますか? 小生は情けないですが、現時点の達成率は40%といったところです。 今年あと6カ月を残し、この国家試験のほかあと1つ国家試験を合格する予定です。 取り急ぎの試験勉強が落ち着いたら、新たにプログラミングの実践レッスン (ネットワーク,DB,セキュリティ,GUI,グラフィック描画などの各分野の基礎から応用)を開設したいと思っています。 また、ブログでは、海外生活で感動した出来事や、面白い話を紹介したいと思います。 それでは皆さん、ごきげんよう。 C言語 Mon, 03 Jul 2017 22:44:50 +0900 C言語プログラミング入門講座::C言語プログラミング入門講座 北本 吉司 「パブリック・フットパス」を歩き続けるかの如く http://cyta.jp/cl/b/71815 <img src="http://cyta.jp/p/image/card/2017/4/1/37984/120.jpg" alt="" /><br>緑の中を走る1本の道は何処へ続くのだろうか? 道はあぜ道から煉瓦造りの道へと時に姿を変え、 初夏の柔らかい日差しと、頬を撫でる心地よい風が、 私の探求心と冒険心を刺激する。 かつての主の栄枯盛衰が伺える城や宮殿の遺跡を、 遠目に見る景色は新鮮で実に美しい。 ここは私が何度となく出張し、 世界遺産に指定された首都エジンバラを 中心としたスコットランド地方である。 今もこんな「パブリック・フットパス」が、 たくさんあり、我々の心と体を癒してくれる。 さて皆さん、 「C言語プログラミング入門講座」は、 「パブリック・フットパス」を歩き続けるかの如く、 皆さんのステップアップが継続できる様に、 以下のレッスン内容でお手伝いしたいと思います。 ・C言語とは ・データ型 ・演算子 ・制御の流れ ・関数 ・配列とポインタ ・構造体と共用体 ・入出力関数 それでは皆さん、ごきげんよう。 C言語 Sat, 01 Apr 2017 10:40:26 +0900 C言語プログラミング入門講座::C言語プログラミング入門講座 北本 吉司 Android Studioの導入 http://cyta.jp/cl/b/68549 <br>源田です。 こちらの投稿は、かなりひさびさになってしまいました。 さて、最近Android用アプリ開発ツールである「Android Studio」(Android公式のもの)に注目しています。 というのも、最新のバージョン(2.2)でCやC++まわりの連係が強化されたから、なのです。 CやC++でのデバッグも、従来版よりかなりやり易くなっているみたいです。(みたい、と表したのは従来版を使っていないため比較ができないから) ということで、ただいま導入中です。 まずは、サンプルプロジェクトの動作確認までをブログ記事(Qiitaという別サイト)を登録しました。ご興味のある方は是非ご一読ください。 http://qiita.com/ygenda/items/d0f9386cc764b8b441dd 今回は以上です。 C言語 Sun, 04 Dec 2016 18:50:50 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 整数の範囲の余談2(未来のお話) http://cyta.jp/cl/b/44571 <br>しばらく、更新が滞ってしまいました。すみません。 今回は整数の範囲に関する余談のその2、未来起こりうる話について書きます。 本題に入る前に、かつて「2000年問題」という騒動が起こったのを覚えていますでしょうか? これは、年に関する処理を誤ることでコンピュータが誤動作する可能性があるとして指摘されたものです。ただ、このときはほとんど問題には発展しませんでした。 しかし、コンピュータが誤動作する可能性は未来にも存在します。それは、「2038年問題」と呼ばれるものです。 この用語は、初めて聞くかたも多いと思います。 ちなみに、問題が発生する時刻まで特定されています。その時刻は「2038年1月19日3時14分7秒(世界標準時。日本時間では12時14分7秒)」です。 さて、何故このような問題が指摘されているのでしょうか。それは、C言語を含む多くのプログラミングにおける「経過時間のデータ型」に理由があります。 ここでは、C言語の場合で説明します。 C言語の時間に関するマクロ定義や関数宣言は、「time.h」と呼ばれるヘッダファイルでおこなわれています。このヘッダファイルでは、経過時間を示す time なる変数が定義されています。経過時間の起点は「1970年1月1日0時0分0秒(世界標準時)」です。 そして、この変数timeのデータの型が問題なのです。 この変数自体は、typedefされたtime_t型で宣言されています。で、多くの処理系ではこのtime_tの定義元がint型となっています。 int型ということになると符号付きになるので、正の整数側の最大値は2,147,483,647になります。これが何を意味するかというと、「1970年1月1日0時から2,147,483,647秒後までしか、経過時間の処理は正常に動作しない」ということです。 そして、その時刻が冒頭の「2038年1月19日3時14分7秒」になるわけです。 現在では、time_t型の定義元が64ビットである処理系も増えてきました。が、すべてがそういうわけではありません。 このような根拠があるので、「2038年問題」に関しては世間に浸透させないければいけないと考えています。 以上、2回にわたって整数の範囲に関する余談をお話しました。 次回は、再びC言語本来の話題で書く予定です。 C言語 Tue, 05 Aug 2014 23:59:28 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 整数の範囲の余談1(過去のお話) http://cyta.jp/cl/b/40425 <br>今回から2回にわたり、整数の範囲にまつわるお話を書きたいと思います。 その1は、過去(現在でもあるかも)のお話です。 1986年5月に、後に日本を代表するロールプレイングゲーム(RPG)シリーズの初代となるゲームが発売されました。 そのゲームとは。。。ファミコン版のドラゴンクエストです。 私が小学校6年生のときで、本当は受験を控えていたにも関わらずハマってしまったゲームです。 さて、このゲームには様々なステータスがありました。ヒットポイント(HP)やマジックパワー(MP)、経験値やお金(ゴールド)といったものです。 さて、このゲームをやった事があるかたはご存知かも知れませんが、この各種ステータスには上限値というものがありました。その上限値は、HPとMPは255、経験値とゴールドは65535でした。 この値、どこかで出てきましたね。そう、それぞれ最上位ビットを符号ビットとして扱わない場合の、1バイトと2バイトの最大値なのです。 このことから、HPとMPを制御するデータは1バイト、経験値とゴールドを制御するデータは2バイトでプログラミングされていることがわかるのです。 小学生で2進数の考え方が浸透していなかった私は、特に経験値やゴールドの上限値が「何故こんな中途半端なの?」と思ったのを覚えています。 他にも、255や65535で上限値を切られたデータが存在するゲームがあるようですが、2進数の考え方を知らないうちは「中途半端だなぁ」と思いますよね。 以上、余談その1でした。 さて次回は、未来起こりうる話を書きます。かつて「2000年問題」の騒動があったのを記憶されているかたも、多いと思います。同じような問題が、未来にも起こる可能性があるのです。 24年後あたりに。。。 C言語 Mon, 21 Apr 2014 16:29:40 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 負の整数の2進数数値表現 http://cyta.jp/cl/b/39937 <br>前回は、整数の範囲について書きました。 その最後で、「負の整数の2進数数値表現は、どのようになるのか」という点に触れました。今回は、この点について書きます。 まず、結論から書きます。 負の整数の2進数数値表現は、「正の整数の2進数数値表現の全ビットの0/1を入れ換えて、最後に1を加えたもの」になります。 例として、1バイトの大きさをもつ整数100の場合で示します。 整数100は、2進数数値表現で「01100100」となります。 この表現の全ビットの0/1を入れ換えます。すると「10011011」となります。 最後に、1を加えて「10011100」となります。これが、100に対する負の整数である「-100」の2進数数値表現となります。 このとき、100に対する負の整数-100のように、基準となる数値に加えた場合の答えが0となるような整数のことを「補数」と呼びます。そして、2進数の場合の補数のことを「2の補数」と呼びます。 2の補数の作り方は、前述した「全ビットの0/1反転→最後に1を加える」になります。 ここで、負の整数を2進数数値表現で表した場合に最上位のビットが必ず「1」となることに、注目してください。この最上位のビットのことを、特に「符号ビット」と呼びます。 C言語の場合で最上位ビットを符号ビットとして扱うかどうかは、数値の型(shortやlong等)の前に「signed」または「unsigned」を付けることで制御します。前者が符号ビットにする、後者が符号ビットにしない(即ち、より広い範囲の正の整数が取り扱える)、となります。いずれも指定しない場合は、符号ビットにする動作となります。 さて前回のブログで、負の整数を取り扱う場合に負の整数の範囲のほうが1だけ広いことに触れました。これは、「符号ビットだけが1、他が0」(例えば1バイトで表すと10000000)の表現が負になる(= -128)ことが理由です。正の整数は「0〜127」の128個、負の整数は「-1〜-128」の128個が取り扱える、ということですね。 今回触れた2の補数の考え方は、基本情報技術者試験用の各種参考書で説明されていますので、お持ちの方はそちらも参考にしてください。 さて次回と次々回ですが、少しC言語から離れて前回の「整数の範囲」に焦点をあてて、過去のお話と未来起こる可能性の問題のお話に触れましょう。 C言語 Mon, 07 Apr 2014 15:24:11 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 整数の範囲 http://cyta.jp/cl/b/38815 <br>前回は「データの型」について、基本的なことを書きました。 その中で、データの型には1バイト(=8ビット)、2バイト(=16ビット)、4バイト(=32ビット)の3種類の整数型があることに触れました。実際には8バイトの整数型もありますが、まずは前述の3種類をしっかり使いこなすことが先です。 さて、この3種類の整数型で取り扱える整数の範囲はどのぐらいでしょう。 結論から書くと、以下の通りとなります。 1バイト整数型: 0〜255 2バイト整数型: 0〜65,535 4バイト整数型: 0〜4,294,967,295 中途半端な整数が、最大になっていますね。これは、8ビット、16ビット、32ビットの各々において、すべてのビットが1になった2進数の数値表現を10進数の整数に変換したものなのです(たとえば2進数の11111111→255)。 なお、これはすべての整数が正であることを前提にした範囲です。 一方で、一番左のビットを「0なら正、1なら負」とみなすようにして、負の整数も取り扱うようにすることもできます。 この場合の整数の範囲は、以下の通りになります。 1バイト整数型: -128〜127 2バイト整数型: -32,768〜32,767 4バイト整数型: -2,147,483,648〜2,147,483,647 いずれも「負の整数のほうが、範囲が広い」ことに注目してください。 さて負の整数を2進数の数値表現で表す場合、どのようになるのでしょうか? 次回は、この「負の整数の2進数数値表現」について書きます。これは情報処理技術者試験(主に基本情報技術者)でも出ますので、是非知っていただきたい内容です。 C言語 Mon, 03 Mar 2014 14:35:47 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 データの型 http://cyta.jp/cl/b/38461 <br>C言語に限らず、プログラミングにおいて演算処理をさせることは不可欠と言っていいでしょう。 ということで、今回から何回かに分けて演算処理をプログラミングする上で必要なことを書いていきます。 その1回目は、「データの型」です。 このデータという呼び名は、「変数」と「定数」をまとめたものとお考えください。 さて、ここでは変数を中心に説明します。 プログラム中に、  short int a; のような記述を、何度も目にすることと思います。 aというのは、変数であることを示す「識別子」と呼ばれるものです(識別子については、講座で詳しく触れます)。 そして、aの左側に書かれている「short int」というのが、aという変数の型を決めるキーワードです。 詳しくは後述しますが、この記述では「2バイトのサイズのaという変数」を宣言した、ということになります。 さて、この型を表すキーワードには、主に以下のものがあります。  char(1バイトの大きさの文字型)  short int(2バイトの大きさの整数型)  long int(4バイトの大きさの整数型)  (※)1バイト=8ビット。ビットについては「2進数の考え方」を参照してください。 上記以外に、floatやdoubleといった小数点を扱う型もありますが、まずは前述の3つの型を使いこなせることが目標となります。 なお、shortやlongを省略して単に「int」と書いてもOKですが、この場合はコンピューターによって2バイトになるか4バイトになるか変わるため、注意が必要です。個人的には、shortやlongをつけることをおすすめします。 次の回では、1バイト、2バイト、4バイトの整数で取り扱える数値について書いていきます。 C言語 Tue, 18 Feb 2014 00:53:47 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 プログラミングの醍醐味(続き) http://cyta.jp/cl/b/37804 <br>前回のつづきです。 例題は「九九のアルゴリズムを考えてください」でした。 まずは最初の縛り、かけ算の演算子(*)を使わない場合の書き方です。 これは、かけ算=足し算の繰り返しであることを利用します。例えば以下のようになります。 int kuku(int a, int b){  int i,answer=0;  for(i=1;i<=b;i++){   answer=answer+a;  }  return answer; } 途中に出てくるforの部分の詳細は改めて説明しますが、この部分では「aをb回足す」ということをやっています。 例えばaが5でbが6の場合、答えが30になることを確認してみてください。 では、演算自体を使わないやり方はどうでしょう? この場合は、あらかじめ九九の答えをデータとして用意しておいて、その答えを参照するやり方が考えられます。 int kuku(int a, int b){  int answer[9][9]=  {{1,2,3,4,5,6,7,8,9},   {2,4,6,8,10,12,14,16,18},   {3,6,9,12,15,18,21,24,27},   {4,8,12,16,20,24,28,32,36},   {5,10,15,20,25,30,35,40,45},   {6,12,18,24,30,36,42,48,54},   {7,14,21,28,35,42,49,56,63},   {8,16,24,32,40,48,56,64,72},   {9,18,27,36,45,54,63,72,81}};  return answer[a-1][b-1]; } 最後のreturnでaとbをマイナス1しているのには、理由があります。それは、最初に定義したデータが「配列」と呼ばれるものだからです。配列の詳細はそのうち説明しますが、この配列の要素と呼ばれるものが「0番目」から始まるものであるため、マイナス1しているのです。 2番目のアルゴリズムはかなり強引ですが、演算の手間を省けるため実行時間を速くできる可能性があるというメリットがあります。一方で、データの容量を取る大きなデメリットがあるので、あまりおすすめはできませんが。 以上、前回の補足編でした。 C言語 Fri, 24 Jan 2014 12:37:37 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 プログラミングの醍醐味 http://cyta.jp/cl/b/37595 <br>C言語に限らず、プログラミングの醍醐味って。。。いったい何でしょう? 私は、その1つに「自由にアルゴリズムを考えられる」ことを挙げたいです。 そこで、簡単な例題をひとつ。 【例題】「九九」をおこなうプログラムのアルゴリズムを考えてください。 これに対して、3通りくらいの方法が思い浮かべば、アルゴリズムをかなり柔軟に考えられる方だと思います。 一番わかりやすいのは、C言語風に書いた場合に、 int kuku(int a, int b){  return (a * b); } のように、かけ算の演算子(*)を使うことでしょう。 では、* を使ってはいけないという縛りをつけたら、どう書けばいいでしょう? さらに、* だけでなく演算子と呼ばれるものを使ってはいけないという縛りをつけたら、どうでしょう? いずれの場合も、ちゃんと九九をおこなうアルゴリズムが組めます。 さて、この2つの縛りをつけた場合のアルゴリズム例は。。。またの機会に紹介しましょう。 C言語 Thu, 16 Jan 2014 22:49:08 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 2進数の考え方 http://cyta.jp/cl/b/36964 <br>C言語によるプログラミングをはじめるにあたり、まずは「数値表現」に触れておく必要があります。 日常生活で私達が扱っている、0〜9の数字からなる数値表現(例えば1234、など)。この表現は、「10進数」と呼ばれるものです。 一方、コンピュータなど情報処理の分野では、「2進数」による数値表現が当たり前のように出てきます。つまり、すべての桁を0か1のみで表すのです。 たとえば、「10110」のような感じになります。さて、これは10進数で表すといくつになるでしょう? 正解からいうと、「22」になります。 2進数では、一番右の桁から順番に「2の0乗の位」、「2の1乗(=2)の位」、「2の2乗(=4)の位」、...となっていきます。 そこで、冒頭の「10110」。これは、2の4乗(=16)、2の2乗(=4)、2の1乗(=2)の桁が1になっていますので、10進数に直すと16+4+2で、22になるわけです。 ちなみに2進数における桁のことを、情報処理の世界ではビット(bit)と呼んでいます。また、データのサイズ表現で用いられる1バイト(byte)の大きさは、8ビット分に相当します。 ということでプログラミングをするにあたって、2進数の考え方に慣れておきましょう。 C言語 Sat, 21 Dec 2013 01:21:48 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一 自作したソフトウェアの動きをみるのは、楽しいです http://cyta.jp/cl/b/36769 <br>C言語は、様々なプログラミング言語におけるもっとも代表的なものの1つです。最近ではJavaやObjective-C、Rubyなどのプログラミング言語が注目されているようですが、やはり基礎を習得するならばC言語が最適だと考えています。 さてどんなプログラミング言語であれ、プログラム(※1)を書いてコンパイル(※2)を実施すれば、エラーが起こらない限り実行可能なファイルができあがります。この実行可能なファイルのことを「ソフトウェア」や「ツール」などと呼びます。 自分が書いたプログラムからできた「ソフトウェア」が、どのように動くか。これを見るのって(自分が作っただけに)楽しいものです! さあ、皆さんもこの楽しみを堪能してみましょう! (※1)厳密には、これをソースコードと呼びます (※2)ソースコードを実行可能なファイルに変換するための処理です。 C言語 Wed, 11 Dec 2013 00:42:25 +0900 C言語プログラミング入門講座::楽しめるC言語セミナー 源田 雄一