【初めての方歓迎】暇だからプログラミング教える

趣味・生活 パソコン

87 Res. 2.85506742 MONA 10 Fav.

1 :名無し三段:2017/10/15 09:55:10 (7年前)  2.69867742MONA/7人

最近の流行りはRubyだのGoだの言われてるけどここではC言語を教えるよ~
「プログラミングやってみたいけど何をすればいいかわからない」
「最近始めたけど勉強の仕方がわからない、何を調べればいいかわからない」
人向けです。

2 :名無し三段:2017/10/15 09:57:25 (7年前)  0MONA/0人

まずプログラミングって何か? かなり簡潔に説明すると
「パソコンに何をやらせるかを"正確に"記述する」
ってこと。書いたプログラムが間違っていればパソコンも思い通りに動かない。

3 :名無し三段:2017/10/15 10:01:59 (7年前)  0MONA/0人

「どこにプログラムを書けばいいの?」
ぶっちゃけWindows付属の「メモ張」でも「Terapad」でも拡張子を「.c」にすれば何でもいいが、そうなるとコンパイラを導入しなければならない。プログラミングの練習でそれをやるのはめんどいので今回は「paiza.io」を使って説明する。
https://paiza.io/ja

注意点としては、paiza.ioで書いたコードは自由に第三者に見られてしまうこと。 サインアップしてコード作成画面の右下にある鍵マークをクリックして「非公開」にすればこれを防げる。

4 :名無し三段:2017/10/15 10:04:33 (7年前)  0MONA/0人

paiza.ioの使い方は各自調べてくれ
とりあえずコード作成画面の左上に「PHP」って書いてあったらクリックして「C」に替えてくれ。これは使用言語を表している。

5 :ピーマン 七段:2017/10/15 10:05:34 (7年前)  0MONA/0人

もう少し丁寧に説明しようぜ

6 :名無し三段:2017/10/15 10:06:59 (7年前)  0MONA/0人

さて、書く場所はこれで確保できたな。

paiza.ioでは親切なのか余計なお世話なのかは知らんが、言語を選択するとその言語に合わせて最初の数行が表示される。 恐らく学校とかでプログラミングを教えてもらうと「"おまじない"だから必ず書いてね」とだけ言われる内容。
今回はこれについてもう少し踏み込んで説明する。

#include <stdio.h>
int main(void){
// Here your code !

}

7 :名無し三段:2017/10/15 10:08:47 (7年前)  0MONA/0人

>>5 わからない箇所は指摘してくれ。
paiza.ioは全て日本語だからgithubとかよりは初心者でも何とかなるかと

8 :名無し三段:2017/10/15 10:12:28 (7年前)  0MONA/0人

>>2でかなり簡潔にプログラミングについて書いたが、もう少し詳しく書くと

パソコンは機械語(C言語やPHP等とは全く違うもの)しか理解できない。
しかし、人間が直接機械語で書くのはかなり難しい。
じゃあ人間でも理解できる言語でプログラムを記述して、それを機械語に変換しよう。

ってことでC言語やRuby、PHPといったプログラム言語がある。
「機械語に変換」するモノを「コンパイラ」と呼ぶ。
「コンパイラ」が機械語に変換する行為を「コンパイル」と呼ぶ。

9 :名無し三段:2017/10/15 10:14:49 (7年前)  0MONA/0人

ちなみに「コンパイラ」は言語毎に用意しなければならない。が、今回はpaiza.ioがonlineで1クリックでコンパイルしてくれるサービスを提供してくれるのでこれ以上コンパイラについては説明しないぞ。

10 :名無し三段:2017/10/15 10:24:28 (7年前)  0MONA/0人

さて、おまじないの話に戻るか。
とりあえず君たちは機械語ではなくC言語で記述するわけだから、プログラミングしてる時はさほど機械語の事は考えなくてもよい。

C言語は「関数」の実行や「変数」を入れるためのメモリの確保や、「if文」、「for文」といった繰り返し処理などが行える。
C言語は、最初にmain関数を実行してくれる。(厳密には他のコトを先にする)
そのmain関数が
int main(void){
}
のことだ。
最初のintは「この関数は"int型"の返り値がある」という意味だ
「何を返すんだよハゲ」って思うかもしれんが、これは一般的に「0」を返すことになっている。なぜ0を返すか、というと「main関数が0を返したらプログラムは正常に実行できましたよ」というルールがあるからだ。 もし、プログラム実行中に何らかのエラー(例えば値を0除算した場合)が起きると0以外の値が自動的に返されるからだ。

11 :名無し三段:2017/10/15 10:27:23 (7年前)  0MONA/0人

int main(void)
のmain

これは関数名を指している。main関数は、関数名がmainでなければならない。もし、int mein(void)なんて誤記してたら「main関数が見当たらないぞ!」という意味の「コンパイルエラー」が発生する。

12 :名無し三段:2017/10/15 10:29:53 (7年前)  0MONA/0人

int main(void)
のvoidについて

これは「引数がない」という意味である。
引数とは、関数を実行する際のパラメータである。main関数には基本的にはない。main関数以外の関数を記述する際に、ここに関数実行時のパラメータが入ると思っていただきたい。
なお、int main(void)のvoidを省略し、int main()と記述することも可。

13 :名無し三段:2017/10/15 10:32:21 (7年前)  0.03939MONA/1人

中括弧、{ }について
〇〇{

}
というように使われるが、これは〇〇の範囲がここから、ここまでですよ
の意味がある。
人によって
〇〇
{


}
と記述しているが、コンパイル時にはどちらでも同じく認識されるので好きな方を選んでいただいて構わない。 ただし、1つのプログラム中で書き方を統一しないとかっこ悪いぞ(コンパイラは気にしないけどね)

14 :名無し三段:2017/10/15 10:40:36 (7年前)  0MONA/0人

次に1行目の
#include <stdio.h>
についてだ
先程、「最初にmain関数を実行してくれる。(厳密には他のコトを先にする)」といったが、この「他のコト」ってのがこれ。(他にもあるが、その都度説明する。)
#include は「ヘッダーファイル(ライブラリとも呼ばれる)を取り込みますよ」という意味だ。で、stdio.hが取り込むヘッダーファイルの名前である。
ヘッダーファイルは「関数の集合体」とまずは考えていてほしい。(関数以外も入っているが、それは後ほど)

ちなみに、ヘッダーファイルはstdio.h以外にもstring.hやmath.hなど他にもたくさんある。
stdio.hは「STanDart Input Output」、標準入出力等の関数がそろっている。
具体的にどんな関数かは、このリンクを参照していただきたい。
http://www.c-tipsref.com/reference/stdio.html

いっぱい関数が書いてあるが、全部覚えなくてもいい。
「scanf」「printf」「fscanf」「fprintf」の4つぐらい覚えれば初心者の中では十分。

15 :名無し三段:2017/10/15 10:44:15 (7年前)  0MONA/0人

あと
// Here your code !
について説明していなかったな

これはコメント文だ
//
を記述すると、「この行のここからはコメント文なのでコンパイラは気にしないでね」という意味になる。
"ここから"なので
int main(void){ //これはmain関数
と記述すれば、「int main(void){ 」までコンパイラは認識する。

16 :名無し三段:2017/10/15 10:44:23 (7年前)  0MONA/0人


複数行にまたがるコメントを書きたい時は
/*
コメント
*/
というように記述する。

/*ああああああ
いいいいいい
ううううう*/

というように、「/* */」で囲まれている範囲にコメントを記述できる。

17 :名無し三段:2017/10/15 10:47:11 (7年前)  0MONA/0人

さて、そろそろ「プログラムを書いて実行したい!」と思うころなので、
定番の「Hello World!!」を表示するプログラムを書く。

18 :名無し三段:2017/10/15 10:48:40 (7年前)  0MONA/0人

「Hello World!!」と"表示"する
というこの"表示"とは、今回は標準出力を言っている。
標準出力をするには、
stdio.hを取り込むので、1行目は

#include <stdio.h>

19 :名無し三段:2017/10/15 10:49:57 (7年前)  0MONA/0人

単に「Hello World!!」を表示すると言っても、C言語のルールを守らなければならないのでmain関数を用意しなければならない。なので

#include <stdio.h>
int main(void){

20 :名無し三段:2017/10/15 10:53:34 (7年前)  0MONA/0人

main関数の中に、「Hello World!!」を表示(標準出力)するプログラムを書きたい。

標準出力の関数はprintf (関数についての詳細はhttp://www.c-tipsref.com/reference/stdio/printf.html を参照)

printf("Hello World!!")

が、「文字列 Hello World!! を標準出力する」という意味になる。


21 :名無し三段:2017/10/15 10:56:22 (7年前)  0MONA/0人

書かなくても動作はするけども、ルールを守るために、目的の動作を終えたら「0」を返す。
これは
return 0
と書くことで「0」を返してこの関数を終了する。という意味になる。

main関数の中括弧を閉じて、これで完成(?)
#include <stdio.h>
int main(void){
printf("Hello World!!")
return 0
}

22 :名無し三段:2017/10/15 10:57:45 (7年前)  0MONA/0人

しかし、これを実行するとコンパイルエラーが発生します。

23 :名無し三段:2017/10/15 11:02:14 (7年前)  0MONA/0人

説明していませんでしたが、C言語のルールで、数式や、命令文の後にはセミコロン「;」をつけなければなりません。
しかし、#include<stdio.h>の後ろには不要で、return 0の後ろには必要、などとちょっとだけ複雑なルールなので、これは慣れていくしかないだろう。

コンパイルエラーのメッセージの英単語の意味は
expected … 予想される
expression … 式
statement … 文
です。

24 :もなむーる名無し八段:2017/10/15 11:02:50 (7年前)  0.039MONA/1人

↓【コラム】
たぶんここまでの解説で「関数」っていう言葉がいきなり出てきて「ほへ?」となっている読者がいるはずなので、コラム補足。

プログラミングを知らない人でも、義務教育で数学は学んだはずで、「1次関数/2次関数」という語に忌々しい記憶が残っている方も多いと思う。
y = ax + b とか y = ax^2 + b みたいなやつね。

プログラミングで使う「関数」という概念も、上記の「関数」と概ね同じ。(細かいことを言うと「副作用」という概念の理解が要るのだけれども、細かいことは最初は無視して構わない)

義務教育で学んだ関数は x の値が決まると y の値が決まるというものだった。式を変形すると y の値で x の値が定まったりしたけれども、それは一旦忘れて良い。(つまり義務教育のより簡単)

義務教育から少し進んだところは、y = ax + b や y = ax^2 + b などを抽象的に y = f(x) として表現できるということ。
そして、f は、義務教育で学んだような計算だけでなく、もう少し複雑なこともできること。
f は x を放り込むと何かをして結果を返してくれる、ロボットか何かだと思えば良い。
↑【コラム】↓

25 :名無し三段:2017/10/15 11:04:10 (7年前)  0MONA/0人

エラーメッセージの内容に従い、必要な個所にセミコロン;つけて、再度実行します。



無事にHello World!!が出力されます。

26 :もなむーる名無し八段:2017/10/15 11:05:02 (7年前)  0MONA/0人

↓【コラム】
どこが f(x) の表現が便利かというと、使う側は中身の細かいことを忘れてもよいということ。
例えば f(x) というロボットがカレーを作るものだとして、ジャガイモと人参とどちらを先に切り始めるのかは、結果としてのカレーを受け取る人にとってはどうでも良い。f(x) で隠すことで、どうでもいいことを忘れることができ結果だけを受け取れる。

C言語(だけでなく近代的なプログラミング言語の多く)で、関数は事前に用意されている。本文に出てくる「scanf」「printf」等は事前に用意されたもの。
また、関数は自分で定義して使える。main() もまた関数。

ただし C言語では main 関数はちょっと特殊な立ち位置で、書かれたプログラムのプログラムの最初に実行されることが約束されていて、引数(xに相当)や結果の返り値に制約がある。

以上、コラム終わり
↑【コラム】

27 :名無し三段:2017/10/15 11:06:34 (7年前)  0MONA/0人

>>24 関数の説明、ありがとうございます。
C言語では
「x の値が決まると y の値が決まる」
のxが引数、yが返り値(戻り値とも呼ぶ)に該当します。

28 :名無し三段:2017/10/15 11:09:28 (7年前)  0MONA/0人

じゃあここで少し遊んでみましょう、

先程のプログラム

#include <stdio.h>
int main(void){
printf("Hello World!!");
return 0;
}

をいじって実行するとどんなエラーが出るか見てみましょう。

29 :名無し三段:2017/10/15 11:16:43 (7年前)  0MONA/0人

例1 (stdio.hを取り込まない場合)



paiza.ioのコンパイラは優秀なのか、コンパイルエラーを吐きつつもHello World!!を出力します。 エラーメッセージを参照すると「関数printfがない。 stdio.hをincludeするかprintfという名前の関数を作るかしろ」という意味のメッセージが書かれています。
今回は実行してくれましたが、他のコンパイラでは「printfってなんだよハゲ」と言って実行しないことがほとんどです。

【蛇足】(初心者は読むと混乱するかもなので別世界の話だと思っててください)
知っている人は知っている「ポケットコンピュータ」ではincludeしなくてもいい。むしろincludeしたほうがコンパイルエラーが出る謎仕様。

30 :名無し三段:2017/10/15 11:19:31 (7年前)  0MONA/0人

例2(返り値を書かない場合)

めんどいので画像省略しますが、paiza.ioでは書かなくても同じように実行するようです。
しかし、他人に見せるプログラムではルールを守ってreturn 0;を書きましょう

31 :名無し三段:2017/10/15 11:25:23 (7年前)  0MONA/0人

疲れたので第一部はここまで
第二部は午後気が向いたら

<宿題(なぜうまく実行できないのか、考えてみよう)>

32 :名無し三段:2017/10/15 11:31:28 (7年前)  0MONA/0人

今後の流れとしては
数値計算(関数の作成や、再帰関数)
繰り返し文
stdio.h以外のヘッダファイル
競技プログラミングのすすめ
動的計画法
有名なアルゴリズム
を考えています。
多分、というより間違いなく今日中には終わりません。

33 :もなむーる名無し八段:2017/10/15 11:40:47 (7年前)  0.039MONA/1人

↓【コラム】
プログラミング言語もまたプログラムです。よってバグがあったり仕様が変わったりします。
本文で取り扱っているC言語も、何回かの改定があり、その改定ごとに細かいところが変遷しています。

例えば、以前のC言語では main 関数の返値は return 文で明示しなければならないという仕様でした。しかしながら C99 と呼ばれる版から「return 文が呼ばれない main 文からの脱出では return 0 が呼ばれたのと同じと見做す」という変更が行われました。paiza.io の後ろで動いているCコンパイラの準拠バージョンは C99 よりも新しい C11 に準拠していますので、return 0 を省略しても警告やエラーは出ないはずです。

それでは今や return 0 を省略しても問題ないでしょうか? それは難しい議論です。C言語は自動車や白物家電など、長く使われる製品で利用される傾向があるので、それらの製品では C99 よりも前のコンパイラを使っているかもしれません。つまり return 0 は事実上省略できません。

医療機器や自動車など、仕様の違いに基づくバグが人命を脅かすような分野では、用いるコンパイラの準拠仕様が明確に定義されることが一般的です。
初心者を卒業した、暇な時間に準拠標準について軽く調べてみると、もう一段ステップアップできるかもしれません。
↑【コラム】

34 :もなむーる名無し八段:2017/10/15 12:20:53 (7年前)  0MONA/0人

↓【コラム訂正】
誤> 以前のC言語では main 関数の返値は return 文で明示しなければならない
正> 以前のC言語では main 関数の返値は return 文で明示しない場合、仕様上は未定義(挙動としては不定値)
細かいことかもしれませんが、念のため。
↑【コラム訂正】

35 :名無し三段:2017/10/15 13:29:21 (7年前)  0MONA/0人

んじゃあ第二部
>>31について

printf関数は、printf("出力する文字列");というように記述する
が、今回は「%」や「"」、「\」を表示させたい。
%と\はまだ説明していないのでこの文字を表示させるのが単純でない理由はわからないが、"についてはこれを表示させるのが単純でないのは、このprintf関数の文法的にわかるだろう。

ではどうやって表示させるか?

36 :名無し三段:2017/10/15 13:34:59 (7年前)  0MONA/0人

実はprintf関数は、文字列だけでなく、改行等も出力することができる。
この改行は、「\n」で表わせる。
なお、環境により「\」の記号が「Yに横線2本」もしくは「スラッシュ/の逆向き」が表示されることがあるが、これは同じものである。

この「\」は、特殊文字の1文字目として扱われる。
特殊文字の例の1つとして、改行\nがある。
そして、問題の「"を表示させる特殊文字」が「\"」である。

37 :名無し三段:2017/10/15 13:42:29 (7年前)  0MONA/0人

特殊文字は「エスケープシーケンス」とも呼ばれる。

じゃあ「\」を表示させるには?
これの特殊文字は「\\」である。

じゃあ「%」を表示させるには?
「\%」…ではないというひっかけがあります。

先程「\」で始まるのが特殊文字(エスケープシーケンス)と言いましたが、今度は「%」で始まる「フォーマット指定子」というものがあります。これの具体例は後で説明しますが、「%はフォーマット指定子の1文字目」とコンパイラが認識します。
なので、「%」を表示するフォーマット指定子が存在し、それは「%%」です。

38 :名無し一級:2017/10/15 13:42:39 (7年前)  0.039MONA/1人

>ってことでC言語やRuby、PHPといったプログラム言語がある。
>「機械語に変換」するモノを「コンパイラ」と呼ぶ。
>「コンパイラ」が機械語に変換する行為を「コンパイル」と呼ぶ。

コンパイラの説明でRubyとPHPを並べるのはどうなんだ?
スクリプト言語は機械語には変換されないぞ

39 :名無し三段:2017/10/15 13:46:08 (7年前)  0MONA/0人

チルダ「~」の表示(環境によって、このフニャフニャが中央にあったり上によったりますが、同じものです。)
はそのまま「~」でよいです。(この問題は結構ひっかけがおおいです。)

よって、模範解答は

40 :名無し三段:2017/10/15 13:52:35 (7年前)  0MONA/0人

>>38
実はRubyとPHPは適当に挙げただけで実は俺その言語は勉強してない。
ググってみたらこの2つってインタプリタ型なのか。

コンパイルを必要とする言語っていうとあとc++とかjavaかな

41 :名無し一級:2017/10/15 13:59:17 (7年前)  0MONA/0人

>>40
そうだね

42 :名無し三段:2017/10/15 14:02:37 (7年前)  0MONA/0人

じゃあ次はprintf関数で変数を表示する方法について
「変数」とは値を入れる箱、のようなものです。
この箱、はパソコンのメモリ上に確保されます。
その箱には名前(変数名)と「型」がついていなければなりません。

例えば
int i;
と記述すれば、
「int型で、変数名はi」という変数を宣言したことになります。(変数は、宣言しないと使えません。)

>>10でもint型という言葉を説明なしで使ってしまっていた事をここで謝ります。

「int」は「integer」という単語をもじったもので、「整数」という意味です。
なので、int型は「整数」の値のことを言います。

43 :名無し三段:2017/10/15 14:07:43 (7年前)  0MONA/0人

しかし、整数型だからどんな整数でも扱えるか、格納できるかというと、それはNOです。
先ほど書いたように、変数はパソコンのメモリ上に格納されます。
非常に大きな数字、99999999999999999999999999999999999999999999999999999999999999999999999を格納できるかというと、できません。

環境によって異なりますが、paiza.ioではint型は4byte(32bit)となっています。
4byteで表わせる範囲は-2147483648~2147483647です。(なぜこの値なのか、について詳しくは説明しません。)
だいたい±21億です。

44 :名無し三段:2017/10/15 14:13:23 (7年前)  0MONA/0人

整数型の変数をprintf関数で表示するには以下のように記述します。

printf("%d",i); //iは既に宣言されている値とする。

先程ちょっと説明しましたが%はフォーマット指定子の1文字目です。
%dは「整数を10進数で出力する」という意味のフォーマット指定子です。
恐らく、dはdecimal number、日本語で10進数のことだと思われます。

45 :名無し三段:2017/10/15 14:17:49 (7年前)  0MONA/0人

とりあえず、変数iを宣言し、出力してみましょう。

そうすると、全く心当たりのない数字が出力され、しかも実行するたびにこの値が変動します。

実は、変数を宣言しただけでは、メモリ上に変数が格納される場所が確保されるだけで、もとからあった値(ゴミみたいなもん)が残っています。
こういった値を不定値と呼ぶこともあります。
なので、変数を扱う場合は、初期化するか、任意の値を代入しなければなりません。

46 :名無し三段:2017/10/15 14:21:05 (7年前)  0MONA/0人

初期化について

初期化は、変数を宣言するときに
int i=0;
のように記述します。0でなくても構いません。

ただし、
int i;
i=0;
といった書き方は結局iに0が格納されていますが、初期化とは呼びません。

47 :名無し三段:2017/10/15 14:24:03 (7年前)  0MONA/0人

ここで数学とプログラミングの大きな違いがあります。
「i=0」を、
数学的に説明すれば「iと0は等しい」という意味ですが
C言語では「iに0を代入する」という意味です。
C言語で「iと0は等しい」を意味するには「i==0」と表現します。これは後で説明するif文などで用いられます。

48 :名無し三段:2017/10/15 14:30:09 (7年前)  0MONA/0人

算術式の表記は、ほとんどは数学と同じですがところどころ異なる点があります。
例えば掛け算の記号は数学では×ですが、C言語では* (アスタリスク)
割算は/ (スラッシュ)
割算のあまりは % です。
ちなみに、()カッコでくくった中を先に計算するというルールはC言語にもありますが、中カッコ{}や大カッコ[]はC言語の算術式には使いません。
例えば
(3*(2+1))*4+1
のように、()を二重にも三重にもつかって表記します。
なお、
(3*(2+1))*4+1は37です。

49 :名無し三段:2017/10/15 14:35:07 (7年前)  0MONA/0人

変数名のルールについて説明を忘れてました

ルールは
・アルファベットの大文字小文字と、アンダーバーと数字が使える
・大文字と小文字は区別される
・1文字目に数字は使用不可
・既に使用されている名前は使用不可

既に使用されている名前とは、例えばintやprintfです。しかし、stdio.hをインクルードしていなければprintfを変数名として扱えます。

50 :名無し三段:2017/10/15 14:41:06 (7年前)  0MONA/0人

疲れた 第二部終了
続きは夜

宿題 以下の順番で処理するプログラムを書け。

整数型の変数を次のように宣言し、初期化する。
a=2,b=3,c=4

aに、bとcを掛け合わせた値を代入する。

bとcを足し合わせた値を、aで割った値をint型で表示する。

bとcを足し合わせた値を、aで割った余りの値をint型で表示する。

*ただし、表示される2つの値の間に改行が行われていること。

51 :名無し三段:2017/10/15 14:43:48 (7年前)  0MONA/0人

>>50追記

int型で表示、は10進数の表記。符号の有無は問わない。

52 :名無し二段:2017/10/15 14:56:14 (7年前)  0MONA/0人

日頃何してる人?

53 :名無し三段:2017/10/15 15:06:38 (7年前)  0MONA/0人

>>52
装置の製造
プログラミングは一切関係ないお仕事、独学(ネット)だけでプログラミング勉強してる。楽しい。

54 :名無し初段:2017/10/15 15:16:16 (7年前)  0MONA/0人

Swiftって需要がないからみんな使ってない感じ?

55 :名無し三段:2017/10/15 15:23:07 (7年前)  0MONA/0人

>>54
仕事では一切プログラミングしてないからそういった業界はよくわからんのね、
Apple用のアプリってSwift以外でも(今も)開発できるもんなの?

56 :もなむーる名無し八段:2017/10/15 15:35:01 (7年前)  0MONA/0人

>>38
> スクリプト言語は機械語には変換されないぞ

んー。そういう理解をしている人は案外多いけれども、実際のところはそうでもない。
裏で JIT コンパイルされる処理系はそれなりにある。
バイトコードも機械語に含めてい良いなら、更にある。

57 :名無しのSEもどき初段:2017/10/15 15:35:37 (7年前)  0MONA/0人

多分本当に何も知らない人はここまで読んでも関数だの変数だのが全然理解できない人もいそう。
あまり事細かにこうだよって最初から説明しちゃうとその時点で理解が追いつかなくなってめんどくさそーだしやーめたってなる人とか、知らない言葉過ぎてわからんからやーめたって思考放棄する人結構いるから・・・
自分で頼んでおいて、何かと理由をつけてサボりたがるダメな友人に教えた時のアレ

関数ってのは
・ある結果を得たい時に呼び出すもので、呼び出すと決まった処理をしてその結果を返してくれる
・関数には大雑把に2種類ある。最初から使えるようになっているものと自分で作らないと使えないもの
・関数の中身はいろんな処理が書かれている

58 :名無しのSEもどき初段:2017/10/15 15:36:10 (7年前)  0MONA/0人

RPGなんかでよくある「おつかいクエスト」をプログラムに置き換えたようなものかな

AというNPCから「アイテム1もってきて!Bが持ってるから!」というクエストを受けた(関数が呼び出された)

Bを探してAに頼まれたと説明した(処理1つめ)

Bは今手元になくてCが作れるからそっちに頼めと言われたからCに頼む(処理2つめ)

Cは今手元に材料がないからすぐ必要なら材料あれば作るぞと言っているから材料を探しに行く(処理3つめ)

材料が揃ったからCに作ってもらった(処理4つめ)

Aに頼まれたアイテム1を渡した(処理5つめ)

Aからお礼としてアイテム2をもらってクエスト完了(関数の処理結果)

59 :名無しのSEもどき初段:2017/10/15 15:37:27 (7年前)  0MONA/0人

これでプログラミングを何も知らない人もとりあえずどんなものかぼんやりと理解はできるんじゃないかなぁ
突っ込みどころはたくさんあると思うけど、そこら辺によくある「何も知らなくてもOK!」という謳い文句のくせに中身をみたらわけの分からない言葉のオンパレードだったという入門書よりはマシだと思う。

60 :名無し先輩三段:2017/10/15 15:42:18 (7年前)  0MONA/0人

でもなんでC言語なにゃ???

61 :名無し一級:2017/10/15 15:47:55 (7年前)  0MONA/0人

>>56
そりゃーJIT考えればそうでしょうけど
それにバイドコード云々いい始めたらコンパイラは別に変換先が機械語でなく、別の中間言語に変換するようなプログラムを指しても使われるからさらに広くなる

初心者スレだし狭義として変換先は機械語くらいの認識でいいと思うけど

62 :名無しのSEもどき初段:2017/10/15 15:48:48 (7年前)  0MONA/0人

あと、これから何かプログラミングをやってみようという人も最初から厳密に理解する必要はないですよ
最初はなんとなくでいいんです。理屈から覚えようとすると早い段階から「あ・・・あれ?」ってなっちゃう人も結構います。
最初は理屈抜きで、過程はすっ飛ばして結果から覚えとけばいい。1+1の結果は2なんです。なんで2になるのかなんて最初は気にしなくていいんです。
電柱に本気で回し蹴りぶちかましたら自分が痛いだけなんて考えなくてもわかるでしょう?でもなんで痛いのかよく考えていくとちゃんと痛い理由に行き着く。最初は結果だけ覚えておけばいいんです。
結局プログラミングは習うより慣れろな事が多いので・・・
あまり深く考えずに最初はこれを実行したらこれが返ってくるもんだとだけ覚えておけば、色々やってるうちに後々勝手に理解が追いつきます。
最初から理屈でなんでそうなるのかからしか覚えたくない!覚えられない!という人はオライリーの本があってるんじゃないでしょうか。あれは解説書・技術書というよりも読み物に近い本が多いので理屈から覚えられる気がする

63 :もなむーる名無し八段:2017/10/15 17:29:46 (7年前)  0MONA/0人

>>61 話を合わせて ahead of time の言語処理系コンパイラに狭めてもいいけれども、現在的なコンパイラ実装の多くは、機械語を生成しているわけではないよ。

初心者スレだからということでお茶を濁すのであれば
「コンパイラとかインタプリタとか大昔は区別したけれども、技術の進歩の結果、言語処理系そのものを作るような一部のエンジニア以外、今やあまり気にしなくてもよい」では?

64 :名無し三段:2017/10/16 21:26:00 (7年前)  0MONA/0人

仕事忙しくて話がさっぱり進めない。
水曜日は定時退社日なのでその日に続きやります。

65 :名無し一級:2017/10/16 22:29:15 (7年前)  0MONA/0人

#include<stdio.h>
int main(void){
while(1){
printf("nullpo\n");
}
return 0;
}

66 :Uran 初段:2017/10/21 05:48:09 (7年前)  0MONA/0人

参加しまーす。

67 :名無し三段:2017/10/21 17:50:16 (7年前)  0MONA/0人

遅くなってごめんなさい、では続き
>>50
の解答コード


(3+4)/12の商と余りを表示します。
7/12は、小数点以下まで計算すれば0.5よりちょっと大きい値になりますが、int型で計算した場合、小数点以下は切り捨てられます。

68 :名無し三段:2017/10/21 17:53:57 (7年前)  0MONA/0人

ここからは、問題とその解答、の形式でしばらく進めます。
質問があればそれを優先して回答します

では次の問題、
7/12
の計算を小数点以下まで行え。

69 :名無し三段:2017/10/21 18:05:09 (7年前)  0MONA/0人

数学的には、
7/12=0.58333333333333…と、永遠に3が続きます。
しかし、パソコンにこの計算をさせると以下のようになります。

https://imgur.com/a/YWuaD

説明なしで使用しましたが、
そのまま7/12、と整数型同士で計算を行うと、勝手に小数点以下が切り捨てられてしまいます。そこで、これは別の型であることを明記しなければなりません。
小数点以下までの値を扱う型として、
float
double
の2つがあります。

70 :名無し三段:2017/10/21 18:11:27 (7年前)  0MONA/0人

画像表示ミスった


環境によってサイズは異なりますが、doubleはfloatよりサイズが大きいです。
このdoubleやfloatの型を「浮動小数点数」と呼びます
float型は4バイトでメモリ消費はint型と同じですが、21億よりも大きい値や、小数点以下も扱えるすごい便利なやつ…に見えますが、実は「有効数字」が限られています。
(doubleは、名前の通りfloatの2倍、8バイトです。)


71 :名無し三段:2017/10/21 18:15:03 (7年前)  0MONA/0人

int型とメモリの使い方がことなり、4バイト、32bitを以下のように使います。

int型…符号(+か-)かを表すのに1bit、絶対値を表わすのに31bit
float型…符号を表すのに1bit、指数に8bit、「仮数」に23bit使用します。
詳しくは外部のページに説明を丸投げします。。。

http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html

72 :名無し三段:2017/10/21 18:18:50 (7年前)  0MONA/0人

整数は「int」
小数点を扱う場合は「double」
とだけ覚えればとりあえずokです。

7/12の計算の話に戻ります。そのままではint型で計算されるので

(double)7/12

と表記します。このように(型の名前)とするのを「キャスト」もしくは「型変換」と呼びます。しかし、「型変換」は他の状況でも行われるので、「」

73 :名無し三段:2017/10/21 18:19:24 (7年前)  0MONA/0人

途中で送信してしまった
「強制型変換」や「明示的型変換」などと呼ばれます。

74 :名無し三段:2017/10/21 18:21:54 (7年前)  0MONA/0人

floatやdouble型を表示するフォーマット指定子は%fです。
表示する桁数を
「%.〇f」とすることで指定できます。

フォーマット指定子の一覧をググるとこんなページもあるので、参考にしてください。
http://www.k-cube.co.jp/wakaba/server/format.html

75 :名無し三段:2017/10/21 19:01:07 (7年前)  0MONA/0人

じゃあprintf関数の次、scanf関数について

今までは何度実行しても同じ出力するプログラムでした。
scanf関数は値をプログラム実行時に入力するための関数

例題:2つの値が入力されるので、その和を出力せよ。ただし、2値は改行区切りで入力される。

76 :名無し三段:2017/10/21 19:12:20 (7年前)  0MONA/0人

printf関数では、("%d",a);
と、フォーマット指定子があったら、カンマ区切りで変数名をそのまま入力していましたが
scanf関数では("%d",&a);というように&が必要です。

理由は難しいので今は読み流してもらっても構いませんが、以下に記載します。
-----
scanf関数では、入力の取り込み先をアドレスで指定する必要があります。アドレスとはメモリ上の住所です。&aとは、「変数aは、メモリ上のどこなのか?」という意味になります。
printf関数で、変数名に&を付けると、格納しているアドレスが表示されるので、試してみてください。

-----

77 :名無し三段:2017/10/21 19:16:08 (7年前)  0MONA/0人

scanf関数のちょっとだけ応用的な使い方の問題
2+5
というように、2値の間に「+」が入った状態で2値が入力されるので、その2値の和を出力しなさい。

78 :名無し三段:2017/10/21 19:20:33 (7年前)  0MONA/0人

疲れたので今日はここまで、明日はif文、while文、などの繰り返し文からはじめまーす

79 :名無し初段:2017/10/21 21:39:46 (7年前)  0MONA/0人

プログラムの取っ掛かりとしてはRPGツクールって優秀だったよなあと思う
関数覚える必要ないし

80 :Uran 初段:2017/10/22 04:20:22 (7年前)  0MONA/0人

良い日になりますように。。

81 :名無し三段:2017/10/22 16:37:07 (7年前)  0MONA/0人

じゃあ次はif文
例題:2つの値が入力されるので、一致していた場合は
「(1つ目の値)=(2つ目の値)」
と表示せよ。一致していない場合は何も表示しなくてよい。


if文の文法としては、
if(条件式){
(条件式が真の時にする動作)
}
です。

82 :名無し三段:2017/10/22 16:38:05 (7年前)  0MONA/0人

前にも一度書きましたが、C言語では、
「=」は「等しい」という意味ではなく「代入」です。
「等しい」を表現するには「==」です。

83 :名無し三段:2017/10/22 16:43:12 (7年前)  0MONA/0人

例題2:2つの値が入力されるので、一致していた場合は
「(1つ目の値)=(2つ目の値)」
と表示せよ。一致していない場合は
「(1つ目の値)!=(2つ目の値)」と表示せよ。

if文の文法part2
if(条件式){
(条件式が真の時にする動作)
}else{
(条件式が偽の時にする動作)
}

この真ってのは、条件式がおかしくない、その通り!っていう意味で、偽はおかしい、違うという意味
3==3は真で、2==5は偽

84 :名無し三段:2017/10/22 16:47:23 (7年前)  0MONA/0人

例題3:2つの値が入力されるので、一致していた場合は
「(1つ目の値)=(2つ目の値)」
と表示せよ。1つ目の値が2つ目より大きい場合は
「(1つ目の値)>(2つ目の値)」と表示せよ。
上記2条件に当てはまらない場合は何も表示しなくてよい。


if文の文法part3
if(条件式1){
(条件式1が真の時にする動作)
}else if(条件式2){
(条件式1が偽で、条件式2が真の時にする動作)
}

85 :名無し三段:2017/10/22 16:50:15 (7年前)  0MONA/0人

例題4:2つの値が入力されるので、一致していた場合は
「(1つ目の値)=(2つ目の値)」
と表示せよ。1つ目の値が2つ目より大きい場合は
「(1つ目の値)>(2つ目の値)」と表示せよ。
上記2条件に当てはまらない場合は
「(1つ目の値)<(2つ目の値)」と表示せよ。

if文の文法part4
if(条件式1){
(条件式1が真の時にする動作)
}else if(条件式2){
(条件式1が偽で、条件式2が真の時にする動作)
}else{
(条件式1が偽で、条件式2も偽の時にする動作)
}

86 :名無し三段:2017/10/22 17:01:28 (7年前)  0MONA/0人

ファイル分割した際に
グローバル変数の宣言の仕方を教えてください。

87 :Uran 初段:2017/10/27 23:38:28 (7年前)  0MONA/0人

参加しますね。

お気に入り

新規登録してMONAをもらえた

本サイトはAsk Mona 3.0に移行しましたが、登録すると昔のAsk Monaで遊ぶことができます。

新規登録ログイン