C言語研修(基礎編) 〜画面とのやり取り〜 キーボードから数値を入力するプログラム #include#include void main(void){ char pszBuffer[256]; int iValue; gets(pszBuffer); iValue = atoi(pszBuffer); printf("%d\n", iValue - 100); } キーボードから数値を入力するプログラム(その2) #include #include void main(void){ char pszBuffer[256]; double fValue; gets(pszBuffer); fValue = atof(pszBuffer); printf("%f\n", fValue - 100); } atoi()の使い方 機能 文字列を整数値(int)に変換する ヘッダファイル stdlib.h プロトタイプ int atoi(const char *string); int atoi (引数); 引数 string |変換された文字列 戻り値 変換後の整数値(int) 変換できない場合は0 "200" → atoi → 200 int型 引数 戻り値 atof()の使い方 機能 文字列を実数値(double)に変換する ヘッダファイル stdlib.hもしくはmath.h プロトタイプ int atof(const char *string); 引数 string |変換された文字列 戻り値 変換後の実数値(double) 変換できない場合は0.0 ・文字列として入力し数値に変換する −gets()と変換関数の組みあわせ ・変換関数には何種類かある −atoi(), atol(), atof() ・万能入力関数scanf()というのがあるけれど。。。 atol()の使い方 機能 文字列を整数値(long)に変換する ヘッダファイル stdlib.h プロトタイプ int atof(const char *string); 引数 string |変換された文字列 戻り値 変換後の整数値(long) 変換できない場合は0L 関数の引数に関数が戻り値を渡せる iValue = atoi(pszBuffer); printf("%d\n", iValue - 100); ↓ printf("%d\n", atoi(pszBuffer) - 100); C言語研修(基礎編) 〜変数と定数〜 ・変数とは −値が格納できる入れ物 −自由に値が変更できる ・定数とは −ある決まった値を示す −値が変更ができない 変数について ・変数は宣言しないと使えない ・変数はそれぞれデータ型がある −文字型: char −整数型: short, int, long −実数型: float, double ・C言語の変数は数値しか格納できない データ型では 分類 型名 使用バイト プレフィックス(例) ←コーディング規約で変わる 文字型 char 1バイト c 整数型 short 2バイト n int 不定 i long 4バイト l 実数型 float 4バイト f double 8バイト f 型無し void - - short <= int <= long 扱える値の種類が異なる −整数型 *整数しか扱えない *桁落ちなど発生しない −実数型 *実数を扱える *桁落ちが発生する可能性がある [例]1→0.9998 (あくまで例である) 扱える値の範囲が異なる −整数型 sort -32768 〜 32767 long -2147483648 〜 2147483647 −実数型 float 3.4E-38 〜 3.4E+38 7桁 double 1.7E-308 〜 1.7E+308 15桁 整数型の符号指定 ・整数型の変数は『符号付き』と『符号なし』で扱える値の範囲が異なる 符号付 正の値と負の値の両方が扱える (signed) 符号なし 負の値は扱えない代わりにより大きな正の値を扱える (unsigned) 符号付き整数 ・『符号付き』を明示する場合はsignedを型名の前につける signed char cCharactor; signed short nValue; signed long lValue; 『符号なし』を指定する場合はunsignedを型名の前につける unsingned char ucCharactor; unsingned short unValue; unsingned long ulValue; プレフィックの例としてunsigned型では変数の型を表すプレフィックスの前にuをつける場合がる ・符号の指定は省略できる ・符号の指定を省略した場合はsingned型として扱われる -ただしchar型については処理系により異なる singned char -128 〜 127 short -32768 〜 32767 long -2147483648 〜 2147483647 unsinged char 0 〜 255 short 0 〜 65535 long 0 〜 4294967295 ・その処理系でももっとも高速に演算できる 整数型 ・使用するバイト数は処理系により異なる −つまり扱える値の範囲も異なる 。C言語の規格では次のことが決まっている short型 <= int型 <= long型 int指定の省略 ・intの指定は省略できる ・正式な表記 short → signed short int long → signed long int ・単なるint型の場合は特定の場合を除いて省略できない データ型の混合演算(計算) ・異なるデータ型を一緒に演算できる [例] lLong = fDouble + nShort; ・演算時には表現能力の高いデータ型に変換される −nShortをshort型からdouble型へ変換 ・代入時には左辺のデータ型に変換される −double型の演算結果をlong型に変換 型変換 ・演算時に型変換は自動的に適切な処理が行われる(暗黙の型変換) ・明示的な型変換の方法もある(キャスト) lLong = (long)(fdouble + (double)nShort); 配列変数について ・同じ型のデータをいくつかまとめて扱える ・配列変数も宣言が必要である int piArray[10] ・プレフィックスの例として配列変数では型を表す プレフィックスの前にpをつける場合がある 配列変数のイメージ int piArray[10];の場合 piArray[0] ← [0]から始まる piArray[1] piArray[2] ・ ・ 10個の変数が確保される ・ ^^^^^^^^^^^^^^^^^^^^^^ piArray[8] piArray[9] ← [0]〜[9]の10個 配列変数の注意点 ・配列には添字がある piArray[0], piArray[1], ... ・配列の添字は0から始まる −1から始まるのではない ・配列の終端は自分で管理する 配列変数を使ったプログラム #include void main(void){ int i, piArray[10]; for(i = 0; i < 10; i++){ piArray[i] = i * i; } for(i = 0; i < 10; i++){ printf("%d * %d = %d\n", %d\n", i, i, piArray[i]); } } 二次元配列とは ・添え字が一つの配列を一次元配列という int piArray[10]; char pszBuffer[256]; ・添え字は2つの配列を二次元配列という int ppiMatrix[2][3]; char ppszBufArray[5][256]; 二次元配列のイメージ int ppiMatrix[2][3];の場合 長さが3の配列変数を ppiMatrix[0][0] ppiMatrix[0][1] ppiMatrix[0][2] ppiMatrix[1][0] ppiMatrix[1][1] ppiMatrix[1][2] 2組用意する for(i=0;i<2;i++){ for(j=0;j<3;j++){ 二次元配列のメモリイメージ int ppiMatrix[2][3];の場合 ppiMatrix[0][0] ppiMatrix[0][1] 長さが3の配列 ppiMatrix[0][2] 2組用意する ppiMatrix[1][0] ppiMatrix[1][1] 長さが3の配列 ppiMatrix[1][2] 文字型の変数とは ・C言語の変数は数値しか格納できない −文字の場合は文字コードを格納する ・文字を格納するのにちょうど良い大きさ −変数の大きさは1バイト ・文字の処理用の特別機能はない −C言語には文字列型の変数はない 文字列を変数に格納するには ・C言語には文字列型の変数はない ・文字型(char)型変数の配列を利用する char pszBuffer[256]; ・プレフィックスの例としてpasを付け加える場合がある −文字(char)型の配列だがpcというわけではない char pszBuffer[256]; gets(pszBuffer); // ABCとキーボードから入力 pszBuffer[0] = 'A'; // 65という数値が入っている pszBuffer[0] = 'B'; // 66という数値が入っている pszBuffer[0] = 'C'; // 67という数値が入っている C言語における文字列の規則 ・文字列の終端には'\0'が格納されている pszBuffer(宣言はchar pszBuffer[256];)に "ABCD"が格納されている場合 [0] [1] [2] [3] [4] [5] [6] ....[256] pszBuffer A B C D \0 .... ・文字列を扱う関数は全てこのルールに従っている 文字列変数の注意点 ・文字列の処理には関数を使用する ・配列の内容は単なる数値である −文字コードが格納されている [0] [1] [2] [3] [4] [5] [6] ....[256] pszBuffer A B C D \0 .... 65 66 67 68 0