C言語プログラミングの良くある質問

エディタの使い方

質問 int main() {」のあとにEnter キーを押しても字下げされません。なぜ?

回答 字下げは拡張子「.c」の付いたファイルへのサービスです。新規文書を作成したら、直ちに「.c」を付けたファイル名で保存しなさい(実習1をやり直しなさい)。

質問 プログラムをいじっているうちに字下げがぐちゃぐちゃになってしまいました。一々タブを付けたり取ったりは面倒です。何か良い方法はありませんか?

回答 「編集」→「選択範囲のフォーマット」メニューを実行しなさい。字下げはプログラムの構造を掴む上で重要な情報です。そのために、エディタのサポート機能を活用すべきです。新しい行を挿入する場合は、前の行の行末にカーソルを置いてからEnter キーを押してください。そうすればぐちゃぐちゃにはなりません。

質問 「編集」→「選択範囲のフォーマット」メニューを選んでも、あきらかにおかしい字下げが残ったままです。どうしてですか?

回答 いずれもシステムのバグみたいですね。コンピュータも間違いを犯すのです,VC2010を作っているのは人間ですから仕方がありません。すべてをソフトウェアに頼るのは危険です。「お客様の責任でお使い下さい」。

質問 if(a==b) { c = 1;」の後でEnter キーを押すと字下げされるはずですがそうなりません。なぜですか?

回答 これもシステムのバグみたいですね。

質問 簡潔な短いプログラムと、分かりやすくするために長くなったプログラムとではどちらの評価が高いですか?

回答 「わかりやすさ」優先にしてください。と言っても、長く書けば分かりやすくなるというわけでもない。「長さ」と「わかりやすさ」は反比例の関係ではありません。コメントを丁寧に付けることである程度分かりやすくなるでしょう。

質問 10 行のプログラムなのに、「ソリューション」だ、「プロジェクト」だ、と恐ろしい名前が付けられますが、もっと簡単にできる方法はありませんか?

回答 VC2010 を使う限りはあきらめなさい。普通のエディタを使ってプログラムを作成し(字下げサービスはありません)、「コマンドプロンプト」画面を使ってプログラムを実行させるという、プロ仕様の方法があります。興味のある人はネットで調べてください。

プログラムの実行

質問 F5 キーを押しても何も反応しません?

回答 VC2010 のウィンドウがアクティブになっていますか? 何かの弾みで、VC2010のウィンドウ以外のところをクリックするとそういう症状が出ます。あるいは、1 回実行したあと、実行画面を閉じないで VC2010 を編集していませんか? これもよくあることです。

質問 プログラムをビルドしてエラーが無く、実行画面が表示されたが、プログラム通りの内容が表示されない。表示されたものは、どうやら前のものらしい。

回答 一つのソリューションの中に複数のプロジェクトを作った場合、F5 キーを押して実行されるのは「スタートアッププロジェクト」と決められています。スタートアッププロジェクトは太字で表示しているのですぐに分かります。実行させたいプロジェクトをスタートアッププロジェクトに変更するには、そのプロジェクトの上でマウスを右クリックし、メニューで指定します。

質問 実行の画面はたくさん表示させると最初に表示した結果が消されてしまい、せっかくデバッグのために変数内容を見ようと思っても有効に利用できません。また、コピーして Word に貼り付けることが出来ません。どうしたらよいのでしょうか?

回答 ところどころに「scanf("%d",&check);」という文を挿入しておけば、入力待ちで画面が停止します(check はint 型の変数ならばなんでも)。表示内容を確かめるなり、画面を選んでコピーするなり、用事が終わったら何か適当な数を入力して先へ進めます。結果が大量にあって scanf で一々止めるのは面倒くさい、という場合はファイルへの出力を考えてください。printf の代わりに fprintf を使って画面に表示されるようにファイルへ出力することが出来ます。実行が全部終わってからそのファイルをテキストエディタで開けてみれば結果を取り出すことが出来ます。

質問 文法エラーもなく実行しているらしいのだが、うんともすんとも言わない、フリーズか?

回答 配列変数を使っていて、添え字が暴走するとそうなることが多い。あるいは、for(k=10; k>0; k++) のように絶対終わらない終了条件を書いてしまう場合もある。いずれにしても、自分で発見出来なければダメ。printf 文を有効活用してください。

デバッグの仕方

エラーを無くすことをデバッグ debug と言います。日本語では「(害)虫取り」。

質問 テキストのプログラム通り入力したのに動きません、なぜですか?

回答 テキストが間違っている可能性もゼロではありませんが、 ほとんどの場合、「あなたの」入力ミスです。テキスト通り入力したつもりに なっているのだと思います。もう一度確認してください。カンマを書くべきところがピリオドになっていませんか? 数字の1の代わりに小文字のエルになって いませんか? 0とオーはどうですか? 「"」は正しく入力されていますか? テキストの間違いを発見したら早く教えてください。

質問 実行できません、どこがいけないのでしょう

回答 同じプロジェクトの中に「main()」から始まるプログラムが二つ以上あるかもしれません。あるいは、
スタートアッププロジェクトになっていないかもしれません。あるいは、
単純な入力ミスかもしれません(これが一番多い?)。

質問 コンパイルしたら、エラーが 10 行以上表示されて、途方に暮れています。どうすればよいでしょうか?

回答 エラーが表示されているウィンドウをクリックし、上向き・下向き矢印キーを操作してエラーメッセージの行を選ぶと、そのエラー原因の行が表示されるので、それをダブルクリックすると、プログラムのエラー箇所に矢印が表示されます。エラーメッセージを見ながら、自分の書いたプログラムのおかしいところを修正してください。
極端なプログラムでは、1 箇所を修正しただけで数十行のエラーメッセージがすべて消え消えた、というようなこともありますので、訳の分からないメッセージ、原因が見あたらないメッセージはひとまず置いて、確実なエラーを修正してもう一度ビルドしてみる、という試行錯誤のやり方がよいでしょう(実習1 のプログラムで、「//」を「/」に換えてビルドしてごらんなさい。うゎー!)。

質問 エラーメッセージの読み方を教えてください。

回答 ソフトウェアが外国製ですので、エラーメッセージは翻訳調で何とも解読不能という場合があります。それでも、何もないよりはましでしょうが。代表的なものを挙げておきます

. error C2054: ’main’ の後には’(’ が必要です。

というような、そのものずばりの指摘は分かりやすいですね。

. error C2143: 構文エラー: ’;’ が’}’ の前にありません。

これも読んで字のごとし、うっかりミスをチェックしてくれます。

. ’double’ から’int’ への変換です。データが失われる可能性があります。

これは double 型データを int 型変数に代入する場合に表示されます。小数点以下の情報が失われますよ、不用意に変数を使っていませんか、というお節介を焼いているのです。半分くらいは分かるのですが、半分くらいは何をいっているのか即座には対応できないようなメッセージが表示されたりします。たとえば、次のようなメッセージは何を言われているのか分からないでしょう。

. error C2001:定数が2 行目に続いています。

これは、たとえば printf の最後の「"」を全角で入力した場合に表示されます。エラー行を丹念にチェックしてください。

. warning C4700: 初期化されていないローカル変数値’a’ が使用されます。

これは、値の代入されていない変数を printf で表示させる命令を書いた場合に表示されます。

質問 警告のメッセージがあってもエラーが0 ならば実行画面に移行しますが、そのまま実行しても正しい結果が得られるのですか?

回答 警告の度合いに依ります。たとえば、「データが失われた可能性があります」という警告の場合、それが意図的であれば、無視しても構いませんが、うっかりそうしているのであれば、当然報いを受けることになるでしょうね。「scanf」に対して必ず「scanf_s」にしろ、という警告が出ますが、無視してかまいません。毎回同じ警告が出されるのが気持ち悪ければ、指示に従って下さい。

質問 見た目は間違っていないし、エラーも警告も0 ですが、実行結果がおかしい。どこがいけないのですか?

回答 こういう質問が多いのですが、万能薬はありません。自分でデバッグできる力を付けていかないと将来困るのはあなたです。
「コンピュータは自分が思ったようには動かない。入力された通りに実行するだけ」
scanf,printf に関するエラーが多いようですから、まずはその辺を重点的に調べてみてください。
その次に多いのは if...else... の部分でしょうか。どうしても分からないときは、変数の内容を書き換えた後に printf を挿入して、書き換えられた変数の内容を表示し、チェックしてください。
そもそもアルゴリズムが間違っている、という場合はどうしようもない。一旦思い込んだら何度プログラムを読み返しても気がつかない、ということは良くあります(日常生活でも経験することでしょう)。テストデータとして、エラーが予想されるデータを作り、それを入力してチェックする、ということを繰り返して、自分で気がつくしかない。
いずれにしても、一旦エラーが出たら、パニックに陥らず、至る所に printf を挿入して変数の動きを追うという地道な作業を自分でやってください。自分で間違いを発見できる力を養わないかぎり、プログラミングは上達しません。
ブレークポイントを使って、プログラムの実行中に一時停止させながらプログラムの動きを追うというデバッグのやり方もあります。索引で調べてください。
上のような努力をした上で、万策尽きた(自力では解決できない)、という場合は、注釈つきのプログラムと入力データ、エラーの発生する状況と、エラーメッセージを添えて質問してください。いきなり「このプログラム、どこが悪いのですか」と聞かれても分かりません。読んで分かるような注釈を付けてください。

アルゴリズムの書き方

質問 アルゴリズムの書き方が分からないので、教えてください。

回答 アルゴリズムには、フローチャートのように、規格が決まっているわけではありませんから、正解はありません。しかし、経験則のようなものはあるので、それらを参考にしながら自分の方法を探してください。
とりあえず、テキストの3章にあるようなフローチャートを書いてみることをお勧めします。いきなり変数がどうのこうの、というところから始めないで、計算の内容をいくつかのパーツに分けて、普通の日本語で作業を記述する箱と条件分岐からなるフローチャートを書いて、手順を組み立てなさい。それを箇条書きに書く練習をしてごらん。それができたら、8章にあるような擬似コード(索引を調べなさい)を書いてみることをおすすめします。

質問 アルゴリズムを要領よく書くための良い方法はありませんか?

回答 特別な方法はありません。いきなり一般的問題に取り組む前に、自分の分かる範囲で小さい問題を最初から最後まで省略なしに書いてみる、ということが必要です(「以下同様」という言葉を使ってはいけません)。都合の良いことばかり考えずに、起こりうる状況をリストアップし、それを一つ一つ確かめていくという時間の掛かるタフな作業が結局早道になります。一般的なルールが見えてきたらそれを記述し、エラーの起きそうなデータを使って試してみる、ダメだったら修正して、もう一度チェックする、ということの繰り返しです。別に計算問題でなくても、経営システム工学の問題はすべて、このように順序立てて理解することが必要になります。正解の分かっている問題でトレーニングしておくことは、将来、いろいろなところで役に立つでしょう。

プログラムの書き方

質問 良いプログラムの書き方を教えてください。

回答 これは難しい質問だ。絵を描くのと同じで、いきなり細部のプログラムから書き始めないで、全体の構成を考えておくことが必要ですね。プログラムの場合はアルゴリズムということになります。アルゴリズムも、やはりステップ1,ステップ2 という具体的な手順を順番に書かないで、おおざっぱなフローを日常語でアウトラインしてから個別問題の手順作成に入る、というようにしなさい。個別の問題に対してはプログラムがすぐに書けるくらいに手順を分解することがデバッグの負担を軽減するのに役立ちます。
ほかには、注釈をたくさん書く、実行文は短く、変数は意味ある名前にする、全体構造が分かるように書く、ひとまとまりの作業は関数化しておく、などが一般的な注意事項でしょうか。

質問 プログラムにはどの程度の注釈を入れるべきなのですか?

回答 「べき」というほどの強いルールはありません。他人の作ったプログラムはもちろんのこと、ちょっと前に作った自分のプログラムでさえ、解読するにははじめから全部作るくらいの時間がかかるものです。要所要所に注釈を付ける習慣を付けてください。 注釈は「/**/ で囲まれた部分」、あるいは「// からその行の最後まで」です。

質問 参考書などを見ると、ときどき「/」を左右にひっくり返した「\」という記号が「\」と思われるところに使われている箇所がありますが、これでよいのですか?

回答 キーボードの下の段、「/」の横に、それを左右対称にひっくりかえしたような記号を刻印したキーがあります(ひらがなの「ろ」のキー)。この記号は「バックスラッシュ」と呼ばれています。そのキーを押すと「\」記号が表示されるでしょう。つまり、バックスラッシュと \ 記号はコンピュータの中では同一視されます。もともとキーボードはアメリカ育ちで、\ 記号なんてものは存在しませんでした。それを日本語化するときに、あまり使われないバックスラッシュキーに \ 記号を割り当てたのです。フォントの都合で、「\」と書くつもりがバックスラッシュになってしまうことがあります。同一視してください。

質問 printf("%d",5^2);」と書いたプログラムを実行させたら 25 でなくて 7 が表示されました。なぜですか?

回答 ^」は Excel のようなべき乗の記号ではなく、排他的論理和というビット演算の記号です。排他的論理和は数を 2 進数で表し、各桁のビット同士で繰り上がりなしの足し算をする、という演算です。5 の 2 進数 101 と 2 の 2進数 010 を繰り上がりなしの足し算すると 111、10 進数で書けば 7、これが答えの真相。

質問 if(a==b)...」と書くべきところを間違って「if(a=b)...」と書いたのですが、同じ結果になりました。なぁんだ、「=」で判定しても良いということですか?

回答 良くありません、たまたま「目的」に合っていたのでしょう、こんな書き方は覚えないでください。「if(a=b)」は「もし b が 0 でなければ」ということと同じです。なぜそうなるかというと、最初にカッコの中が評価され、「a=b」は代入文なので、変数 a に変数 b の内容が代入されます。続いて、「if(a)」が実行されます。条件式が変数だけの場合は「while(1)」の場合同様、1(でなくても 0 以外の数)ならば条件が成り立っているとみなされます。二つの数が等しいかどうかを判定する場合は、絶対に==」でなければいけません。

質問 for ループが二重になったとたんに訳が分からなくなってパニック状態です。どうしたら良いでしょう?

回答 外側のループを外し、制御変数を一つ一つ定数に固定しながら内側のループを何回も書いてみると分かるようになるかもしれません。

データ入力、表示

質問 (1) 「scanf("%d ",&a);」と書いたプログラムでデータを入力しても先へ進みません。なぜですか。(2) 「scanf("%d %d",&b,&c);」で「1,2」と入力したのに c におかしな数が入力されている。「scanf("%d,%d",&d,&e);」で「35 12」と入力したのに eにおかしな数が入力されている。どうしてですか?

回答 (1) 「%d」の後の空白が余計です、削除してください。「それだけで動かないの?」と言われても、そういう約束になっているのでどうしようもない。(2) 「%d」と「%d」の間が空白ならば入力の時も空白で区切り、「,」ならば「,」で区切るという約束です。それぞれ「1 2」、「35,12」と入力していれば良かった。

質問 %lf を使って表示をさせると、3.000000 のようになります。煩わしいので 0 を消したいのですが?

回答 %lf」の代わりに「%.0lf」(ゼロエル)とすれば消せます。「%.1lf」(イチエル)とすれば「3.0」となります。「表示桁数」を索引で調べてください。

質問 データが入力できません、あるいは、入力したはずのデータが正しく入力されません。

回答 一番多いのは、変数の前に「&」を付け忘れることです。先ずそれを確認しなさい。あとは、scanf命令の変数の個数とフォーマット識別子の個数が違っているか、型がおかしいかのどれかでしょう。すぐに分からないとあきらめないで、意図したとおりのプログラムが書けているかどうかを一字一字確認しなさい。

質問 3桁未満の学籍番号を「"%3d"」で表示したら先頭のゼロが表示されません。どうすれば良いですか?

回答 せっかく百の位、十の位、一の位の数字を計算するのだから、「"C%d%d%d-%d"」のように、間を開けずに表示させれば良いでしょう。裏技として、「%」と「3d」の間にゼロを書いて「"%03d"」とすると、「001」のように表示できます。

質問 「1 ドルは何円ですか?  円」と表示させたあと、円の前の空白に入力させることは出来ませんか?

回答 無理です。JAVA の GUI を使ってください。

質問 scanf で入力中に間違ったデータを入力して Enter キーを押してしまった場合、取り消しは効かないのですか?

回答 出来ません。プログラムに「今の入力は...でしたが、それでもよろしゅうございますか」という確認の動作を組み込んでおかない限りは無理というものです。

配列

質問 集計作業でデータを扱うとき、データを記憶させるために2 次元の配列を使いたいのですが、項目によって int 型だったり double 型だったりします。一つの配列に型の異なるデータを混在させることが出来ますか?

回答 配列を宣言するとき、その配列の型は一つに決まってしまいますから、int 型配列の一部だけを double 型とすることは出来ません。double 型と宣言しておいて実質 int 型を記憶させ、表示の時 %.0f という変換指定をするしかありません。構造体というデータ型がありますが、これについてはネットで調べてください。

質問 配列の大きさを無限大にすることは出来ませんか?

回答 ん? そんなことをしてどうする。人生は有限です、コンピュータのメモリも有限。配列の大きさが分からないので、あらかじめ十分な上限を設定しておきたい、という意味であれば、動的に割り当てる方法を考えなさい。ネットで「malloc」を調べてごらんなさい。

関数

質問 なぜわざわざ関数なんてものを持ち出すのか?

回答 簡単なプログラムならば必要ありません。もっと問題が複雑になった場合に備えての準備と思って下さい。だらだら書くよりは、仕事の区切りを付けて、少しずつ仕上げていく、ということは日常良く経験するでしょう。考える単位を分割して、ここまでは確実、という部分を増やしていけば、一度に考えなければいけない範囲を限定できます。間違いも少なくなるでしょう。このような考え方が、階層化、モジュール化です。今のうちにこのような作業スタイルに慣れておくと、あとの苦労が軽減されることは間違いありません。 個人ではなく、チームで作業する場合は、関数なくして、仕事を進めることは不可能です。データの受け渡しの部分だけについてきちんと約束すれば、他の部分のプログラムがどのように書かれているか,気にしなくて済むようになります。

質問 rand() は乱数だと聞いたのですが、実行するといつも最初は 41 です。どうしてですか?

回答 rand() は一定のルールにしたがって0 以上 32767 以下の数列を生成する関数です。生成された数列を順番に眺めていってもその規則性が分からないところから、乱数の代用品(擬似乱数といいます)として使われています。プログラムを実行すると「一定のルール」が働いて、いつも同じ数列を生成するというわけです。このルールを乱すためには

srand (time(NULL)*123456789)

main プログラムの最初の実行文として書いてください。123456789 は特に意味があるわけではなく、適当に大きな数を書いてください。ということはテキストに書いてある(!)ので、索引で rand, srand を検索して詳しい説明のページを読んでください。VC2010 の rand() は、x0 = 1 として、

xn = 214013xn.1 + 2531011(mod 231)

の上15 ビットを取り出しています(http://www001.upp.so-net.ne.jp/isaku/rand.html)。

質問 srand は乱数らしくする関数と教わりましたが、srand を入れたせいで、乱数ではなくなりました。どうしてくれるんだ!

回答 srand はある規則で作られた(ランダムそうに並んでいる)数列の読み出す場所を指定する関数です。したがって、例えば、「srand(1354987); printf("%d ",rand();」という命令を繰り返し実行すると、常に同じ数字が表示されます。次のようなプログラムを作って実験してみてください。

int randbetween(int m, int n) {
	srand(time(NULL));
	return (n-m+1) * rand() /(RAND_MAX+1) + m;
}
...
	for(i=1; i<=10; i++) printf("%d ", randbetween(3,9));

というプログラムを実行すると、time(NULL) はあまり動かないので、同じ数が10個表示されることになります。srand はプログラム実行開始時に一度だけ実行させるだけにしてください。

質問 「min」「max」という関数を定義しようとしたのですが、エラーになってしまいます

回答 最近のバージョンで、int型の数の最小値、最大値を計算する関数として、組み込まれたようです。「Min」「Max」のように、名前を変えてください。

ファイル入出力

質問 ファイルに、たとえば 1 行に 5 個のデータが何行かにわたって記憶されているとします。このときたとえば各行の 3 番目のデータだけを取り出す、というようなやり方はあるのですか?

回答 読んで使わなければよいでしょう。上の例で言えば

fscan (ff,"%d %d %d %d %d",&za,&zb,&x,&zc,&zd);

として x だけを使うのです。

質問 ファイルからデータを読み出すとき、記憶させたはずのデータの代わりに、変に大きなデータが読み出されてしまいます。どうしてでしょうか。ちなみに、記憶させるときは「fprintf(fp,"%d",a);」という形式でした。

回答 printf("%d%dUn",1,2); を実行すると12 が表示されるでしょう。ファイルに書き込む場合でも同じことです。データとデータの間には空白が必要です。「"%d ", "%d", " %d " 」などを使って記憶させてください。

文字型データ

質問 文字データの扱い方を教えてください。

回答 文字データはchar型という特別なデータ型を使って表現します。char型とは、1バイトで表現されるデータ型で(テキスト6.5節、13.1節参照)、文字を記憶させるために定義されています。文字は1 バイト(256通り)の整数で表現されており、それを文字コード(グーグルで「アスキーコード」を検索してください)と言います。

	char str[100];
	gets(str);

という命令を実行すると、改行までの文字列が char型配列 str に記憶され、入力した文字数は

	n = strlen(str);

によって知ることができます(「I am a student.」と入力すると、nは空白も含めて15です)。この strlen関数を使うために、プログラムの最初に

#include <string.h>

が必要です。入力したあと、

	printf("%s\n",str);

とすると、入力した文字列がそのまま表示され、

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

とすると、入力した文字列の文字コード(列)が表示されます。

int 型と double

質問 pow関数でpow(x*y*z,1/3)」と入力しても正しい答えが得られません、どうしてですか?

回答 1/3 = 0; 1.0/3 = 0.333...」となることを思い出せば、分かるでしょう。「pow(x*y*z,1.0/3)」としなければいけません。ゼロ乗が1になるのは数学の約束。

質問 正確な3分の1を入力するにはどうすれば良いですか?

回答 良い質問ですね。テキストの先に書いてありますが(「計算精度」を索引で引いて下さい)コンピュータの計算は電卓と同じで、決められた桁数しか計算しません。したがって、「実数」の計算はキチンとは出来ないのです。実際、「"%.15lf"」(フォーマット識別子のオプション、テキスト20ページ)を使って表示させると、27 の三乗根は 3 ではなく、「2.9999999999999982」となります。四捨五入すれば 3 ですが、微妙に小さい値が記憶されます。無限小数を有限桁で表したことによる誤差です。

ワードレポート

質問 ワードにプログラムを貼り付けると、タブのために書き出しが右に寄ってしまい、長い命令が1行に収まりきらず、見にくくなってしまいます。

回答 ワードのタブを設定し直してください。ワードの「表示」タブ「表示」グループのルーラーにチェックを入れると、リボンの下に目盛りの付いた物差しのようなものが表示されます(ルーラーといいます)。そのルーラーの砂時計のようなアイコンの右にある数字の2をクリックすると、「L」のような記号が表示されます。それがタブマークです。同じようにして、数字の「4」「6」「8」をクリックしてください。そうして、キーボードからタブを入力すると、カーソルが今設定したタブマークの位置までジャンプすることが確認できるでしょう。この仕組みを利用します。
さて、プログラムをコピーペーストしたら、プログラムを全部選んで、ルーラーの「2」「4」「6」「8」をクリックしてタブを設定すると、字下げの位置を左に寄せることができます。より詳しい説明が ここにあるので参考にしてください。

質問 MS-VC2010の画面ではきちんと字下げされているのに、ワードに貼り付けたらでこぼこになってしまいました。どうしてですか。

回答 int main() {」の後字下げされるのは行のあたまにタブが挿入されるからです。タブはスペース4文字分と設定されています(デフォルト、変えることもできます)。新たな行を入力するとき、行の頭からスペースキーを4回たたくとタブ一つ分の空白が挿入されますが、タブと見分けはつきません。それをワードに貼り付けた場合、ワードのタブが空白4文字分に設定されていると良いのですが、そうはなっていません。スペース4文字分とタブ一つでは先頭からのずれる位置が違ってくるので、ぐちゃぐちゃになるのです。MS-VCでの字下げは必ずタブを使わなければいけません。そんなことに気を使わずに、新しい行を入力するときは常に前の行の最後にカーソルを置いてEnterキーを押せばMS-VC201があなたを助けてくれます。

もどる

プログラミング以前の問題

質問 度数分布って何ですか?

回答 度数分布(あるいは頻度分布)といえば大学生ならば皆知っている,と思っていたのですが・・・ データが与えられたとき、同じデータの個数を数えたものを度数分布といいます。たとえば、サイコロを100回振って1から6までの数の並びが得られたら、1が何個、2が何個、と出現頻度を数えたときの6個の数字が度数分布です。それを100で割ったものは相対度数分布(あるいは、相対頻度分布)といいます。データを増やすと相対度数分布はある程度安定した数の集まりになります。それを理想化したもの確率といいます(1の目の出る確率は1/6のようにいう、1の目の出る確率が1/6のサイコロを1000回振ったら157回1の目が出た場合、度数は157,相対度数は0.157だった、というように使い分ける)。
測定データのように一つひとつのデータが違う場合は、このような意味で度数を数えてもデータと変わらないので、その場合はデータの範囲を20くらいに分割して(一つ一つの区間をクラスという)、一つ一つのデータがどのクラスに属するかを調べてクラス番号に置き換え、各データのクラス番号をすべて集めたものの度数分布を、そのデータの度数分布といいます。例えば、身長データの度数分布を作る場合は、140センチから5センチ刻みでクラスを決め、140から145までをクラス1、145から150までをクラス2、150から155までをクラス3、...として、身長データを1,2,3,...のクラス番号に変換し、クラス番号データの度数分布を計算します。データがたくさんあればクラスの幅を小さく取ってより正確な度数分布を計算することが出来ます。

参考書

質問 参考書は必要ですか?

回答 とりあえずはコンピュータを使いながら、配布のテキストを隅から隅まで徹底的に実習してみてください。分からないところがあれば質問してください。それでも分からなければ、自分の実力・好みに合った参考書を探してください。一章にもいくつかリストしてあります。このテキストは初学者に2 ヶ月程度の演習で一通りのプログラミングができるように作られたものですから、C言語の機能の一部しか取り上げられていません。演習の範囲を超えてもっと勉強したい人は積極的にもっと高度な解説書、参考書を勉強してください。あるいは、インターネットで「C言語入門」を検索するとオンライン解説書を見ることができ、「C言語 ポインター」のように、キーワード検索すると、そのトピックスの解説記事を見ることができます。活用して下さい。