はじめに
この実験では、C 言語で順列 (nPr) を計算する方法を学びます。この実験は、以下の手順で構成されています。
最初に、順列の計算に必要な n と r の入力値を読み取ります。scanf() 関数を使用してユーザーから入力を受け取り、入力値を出力して確認します。
次に、階乗と順列 (nPr) を計算する関数を実装します。計算式は nPr = n! / (n-r)! です。r が n より大きい場合、エラーメッセージを表示します。
n と r の入力
このステップでは、C プログラミングで順列を計算するために必要な n と r の入力値を読み取る方法を学びます。
まず、順列計算プログラムを実装するための新しい C ファイルを作成しましょう。
cd ~/project
nano permutations.c
次に、入力値を読み取るコードを記述します。
#include <stdio.h>
int main() {
int n, r;
printf("アイテムの総数 (n) を入力してください:");
scanf("%d", &n);
printf("選択するアイテムの数 (r) を入力してください:");
scanf("%d", &r);
printf("入力された値:n = %d, r = %d\n", n, r);
return 0;
}
実行例:
アイテムの総数 (n) を入力してください: 5
選択するアイテムの数 (r) を入力してください: 3
入力された値: n = 5, r = 3
コードの詳細:
scanf()を使用して、ユーザーから整数を入力を読み取ります。%dは整数の書式指定子です。&nと&rは、入力値が格納されるメモリアドレスです。- 入力された値を出力して、入力を確認します。
プログラムをコンパイルして実行します。
gcc permutations.c -o permutations
./permutations
nPr = n!/(n-r)! の計算
このステップでは、階乗の計算によって順列 (nPr) を計算する関数を実装します。
以前の permutations.c ファイルを修正して、階乗計算と順列計算を追加しましょう。
cd ~/project
nano permutations.c
次に、階乗と順列計算関数でコードを更新します。
#include <stdio.h>
// 階乗を計算する関数
unsigned long long factorial(int num) {
unsigned long long result = 1;
for (int i = 1; i <= num; i++) {
result *= i;
}
return result;
}
// 順列 (nPr) を計算する関数
unsigned long long permutation(int n, int r) {
// 無効な入力をチェック
if (r > n) {
printf("Error: r は n より大きくできません\n");
return 0;
}
// 式 n! / (n-r)! を使って nPr を計算
return factorial(n) / factorial(n - r);
}
int main() {
int n, r;
printf("アイテムの総数 (n) を入力してください:");
scanf("%d", &n);
printf("選択するアイテムの数 (r) を入力してください:");
scanf("%d", &r);
unsigned long long result = permutation(n, r);
if (result > 0) {
printf("%d 個のアイテムから %d 個選ぶ順列 (nPr) は:%llu\n", n, r, result);
}
return 0;
}
プログラムをコンパイルして実行します。
gcc permutations.c -o permutations
./permutations
実行例:
アイテムの総数 (n) を入力してください: 5
選択するアイテムの数 (r) を入力してください: 3
5 個のアイテムから 3 個選ぶ順列 (nPr) は: 60
実装に関する重要な点:
factorial()関数は、与えられた数の階乗を計算します。permutation()関数は、nPr の式 n! / (n-r)! を実装します。- より大きな階乗値を扱うために
unsigned long longを使用しています。 - 入力検証で、r が n 以下であることを確認しています。
結果の表示
このステップでは、順列計算プログラムを拡張して、より詳細な出力とフォーマットオプションを追加します。
permutations.c ファイルを修正して、結果の表示を改善しましょう。
cd ~/project
nano permutations.c
結果表示を改善したコードを更新します。
#include <stdio.h>
// 階乗を計算する関数
unsigned long long factorial(int num) {
unsigned long long result = 1;
for (int i = 1; i <= num; i++) {
result *= i;
}
return result;
}
// 順列 (nPr) を計算する関数
unsigned long long permutation(int n, int r) {
// 無効な入力をチェック
if (r > n) {
printf("Error: r は n より大きくできません\n");
return 0;
}
// 式 n! / (n-r)! を使って nPr を計算
return factorial(n) / factorial(n - r);
}
// 詳細な順列計算の説明を表示する関数
void printPermutationDetails(int n, int r, unsigned long long result) {
printf("\n--- 順列計算詳細 ---\n");
printf("アイテムの総数 (n): %d\n", n);
printf("選択するアイテムの数 (r): %d\n", r);
printf("計算:%d P %d = %d! / (%d - %d)!\n", n, r, n, n, r);
printf("結果:%llu 通りの異なる配置が可能です\n", result);
printf("----------------------------------------\n");
}
int main() {
int n, r;
printf("順列 (nPr) 計算機\n");
printf("アイテムの総数 (n) を入力してください:");
scanf("%d", &n);
printf("選択するアイテムの数 (r) を入力してください:");
scanf("%d", &r);
unsigned long long result = permutation(n, r);
if (result > 0) {
printPermutationDetails(n, r, result);
}
return 0;
}
プログラムをコンパイルして実行します。
gcc permutations.c -o permutations
./permutations
実行例:
順列 (nPr) 計算機
アイテムの総数 (n) を入力してください: 5
選択するアイテムの数 (r) を入力してください: 3
--- 順列計算詳細 ---
アイテムの総数 (n): 5
選択するアイテムの数 (r): 3
計算: 5 P 3 = 5! / (5 - 3)!
結果: 60通りの異なる配置が可能です
----------------------------------------
主な改善点:
- 専用の
printPermutationDetails()関数を追加しました。 - 計算の詳細な情報を表示するように出力を改善しました。
- 順列の式と結果を説明しました。
- タイトルと詳細な説明でユーザーインターフェースを改善しました。
まとめ
この実験では、C プログラミングで順列を計算するために必須の n と r の入力値を読み取る方法を学びました。また、n! / (n-r)! という式を使って階乗と順列 (nPr) を計算する関数を実装しました。
主な学習ポイントは、整数入力を読み取るための scanf() の使用、階乗と順列計算関数の作成、r が n より大きい場合の無効な入力の処理です。



