C言語

プログラムを書いていると、同じ処理を何度も実行したくなることがあります。
そんな時は、forを使えばよいのです。

for(初期化処理; 継続条件; 終了処理){

}


forは{}の中を有効範囲とみなし、継続条件が真である限り有効範囲の処理を繰り返し続けます。

初期化処理は、forへ突入する際に1度だけ実行されます。

終了処理は、forの処理が1周する度に実行されます。

これはサンプルコードを見たほうが早いと思います。

102

手順を1つずつ追ってみましょう。
①forループへ突入(継続条件が真である時突入する)する際にLoopCountの値を1にします。

②継続条件が真であるか判定します。この場合、LoopCountが10以下であるかを判定します。
真ならば{}内の処理を実行します。偽ならばfor全体から脱出します。
ifに似てますね。

③printf("hello for loop \n");が実行されます。

④{}内の処理が全て終了したので、終了処理が実行されます。この場合、LoopCountの値が1加算されます。

⑤ ②へ戻ります。


このプログラムはループの終わりでLoopCountの値を加算し、LoopCountの値が10以下の間、文字列を表示します。LoopCountの値が11の時、forから脱出します。

また、for内部の書き方は必ずこうしなければならない訳ではありません。終了処理にインクリメントを使わず、LoopCount = LoopCount + 1と書いても問題なく動きますし、初期化の必要がなければ省略しても構いません。継続条件を省略すれば、∞ループを作ることもできます。

forの文法はあくまで、
for(初期化処理; 継続条件; 終了処理){

}

でしかないことを頭の片隅へ入れておいて下さい。
初期化処理, 継続条件, 終了処理の書き方はプログラマの自由です。
Cのforは式を書く際になんの制約も課さないので、終了処理で全く関係ない演算をしても文法上問題はありません。

問34:次の実行結果となるプログラムを書きなさい。
103


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ところでforの()の式は省略することができるのでした。では全て省略するとどうなるのでしょうか?
結論から言うと、∞ループになります。
つまり、有効範囲{}の中の処理を永久に実行し続けるということです。

このプログラムは*を∞に出力し続けます。
104

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
break;を使うことで、ループから脱出することができます。

このプログラムでは、*を1つしか出力しません。
105

ループ内部にてbreak;が発動すると、その時点で最も内側のループから脱出します。

これを利用して、ユーザーから特定の文字が入力されるまで、しつこく文字入力を要求するプログラムを書くこともできます。

106

forループが∞に続くので、nを選択した後はまたforの最初の処理に戻るのです。
yを選択することでifが発動し、forから脱出することができます。

補足:scanf(" %c", &Character);と書いているのは、scanfが文字の入力を受け付ける際、改行を読み込まない仕様の為です。その改行を切り捨てるためにスペースを空けているのですが、scanfの挙動については今は関係ない話なので、ここでは気にしないことにします。scanfは古い関数なのでこうなるとだけ理解しておいてくれればそれで良いです。


難35:2択クイズを出題するプログラムを書いて下さい。問題はなんでもよいですが、ユーザーが間違えた時は、再びユーザーへ入力を促すようにして下さい。
このエントリーをはてなブックマークに追加

ここまでC言語における変数の操作方法を大量に学んできました。
C言語には3つの柱があります。
85


・関数 ・変数 ・文法 です。

あなたは今、変数の柱を建てることに成功しました。

関数の柱は実はプログラマが生涯かけて建てていくことになるものです。
あなたはまだprintf関数とscanf関数しか操作しりませんが、Cの標準ライブラリには様々な関数があります。C言語 標準ライブラリ関数一覧(wikipedia)
sqrt関数も触れはしましたけど……

#include <stdio.h>にはprintf関数とscanf関数が入っているとお話しましたが、それ以外にも様々な関数が格納されています。これらの関数の操作方法を全て習得するのは大変困難でしょう。
ですから、必要になったらその都度練習して下さい。

例えば文字列を連結させたくなり、strcat関数を使いたくなったら、string.hをインクルードし、
strcat 使い方 などで調べてみて下さい。きっと分かりやすく解説しているHPがたくさん出てくるでしょう。
そうやって必要に応じて調べていく内に、操作できる関数群も増え、より複雑なプログラムも書けるようになるのです。

ところで今ボクは標準ライブラリと説明しましたね。
そうです。この関数群はあくまでもデフォルトで用意された機能に過ぎないのです。

例えば他のユーザーが制作した関数を使用することもできるのです。
その場合はそのユーザーが一緒に制作しているであろうマニュアルを参照して下さい。

と、こんな感じで関数の柱は人生を掛けて蓄えていくものなので、この講義では関数そのものの使い方にはあまり触れません。━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
では、文法の柱はどうなのかというと……これは今から学習します。
文法はこれまでにもいくつか触れてきました。例えば文末には;を付ける。文字は'で囲む、文字列は"で囲む……などです。

プログラムを書いていて、ある条件を満たした時だけ処理を行いたい場合を想定します。
例えば、ユーザーが特定の数値を入力した時だけ文章を表示する。などです。

そのようなプログラムを書く場合はifを使います。
86


if{}で囲んだ範囲をifの有効範囲とみなします。
ifの{}の中身は()の中が真(正しい時)のみ実行されます。

サンプルコードでそれを見てみましょう。

87

88


C言語の世界では=代入演算子なので、=と書くとNumber へ123を
代入せよという命令となってしまいます。ifの中で代入を行うこと自体は全く問題ありません

なので、=を2つ重ねて==とし、これを比較演算子と呼びます。これは左辺と右辺の値が同じであれば真を返す演算子です。
そうです。Number == 123とは、演算なのです。
Numberと123が同じ値なら真を、違う値なら偽を返す演算です。
if の()の中が真の時、ifの有効範囲は実行されると説明しました。

==演算子はifの機能ではありません。ifで使うことが多いだけで、あくまで演算の結果をifで利用しているだけということを心の片隅に置いておいて下さい。

また、ifif() と書いても、if ()と書いても、if    ()と書いても問題ありません。

問26:入力された整数が1205の時、認証成功と表示するプログラムを書きなさい。


難27:入力された整数が777の時、"確変"と表示して、もう一度入力を受け付け、そこで999と入力された時、"超大当たり"と表示するプログラムを書いて下さい。


難28:aと入力したら、bと表示するプログラムを書いて下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
==のことを比較演算子といいます。比較演算子を使えば、より複雑な条件を設定することができます。
比較演算子は全部で6種類です。
[優先-1] <=(左辺が右辺以下)
[優先-1] >=(左辺が右辺以上)
[優先-1] <(左辺が右辺未満)
[優先-1] >(左辺が右辺を超過)
[優先-2] ==(左辺と右辺が等しい)
[優先-2] !=(左辺と右辺が等しくない)


これらの演算子は主にifの()の中で使用することになるでしょう。

if (100 < Number) と書けば、Numberの値が100を超過している時に有効範囲が実行されます。

問28:ユーザーに整数を入力させ、その値が80以上なら"合格"と表示するプログラムを書いて下さい。


問29:ユーザーに少数を入力させ、その値が30.5以下ならば、20を加算して表示するプログラムを書いて下さい。


問30:ユーザーに文字を入力させ、その文字がk以外だったならば、kと表示するプログラムを書いて下さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ここまで書いてきてふとこう思ったことはありませんか?
もっと複雑な条件を書きたい……と。
具体的には100以下でありつつ80以上の値を判定したり、
aとbとcを真と判定し、それ以外を偽と判定したい……などです。

実は……それを叶えてくれる論理演算子があります。
また演算子かよと思うかもしれませんが、最後の2つです。
[優先度-4] &&(論理積)
[優先度-5] ||(論理和)


&&演算子は左辺と右辺の条件が両方満たされた時、真を返します。
if (Number >= 80 && Number == 100)
と書けば、Numberの値が80以上かつ100だった時に有効範囲が実行されます。


95


問31:入力された整数が100ではなく、かつ、80点以上の時、合格&インパーフェクトと表示し、入力された値が100の時は合格&パーフェクトと表示するプログラムを書いて下さい。


||演算子は左辺または右辺の条件どちらかが満たされた時、真を返します。
どちらも満たされた場合もを返します。

if (Number == 100 || Number == 99)
と書けば、Numberの値が100または99の時に有効範囲が実行されます。

98

99


難32:ユーザーが文字を入力し、それがaかbかcの時は、"認証成功"と表示するプログラムを書きなさい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下のサンプルコードをご覧ください。

これは、Numberの値が80以上ならば"合格"と表示し、80未満なら不合格と表示するプログラムです。

なんというか、不格好ですよね。
80以上のときに"合格"と表示する為に条件文を書くのは分かりますが、80以上でないのであれば、必然的に不合格となるではないですか。
要は、80点以上なら合格、それ以外なら不合格 とプログラムを書く方が人間工学的にスッキリしますよね。

それ以外をプログラムで表現するには、elseを使います。
elseは、直近のifの条件が偽の時発動します。

elseifと同じように{}で区切った範囲を有効範囲とします。ifと違う部分は、()を持たず、条件文を書く欄がないことです。

上のプログラムは次のように書き直しても正しく動きます。


対応するifとくっつけた方が直感的で分かりやすいプログラムになりますね。


問33:ユーザーから入力された整数が50以上なら"当たり"、それ以外なら"外れ"と表示するプログラムを書きなさい。
このエントリーをはてなブックマークに追加

では前回に引き続き、文字列を操作する方法を学びましょう。

・char型の変数を大量に宣言し、1文字づつ代入していく方法 が最も柔軟なのでしたね。

しかしこれはソースコードが見づらくなる上、とても書きにくい手法でした。

ところでC言語は配列をサポートしています。
配列とは、同じ型の変数を大量に宣言する方法です。

char String[100];

と宣言すると、char型のStringという領域がメモリ上に100箇所用意されます。
そこに1文字づつ置いていけばよいのではないでしょうか。

73


各領域へアクセスする際は宣言の時に使用した[]を使います。[100]と宣言した場合、[0]~[99]までの100箇所の領域が確保されます。0から始まるのでご注意下さい。

補足:string[5]に代入している\0はNULL文字といって、ここがこの文字列の末尾であることを表します。printf関数がprintf("%s", String);で文字列を表示する際には、このNULL文字を見つけるまで文字列をシークしているのです。
また、NULL文字は整数で表すと0です。ポインタへ文字列定数を格納する時には自動的に作成されていたので、気に留める必要はなかったのですが、配列へ文字を1つずつ格納する際には自動生成はされないので、手動で付けてやる必要があります。


少し楽に書けましたが、それでもまだ原始的です。

実は配列も初期化することができます。

配列を初期化する場合、[0]から順次値が代入されていきます。
この特性を応用します。


74


配列を初期化する場合は{};を使います。}の末尾にセミコロンが付いているのをお忘れなく。

しかしこれもまだ使いにくいです。なんというか、単にStringへ文字を1つずつ代入したいだけなのに、,で区切ったり'で区切るのは機械的でつまらないですね。
ちなみにこのやり方だとNULL文字を明示的に代入する必要はないです。

ということでC言語には配列を初期化するシンタックスシュガーが用意されています。シンタックスシュガーとは、より簡単に仕事を行う方法という意味です。

char String[100] = "hello";
実はこのように宣言できます。こうすると左の文字から順次[0]~へ格納されていきます。

最初から教えて! と思うかもしれませんが、恐ろしいのはこの"hello"は文字列定数ではないのです。文字列なのです。

文字列定数:文字全体を定数として扱う、つまり文字全体が1文字になっているような状態。参照しかできない。
char* String = "hello";

文字列:文字が集まって列になったもの。各文字ずつ参照したり、指定した文字だけ変更することも可能。もちろん参照も可能。
char[100] = "hello";

この違いを理解して貰う為に、今まで回りくどい説明を重ねてきたのです。
文字列を初期化する際には、通常の方法とシンタックスシュガーの方法どちらを使ってもNULL文字は勝手に格納されます。

75


もちろん文字列定数の時と違い、1文字だけを変更することも可能です。

76


ところで、printfでは文字列を%sで表示できるのでしたよね?

ということは……このように書くこともできますね。

77


どうですか? 大分すっきりしてきましたね。理論を1つずつ積み重ねて正解に近づくと、感動を覚えますね。この感動を忘れないで下さい。

しかしまだ完全ではありません。なぜなら、helloはNULL文字を含めても6文字しかないからです。
なのに[100]と宣言するのはもったいないですよね。使わない領域が94箇所もあるのですから。

char String[6] = "hello";

これで正解だと思った方は鋭いです。しかしここにもまたシンタックスシュガーがあるのです。
実は……
char String[] = "hello";
こう書くことができるのです。
こう書くとコンパイラが適切な数の領域を確保してくれます。
文字の数を自分で数えて値を書くと、間違える可能性が高いので、文字列を扱う時はこのようにして下さい。これなら無駄な領域もないです。

どうです? 美しさすら覚えてきたでしょう。

問23:画面上にhelloと表示するプログラムを書きなさい。但し、printf関数へ直接文字列を渡してはいけません。(参照して表示して下さい)


問24:上のプログラムを書き換えて、helloのoを0へ変更して表示するプログラムを書きなさい。



文字列定数は使えないのかと問われますと、そんなことはありません。
変更ができないというのは、欠点にも思えますが、利点でもあるのです。
文字列定数の文字を変更しようとすると、C++ではコンパイルエラーになりますから、(Cでは実行時エラー)変更することがない文字列に使えば、誤って変更するプログラムを書いたとしてもエラーにしてくれます。これはデバッグを助けてくれます。逆に、変更する可能性がある時は文字列を使えばよいのです。道具は使いようです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ユーザーから入力を受け付けて、その文字を文字配列へ格納するプログラムを作成してみましょう。

82


この場合は、残念ながら文字列の要素を多めに確保しておく他ないです。

……おや、ところでscanfへは格納先のアドレスを渡すのでしたよね。
ということはscanf("%s", &String); と書くのが正しい気がします。

しかし、よく考えてみて下さい。そもそも格納先のアドレスとはどこでしょう?
Stringはchar型の変数の集合体です。&Stringと指定した時、大量にあるchar型の配列の一体どこを指定すればよいのでしょうか。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
正解は、String[0]です。
入力された文字をString[0]から順次代入していくのが無駄のないプログラムです。
つまり、scanf("%s", &String[0]); と書くのが正しいのです。
scanfには変数のアドレスを指定する。

が、ここでもシンタックスシュガーがあります。
実は文字列や文字列定数の名前はその名前そのものが先頭文字のアドレスを表すのです。

つまり、Stringと&String[0]は全く同じことを意味しているのです。
どちらも先頭文字のアドレスを表します。

なのでscanf("%s", String); と書くことができるのです。

補足:シンタックスシュガーはなぜ存在するか? これは単にその言語のルールだからという言葉で説明できます。理屈ではscanf("%s", &String[0]); と書くのが正しいことは勿論理解できますし、このように書いても良いでしょう。しかしなんというか、あまり見栄えがよくないというか。要はユーザーからの入力を受け付けたいだけなのだから scanf("%s", String); と書くほうが人間(ジョブ)目線では直感的だと思うのです。


問25:次の実行結果となるプログラムを書きなさい。
83

このエントリーをはてなブックマークに追加

さて、ここまで数値を扱った演算をたくさんしてきましたが、文字を扱った演算はしてきませんでした。なぜ今まで文字を扱わなかったのかといいますと、単純に難しいからです。気合入れて下さいね。

C言語に置いて、文字文字列は区別されます。文字列は文字の集合体です。つまり、1文字扱う場合と複数の文字を扱う場合で操作が異なるということです。
最も、1文字を文字列として扱うこともできますけどね。

文字を格納するには、charを使います。

char Character;
Character = 'a';


これで、文字型の変数Characterにaが代入されました。
文字を操作する際には、それが文字であることを明示する' '記号を付けることを忘れないで下さい。

それではサンプルコードにてCharacterの値を確認してみましょう。文字を変換するフォーマット指定子は%cです。

61


もちろん、char Character = 'a';と書くことも可能です。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
続いて文字列型を学習します……が、C言語に文字列型はありません!(C++にはあります)
なので、C言語で文字列型を扱う場合、ゴリ押しで扱うことになります。
ゴリ押しの方法は2種類あり、
・char型の変数を大量に用意する方法
・メモリ上に文字列を配置し、その領域のアドレスを参照する方法


の2種類があります。まず、char型の変数を大量に用意する方法をやってみます。


62


めんどうくさいですが、これなら Character3 へ '適当な文字'を代入すれば、 3文字目だけ変更するといった芸当も可能です。ゲームプログラムで例えれば、主人公の名前に応じてテキストを変更することもできますね。


63


でもなんだかやっぱり原始的というか、不格好というか、もう少し書きやすく書きたいですね。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ここで皆さんにお願いなのですが、ソリューション エクスプローラー→Source.cppを右クリックして
ファイルの拡張子を.cppから.cへ変更して頂けますでしょうか。
BlogPaint


BlogPaint


実は今までは.cppファイルにコードを記述してきました。
.cppとはC++の拡張子です。
つまり、今まではC++のプログラムを記述していたのです。

C++はCをほぼ完全に内包していますが、何箇所か互換性のない部分があります。
文字列型を学習するに辺り、C++では記述不可能な書き方を学習します。
なのでそのままだとコンパイルエラーとなるのです。

C++流の文字列型の学習はC++言語を学ぶ時に、改めて行って下さい。
また、C++でも通用するC流の文字列型の操作はこの後の講義でも行います。

ではこれからの講義に意味はないのかと問われるとそれは違います。
scanfの時と同じように、この後の基礎となりますのでしっかり学習して下さい。

scanfといい、文字列型といい、Cの使いにくい部分をさらけ出していますがC言語そのものの歴史は古く、2017年から数えて46年前の言語なのである種仕方のない部分でもあるのです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
メモリ上に文字列を配置し、その領域のアドレスを参照する方法で書いてみます。


66


char* はchar型(文字型)のポインタ変数と言います。

char* が保存しているのはhelloという文字列ではなく、helloという文字列が配置されたメモリのアドレスです。

ポインタ変数とは、アドレスを保存する変数のことを指し、型名の後ろに*を付けて表現します。

C言語では、文字列は宣言した時点でどこかしらのメモリ上に配置されるので、その配置されたアドレスを把握しておけば文字列を擬似的に操作できるのです。
char* String = "hello";は、helloという文字列をメモリのどこかに格納し、そのアドレスをStringへ代入しているのです。
ちなみに文字列は ' ではなく、" で囲んで表現します。"a"は1文字ですが文字列扱いです。

もしここで、それならば文字列の先頭に&が必要なのでは? と考えた方は鋭いです。
しかし、そもそもchar* にはアドレスしか入らないことが自明なので、&で指定せずともコンパイラがアドレスを代入してくれるのです。

この方法の方がスマートな気がしますが、実はこの方法には弱点があります。
先の方法のように、文字列の一部を置換することができません。

ええ……と思うかもしれませんが、文字列が格納されるアドレスは読み取り専用領域なので、変更できないのです。この方法では参照しかできません。
なぜ読み取り専用領域へ格納されるかというと、文字列全体を定数として扱っているからです。先の方法では1文字を大量に並べていたので変更が可能だったのですが、今回の方法は文字列をまとめてメモリへ配置し、そのアドレスを参照しているので、アドレスしか見ることができない状態なのです。いわば文字列全体が1つの文字になっているような状態です。

この方法は、文字列を参照したい場合には非常に有効です。

実行結果
68

アルファベット表を作成し、何度か表示するプログラムなのですが、普通にprintfだけで表示するのはうんざりします。もしアルファベットの順番を間違えでもしていたら、全てのprintfを修正する必要があります。しかし、この文字列を参照する方法なら、マスタデータが一箇所にあるだけなので、修正は一箇所だけで済みます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
しかしこの方法もまだ扱いやすいとは言えません。参照を使用する機会には有効ですが、もう少し柔軟に、具体的には好きな時に好きな箇所の文字を変更できるとなお良いですね。

では、再びお願いなのですが、ソリューション エクスプローラー→Source.cを右クリックして、ファイルの拡張子を.cから.cppへ戻して頂けますでしょうか。
70

BlogPaint


戻すと、プログラム自体がエラー扱いになります。C++とCの僅かな相違点です。
ちなみにC++でこの文字列を参照する方法を使う場合、char* の前にconstを付ければよいです。

const修飾子を付けた変数や関数や引数は参照専用となります。参照専用とは、その値を変更することができないということです。C++ではconstにて明示しなければ文字列を参照する方法は使えなくなりました。

72

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ところで、結局のところ一番最初に試したchar型を大量に作ってゴリ押す方法が最も柔軟でしたね。
C言語には文字列型がないので、このようにプログラマが苦労を強いられるのです。

しかしそれではあまりに忍びないので、次回は文字列を更に使いやすく操作し、かつC言語でもC++でも使用できる術式を披露したいと思います。
このエントリーをはてなブックマークに追加

以前、変数とは、メモリ(保存領域)上に名前を付けて、その領域を確保することだと話しました。
int Variable;
と宣言すると、メモリ上に整数が入る領域Variableを確保することを意味するのです。
そして、Variable という名前をソースコードで用いると、Variableという名前の領域に入っているデータを参照します。

では、ここで新しい演算子の紹介です。
それは……&演算子です。
&を変数の先頭に付けると、その変数の領域のデータではなく、その変数のアドレスを表します。
アドレスとは、具体的にメモリのどこに変数の領域があるのかを表したいわば住所です。

つまり、
int Variable;
Variable; // Variableに格納された値を表す。
&Variable; // Variableのアドレスを表す。


ということです。

メモリを直接見ることはできませんが、想像することはできます。
コンピュータの内部には、変数を保存しておく領域があり、その領域にデータを配置することで計算に都合をつけています。

その領域のデータを参照する時は、変数名をそのまま用いればよいのです。
その領域そのものを参照する時は、&変数名を用いればよいのです。

ものは試しで、サンプルコードを打ち込んでみましょう。


55

※尚、お使いの環境によってアドレスの値は変わります。

コンピュータ内部のメモリを図で表すとこんな感じです。
56

int 型(整数型は4バイト)なので、4ずつアドレスの値が変わっています。
char型だと1バイトなので1ずつアドレスの値が変わります。

つまり、変数の場所を把握する演算子が&演算子です。
また、変数の場所のことをアドレスと呼びます。

現実世界で物を届ける時に、住所を把握することでスムーズに配達できるように、
コンピュータの世界でもなんらかのデータを送出する時に、送出先のアドレスを把握しておけばスムーズに配送ができるのです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

と、言ったところで早速アドレスを使ってみましょう。

scanf関数を学習します。
scanfは、printfと対になる関数で、ユーザーが標準入力(キーボード)から入力したデータを変数へ配送します。

int scanf(const char *format, ...)

また難しいことが書いてあるように見えますが、使い方はシンプルです。

scanf("フォーマット指定子で変数の型を指定", 格納する変数のアドレス);
復習:フォーマット指定子は、%dや%fのことです。
こんな感じです。例えば int Variable; へ値を格納する場合、scanf("%d", &Variable);と書けばよいのです。

それでは、ユーザーへキーボードへの入力を促し、入力された値を出力するプログラムを書いてみましょう。


57


#pragma warning(disable : 4996)という見慣れない記述がありますが、
scanfは安全な関数ではないため、Visual Studio が勝手にエラーにします。
しかし、今は実用的なアプリケーションを作成することよりも、シンプルに学習することに重点を置いているので、その警告を無視する為にプラグマを書いているのです。

なお、プラグマはC言語の文法とは全く関係ありません。
実用的なアプリケーションを書く時は、より安全なscanf_sを使うべきです。


また、ユーザーからの入力を受け付けると、ブレークポインタが発動してコンソール(黒い画面)がウィンドウの後ろに引っ込むことがあります。
これはコンソール特有の挙動なので、あまり気にしないで下さい(学習環境でのみ起こる現象です)


では続いて、半径(少数)を入力して貰い、その値を2乗し、3.1415を掛けることで面積を表示するプログラムを書いてみましょう。

58


ここでPOINTなのですが、scanfにてdouble型を指定する時は、"%lf"を使って下さい。(lはアルファベットのエルです)なぜprintfは%fを使い、scanfは%lfを使うのかを説明すると、このページでは余白が足りないので、気になる方はご自身で調べてみて下さい。

問21:上で作成したプログラムに5(整数)を入力するとどうなるか?


問22:ユーザーから整数または少数の入力を2回受け付け、その値同士を足し算して結果を表示するプログラムを書きなさい。

このエントリーをはてなブックマークに追加

↑このページのトップヘ