%=====================================================================
% 秋田高専 5E 計算機応用 テキスト
%テーマ 散布路留プログラム
%    本テキストの内容
%        ・
%        ・
%        ・
%        ・
%
% last updated 2005.4.13
%    created by  Masashi Yamamoto
%     e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{graphicx,amsmath,amssymb,ascmac,theorem,float}
\oddsidemargin 0mm  %左の余白 25.4mm-0mm奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm偶数ページ
\textwidth 160mm
\newcommand{\command}[1]{「\texttt{#1}」}
\newcommand{\tw}[1]{\texttt{#1}}
%
\begin{document}
\title{C言語の基本的な知識とコンパイルの練習}
\author{山本昌志\thanks{独立行政法人秋田工業高等専門学校電気工学科}}
\date{2004年4月13日}
\maketitle
%
%=====================================================================
\section{本日の学習内容}
%=====================================================================
C言語の基本的な知識の習得とコンパイルの練習を行う。ここでは、
%
\begin{itemize}
 \item プログラム毎のディレクトリーの作成
 \item エディターを立ち上げてプログラムの打ち込み
 \item プログラムのコンパイル
 \item プログラムの実行
\end{itemize}
%
ができることが目標である。あわせて、C言語の基本的な約束も理解する。
%
%=====================================================================
\section{基本事項}
%=====================================================================
%---------------------------------------------------------------------
\subsection{大文字と小文字の区別 教科書p.7}
%---------------------------------------------------------------------
C言語では、大文字と小文字は、区別される。変数名 hogehogeとHogehoge、hoGehogeは
異なる。
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	#include <stdio.h>
	int main(){
	  int hogehoge, Hogehoge, hoGehoge;

	  hogehoge = 1;
	  Hogehoge = 2;
	  hoGehoge = 3;

	  printf("hogehoge = %d\n",hogehoge);
	  printf("Hogehoge = %d\n",Hogehoge);
	  printf("hoGehoge = %d\n",hoGehoge);

	  return 0;
	}
 \end{verbatim}
\end{quote}
%
このプログラムは、次のようになっている。
\begin{itemize}
 \item \tw{\#include <stdio.h>}は、当面おまじないだと思って欲しい。
 \item \tw{int main()}もおまじない。この後の中括弧\tw{\{ \}}の中身が\tw{main}と言
       う関数の本体である。当面は、この中に書かれたものが実行されると考えて欲し
       い。
 \item \tw{int hogehoge, Hogehoge, hoGehoge;}で整数型の変数(\tw{hogehoge,
       Hogehoge, hoGehoge;})を用意している。
 \item \tw{printf}で変数のデータを書き出している。
\end{itemize}

これをコンパイルして、実行させると以下のような出力が画面に現れる。これを見ると、
大文字と小文字を区別していることが理解できる。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{実行結果} & \begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	hogehoge = 1
	Hogehoge = 2
	hoGehoge = 3
 \end{verbatim}
\end{quote}\\
 \end{tabular}
\end{quote}

%
%---------------------------------------------------------------------
\subsection{注釈(コメント文) 教科書p.11}
%---------------------------------------------------------------------
コメント文は、プログラムの内容をわかりやすくするために記述するものである。これは、
人間のためのもので、コンパイラーは無視する。プログラムを維持・管理するときの参考
に用いる。良いプログラムは、コメント文が大量に書かれている。FORTRANの場合、第一
カラムが"*"、または"C"の場合、その行はコメント文となるのは、依然学習したとおりで
ある。C言語の場合は、/*〜*/で囲まれた部分が、コメント文となる。行をまたいでも、
それは有効である。

プログラムのデバッグのとき、スキップしたい行をコメントアウトすることはよく使うテ
クニックである。
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	/* ============================================ */
	/* ==    円の面積の計算                           */
	/* ============================================ */       
	#include <stdio.h>
	int main(){
	  double pi;
	  double r, s;

	  pi = 3.141592;           /* 円周率 */
	  r = 1.0		 /* 円の半径 */
       
	  s = pi*r*r               /* 円の
	     次の行にまたがっても良い	面積計算 */
       
	  printf("s = %f\n",s);    /*出力*/

	  return 0;	
       
       }
 \end{verbatim}
\end{quote}
%
%---------------------------------------------------------------------
\subsection{識別子 教科書p.12}
%---------------------------------------------------------------------
識別子とは、変数、記号定数、関数などにつける名前のことである。名前に用いることが
出来る文字は決まっており、以下のとおりである。
\begin{quote}
 \tw{
 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\\
 a b c d e f g h i j k l m n o p q r t t u v w x y z\\
 0 1 2 3 4 5 6 7 8 9
 \_ (下線、アンダースコアー、アンダーバー)
 }
\end{quote}
%
%---------------------------------------------------------------------
\subsection{全角空白と半角空白 教科書p.13}
%---------------------------------------------------------------------
全角の空白と半角の空白は、まったく異なる。全角の空白は、日本語を表示する時以
外、使うことは有りません。全角の空白を書くと、非常に分かりにくいバグの原因となる
ことがあるので極力使わない方がよいであろう。
%
%---------------------------------------------------------------------
\subsection{フリーフォーマット 教科書p.13}
%---------------------------------------------------------------------
FORTRANは、7カラム目から、プログラムは記述するという約束がる。しかし、Cには、ど
こからでも、プログラムを書くことが出来るので便利である。そのため、プログラムは、
字下げをしてわかり易い記述ができる。字下げは、[Tab]を使うと自動的にできる。字下
げを上手に使って、わかりやすいプログラムを書くことが、上達の早道である。
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	#include <stdio.h>

	int main(){

	  int i, j;
	  int kai;

	  for(i=1; i <= 5, i++){
	    kai = 1;

	    for(j=1; j <= i, j++){
	      kai = kai*j;
	    }

	    print("%dの階乗 = %d\n",kai);
	  }

	  return 0;
	}
 \end{verbatim}
\end{quote}
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{実行結果} & \begin{quote}
		       \setlength{\baselineskip}{12pt}
		       \begin{verbatim}
	1の階乗 = 1
	2の階乗 = 2
	3の階乗 = 6
	4の階乗 = 24
	5の階乗 = 120
		       \end{verbatim}
		      \end{quote}\\
 \end{tabular}
\end{quote}
%      
%---------------------------------------------------------------------
\subsection{セミコロン}
%---------------------------------------------------------------------
Cはフリーフォーマットで記述できますので、文の区切りの記号が必要である。その区切り
の記号にセミコロンを用いる。
%
%=====================================================================
\section{コンパイルの練習}
%=====================================================================
%---------------------------------------------------------------------
\subsection{最小のプログラム (nothing.c)}
%---------------------------------------------------------------------
何も、実行しないプログラムである。
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}         
	main(){
	}
 \end{verbatim}
\end{quote}
%

mainは関数名。Cのプログラムの中に、必ず、1つ必要。関数名のあとの(  )の中に、引数
を書く。引数とは、その関数の変数みたいなのもの。これについては、後の授業で説明す
る。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コンパイル} & \tw{gcc -o nothing nothing.c} あるいは、
  \tw{gcc nothing.c} \\
  \textbf{実行} & \tw{./nothing} あるいは、 \tw{./a.out}\ \\
  \textbf{結果} & なんにも、起こらない。\\
 \end{tabular}
\end{quote}
%      
%---------------------------------------------------------------------
\subsection{1行出力 (hello\_world.c)}
%---------------------------------------------------------------------
画面に、1行出力させる。この、Hello Worldのプログラムは世界で、一番、書かれている
プログラムである。
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	#include <stdio.h>
	
	int main(){

	  printf("Hello World !!");

	  return 0;
	}
 \end{verbatim}
\end{quote}
%

\tw{\#include $<$stdio.h$>$} これは、ヘッダーファイルと呼ばれるもので、関数のプ
ロトタイプがかかれている。プロトタイプとは、関数の引数の数と型をチェックするもの
である。ここでは、\tw{printf}関数を使うため、これが必要である。とりあえず、おまじな
いと思って、常に先頭に書く習慣をつける。

\tw{printf()}は、名前のとおり、標準出力に出力する関数である。標準出力とは、通常、
ディスプレイが割り当てられている。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コンパイル} & \tw{gcc -o world hello\_world.c} あるは、
  \tw{gcc hello\_world} \\
  \textbf{実行} & \tw{./world} あるいは、 \tw{./a.out} \\
  \textbf{結果}	& \tw{Hello World !!}
  \end{tabular}
\end{quote}
%      
%---------------------------------------------------------------------
\subsection{2行出力 (hello\_akita.c)}
%---------------------------------------------------------------------
画面に、2行出力させる。1, 2行目に改行マークがある。
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	#include <stdio.h>

	int main(){
	
	  printf("Hello World !!\n");
	  printf("from Akita National College of Technology !!\n");
	  
	  return 0;
         }
 \end{verbatim}
\end{quote}
%        
         
\tw{printf}の中の$\backslash$\tw{n}エスケープシーケンスと言われ改行を示す。重要
な拡張表記については、教科書のp.28に示されているので、見るのがよいだろう。通常、
よく使用されるのは、$\backslash$\tw{n}と$backslash$\tw{t}である。
%
%      
%---------------------------------------------------------------------
\subsection{足し算 (add.c)}
%---------------------------------------------------------------------
$\pi$+$e$の計算を行い、その結果を示す。
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	#include <stdio.h>

	int main(){
	  double a, b, c;

	  a = 3.1415927;
	  b = 2.7182818;
	  c = a+b;

	  printf("pi = %10.7f\n",a);
	  printf("e = %13.9f\n",b);
	  printf("pi+e = %20.12f\n",c);

	  return 0;
	}
 \end{verbatim}
\end{quote}
%        
         
\tw{double}によって、変数の型を指定している。\tw{double}は、倍精度実数型である。
それ以外のデータの型については、教科書のP.34に示されているので確認すること。

         
\tw{\%10.7f}は、書式つき出力を示している。\tw{printf("pi =
\%10.7f$\backslash$n",a)}は、\tw{a}を\tw{10.7f}書式で出力する命令。\tw{f}は浮動
小数点のこと。\tw{10.7}の\tw{10}はフィールド幅を示し、\tw{7}は小数点以下の桁数を
示している。フォートランと同じ。
%      
%---------------------------------------------------------------------
\subsection{ファイルへの書き込み(outf.c)}
%---------------------------------------------------------------------
sample.txtというファイルを作り、その中に、Hello Worldと書く。
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	#include <stdio.h>
	
	int main(){
	  FILE *out_file;

	  out_file = fopen("sample.txt", "w");
	  fprintf(out_file, "Hello World");
	  fclose(out_file);

	  return 0;
	}
 \end{verbatim}
\end{quote}
%        
         
\tw{FILE}は、変数の型指定みたいなも。\tw{out\_file}の型がファイルを示す。
\tw{out\_file}の前についている\tw{*}は、ポインターをしめす。これについては、
おまじないと思って、ファイルを使う場合は、\tw{FILE *filename;}と記述すればよい。

\tw{fopen}は、ファイルを開く関数です。引数は、ファイル名とオープンモードである。オー
プンモードについては、教科書のp.382に書かれている。

\tw{fprintf()}は、\tw{printf()}とほとんど同じ。第一引数に、出力先を指定する。も
し、\tw{stdout}と指定すると、標準出力(通常ディスプレイ)に出力される。

\tw{fclose}は、ファイルを閉じる関数である。

プログラムをコンパイル・実行の後、作成されたファイルを調べよ。
%
%---------------------------------------------------------------------
\subsection{ファイルからの読み込み(inf.c)}
%---------------------------------------------------------------------
\tw{sample.txt}というファイルを読み込み、その内容を出力する。
%
\begin{quote}
 \setlength{\baselineskip}{12pt}
 \begin{verbatim}
	#include <stdio.h>

	int main(){
	  FILE *in_file;
	  char ss[256];

	  in_file = fopen("sample.txt", "r");

	  fgets(ss, 256, in_file);
	  printf("%s",ss);

	  fclose(in_file);

	  return 0;
	}
 \end{verbatim}
\end{quote}
%        
         
\tw{char ss[256]}は、文字型変数、256バイトのメモリー領域を確保しろという命令であ
る。

\tw{fgets}関数で、ファイルの中身を読み込みむ。最初の引数は読み込んだ文字の格納
領域、次は最大読み込む文字数、最後は読込先のファイルポインターである。
%=====================================================================
\end{document}
