今までの練習問題の復習
第3回
ちょっとした練習問題① 整数の変数a=123と実数の変数b=0.456を加算した結果a+bをprintfで表示しなさい。小数点以下は6桁まで表示すること。
#include <stdio.h> int main(void){ int a = 123; double b = 0.345; printf("%.6f \n", a+b); return 0; }
ちょっとした練習問題② BMI = w ÷ h2 sd = 22 × h2 f = (w - sd) ÷ sd ×100 身長h(m)と体重w(kg)を変数に代入して、BMIと肥満度f(%)を計算し、身長、体重、BMIそして肥満度を表示する。 BMI = w ÷ h2 sd = 22 × h2 f = (w - sd) ÷ sd ×100
#include <stdio.h> int main(void) { double h = 1.7; double w = 65.0; double BMI = w / (h * h); double sd = 22 * h * h; double f = ((w - sd) / sd) * 100; printf("%f m, %fkg\n", h, w); printf("BMI = %f \n", BMI); printf("肥満度 = %f \n", f); return 0; }
第4回
ちょっとした練習問題① ( a + b ) * c / b を計算するプログラムを作りなさい。ただし、a = 5.36、b = 8.47、c = 5.789 とする。 また、計算結果は、 printf( "結果 = %f\n", 「計算結果が格納されている変 数」 ); を用いて画面出力しなさい。
練習問題①の解答 #include <stdio.h> int main(void){ double a=5.36, b = 8.47, c = 5.789; printf("答え%lf \n", ( a + b ) * c / b); return 0; }
ちょっとした練習問題② 468円の買い物をして1万円札を出したときのお釣りの札と硬貨の枚数をもとめなさい。 また、計算結果は、 printf( "○円礼の枚数 = %d\n", 「計算結果が格納さ れている変数」 ); を用いてそれぞれ画面出力しなさい。
#include <stdio.h> int main(void) { int turi = 10000; turi -= 468; printf("おつり = %d\n", turi); printf("五千円礼の枚数 = %d\n", turi / 5000); turi %= 5000; printf("千円礼の枚数 = %d\n", turi / 1000); turi %= 1000; printf("五百円玉の枚数 = %d\n", turi / 500); turi %= 500; printf("百円玉の枚数 = %d\n", turi / 100); turi %= 100; printf("五十円玉の枚数 = %d\n", turi / 50); turi %= 50; printf("十円玉の枚数 = %d\n", turi / 10); turi %= 10; printf("一円玉の枚数 = %d\n", turi); return 0; }
ちょっとした練習問題③ 1個 3000円の品物Aを 1200個と、1個 5000円の品物Bを800個購入したときの合計金額、および、品物Aを800個と品物Bを1200個購入したときの合計金額をもとめなさい。 また、計算結果は、 printf( "結果 = %ld\n", 「計算結果が格納されている変 数」 ); を用いてそれぞれ画面出力しなさい。
練習問題③の解答 #include <stdio.h> int main(void){ int a = 3000, b = 5000; a *= 1200; b *= 800; printf("結果 = %ld\n", a+b); return 0; }
第5回
ちょっとした練習問題① for文の二重ループを使って「1×1=答え」から「9 × 9=答え」となるような九九の計算を表示させるようなプログラムを記述せよ。
#include <stdio.h> int main(void) { for (int i = 1; i <= 9; i++) for (int j = 1; j <= 9; j++) printf(" %d × %d = %d\n", i, j, i*j); return 0; }
ちょっとした練習問題② Aさん、Bさん、Cさん、Dさん、Eさんの5人が同時にじゃんけんをします。(リーグ戦やトーナメント戦ではない)その5人の出した手をそれぞれ入力とし、それぞれの勝敗を判定するプログラムを作成してください。出力はprintfで「○さんの勝ち」、「○さんの負け」、「あいこです」と表示するプログラムとします。
//ビット演算(グー0x01、チョキ0x02、パー0x04) int a = 0x01, b = 0x02, c = 0x01, d = 0x01, e = 0x02; int ans = a | b | c | d | e; if (ans == 0x01 || ans == 0x02 || ans == 0x04 || ans == 0x07) { printf("あいこ\n"); } else if (ans == 0x03) { if (a == 0x01) { printf("Aさんの勝ち\n"); else { printf("Aさんの負け\n"); if (b == 0x01) { printf("Bさんの勝ち\n"); printf("Bさんの負け\n"); if (c == 0x01) { printf("Cさんの勝ち\n"); printf("Cさんの負け\n"); if (d == 0x01) { printf("Dさんの勝ち\n"); printf("Dさんの負け\n"); if (e == 0x01) { printf("Eさんの勝ち\n"); printf("Eさんの負け\n"); else if (ans == 0x06) { if (a == 0x02) { printf("Aさんの勝ち\n"); } else { printf("Aさんの負け\n"); if (b == 0x02) { printf("Bさんの勝ち\n"); printf("Bさんの負け\n"); if (c == 0x02) { printf("Cさんの勝ち\n"); printf("Cさんの負け\n"); if (d == 0x02) { printf("Dさんの勝ち\n"); printf("Dさんの負け\n"); if (e == 0x02) { printf("Eさんの勝ち\n"); printf("Eさんの負け\n"); else if (ans == 0x05) { if (a == 0x04) { printf("Aさんの勝ち\n"); } else { printf("Aさんの負け\n"); if (b == 0x04) { printf("Bさんの勝ち\n"); printf("Bさんの負け\n"); if (c == 0x04) { printf("Cさんの勝ち\n"); printf("Cさんの負け\n"); if (d == 0x04) { printf("Dさんの勝ち\n"); printf("Dさんの負け\n"); if (e == 0x04) { printf("Eさんの勝ち\n"); printf("Eさんの負け\n");
ちょっとした練習問題③ モンテカルロ法を使って円の面積を計算して円周率を求めます。円の面積はπ×半径×半径です。半径を1としたときの円の面積はπとなります。またその円に内接するような正方形は1辺が円の直径となり、縦×横、2×2で面積は4となります。となると近似でπ = 4と考えることもできます。 続く
モンテカルロ法はランダム(乱数)を用いたシミュレーションです。本問題ではx座標、y座標にランダムで点を打ち、下のグラフのように「x モンテカルロ法はランダム(乱数)を用いたシミュレーションです。本問題ではx座標、y座標にランダムで点を打ち、下のグラフのように「x*x + y*y <= 1」のときの点が円の面積の内側にある点として、円の面積を4×(円の内側の点)/(正方形にあるすべての点)で近似することができます。以上のようにしてモンテカルロ法で点すべての数を10000、10000、100000で増加させて円周率の値を求めるようなプログラムを作成してください。
モンテカルロ法の図
srand(time(NULL)); double x, y; int max = 1000000, cnt = 0; for (int i = 0; i < max; i++) { x = rand() / 32767.0; y = rand() / 32767.0; if (x * x + y * y <= 1.0) cnt++; } printf("答え = %lf \n", 4.0 * (double)cnt / (double)max); return 0;
第6回
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
#include <stdio.h> int main(void){ char iro[] = {'R', 'W', 'R', 'R', 'W' , 'W' , 'W'}; for(int i = 0; i < 7; i++) if(iro[i] == 'W') printf("Wは配列の%d番目です \n", i); return 0; }
ちょっとした練習問題② 二次元配列を使って以下に示す' '(1文字空白)と'#'(シャープ)でつくられた図をprintfで表示するプログラムを記述しなさい。
#include <stdio.h> int main(void) { char a[10][10]; int x, y; for (x = 0; x < 10; x++) for (y = 0; y < 10; y++) a[x][y] = ' '; for (x = 0; x < 10; x++) { a[x][0] = '#'; a[x][8] = '#'; } for (y = 0; y < 9; y++) { a[0][y] = '#'; a[9][y] = '#'; for (y = 2; y < 4; y++) { a[2][y] = '#'; a[3][y] = '#'; a[6][y] = '#'; a[7][y] = '#'; } for (x = 3; x < 7; x++) a[x][6] = '#'; a[3][5] = '#'; a[6][5] = '#'; for (y = 0; y < 10; y++) { for (x = 0; x < 10; x++) { printf("%c", a[x][y]); printf("\n"); return 0;
ちょっとした練習問題③ 配列animの0番目が"ぞう"、1番目が"きりん"、2番目が"わに"、3番目が"ぱんだ"、4番目が"チンパンジー"となるように宣言をし、animで宣言した動物のすべてをprintfで表示となるプログラムを記述しなさい。
#include <stdio.h> int main(void) { char anim[5][15] = { "ぞう", "きりん", "わに", "ぱんだ", "チンパンジー" }; for (int i = 0; i < 5; i++) printf("%s \n", anim[i]); return 0; }
ちょっとした練習問題④ 0~99の範囲の10個の整数をランダムに生成して、小さい順に並び替えるプログラムを作成しなさい。このとき、C言語のライブラリ関数(qsort()など)を使わないこと。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { srand(time(NULL)); int a[10]; int i, j, temp; for (i = 0; i < 10; i++) a[i] = rand() % 100 + 1; for (i = 0; i < (10 - 1); i++) { for (j = (10 - 1); j > i; j--) { if (a[j - 1] > a[j]) { temp = a[j - 1]; a[j - 1] = a[j]; a[j] = temp; } for (int i = 0; i < 10; i++) printf("%d \n", a[i]); return 0;
ちょっとした練習問題⑤ 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} }, };
#include <stdio.h> int main(void) { 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 } }, }; int i, j, k, sum = 0; for (i = 0; i < 2; i++) { for (j = 0; j < 4; j++) { for (k = 0; k < 3; k++) { sum += tensu[i][j][k]; } printf("sum = %d \n", sum); return 0;
ちょっとした練習問題⑥ 文字列s内のすべての数字文字を削除するプログラムを作成しなさい。格納された文字列は"AB1C93D"とする
#include <stdio.h> #include <string.h> int main(void) { char s[] = "AB1C93D"; char a[10]; int i, cnt = 0; for (i = 0; i < 10; i++) { if ('0' <= s[i] && s[i] <= '9') { continue; } else { a[cnt] = s[i]; cnt++; printf("%s \n", a); return 0;
第7回
ちょっとした練習問題① 関数seki( x, y)を「x * y」を戻り値として宣言し、25と10を実引数とした関数sekiを実行して結果をmainにおけるprintf()で表示するプログラムを記述しなさい。
#include <stdio.h> int seki(int x, int y) { return x * y; } int main(void) { printf("%d \n", seki(25, 10)); return 0;
ちょっとした練習問題② 以下のプログラムの赤字の部分のみを関数とするようなプログラムを記述しなさい。 #include <stdio.h> int main( void ){ int a, b, c; puts( "二つの整数値を入力 " ); scanf( "%d %d", &a, &b ); if ( a <= b ) { c = a; }else { c = b; } printf( "小さい方 = %d\n", c ); return 0;
#include <stdio.h> int min2(int, int); int main(void) { int a, b; puts("二つの整数値を入力 "); scanf("%d %d", &a, &b); printf("小さい方 = %d\n", min2(a, b)); return 0; } int min2(int a, int b) { int c; if (a <= b) { c = a; }else { c = b; return c;
ちょっとした練習問題③ 1文字を引数として、その文字がアルファベット小文字であれば大文字に変換して返す関数を作成しなさい。(小文字でなければそのままを返す) その関数を使用して、入力された文字列を大文字に変換して表示しなさい。
#include <stdio.h> char ToUpper(char ch) { if ('a' <= ch && ch <= 'z') { return ch - ('a' - 'A'); }else { return ch; } int main(void) { char str[100]; scanf("%s", str); for (int i = 0; str[i]; i++) str[i] = ToUpper(str[i]); printf("%s\n", str); return 0;