Download : sample-001.c ( utf8 版 )
/* * 2016/09/23 sample-001.c */ /* * 複数条件の分岐 * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> /* * trump * トランプの番号から、その名前を表示する */ void trump ( int number ) { printf ( "数値 %d の表すカードは、", number ); if ( number == 1 ) { /* 番号が 1 なら エース (A) */ printf ( "エース" ); } else if ( number == 11 ) { /* 番号が 11 なら ジャック (J) */ printf ( "ジャック" ); } else if ( number == 12 ) { /* 番号が 12 なら クイーン (Q) */ printf ( "クイーン" ); } else if ( number == 13 ) { /* 番号が 13 なら キング (K) */ printf ( "キング" ); } else if ( number == 0 ) { /* 番号が 0 の場合は例外的に ジョーカー ($) */ printf ( "ジョーカー" ); } else { /* それ以外 */ if ( number < 0 ) { /* 番号が負の場合は.. */ printf ( "範囲外" ); } else if ( 13 < number ) { /* 番号が 13 より大きい場合は.. */ printf ( "範囲外" ); } else { /* それ以外は.. */ printf ( "%d の数カード", number ); } } printf ( "です。\n" ); } /* * main * */ int main( int argc, char *argv[] ) { trump ( -1 ); trump ( 0 ); trump ( 1 ); trump ( 7 ); trump ( 10 ); trump ( 13 ); trump ( 20 ); return 0; }
$ ./sample-001.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : sample-002.c ( utf8 版 )
/* * 2016/09/23 sample-002.c */ /* * 複数条件の分岐(case 文を利用した場合) * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-002.exe sample-002.c * 実行 * sample-002 */ #include <stdio.h> /* * trump * トランプの番号から、その名前を表示する */ void trump ( int number ) { printf ( "数値 %d の表すカードは、", number ); switch ( number ) { /* 一つの式の値で分岐 */ case 1: /* 番号が 1 なら エース (A) { (開きブロック) */ printf ( "エース" ); break; /* ここで 1 の場合がおわる } (閉じブロック) */ case 11: /* 番号が 11 なら ジャック (J) */ printf ( "ジャック" ); break; case 12: /* 番号が 12 なら クイーン (Q) */ printf ( "クイーン" ); break; case 13: /* 番号が 13 なら キング (K) */ printf ( "キング" ); break; case 0: /* 番号が 0 の場合は例外的に ジョーカー ($) */ printf ( "ジョーカー" ); break; case 2: /* 範囲は指定できないので、全て列挙 */ /* 2 の場合は 3 の場合と同じなので break しない */ case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: printf ( "%d の数カード", number ); break; /* 2 〜 10 の場合はここで、終了 */ default: /* それ以外は.. */ printf ( "範囲外" ); break; /* これは不要だが、つける習慣を (マナー) */ } printf ( "です。\n" ); } /* * main * */ int main( int argc, char *argv[] ) { trump ( -1 ); trump ( 0 ); trump ( 1 ); trump ( 7 ); trump ( 10 ); trump ( 13 ); trump ( 20 ); return 0; }
$ ./sample-002.exe 数値 -1 の表すカードは、範囲外です。 数値 0 の表すカードは、ジョーカーです。 数値 1 の表すカードは、エースです。 数値 7 の表すカードは、7 の数カードです。 数値 10 の表すカードは、10 の数カードです。 数値 13 の表すカードは、キングです。 数値 20 の表すカードは、範囲外です。 $
Download : sample-003.c ( utf8 版 )
/* * 2016/09/23 sample-003.c */ #include <stdio.h> /* * for 文を利用して、0 から 9 の数値を表示する * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-003.exe sample-003.c * 実行 * sample-003 */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ for ( i = 0; i < 10; i = i + 1 ) {/* i を 0 〜 9 迄変化 */ printf ( "%d\n", i ); /* i を出力 */ } return 0; }
$ ./sample-003.exe 0 1 2 3 4 5 6 7 8 9 $
Download : sample-004.c ( utf8 版 )
/* * 2016/09/23 sample-004.c */ #include <stdio.h> /* * for 文を利用して、1 から 10 の数値を表示する * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-004.exe sample-004.c * 実行 * sample-004 */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ for ( i = 1; i <= 10; i = i + 1 ) {/* i を 1 〜 10迄変化 */ printf ( "%d\n", i ); /* i を出力 */ } return 0; }
$ ./sample-004.exe 1 2 3 4 5 6 7 8 9 10 $
Download : sample-005.c ( utf8 版 )
/* * 2016/09/23 sample-005.c */ #include <stdio.h> /* * for 文を利用して、0 から 9 の数値を表示する * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-005.exe sample-005.c * 実行 * sample-005 */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ for ( i = 0; i < 10; i++ ) { /* i を 0 〜 9 迄変化 */ /* i++ は i = i + 1 と同じ */ printf ( "%d\n", i ); /* i を出力 */ } return 0; }
$ ./sample-005.exe 0 1 2 3 4 5 6 7 8 9 $
Download : sample-006.c ( utf8 版 )
/* * 2016/09/23 sample-006.c */ #include <stdio.h> /* * for 文を利用して、0 から 9 迄の 10 個の数値を和を表示する * sum = \sum_{i=0}^{9} i * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-006.exe sample-006.c * 実行 * sample-006 */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ int sum = 0; for ( i = 0; i < 10; i++ ) { /* i を 0 〜 9 迄変化 */ /* i++ は i = i + 1 と同じ */ sum = sum + i; /* sum に i の値を加える */ printf ( "%d %d\n", i, sum ); /* i と sum を出力 */ } printf ( "最終的には sum = %d\n", sum ); return 0; }
$ ./sample-006.exe 0 0 1 1 2 3 3 6 4 10 5 15 6 21 7 28 8 36 9 45 最終的には sum = 45 $
Download : sample-007.c ( utf8 版 )
/* * 2016/09/23 sample-007.c */ #include <stdio.h> /* * for 文を利用して、0 から 9 の数値を表示する * プログラムを while に書き直す * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-007.exe sample-007.c * 実行 * sample-007 */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ /* 元々のプログラム for ( i = 0; i < 10; i++ ) { printf ( "%d\n", i ); } step-1 <初期化式> を前にもってくる i = 0; for ( i < 10; i++ ) { printf ( "%d\n", i ); } step-2 <再初期化式> を、繰返し文の後にもって行く i = 0; for ( i < 10 ) { printf ( "%d\n", i ); i++; <= { 〜 } の一番最後 } step-3 for を while に書き換える i = 0; while ( i < 10 ) { printf ( "%d\n", i ); i++; } */ /* 元々のプログラム for ( i = 0; i < 10; i++ ) { printf ( "%d\n", i ); } */ i = 0; while ( i < 10 ) { printf ( "%d\n", i ); i++; } return 0; }
$ ./sample-007.exe 0 1 2 3 4 5 6 7 8 9 $
Download : sample-008.c ( utf8 版 )
/* * 2016/09/23 sample-008.c */ #include <stdio.h> /* * for 文では、条件式がサボれる * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-008.exe sample-008.c * 実行 * sample-008 */ int main(int ac, char *av[] ) { for ( ;; ) { /* while では条件を省略できないが for 文ではできる .. */ /* 条件が省略されると、「常に真」になるので無限ループ */ /* プログラムを停止させるには * Ctrl-C ([Ctrl] キーを押しながら [C] キーを押す) * を押す。 */ printf ( "動いています...\n" ); } return 0; }
動いています... 動いています... 動いています... 動いています... .... 動いています... 動いています... 動いています... 動いています... 動いてい^C
Download : sample-009.c ( utf8 版 )
/* * 2016/09/23 sample-009.c */ #include <stdio.h> /* * for 文を利用して、0 から 99 の偶数の数値 * アプローチ * (その一) i を 0 〜 99 として、但し偶数だけを出す * * 利用方法 * コンパイル * cc -I ~/c/include -o sample-009.exe sample-009.c * 実行 * sample-009 */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ for ( i = 0; i < 100; i++ ) { /* i を 0 〜 99 迄変化 */ /* 但し、i が偶数の時だけ → if 文を利用する */ if ( i % 2 == 0 ) { /* i を 2 で割った余り(i%2)が 0 */ /* 即ち i が偶数の時.. */ printf ( "%d\n", i ); /* i を出力 */ } } return 0; }
$ ./sample-009.exe 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 $
/* * 2016/09/16 20160916-03.c * * scanf による書式指定入力 * */ #include <stdio.h> /* * */ /* * main */ int main( int argc, char *argv[] ) { int i; /* キーボードから入力された整数値を保持する整数型変数 */ double d; /* キーボードから入力された浮動小数点数値を保持する浮動小数点数型変数 */ printf ( "整数値をキーボードから入力します : " ); scanf ( "%d", &i ); printf ( "入力された整数値は %d でした。\n", i ); printf ( "浮動小数点数値をキーボードから入力します : " ); scanf ( "%lf", /* s:ここ */ ); printf ( "入力された浮動小数点数値は %f でした。\n", d ); return 0; }
/* * 2016/09/16 20160916-05.c * * while 文 * * 奇数の和を求めて、平方を計算する * 1 = 1 = 1 * 1 * 1 + 3 = 4 = 2 * 2 * 1 + 3 + 5 = 9 = 3 * 3 */ #include <stdio.h> #include "s_print.h" /* * main */ int main( int argc, char *argv[] ) { /* 整数型変数 odd の宣言とその初期化 ( 初期値は 1 を指定 ) */ int odd = 1; /* 整数型変数 sum の宣言とその初期化 ( 初期値は 0 を指定 ) */ int sum = 0; /* sum = 0 + 1 + 3 + .. + 9 = 25 = 5^2 */ /* odd の値が 9 以下の間は繰り返す */ while ( odd <= 9 ) { /* odd < 10 でもよい [ odd < 11 ] */ /* sum に odd の値を「追加」する */ sum = sum + odd; /* sum にこれまでの和が入っているとして、 それに、新たに odd の値を加える */ /* odd の値を次の奇数にする */ odd = odd + 2; /* 1 の次の奇数は 3 で、その次は 5 のように 奇数の値は, 2 ずつ増えてゆく */ } /* 整数型変数 sum の値を画面に出力 */ s_print_string ( "1 から 9 までの奇数の和は " ); s_print_int ( sum ); s_print_string ( " です。\n" ); return 0; }
#include<stdio.h> int main(int argc, char *argv[] ) { printf ( "Hello, World\n" ); /* printf は、引数で与えられた文字列 (この場合は「"Hello, World\n"」) を画面に出力する */ return 0; }
#include<stdio.h> int main(int argc, char *argv[] ) { printf ( "整数値 : %d を表示\n", 1234 ); /* 文字列の中に「 % で始る文字列(書式指定)」を含めることができる 「%d」 この場所に、この後に続く、整数の値を埋め込んで表示する 「整数値 : %d を表示\n」 ↓ 「整数値 : 1234 を表示\n」 */ printf ( "整数値 : %10d を表示\n", 1234 ); printf ( "整数値 : %-10d を表示\n", 1234 ); printf ( "[%d]\n", 123 ); printf ( "[%d]\n", 1234 ); printf ( "[%d]\n", 12345 ); printf ( "[%10d]\n", 123 ); printf ( "[%10d]\n", 1234 ); printf ( "[%10d]\n", 12345 ); printf ( "浮動小数点数 : [%f]\n", 123.456 ); printf ( "浮動小数点数 : [%15.8f]\n", 123.456 ); /* %d 整数値 %f 浮動小数点 %c 文字 %s 文字列 */ printf ( "整数値 %d, 浮動小数点数 : %f, 文字 : %c, 文字列 %s\n", 123, 123.456, 'a', "xyz" ); return 0; }
#include <stdio.h> void print_int ( int n ) { printf ( "1. 整数値 : %d\n", n ); printf ( "2. 整数値 : %d\n", n ); printf ( "3. 整数値 : %d\n", n ); } int main(int argc, char *argv[] ) { print_int ( 123 ); /* => n = 123 print_int ( int n ) => n = 123 printf ( "整数値 : %d\n", n ); => printf ( "整数値 : %d\n", 123 ); => 「"整数値 : 123\n"」 */ print_int ( 789 ); /* => n = 789 print_int ( int n ) => n = 789 printf ( "整数値 : %d\n", n ); => printf ( "整数値 : %d\n", 789 ); => 「"整数値 : 789\n"」 */ return 0; }
#include <stdio.h> void print_int ( int n ) { printf ( "1. 整数値 : %d\n", n ); n = 999; /* 代入式 : 「変数名 = 式」 */ /* 変数の値を、式の評価した値に置き換える */ /* 以後、この変数値は、以前の値を失い、 新しい値(ここで指定した値) になる */ /* 「代入」とは、「変数の値を指定した値に変更する」こと */ printf ( "2. 整数値 : %d\n", n ); printf ( "3. 整数値 : %d\n", n ); } int main(int argc, char *argv[] ) { print_int ( 123 ); /* => n = 123 print_int ( int n ) => n = 123 printf ( "整数値 : %d\n", n ); => printf ( "整数値 : %d\n", 123 ); => 「"整数値 : 123\n"」 */ print_int ( 789 ); /* => n = 789 print_int ( int n ) => n = 789 printf ( "整数値 : %d\n", n ); => printf ( "整数値 : %d\n", 789 ); => 「"整数値 : 789\n"」 */ return 0; }
#include <stdio.h> void print_int_2 ( int n ) { printf ( "2. 整数値 : %d\n", n ); printf ( "3. 整数値 : %d\n", n ); } void print_int ( int n ) { printf ( "1. 整数値 : %d\n", n ); print_int_2 ( 999 ); } int main(int argc, char *argv[] ) { print_int ( 123 ); /* => n = 123 print_int ( int n ) => n = 123 printf ( "整数値 : %d\n", n ); => printf ( "整数値 : %d\n", 123 ); => 「"整数値 : 123\n"」 */ print_int ( 789 ); /* => n = 789 print_int ( int n ) => n = 789 printf ( "整数値 : %d\n", n ); => printf ( "整数値 : %d\n", 789 ); => 「"整数値 : 789\n"」 */ return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int i; /* i という変数(auto 変数/ローカル[局所]変数) を宣言 */ /* 新しく i という int 型の変数が作られる */ /* 変数の値は、「不定」です */ /* 必ず、値を代入(最初の値の代入を初期化と呼ぶ)をする */ /* 変数宣言は、ブロックの先頭で行い、 その有効範囲は、ブロック内 */ i = 123; printf ( "i = %d です\n", i ); printf ( "i = %d です\n", i ); printf ( "i = %d です\n", i ); i = 999; printf ( "i = %d です\n", i ); i = i + 1; /* 代入する式の中で、自分自身も利用できる */ /* 右の i は、これまでの値 999 になる */ /* 左の i は、i+1 すなわち 999+1=1000 が代入される */ /* これ以後は、i は、新しい値 1000 となる */ printf ( "i = %d です\n", i ); return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int i = 0; /* 変数の宣言と同時に、初期化(代入)が可能 */ /* int i; i=0; */ /* while 文 : 繰り返しを行う命令 構文 while ( 「繰り返す条件(実行する条件)」) { 「繰り返す命令」 } 意味 「繰り返す条件(実行する条件)」が成立する間 「繰り返す命令」を(繰り返し)実行する */ /* i = 0 */ while ( i < 10 ) { printf ( "i=%d\n", i ); i = i + 1; /* i が一ずつ増える */ } /* i が 10 より、小さい間、printf と i=i+1 を実行する time line i 操作 0 5 0 <10 --- 1 19 条件が成立 2 20 「i=0」 3 21 1 <10 4 19 条件が成立 5 20 「i=1」 6 21 2 .. n 19 9 条件が成立 n+1 20 「i=9」 n+2 21 10 n+3 19 条件が不成立 n+4 43 終わり */ return 0; }
/* * 2016/09/16 20160916-05.c * * while 文 * * 奇数の和を求めて、平方を計算する * 1 = 1 = 1 * 1 * 1 + 3 = 4 = 2 * 2 * 1 + 3 + 5 = 9 = 3 * 3 */ #include <stdio.h> #include "s_print.h" /* * sum_squre ( 1, 9, 0 ) -> 1 + 3 + .. + 9 = 5^2 */ int sum_squre ( int odd, int max, int sum ) { if ( odd <= max ) { /* while の条件と同じ */ return sum_squre ( odd + 2, max, sum + odd ); /* /* 再帰を利用して、while の機能を実現する */ } else { return sum: } } /* * main */ int main( int argc, char *argv[] ) { /* 整数型変数 odd の宣言とその初期化 ( 初期値は 1 を指定 ) */ int odd = 1; /* 整数型変数 sum の宣言とその初期化 ( 初期値は 0 を指定 ) */ int sum = 0; /* sum = 0 + 1 + 3 + .. + 9 = 25 = 5^2 */ /* odd の値が 9 以下の間は繰り返す */ sum = sum_squre ( odd, 9, sum ); /* while 文がなくなった !! */ /* while 文は、「繰り返し」なので、「再帰」と同じ機能 */ /* 整数型変数 sum の値を画面に出力 */ s_print_string ( "1 から 9 までの奇数の和は " ); s_print_int ( sum ); s_print_string ( " です。\n" ); return 0; }
#include <stdio.h> /* * while と入力 * * キーボードから、文字を入力し、それが、小文字なら大文字に変換する * そして、$ が入力されたら、終わりにする。 */ int main(int argc, char *argv[] ) { int ch; /* キーボードから入力された文字(コード) */ while ( ( ch = getchar() ) != '$' ) { /* 入力が「$」なら終了するので... */ if ( ch <= 'z' ) { if ( 'a' <= ch ) { ch = ch - 'a' + 'A'; /* 小文字を大文字 */ } } putchar ( ch ); /* 変換した文字を出力する */ } return 0; } /* a=b 代入「式」 「式」=>値を持つ その値は、右辺の値そのもの 「b」 と同じ a=b; */
#include <stdio.h> /* scanf printf の入力版 */ int main(int argc, char *argv[] ) { int i; /* 整数型の変数 */ printf ( "キーボードから整数値を入力してください : " ); /* 入力促進(プロンプト) */ scanf ( "%d", &i ); /* 整数値を入力するので %d を指定し、 第二引数以後は、変数名に&を付けたものを 書き込む */ /* scanf はキーボードから、色々な値を を入力し、それを変数に代入する */ printf ( "あなたが入力した値は %d です\n", i ); return 0; }
#include <stdio.h> /* scanf printf の入力版 */ int main(int argc, char *argv[] ) { double i; /* 浮動小数点数型の変数 */ printf ( "キーボードから実数値を入力してください : " ); /* 入力促進(プロンプト) */ scanf ( "%lf", &i ); /* 浮動小数点数を入力するので %f となり そうだが、諸般の都合で %lf を指定する、 第二引数以後は、変数名に&を付けたものを 書き込む */ /* scanf はキーボードから、色々な値を を入力し、それを変数に代入する */ printf ( "あなたが入力した値は %f です\n", i ); return 0; }
#include <stdio.h> /* scanf printf の入力版 書式指定をすることにより、色々な型の値を、いくつも 入力して、変数に代入してくれる ただし、 変数の前には & をつける必要がある(実は、嘘だが、今回はそう覚える) 理由も今回は説明しない 書式は、 整数 %d 文字 %c 浮動小数点数 %lf (%f でないことに注意) 文字列 %s 現時点では、文字列を持つ変数は習っていない 使い道がない scanf では、最初の引数の文字列には、 書式指定以外はいれないようにする。 */ int main(int argc, char *argv[] ) { int i; /* 整数型の変数 */ double d; /* 浮動小数点数型の変数 */ printf ( "キーボードから整数値を入力してください : " ); /* 入力促進(プロンプト) */ scanf ( "%d", &i ); /* 整数値を入力するので %d を指定し、 第二引数以後は、変数名に&を付けたものを 書き込む */ /* scanf はキーボードから、色々な値を を入力し、それを変数に代入する */ printf ( "あなたが入力した値は %d です\n", i ); printf ( "キーボードから実数値を入力してください : " ); /* 入力促進(プロンプト) */ scanf ( "%lf", &d ); /* 浮動小数点数を入力するので %f となり そうだが、諸般の都合で %lf を指定する、 第二引数以後は、変数名に&を付けたものを 書き込む */ /* scanf はキーボードから、色々な値を を入力し、それを変数に代入する */ printf ( "あなたが入力した値は %f です\n", d ); return 0; }
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
なお「名前(P,Q,R,..)」の部分が同じ所には同じものが入ります。
Download : 20160923-01.c ( utf8 版 )
/* * CDATE FILENAME * * キーボードから一文字入力し、その文字によって異る国の挨拶をする */ #include <stdio.h> /* * hello ( char contry ) * char contry : 国を表す一文字 * j : 日本 * e : 英語 * c : 中国 * f : フランス語 * g : ドイツ語 */ void hello ( char cmd ) { switch ( cmd ) { case 'j': /* 'j' の時は、日本語にする */ printf ( "こんにちは\n" ); break; case 'e': /* 'e' の時は、英語にする */ /* ** この部分を完成させなさい */ break; case 'c': /* 'c' の時は、中国語にする */ printf ( "ニイハオ\n" ); /* ** この部分を完成させなさい */ case 'f': /* 'f' の時は、フランス語にする */ printf ( "Bonjour\n" ); break; /* ** この部分を完成させなさい */ printf ( "Guten tag\n" ); break; default: /* どれでもなければ.. */ printf ( "???\n" ); break; } } /* * main */ int main( void ) { printf ( "国を表す文字を入力してください\n" ); printf ( "\tj\t日本\n" ); printf ( "\te\t英語\n" ); printf ( "\tc\t中国\n" ); printf ( "\tf\tフランス\n" ); printf ( "\tg\tドイツ\n" ); hello ( getchar() ); /* getchar() で文字を入力し、それに対応する結果を出す */ return 0; }
f
$ ./20160923-01-QQQQ.exe 国を表す文字を入力してください j 日本 e 英語 c 中国 f フランス g ドイツ Bonjour $
Download : 20160923-02.c ( utf8 版 )
/* * 課題 CNAME-02 * * 20160923 20160923-02-QQQQ.c * * 0 〜 99 の偶数を出力する * */ #include <stdio.h> /* * for 文を利用して、0 から 99 の偶数の数値 (そのニ) i が 0 〜 99 の間の偶数だけを動くようにし、毎回 i を出す */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ for ( i = 0; i < 100; /* p:ここ */ ) { /* i++ だと i = 0, 1, 2, .. */ /* ○○とすれば i = 0, 2, 4, .. */ printf ( "%d\n", i ); /* i を出力 */ } return 0; }
$ ./20160923-02-QQQQ.exe 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 $