前回の練習問題
ちょっとした練習問題① for文の二重ループを使って「1×1=答え」から「9 × 9=答え」となるような九九の計算を表示させるようなプログラムを記述せよ。
ちょっとした練習問題② Aさん、Bさん、Cさん、Dさん、Eさんの5人が同時にじゃんけんをします。(リーグ戦やトーナメント戦ではない)その5人の出した手をそれぞれ入力とし、それぞれの勝敗を判定するプログラムを作成してください。出力はprintfで「○さんの勝ち」、「○さんの負け」、「あいこです」と表示するプログラムとします。
ちょっとした練習問題③ モンテカルロ法を使って円の面積を計算して円周率を求めます。円の面積はπ×半径×半径です。半径を1としたときの円の面積はπとなります。またその円に内接するような正方形は1辺が円の直径となり、縦×横、2×2で面積は4となります。となると近似でπ = 4と考えることもできます。 続く
モンテカルロ法はランダム(乱数)を用いたシミュレーションです。本問題ではx座標、y座標にランダムで点を打ち、下のグラフのように「x モンテカルロ法はランダム(乱数)を用いたシミュレーションです。本問題ではx座標、y座標にランダムで点を打ち、下のグラフのように「x*x + y*y <= 1」のときの点が円の面積の内側にある点として、円の面積を4×(円の内側の点)/(正方形にあるすべての点)で近似することができます。以上のようにしてモンテカルロ法で点すべての数を10000、10000、100000で増加させて円周率の値を求めるようなプログラムを作成してください。
モンテカルロ法の図
プログラミング応用 配列、文字列
配列 複数の値を入れることができる変数の集まり 1つの変数名で複数のデータをまとめて管理で きるようになっている 文字列も配列。 「.length」がないので注意 多次元配列が使える 連想配列みたいなのは別項目(ないと考える)
実行してみる① #include <stdio.h> int main(void){ int a[4]; a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4; for (int i = 0; i < 4; i++) printf("%d\n", a[i]); return 0; }
実行してみる② #include <stdio.h> int main(void){ int a[4] = {1, 2, 3, 4}; for (int i = 0; i < 4; i++) printf("%d\n", a[i]); return 0; } 同じ実行結果になる
実行してみる③ #include <stdio.h> int main(void){ int a[4] = {1, 2, 3, 4}; printf("%d\n", a[5]); return 0; } エラーになる
実行してみる④ 中に何も書かない方法もある どうなるか確認してみよう #include <stdio.h> int main(void){ int a[] = {1, 2, 3, 4}; for (int i = 3; i >= 0; i--) printf("%d\n", a[i]); return 0; } 中に何も書かない方法もある どうなるか確認してみよう
配列の仕組み 普通の変数 値 int 変数名; 配列変数 値 値 値 1 2 int 配列名[] = {値};
ネットで拾ってきた絵
文字列は配列 文字列は文字の集まり、配列で表す ダブルクォート ” は文字列、シングルクォート ’ は1文字を表す char s[6]の配列で5文字を表すことができる
実行してみる① #include <stdio.h> int main(void){ char m[6] = “Hello”; printf(“%c%c%c%c%c \n”, m[0], m[1], m[2], m[3], m[4]); printf(“%c \n”, m[3]); printf(“%s \n”, m); return 0; }
実行してみる② #include <stdio.h> int main(void){ char s[4] = “Cat”; s[0] = ‘R’; printf(“%s \n”, s); return 0; }
実行してみる③ #include <stdio.h> int main(void){ char a[4] = “NET”; char b[4]; for(int i = 0; a[i] != ‘\0’; i++) b[i] = a[2-i]; b[3] = ‘\0’; printf(“%s は逆からだと %s \n”, a, b); return 0; }
#include <string.h> 文字列関数 #include <string.h> () …文字列の長さを得る () …文字列をコピーする () …文字列を結合する () …数値などを文字列に変換 () …文字列を数値に変換する
実行してみる① #include <stdio.h> #include <string.h> int main(void){ char s1[] = “cat”, s2[] = “dog”; char s[20]; sprintf(s, “I love %s and %s.”, s1, s2); printf(“「%s」の文字数は%d \n”, s, strlen(s)); return 0; }
実行してみる② 文字列を代入する ための関数 #include <stdio.h> #include <string.h> int main(void){ char m[11] = ”Hello"; printf("%s \n", m); strcpy(m, “Good bye!”); return 0; } 文字列を代入する ための関数
多次元配列 1次元配列 int a[3]; 2次元配列 int a[2][3]; 3次元配列 int a[2][2][3]; 4次元配列
実行してみる #include <stdio.h> int main(void){ int a[2][3] ={ {10, 20, 30}, {40, 50, 60} }; for(int x = 0; x < 2; x++) for(int y = 0; y < 3; y++) printf(“a[%d][%d] = %d \n”, x, y, a[x][y]); return 0; }
今週はここまで 何か質問はありませんか?
ちょっとした練習問題① 配列iroを[“赤”, “白”, “赤”, “赤”, “白” , “白” , “白”]を宣言して、「白」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
ちょっとした練習問題② 二次元配列を使って以下に示す”□”と”■”でつくられた図をprintfで表示するプログラムを記述しなさい。
ちょっとした練習問題③ 試験の点数が格納された配列score = [98, 100, 43, 21, 87, 76, 59, 60, 10, 34]を宣言して、関数akatenに配列scoreを参照渡しして赤点(60未満)となる配列が何番目かをprintfで表示するプログラムを記述してください。
ちょっとした練習問題④ 配列animの0番目が”ぞう”、1番目が”きりん”、2番目が”わに”、3番目が”ぱんだ”、4番目が”チンパンジー”となるように宣言をし、animで宣言した動物のすべてをprintfで表示となるプログラムを記述しなさい。
ちょっとした練習問題⑤ String関数を使って文字列の変数strの中身をすべて配列mojiに格納し、10番目の文字を”超大”と変更して、その文字をprintfで表示するプログラムを記述しなさい。 char str[] = “私はプログラミングが大好きです”;
ちょっとした練習問題⑥ 0~99の範囲の10個の整数をランダムに生成して、小さい順に並び替えるプログラムを作成しなさい。このとき、C言語のライブラリ関数(qsort()など)を使わないこと。
ちょっとした練習問題⑦ 4人の学生の3科目のテスト2回の合計を求めて表示するプログラムを作成しなさい。点数を格納するのは3次元配列tensuとする。 int tensu[2][4][3] ={ { {91, 63, 78}, {67, 72, 46}, {89, 34, 53}, {32, 54, 34} }, { {97, 67, 82}, {73, 43, 46}, {97, 56, 21}, {85, 46, 35} }, };
ちょっとした練習問題⑧ 文字列s内のすべての数字文字を削除するプログラムを作成しなさい。格納された文字列は”AB1C93D”とする