ひな形は、このページからコピーしたりすれば一瞬で手に入りますが、 「あえて手で打ち込むこと」を強く推奨します 。
小中学校といろいろ覚えるときに、ひたすら繰り返しノートなどに書いて覚えたと思います。
一番最初のひらがなから。
それと同じです。意味がよくわからなくとも、打ち込み続けることで頭だけではなく指も慣れ、最後にはなかば無意識でプログラムが作れるようになると思います。<なった人
また、コピーは一瞬過ぎて、その内容を考える暇がありません。
打ち込む速度で考え、動かしてエラーが出たときにどこがおかしいのかを探し、直すことで、次第に意味が通じるようになります。
プログラムにはいろいろな形式があります。
最終的には、コンピュータが直接理解できる、01なデータの固まり(マシンコードとか、バイナリとか呼ばれます。)として実行されることには違いありませんが、たとえば、
A=B+C
と書いたり、
B+C→A
と書いたり、
BとCの合計をAに入れる
と書いたり、単に合計を求めるにもそれらしくわかる書き方がいくつかあるように、「指示の仕方」が何通りもあります。
指示の仕方の文法を取りそろえたものをプログラミング言語で、膨大な種類があります。
(すでに業界でよく使われるものがあっても、それなりに欠点があるので「俺様言語」を開発する人がたくさんいるので。その中から爆発的に広く使われるようになる言語もたまにあります。)
「プログラムをつくる」ということは
その観点からすると、プログラムの作り方を学ぶにはいろいろな言語が使えますが、ここではC言語を使います。
C言語(およびその改良版?であるC++言語)は幅広く使われています。
その特徴として、比較的「みてわかりやすい」言語でありながら、コンピュータの隅々まで指示できる「汚さ、泥くささ」をもった言語です。
情報系や計算系の立場的には、コンピュータのハードウエアにちょっかいを出すことは想定されていませんが、機械をコンピュータで動かそうというときには、ハードウエア操作も不可欠になります。
C言語の開発由来もそれ系で、いまでは、「組み込み」と呼ばれる機械に近いところで動くプログラムを書くときにはなくてはならない言語になっています。
一方、機械科のコンピュータ系演習科目で使われる頻度が高いFORTRANという言語は、主に計算向きです。機械制御などは想定されていません。
比較的文法などが(コンピュータからみて)単純で、演算の高速化(最適化=勝手に処理順序を入れ替えるなど)がしやすいとされています。
以前はスーパーコンピュータはFORTRANでなければ動かせないといわれてましたが、最近は普通にC言語も使えるようです。
たとえば、
「できること二つ」は組み合わせ次第で、いろいろな計算ができます。
ただし、実際にプログラムを作るには、言語ごとに「演算式の書き方」と「判断する対象の書き方」を覚えておく必要があります。
なお大前提として、プログラムは「半角英数記号」だけで書きます。全角はつかえません。
また、後述しますが、原則として各記述(数式など)の後ろには「;」(セミコロン)をつけます。
また、プログラムの中で 「/*」「*/」 で囲まれた部分(複数行のことあり)、1行のなかで「//」の後ろは「コメント」といって、無視されます。
メモ書きなどに使えますし、日本語もそこなら使えます。
変数=値の入れ物 です。
表計算ソフトのセルにあたるものですが、あれに比べるとずっと制限がきつく、予め「○○の種類を入れる」と決めて、かつ、自分で名前をつけておかなければ使えません。
(種類を決めることで効率はよくなる。何を入れるかわからない容器よりは、わかっているほうが適切な大きさ、また、使うときに気を遣わなくなるため。名前は「自由につけられる」という利点。)
この講義で使うものは
整数や小数の変数を用意するときは
int i,j,k,seisuu;
double a,b,c,shosu;
と書きます。複数を同時に作りたいときは「,」で区切ります。
以下雑学:
小数に整数が含まれますが、普通はあえて、整数ですむものは整数ですませます。
一つは効率の問題です。1+1を計算したいときに、1.0000000+1.0000000と電卓を打つのは無駄です。
もう一つは、なんでも小数でやると、思わぬ失敗をすることがあるからです。
特に、直接的、間接的に回数を数えるときに小数をつかうと失敗する場合があります。
(有名どころとしては、0.1+0.1+0.1+...という計算で誤差が出る。<0.1は2進数で表現できない数:循環小数)
そこで「整数ですますべきところは整数ですませる」癖をつけておく必要があります。
今回の演習環境ではintは±20億くらい、doubleは有効桁数15桁(で10の±300乗)くらいの範囲が表せます。
使い方にもよりますが、困ることはあまりないかもしれません。
(たとえば、10の5乗に10のマイナス12乗くらいを加えると無意味、という問題が生じる)
蛇足ですが、いろいろな習わしの関係で、変数で「i,j,k,l,m,n」は普通は整数にします。
Σなどでもよく出てきますが。
習わしは文法でもないので、ある意味無視してもかまわないのですが、業界標準の習わしを無視すると、だれかに見せたりするときに誤解を招くことがあるので、普通は従っておきます。
習わしの重要な例で「赤と黒の電線があったらプラスは赤にする」というものもあります。
その慣例を無視して逆につなぐと、別の人が先入観で電源をつないで回路から煙があがることになります。
(俗に、iはinteger:整数のi, nはnumber of:個数のnでその周囲が使われているとか。
一般に、i,j,kは数を順番に数えるため、l,m,nは全体の個数を表したりするときによく使われます)
C言語では普通に数式を書くに書けます。ただし、×を省略しては書きません。
C言語のプログラムは式の計算などを一つ一つを手順を順番に書くことで構成されます。
おのおのの手順は、以下の2通りで書かれます。
C言語で普段使う条件による実行「もし〜なら〜する、さもなければ〜する」の系統は、大きく3種類が使われます。
C言語で手順をまとめて、独立した1ブロックにしたものを関数といいます。
関数には入力するもの「引数(ひきすう)」と出力の値「返値(かえりち)」があります。
b=sin(a);
は普通の数学の関数に見えますが、C言語的には「aという引数をsin()という関数に渡して、その返値をbに代入」と解釈します。
基本的に関数は、
関数(引数,引数,引数,...)
と「()」が必ずつきます。たまにある、引数のない関数は「関数()」と表記します(例としては「乱数を返す関数」とか)。
また、普通の関数は引数の数は決まっています(sin関数も値をいくつも与えない)。
関数は手順をまとめて使いやすくしたものなので、たまに(わりと)、
関数();
とだけプログラムに書かれることがあります。
これは本当に手順だけをまとめていて、渡す値もなければ、戻ってくる値も使わないという状態です。
返値があっても、利用する必要はありません。また
b=sin(a)*cos(a);
のように、式の一部として使うことももちろんあります。
関数を自分で作ることもできますが、とりあえず、使い方だけ把握しておきます。
一番簡単なプログラムの構成
#include <stdio.h> // 普通は書く(この // の後ろはコメントで無視される) #include <math.h> // 数学関数を使う場合 cos, sin, tan, log, sqrt など int main(void) // 必須。ここからプログラムが実行される { // この { も必須 手順; : 手順おしまい; return 0; // 文句なく終わるおまじない。ないと文句いわれる } // ここまでプログラムを作る、という場合、まずは勢いでこれだけ書いてしまって、あとから中の手順を書く、というのが初心者にはお勧めです。
![]() |
右クリック→新規作成→フォルダ |
![]() |
ファイル名を変更 |
まず、cygwinのフォルダ(マイコンピュータ→Windows(Z:)→cygwin)を開きます。
ここにはすでに、makereportフォルダがあるはずです。
makereportフォルダのほかにprogramフォルダをつくります。
フォルダのウインドウで、「右クリック」→「新規作成」→「フォルダ」。
フォルダができて、「新しいフォルダ」と青く表示されていたらそのまま「program」(enter)と入力します。
青くならずに、ただ「新しいフォルダ」ができたら、フォルダを選んで「右クリック」→「名前の変更」で変更できます。
以後、作業はこのprogramフォルダで行います。
C言語でプログラムを作って動かすには、以下の3手順が必要です。
![]() |
右クリック→新規作成→テキスト |
![]() |
ファイル名を強制的に '○○.c'に変更 |
![]() |
フォルダオプション |
まず、先ほど作ったprogramフォルダを開きます(最初は空のはずですが)。
ここで「右クリック」→「新規作成」→「テキストドキュメント」を選びます。
すると、"新規テキストドキュメント.txt"とか、ファイル名が勝手についたファイルができるので、これを「prog1.c」に変えます。
(上のフォルダ名を変えるのと同じ操作)
変えようとすると「拡張子を変えていいんですか」的な確認を求められますが、そのままOKします。
すると、「C」と書かれたアイコンのファイルに変わります。
(中身は空のファイル、ただ、".c"をつけたことで、Windows的にはC言語用のファイルと思うことにした)
この際、もしも、"新規テキストドキュメント"に".txt"がついていない場合(右2枚目の青○の中:この例ではついている)、フォルダのウインドウのメニュー→「ツール」→「フォルダオプション」を開き(右図3枚目)、「表示」タブの「詳細設定」の下の方の「登録されている拡張子は表示しない」に「チェックが入っていたら」外してください(→適用ボタン)。もし、チェックがついていないのに表示されない場合は、相談してください。
![]() |
VisualStudioの画面 |
![]() |
ソースを入力する |
![]() |
C言語ヘルプ |
開いたら(空ですが)、以下のプログラムを入力してください。
#include <stdio.h> #include <math.h> int main(void) { int i,j; j=0; for(i=0;i<10;i++) { j=j+i; printf("%d %d\n",i,j); } return 0; }※プログラムの各行の先頭の空白は、プログラムとしては「どうでもいい空白」でなくともかまわないものです。 ただ、対になる{と}を明白にするため、また{}で囲まれた部分は一つの手順のまとまりなので、その構造を明確にするため、空白をいれて右に段々にします。
いれたら保存してください。
注意
プログラムはこのページからコピー&ペーストすることなく、 手で入力 してください。
文字を鉛筆で書いて覚えたように、プログラムもまた、キーボードから繰り返し打ち込むことで、なれて覚えてきます。
includeとかmainとかprintfとか、毎回出てくるようなキーワードもすぐになれます。
プログラムを作れるようになる、とは、成功や失敗を繰り返すことで、経験値を増やすことです。
コピペですましてしまうと、おそらく、入力ミスなどに起因するエラーに遭遇することもありません。
それではなんのためにもなりません。今はよくても演習課題やレポートのときに、自分でできなくなる確率も上がります。
以上で、ひとまずソースの作成は終了です。
参考:
Visual Studioは本来C言語などの開発環境一式のソフトです。
そのエディタだけをつかっていますが、便利な機能として、適当なキーワード(たとえば、見慣れない printf とか)にカーソルを置いてF1キーを押すと、なんらかの解説がでることがあります。
実際には、あまりに関連する項目が多すぎて、期待するものではないかもしれませんが、使い慣れてくると、プログラムを作るときの辞書代わりに使えます。
次は変換作業を行います。
デスクトップにコピーした「cygwinへのショートカット」を起動します(もしくはマイコン→Y:→cygwin→cygwinへのショートカット)。
(基本的にレポート提出の手順と近い)。
つぎに、$マークが出たら
$ cd program ($が表示されているところに cd.. 入れてEnter)と入力します。さっき作ったprogramフォルダで作業するように指示しました。
そこで、
$ gcc -o prog1 prog1.cと入力します。
まったく問題がなければ、何事もなかったかのように、また$がでます。
programフォルダをみると(F5を押すと)prog1.exeができています(残念ながらダブルクリックしても動きません)。
そうでない場合は、「error」とか「warning」とか書いてあるエラーが出てきます。英語で。
プログラムを作る以上、これらは避けて通れません。これになれるのも重要ですので、出たら、正面から向き合ってください。
英語ですが、よく見ると単純なことしか、普段はいってません。
必要なら、まずは単語を調べてみましょう。
→gooの辞書、
→英辞郎
ついでに、表示をみると、"line ??"と書いてあります。これはエラーが出た場所が何行目かを表しています。
この手のエラーのやっかいなところは、その行よりも前の間違いでもエラーがでることですが、まずは、指定された行をみてみましょう。
あっさりと「これじゃだめじゃん」な間違いに気づくかもしれません。
典型的なエラーは別にまとめておきます。
エラーは直して、ソースを保存して、またコンパイルです。
その際、cygwinのウインドウで「↑」(上矢印キー)を押すと、直前のコマンドをさかのぼって呼び出せます。覚えておくと便利です。
![]() |
コンパイル→実行 |
![]() |
プログラムが止まらなくなった! |
![]() |
Ctrl-Cで止める |
$ prog1レポートをつくるmakereportも、gccもcygwin上で実行できるようにつくったプログラムなわけで、新たに、自前でprog1というソフトをつくったことになります。
今回のプログラムはすぐに「$」が戻ってくるはずですが、表示が止まらないとか、なにもおこらないという場合は、プログラムが間違っていて暴走している可能性があります。
プログラムの強制停止 はControl-Cです。変だと思ったら、とりあえず押してみましょう。
なお、それでもだめそうなときは、cygwinのウインドウごと消してしまってもかまいません。
期待通りのプログラムなら、
$ prog1 0 0 1 1 2 3 3 6 4 10 5 15 6 21 7 28 8 36 9 45とか表示されると思います。
出力には様々な方法があります(ある意味、ロボットが動くのも「ロボットを動かすプログラムの出力の結果」)が、一番手っ取り早いのは、そのまま画面に数字等で表示してしまうことです。
ここでは、その代表格であるprintfを簡単に説明します。
画面に出力する際にもっともよく使われるものに printf()関数があります。
関数といっても返される値には関心はなく、もっぱら「便利な機能をまとめたもの」としての関数です。
本講義でも頻繁に使いますが、世の中でもよく使われています。
それを端的に表す言葉として「printfデバッグ」(デバッグ=誤りによる不具合解消)という言葉があるくらいです。
プログラムは、コンパイルができれば(エラーなどがなければ)完全というわけではありません。
むしろ、たいていはそこがスタートラインで、そこから機能的に望んだものかどうかのチェックと修正という、最重要段階が始まります。
その際、動作が怪しいと思ったところで、とりあえず変数の値をかたっぱしから表示させて動作具合をみる、そもそもそこが実行されているか怪しいときに適当にaaaとか表示させてみる、ということを行います。それを称するのが「printfデバッグ」です。
さて、printfは、以下のような使い方をします。
printf("書式文字列",値1,値2,.....);たいていの関数は渡される引数(括弧内に並べる変数など)の数が決まっていますが(sinは1個のみなど)、このprintfは最低1個、そのあと必要なだけ並べるという決まりがあります
「"書式文字列"」は「"」でくくった適当な文字列(文字のつらなり)で、画面に表示される文字を決めます。
ただし、一部に特殊な文字を含めることができます。
ただし、このままだと、表示はきれいにそろいません。整数は必要な桁数を表示するだけ、小数も適当な桁数表示するだけなので、桁数に応じて文字の数が変わったりします。そういうのを気にする場合は、
数値は、%dの場合は整数を、%fの場合は小数を、書式文字列内に%d,%fが出てくる順番に与えます。
例:printf("%d %f %d\n",整数,小数,整数);
間違うと、ぐちゃぐちゃな値が表示されます。
(printfに渡されるのは、あくまでゼロイチな組み合わせの値で、%dか%fかでprintfが解釈の仕方を変えるため)。
この数値は、変数そのもの、ただの数値、数式などがつかえます。
例:printf("%d %d %f\n",i,i*i,3.141592);
ただ、数式を書く場合は、整数のみの演算式だと整数に(%dに対応)、一部に小数が入ると小数に(%f)になることに注意が必要で、また、ただの数値も小数点があるかないかで変わります。
次のプログラム prog2.c をつくって、コンパイル、実行してください。
#include <stdio.h> #include <math.h> int main(void) { int i; double th; for(i=0;i<10;i++) { th=2*M_PI*i/10.0; printf("%d %f %f\n",i,th,sin(th)); } return 0; }
![]() |
printfと修正 |
$ prog2 0 0.000000 0.000000 1 0.628319 0.587785 2 1.256637 0.951057 3 1.884956 0.951057 4 2.513274 0.587785 5 3.141593 0.000000 6 3.769911 -0.587785 7 4.398230 -0.951057 8 5.026548 -0.951057 9 5.654867 -0.587785のような結果が出るはずです。
次に、printfの行を
printf("%d %f(%fπ) %f\n",i,th,(i/10.0)*2,sin(th));と修正して、コンパイル、実行(""の中ならば、全角文字(πや漢字など)使っても問題なし)。
printf("%2d %4.2f(%3.1fπ) %5.2f\n",i,th,(i/10.0)*2,sin(th));のように変えてみましょう(書式文字列のみ)。
$ prog2 0 0.00(0.0π) 0.00 1 0.63(0.2π) 0.59 2 1.26(0.4π) 0.95 3 1.88(0.6π) 0.95 4 2.51(0.8π) 0.59 5 3.14(1.0π) 0.00 6 3.77(1.2π) -0.59 7 4.40(1.4π) -0.95 8 5.03(1.6π) -0.95 9 5.65(1.8π) -0.59
以下、適宜やってみてください。
// kuku.c #include <stdio.h> #include <math.h> int main(void) { int i,j; for(i=1;i<10;i++) // i=1...9 { for(j=1;j<10;j++) // j=1...9 { printf(" %2d",i*j); } printf("\n"); } return 0; }
$ gcc -o kuku kuku.c $ kuku 1 2 3 4 5 6 7 8 9 ←i=1 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 ←i=9よくみれば、とくに不思議なところはないと思います。
インド式の九九は20×20らしいです。
表示を気にしつつ、つくってみましょう。
挑戦 ここまでの内容が楽勝な人は
$ kuku2 | 1 2 3 4 5 6 7 8 9 --+--------------------------- 1| 1 2 3 4 5 6 7 8 9 2| 2 4 6 8 10 12 14 16 18 3| 3 6 9 12 15 18 21 24 27 4| 4 8 12 16 20 24 28 32 36 5| 5 10 15 20 25 30 35 40 45 6| 6 12 18 24 30 36 42 48 54 7| 7 14 21 28 35 42 49 56 63 8| 8 16 24 32 40 48 56 64 72 9| 9 18 27 36 45 54 63 72 81をなるべくエレガントにつくってみましょう。
11/16 の講義開始まで に以下のプログラム kadai1.c をつくって、コンパイルし、実行できることを確認しておいてください。
それをもとに、16日にC言語な課題の提出方法を確認します。
$ gcc -o kadai1 kadai1.c $ kadai1 1 1 1 <ここでは何個か 最後の奇数 合計が 2 3 4 <表示されている 3 5 9 : 125 249 15625 $ <ちゃんと終了するプログラムであること最低限、こんな感じででるように。
いろいろと小細工を考えてみた例:
$ kadai1 1個: 1=1 2個: 1+3=4 3個: 1+3+5=9 4個: 1+3+5+7=16 5個: 1+3+5+7+9=25 6個: 1+3+5+7+9+11=36 7個: 1+3+5+...+9+11+13=49 8個: 1+3+5+...+11+13+15=64 123個: 1+3+5+...+241+243+245=15129 124個: 1+3+5+...+243+245+247=15376 125個: 1+3+5+...+245+247+249=15625 $※もちろん、ここまでやる必要はありませんが、課題が楽勝で飽きる、という学生さんはこういうのをやってみるのいいかも。 このページ、ここで終了。