計算数学演習第1回

はじめに

計算数学演習ではC言語によるプログラミングの演習と、
C言語を用いた数値計算(「微分方程式」の解の近似計算)およびその解の可視化の演習を行います。
演習ではC言語の参考書として、(古いものですが)以下のものをあげます。

  1. 新・明解 C言語 入門編、柴田望洋著 ソフトバンククリエイティブ、ISBN 978-4-7973-7702-6
  2. 苦しんで覚えるC言語、MMGames著 秀和システムISBN-13: 978-4798030142
  3. 苦しんで覚えるC言語、(webpage)https://9cguide.appspot.com/
  4. 新訂 新C言語入門 スーパービギナー編、林晴比古著 ソフトバンククリエイティブ、ISBN4-7973-2563-1

この授業で扱う「プログラミング」に関する部分は、上記の参考書だと前半半分かそれ以下の内容です。
演習を受けてみて、
「是非プログラミングをマスターしたい」
「ある程度 はプログラミングというものもできたほうが良いのでは?」
「まぁ、知っていて損はないだろう」
などと思った人で、C言語やプログラミングについてあまり 知識をもっておらず、かつ参考書も持っていない人は、なにか一冊参考書を買い、自習をすると良いでしょう。
上記の参考書自体は古いものもあり、プログラミングに関する書籍は今も毎年多く出版されています。大きな書店などで何冊か試し読みしてみて、気に入ったC言語に関する参考書を見つけると、演習によるプログラミングスキルの習得に大きく役立つでしょう。

今日の演習

今日は以下の内容で演習を行います。

  • 演習の進め方とTAの紹介
  • この演習で行うこと
  • 演習のホームページの紹介と見方
  • レポート提出について
  • エディターの使い方
  • コンピュータに関する基礎
  • 簡単なプログラムのコンパイルと実行(次回の予告的内容)

次回の予告的内容も載せてあります。
おそらく今日の時間内でそこまでは行けないと思いますが、
来週以降の内容に興味がある人は是非読んでおいてください。

演習の進め方とTAの方々の紹介

この演習ではTAが皆さんの学習をサポートします。
演習はこのホームページを皆さんに見てもらいながら、口頭で色々と説明をしながら分からないところはTAの皆さんにそれぞれ対応していただきます。演習の進め方の詳細は口頭で説明します。

この演習で行うこと

この演習の最終的な目標は、

計算数学の講義に出てくる様々な「常微分方程式」(ニュートン力学系や現実の現象に関する数理モデル)をコンピュータを使って解けるようになる

ことです。
講義内容の更なる理解と、皆さんの知識の拡大、ならびに数学の広がりを感じ取ってもらう事です。
数値計算は特に、解析的に解く事のできない問題、方程式を考察する際、強力な味方になってくれます
また行列の計算や、公式のない代数方程式の近似解の探索などにも力を発揮します。

この目的のために、この演習では大きく分けて2つのパートに分けています。

  1. プログラミング言語の初歩と数学的な応用
  2. 常微分方程式の方程式の数値解法とグラフを用いた解の可視化

この演習の前半はプログラミング言語の演習となりますが、頭で思い描いた処理や数学的な表現をある程度自在にプログラムに落とし込むことを意識してください。
例えば、「入力された10個の数字の和を計算して、その値を出力する」という課題に対して、どういったプログラムの構造が必要かを頭の中で自在に作れるようになっておく必要があります。

基本的な数学的な表現をプログラムに落とし込むことができるようになると、それらを組み合わせることで、常微分方程式を数値的に解くことができるようになります。解いた結果を数値の羅列として見てもわかりづらいので、グラフを用いて可視化します。そうすることで、それぞれの常微分方程式がもつ特徴・本質を探究するツールを得ることができます。

内容自体はそこまで難しいものではなく、きちんと演習に出て、演習課題に取り組めば現在プログラミングに関して全く知識が無い人でも、ある程度のプログラムは書けるようになります。
ですが例年、途中で諦めてしまったり、わからないところをそのままにしてしまって、終盤でどうしようも無くなってしまう人もいます。
この授業では藤井やTAが巡回する時間を多く取っていますので、説明を聞いてもわからないところやうまくプログラムが動作しないときなど、積極的に手をあげてSOSを出してください。

演習のホームページの紹介と見方

演習のホームページのURLは

計算数学演習


です。
このトップに「お知らせ」という項目があります。
そこには、レポートの回収状況やその他大事なお知らせを載せますので、毎週必ず見てください。
その他有用な情報へのリンクなどありますので、演習中に紹介します。

レポート提出について

計算数学演習で出す課題は、Moodleを通して提出してもらう予定です。
参考資料などもMoodle経由で提供する予定です。

コンピュータの基礎

皆さんの最も身近なコンピュータというと、最近ではスマートフォンやタブレット端末をあげる人が多いのではないでしょうか。これらを使うとき、「アプリ」をインストールすると思います。「アプリ」はアプリケーションの略で、「メール」「webブラウザ」「電卓」「地図」「ゲーム」などの機能ごとに分けて提供されています。さらにこれらのアプリを動かすために、iOSやAndroid、さらにはWindowsやmacOSなどのオペレーションシステム(OS)が組み込まれています。アプリやOSなどのことを総称して、ソフトウェアと言います。ソーシャルゲームなどではよく新機能の追加や処理の正常化(バグの処理)を行うアップデートがありますが、アプリのアップデートによって動作がスムーズになる、なんてこともよくあります。
ソフトウェアとはつまり、プログラムのことだと思っておいて相違ないです。プログラムが正しいか、最適な構成になっているか、というのは、ソフトウェアの品質に大きく関わってきます。

ソフトウェアの対になる言葉としてハードウェアがあります。ハードウェアとは、端末自体さらには、端末を構成する物理的な部品のことを指します。余談ですが、パソコンを購入する際、CPUやメモリの性能であったり、ストレージはHDDなのかSSDでどのくらいの容量なのか、などを気にして見てみると良いですね(さらにグラフィックボードや電源など、気にしだすとキリがないですが)。ソフトウェアが更新されていって、新機能などがどんどん追加されてくると、古い端末ではだんだん動作が遅くなってくることを経験したことはないでしょうか?これはソフトウェアが要求する性能にハードウェアが追いついていけないことから、動作が遅くなることが多いためです。ハードウェアの細かいことについてはこの演習ではひとまずおいておきましょう。

さて、プログラムは「計画」や「予定」と訳すことができますが、コンピュータはプログラムに書かれている指示どおりに作 動する自動機械ともいえます。
なお、コンピュータの日本語訳は電子計算機で、その名のとおり、計算をする機械です。
この演習ではその本来の使い方である数値計算をコンピュータにさせることを目標としています。
プログラミングとはソフトウェアを開発することであり、プログラミング言語とは、ソフトウェアを開発するための言葉です。
プログラミング言語とは言語という名が示すとおり、文法があります。
しかしながら、自然言語(日本語や英語)のような複雑さはありません。
出てくるキーワードもわずかです。C言語もそのようなプログラミング言語の一種です。
皆さんのこれまでのコンピュータの使い方は、他人の作成したソフトウェアを利用する事だったでしょう。
例えば、メールソフトをつかったり、Webブラウザでホームページを閲覧したり、日常的にコンピュータを用いない人は皆無と言っても良いでしょう。
しかしながら、そういったソフトウェアの開発をする人は殆どいません。
この演習で皆さんに行ってもらう事は、簡単なソフトウェアではありますが、まさしくソフトウェア開発です。
そのようなクリエイティブな事に挑戦できるという意気込みで取り組んでください。
余談ですが、実際数学科を卒業してソフトウェア関連の会社に就職する人が多いようです。
ソフトウェア会社に入ってからも当然プログラミングの教育は受けますが、今の速い段階である程度の基礎を身につけるかつけないかは大きな差になると思います。

CコンパイラーとC言語

コンピュータは機械語とよばれる言語しか実行できません。日本人が日本語しか理解できないのと同じことです。日本人が英国人と話をしたい場合、日本人である我々が英語を習得する方法と、通訳をとおして話をする方法があるでしょう。Cコンパイラーとは、C言語から機械語に翻訳を行う通訳だといえます。
日本語と英語は両方とも自然言語であり、言語として大差ありません。しかし、機械語とC言語の間には大きな差があります。機械語に比べてC言語は人間にとって格段に理解しやすい言語なのです。C言語などのプログラミング言語を高級プログラミング言語と呼びますが、高級とは機械語に比べてより人間が理解しやすいという意味で高級であるということです。機械語にほぼ一対一で対応する言語としてアセンブラ言語というものがありますが、現在も今後もアセンブラ言語に接することはまず無いと思います。アセンブラ言語は、低級プログラミング言語と呼ばれることもあります。(もちろん、低級プログラミング言語では低級なことしかできないというわけではありません。どのようなプログラミング言語でかかれているにしろ、最終的には機械語に翻訳されるわけですから・・。)
C言語とは、先述のように高級プログラミング言語の一種です。高級プログラ ミング言語にはC言語の他に、BASIC、 Java、 Ruby、 Python、 Visual BASIC、 Delphi、 PASCAL、 LISP、 FORTRAN、 PROLOG、 PL/I、 C++、 COBOL等々、それこそ山ほどあります。その他にアセンブラ言語という低級プログラミング言語もあります。高級プログラミング言語にはそれぞれ文法があり、その文法に従ってプログラムを記述する必要があります。
繰り返しになりますが、コンピュータは直接的には機械語しか理解できません。 つまり、機械語で書かれたプログラムしか実行することができないのです。もちろん我々ががんばって、機械語のプログラムを書けばよいのですが、それは大変 でかつ効率もよくありません。そこで、高級プログラミング言語であるC言語が登場します。高級プログラミング言語は、機械語に比べて、より人間に理解しやすい言語となっています。
そこで、高級プログラミング言語であるC言語でかかれたソースプログラムを機械語に変換する必要があり、その為のソフトウェアがCコンパイラーと呼ばれるソフトウェアです。(ソフトウェアの開発の為にC言語を用いるのですが、その為にCコンパイラーというソフトウェアを使うのです。)
ところで今回、皆さんはたまたまC言語を習っていますが、高級言語どれか一つをマスターすれば、他の高級言語はたいした苦労も無くマスターできます。
余談ですが、CコンパイラーというソフトウェアもC言語でかかれています。(卵が先か、鶏が先か?)

コンピューターを使って考えるときに

ところでこの演習の目的はコンピューターを使って数学的な問題を解くことでありますが、これはもちろん、この演習ではコンピュータしか使ってはいけない、という訳ではありません(当たり前の事ですが。)。
コンピューターの長所は、単純な作業をあきれるほど沢山の回数、正確かつ高速に処理できることで、数値計算ではその特性を最大限活かして(近似)解を探ります。よって問題を解くためには、その問題をそれと等価な「単純作業の繰り返し」という形に、書き換える必要があります。プログラミングとは、この書き換えを(コンパイルすれば)コンピューターでも分かる言語で行う事であります。
例えばある積分や証明を行うときに、「この形にすれば(式変形すれば)、あの公式が使える」とか「この形にできれば、あの定理を使って証明できる」という 状況がよくあると思います。プログラミングとは、その「この形」にする、という作業に相当するものです(「この形に(プログラミング)すれば、コンピュー ターで近似解が求まる」)。それゆえ、プログラミングには数学的センスが問われる事になるわけです。積分や証明では多くの場合、「この形」が式の形で得られ ますが、数値計算の場合、(今回は)C言語によるプログラムになります。
積分や証明をする場合、大抵の人は頭の中だけでなく、紙とペンでいろいろ試しながら「この形」を見つけていると思います。コンピューターでのプログラミン グでも同じです。頭の中だけで考えていては、(初歩的な所は別ですが)なかなかできるものではありません。(まあ、中には何でもできる天才もいますが。) その事をふまえて、常にノートとペンくらいは脇に備えておく事をお勧めします

プログラム作成から実行までの流れ*

さて、早速なれてもらうためにプログラムの作成に取りかかりますが、全体の流れを以下の図に示します。

特に、皆さんが行うのは緑色の部分のみで、他の部分はコンピュータが行ってくれます。
そのため、必要最低限であればプログラムの書き方・実行の仕方さえわかればプログラミングでいろいろな計算ができます。
しかし、コンピュータが実際に何を途中でしているかを理解するのは、良いプログラムを書くためには重要なことです。

エディターの使い方

次回から「C言語」によるプログラミングを行いますが、プログラムを書く為にエディターというソフトウェアを利用します。エディターとは、機能が限定されたワープロだと思えばよいでしょう。今日は

  • エディターを起動する
  • 文字を打ち込む
  • ファイルに名前を付けて保存する
  • エディターを終了する
  • 先に保存したファイルを再びエディターで開く

という一連の作業を順を追って説明します。
次回の演習では、簡単なC言語によるプログラムを実際にテキストエディターで 打ち込み、それをコンパイルし実行するという一連の作業を行います。多少内容を変更するかもしれませんが、次回の内容を以下に示しておきます。自分で読ん で一人でもできるよう丁寧に書いたつもりですので興味がある人はどんどんすすんでください。操作方法で分からないところがあれば、各人の座っているマシン に備え付けの冊子に有用な情報がありますのでご覧ください。(途中、演習中に実演と書かれているものについては文字で説明するのが難しいため実演する予定 のもので、次回の演習で実際に実演しますが、備え付けの冊子で解決する程度の事です。)

ソースプログラムの作成

ソースプログラムとは、まさにプログラムの元であり、通常テキストファイル(文字ファイル)です(先ほど使い方を簡単に説明したテキストエディターを使って編集します)。ソースプログラムは、C言語やFORTRANといった高級言語 でかつ、それら言語の文法に従った形式で記述されています。次に示すものは、C言語で書かれたソースプログラムの例です。

#include <stdio.h>

int main() {
    printf("Hello!\n");
}

エディターを開き、ソースプログラムを例のとおりに打ち込み、ファイル名を hello.c というファイル名で保存してください。このように、C言語のソースプログラムがかかれているファイルには、最後に .c をつける決まりがあります。例のプログラムの内容は後ほど説明しますが、ここでは、画面に Hello! と表示するプログラムであるとだけ言っておきましょう。後ほどこのプログラムを実際に動かします。

ファイル名に関する注意

ファイル名は適当につけていただいて結構なのですが(もちろん、レポート提出時には指定したファイル名にしてもらいます)次のような英数字で構成されるものにしてください。例えば、
gebageba.c
filename
this_is_sample.c
20151006.c
など。
また、漢字や / * ? & 等の文字は使わないようにしてください。

よく使うUNIXコマンド
(ターミナル・端末での操作)

コマンド 意味 使い方例
mkdir ディレクトリを作成 mkdir work:「work」という名前のディレクトリを作成する
cd ディレクトリの移動 cd work:「work」という名前のディレクトリに移動する
cd または cd ~/:ホームディレクトリ(初期設定では/home/アカウント名)に移動する
pwd 現在のディレクトリを表示 pwd
ls ファイルのリストを表示 ls ./現在のディレクトリに含まれるファイルのリストを表示
cp ファイルのコピー cp A.txt B.txt 「A.txt」の内容をコピーして「B.txt」というファイルを作成
mv ファイルの移動 mv A.txt B.txt 「A.txt」を「B.txt」というファイル名に変更
rm ファイルの削除(要注意) rm A.txt 「A.txt」を削除

他にも便利なUNIXコマンドは色々あります。Web上にはUNIXコマンドをまとめたり、応用例などを紹介するサイトが無数にありますので、調べてみましょう。

ソースプログラムのコンパイル

先程説明したとおり、C言語で書かれたソースプログラムをコンピュータは直接実行することはできません(機械語に変換されている必要がある)。そこで、ソースプログラムをコンパイル(翻訳・変換)するという作業が必要となります。
C言語で書かれたソースプログラムのコンパイルにはCコンパイラというソフトウェアを使います。Cコンパイラというソフトウェアはターミナルと呼ばれるソフトウェア上で実行します。
 このように、コンピュータ上で何かする場合、あらゆるものがソフトウェアなわけです。今後、混乱が無いようであれば、ソフトウェアという言葉を省略します。
まず、ターミナルを起動します。

ターミナル上での手順も実演しますが、
gcc hello.c -o hello
とすることで、機械語に翻訳されたプログラム hello が生成されます。ソースプログラム中にエラーがある場合(文法上の誤りが大半)画面上にエラーがあるといったメッセージが表示されます。
ここで gcc というのがCコンパイラーです。ターミナルでプログラム名を打ち込むことでそのプログラムを実行できるのですが、つまり、ここでは cc というプログラム(Cコンパイラ)を実行しています。
プログラム hello を実行するには、ターミナル上で、
./hello
とします。作成したプログラムを実行するときには、はじめにピリオド、次にスラッシュをつけます。はじめのピリオド、スラッシュは省略できる場合もありますが、当面必要だと思っておいてください。
./hello
と実行すると、画面に Hello! と表示されたことと思います。

最も短いプログラム

Hello!が出てくるプログラムも短いですが、もっと短いプログラムも作れます。

int main() {
    return 0;
}

これでコンパイルして、実行してみてください。
何も起こらないと思いますが、先ほどの流れにはすべて沿っているので、c言語のプログラムとしては機能しています。

画面に文字列を表示するプログラム

./hello を実行して分かったと思いますが、先ほどのサンプルプログラムは、画面に文字列 Hello! を表示するものでした。
たった7行(空白行も含む)のプログラムです。一行ずつみてみましょう。
説明の為に、行頭に行番号をつけました。(説明の為につけたのであって、ソースプログラムに書き込む必要はありません。書き込むとエラーになってしまいます。)

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

1行目:
この行で、 stdio.h というヘッダーファイルを読みこみます(インクルードするともいう)。 .h で終わるファイル名を持つファイルをヘッダーファイルと呼び、stdio.h のほかにも math.h など色々な種類があります。ヘッダーファイルでは定数や関数の定義を行っていますが、いまのところを詳細を知る必要はありません。
当 面、C言語でプログラムを書くときは必ず#include<stdio.h> という行をプログラムのはじめの方に入れるのだと覚えておいてください。(演習が進むにすれて、他のヘッダーファイルもインクルードする必要がでてきます。そのときには指示をしますので、それに従ってください。)詳しくは参考書を参照してください。
2行目:
空白行(何も書かれていない行)です。プログラムを読みやすく(見やすく)するためには空白行も必要です。Cのソースプログラムには好きなだけ空白行を入れることができます。
3行目~6行目:
関数 main の定義です。“int main()”は”main()”と略しても問題なく動作しますが、本演習では”int main()”と書いて下さい。C言語では、プログラムの単位として「関数」と呼ばれるものがあります。プログラマ(プログラムの作成者)は、あらゆる処理(繰り返し処理、画面に文字列を表示する処理等)を関数にまとめる必要があります。この例の場合、main という名前の関数のなかで、printf という名前の関数を引数 “Hello!\n” で呼び出しています。引数とは、関数に渡す値です。
関数
 詳しくは、関数定義の方法のところで説明しますが、C言語の構成単位である「関数」は戻り値引数というものがあります。例えば、
y = sin(x)
と書いたとき、sin が関数名で x が関数 sin の引数変数 y には sin(x) の戻り値(この例の場合、関数 sin(x) の値)が入ることになります。変数や、ここでの = 記号の意味は次回以降説明します。(早く知りたい人は参考書を見てください。)

main 関数

この例では、プログラムは main という名前の関数のみで構成されています。実は、main という名前の関数はC言語で書かれたプログラムには必ず1つある必要があります。C言語では勝手な名前の関数を定義することができますが(関数の定義は再来週あたりに勉強します)その場合どの関数をはじめに実行するかルールを作る必要があります。C言語では main という関数に書かれた内容をはじめに実行する決まりとなっています。

main 関数の ()

また、main 関数の定義では int main() と最後に () がついています。当面、このようにするものだと覚えてください(関数の定義の部分で説明します)。引数なしという意味です。

main 関数の有効範囲

関数の定義は中括弧{ } で囲まれている必要があります。main という関数を定義していますが、その有効範囲は中括弧で囲まれた範囲(3行目~6行目)となります。

Cのプログラムは関数で構成されますが、その関数はいくつもの「」で構成されます。文は終端に ; を伴います(セミコロンとよむ)。ただし、次週以降でてくる for や while といった制御文は ; をつけません。このセミコロンが1つの文の終わりを示します。セミコロンを忘れてエラーになることがよくありますので、気をつけましょう。

画面に文字列を表示する関数 printf

さて、4行目で printf という関数を呼び出しています。printf はC言語にはじめからある関数(標準関数とよぶ)で、引数(括弧で囲まれた中にかかれたもの)として文字列を受け取り、それを画面に表示する関数です。文字列は ” (ダブルクォーテーションとよむ)で囲まれている必要があります(printf 関数には他にも色々機能があります。次週以降、その他の機能を使うことになります)。つまり、
printf(“Hello!\n”);
は、文字列 “Hello!\n” を画面に表示せよという意味となります。さて、最後にある \n はなんでしょうか?プログラムを変更して、\nの働きを理解しましょう。プログラムを次のように変更してください(hello.cをエディターで開き、変更して保存する)。

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

先ほど同様、ターミナルでコンパイルしましょう。
gcc hello.c -o hello
./hello
どうですか?
Hello!
Hello!
と2行に渡り表示されたと思います。この例から分かるように、\n は改行をあらわしています。
最後に5行目のreturn 0ですが、これは当面はmain関数終了、すなわちプログラム終了の合図だと思って下さい。
return 0は書かなくても問題なく動作します。

実はmain関数の前の部分は、int以外でも動作します。doubleやvoidにすることもあります。詳細は本演習の範囲を大きくこえるので省きますが、キモとしてはプログラムが単独ではなく他のプログラムと連携するために必要なためです。

コンパイルエラーについて

先の hello.c を次のように書き換えてください。

#include <stdio.h>
 
int main() {
    plintf("Hello!\n");
    return 0;
}

みて分かるように、printf 関数のつづりが間違っています。ターミナルでコンパイルしてみましょう。
gcc hello.c -o hello
次のようなエラーメッセージがでましたね。
hello.c:(。text+0xf): `plintf' に対する定義されていない参照です
collect2: エラー: ld はステータス 1 で終了しました

このように、C言語に限らず、プログラミング言語では、つづり間違いなどは許されません。
このようなコンパイル時に出るエラーのことを、コンパイルエラーと呼びます。
(エラーメッセージの内容については演習中に触れます)
また、次のようなプログラムもコンパイルエラーが出ます。

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

この例では、printf関数の閉じカッコを忘れています。
このような些細な間違いもエラーとして、表示されます。
hello.c: 関数 ‘main’ 内:
hello.c:4:22: エラー: expected ‘)’ before ‘;’ token
printf("Hello!\n";
^
hello-error2.c:8:1: エラー: expected ‘;’ before ‘}’ token
}
^

このような些細なつづり間違いや文法的に間違ったプログラムはうまくコンパイル(翻訳)できず、エラーを表示して終わってしまいます。
Cのプログラムを書く場合は、C言語の文法に厳密に従い、
つづり間違いも犯さないようにする必要があります。

プログラムの書き方のルールと慣習

C言語は今見たように言語としての文法があり、それに反するとコンピュータは機械語に翻訳できなくなってしまいます。
この文法に加えて書き方のルールがいくつかあります。
一つ目がトークンです。文法に対する自然言語で言うところの単語です。
コンピュータはこのトークンを一つ一つ読み取り、文法に則って機械語に翻訳してくれます。
なので、一つ一つが読み取れる形式で書かねばなりません
どうすればいいかというと、一つのトークンはつないで書いて、トークン同士は「スペース」「改行」「;」「()」「{}」で区切ることでコンピュータに独立したトークンとして読み込ませることができます。
たとえば、最も短いプログラムは、
int
main
(
)
{
return
0
;
}
とできますが、
int
main
(
)
{
retu
rn
0
;
}
とすると、returnが一つのトークンとして認められなくなってしまいます。
C言語は、フリーフォーマット・自由形式となっていて、基本的に自由に書いていけますが、このトークンが識別できるようになっていることが唯一無二の条件になります。
最も短いプログラムは、
int main(){return 0;}
のように1行にもできます。
しかし、先ほどのreturnが分解されてしまったのとは逆に、
intmain(){return0;}
としてすべてつなげてしまうと、intもmainもreturnも0も識別できなくなってしまいます。
記号として「;」「()」「{}」がつなげても大丈夫なのは、1文字で機能を果たしていて識別できるからです。
intmainはintmとainなどの適当な分割で意味がわからなくなってしまいます。
次に書き方の慣習についてです。
ここで書くことは絶対ではありませんが、皆さんが勉強する本やホームページでもだいたいはこの慣習に従っています。
先に何もしないプログラムを1行に書きましたが、このやり方ではプログラムが長くなれば非常に読みにくくなります。
Hello!を表示するプログラムは

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

というようにできますが、とても読みやすいとはいえません。
ですので元のプログラムにあるように、

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

と{}で一つの塊にすることが一般的なルールです。
こうすることでmain関数がどこからどこまでかが、わかりやすくなります。
また、printfが{}から右にずれていますが、インデントと呼ばれる書き方で、これをすることで階層構造を表します。

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

上のプログラムでも{}で分かれていますが、視覚的にわかりにくいと思います。
どちらかというと一塊を視覚的に見やすくするのはインデントによるところが大きく、同じ階層({}で括られた中)は同じインデントの深さにあることが求められます。
インデントは半角スペース4文字もしくはタブ1つ(キーボード左上の「Tab」)を使うことが一般的です。
たいていのエディタでは、タブ1つの幅を設定できるので、半角スペース4文字分に設定しておきましょう。
このページに掲載しているプログラムでは半角スペースが用いられていますが、(あれ?何回スペース打ったっけ?)とならないように、
タブの使用を強く推奨します

最後にコメントについてです。
短いプログラムは読めばわかりますが、長いプログラムになると何をしているのか読み込むことが大変になります。
ソースコードにはコンパイルされるプログラム以外のことを人間が読むことを目的として書き込む機能がコメントです。

#include <stdio.h>
 
int main() {
    /* コメントです*/
    printf("Hello!\n"); /* ここもコメントです*/
    // こんな書き方もあります。
    return 0;
}

プログラムにはわかりやすくなるように何をしているか書き込む癖をつけておくことをお勧めします。
他の人に読んでもらって何をしているのかわかってもらえるようにするのがベストです。
なぜなら、明日のあなたは他人です。
このような短いプログラムではあまりコメントのありがたみは分かりませんが、より長いプログラムでは大変効果的です。
プログラムのこの部分ではどのような処理をしているかといった内容をコメントとして書き入れる癖をつけておきましょう。

/* サンプルプログラム hello.c */
/*      b000000(学籍番号) 計算数学演習  */
#include <stdio.h>
 
/* main 関数 */
int main() {
    /* Hello! と画面に表示する */
    printf("Hello!\n");
    return 0;
}

注意: 全角と半角に気をつけてください。日本語が打てる状態で * や / を書くと全角文字になってしまう場合があります。空白文字も同様に全角の空白文字となってしまうことがあります。こまめに日本語モードと英数モードを切り 替えてください。このようなミスもコンパイル時にエラーとなります。例えば * / a B は半角文字ですが、* / a B は全角文字です。つづりも文法もあっているのにエラーが出る場合、まずは全角文字を使っていないか疑いましょう。


課題1

5行目中の \n を取り除くとどうなるか?実際に試してみよ。

課題2

サンプルプログラムを変更して、色々な文字列を表示してみよ。

課題3

サンプルプログラムでは printf 関数を一度だけ使っているが、二度、三度と使うプログラムに変更せよ。

課題4

課題3のプログラムを用いる。main関数内で”return 0;”の位置を変えたらどうなるか試してみよ。
例えばprintf関数、return 0、 printf関数の順でソースプログラムを書いた場合、実行結果はどうなるか。

おまけ1

printf(“文字列”);
で 一通りの文字、数字を出力することができるが。画面に出力するためには一工夫が必要な記号も存在する。例えば、”(ダブルクォーテーション)を画面に出力 したいときなどは、そのままでは、文字列の前後の”と見分けがつかないので、コンパイラの混乱を避けるために特殊な記法として \”と入力することになっている。 このような、\ + 何か一文字 をエスケープシーケンスと呼ぶ。C言語の特殊文字、エスケープシーケンスについて調べて、試してみよ。

Department of Mathematical and Life Sciences, Graduate School of Integrated Sciences for Life, Hiroshima University