Jawoll, darauf aufbauend hat es jetzt geklappt:
c-Datei
[spoiler]```/*
*
*/
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#define TRENNER ‘_’
typedef struct Menge {
char *menge;
int n;
int k;
} Menge;
Menge *menge = NULL;
int calcN(char m[]) {
int n;
if(*m == ‘\0’)
return 0;
if(*m++ == TRENNER)
return 0;
n = 1;
while(*m) {
if(m == TRENNER)
n++;
m++;
}
if(–m == TRENNER)
return 0;
return n;
}
void printArray(int arr[]) {
int i;
for(i = 0; i < menge->k; i++) {
printf("%2i", arr**);
}
printf("
");
}
void printA1(int idx, int arr[], int arr2[], int arr3[]) {
int i, idx2;
if(idx == menge->k) {
printArray(arr2);
return;
}
idx2 = idx + 1;
for(i = 0; i < menge->k; i++)
if(arr3**) {
arr3** = 0;
arr2[idx] = arr**;
printA1(idx2, arr, arr2, arr3);
arr3** = 1;
}
}
int *iniArr3(void) {
int *arr3 = (int *) malloc(sizeof(int) * menge->k);
int i = 0;
while(i++ < menge->k)
*arr3++ = 1;
return arr3 - i;
}
void printA(int idx, int val, int arr[]) {
int idx2;
if(idx == menge->k) {
printA1(0, arr, (int ) malloc(sizeof(int) * menge->k), iniArr3());
return;
}
idx2 = idx + 1; / Deklarationen/Definitionen(/Initialisierungen) u. Code nicht mischen */
for(; val < menge->n;) {
arr[idx] = val++;
printA(idx2, val, arr);
}
}
void printB(int idx, int arr[]) {
int idx2, val;
if(idx == menge->k) {
printArray(arr);
return;
}
idx2 = idx + 1;
for(val = 0; val < menge->n; val++) {
arr[idx] = val;
printB(idx2, arr);
}
}
void printC(int idx, int val, int arr[]) {
int idx2;
if(idx == menge->k) {
printArray(arr);
return;
}
idx2 = idx + 1;
for(; val < menge->n;) {
arr[idx] = val++;
printC(idx2, val, arr);
}
}
void printD(int idx, int val, int arr[]) {
int idx2;
if(idx == menge->k) {
printArray(arr);
return;
}
idx2 = idx + 1;
for(; val < menge->n; val++) {
arr[idx] = val;
printD(idx2, val, arr);
}
}
void printAB(int a, int b) {
int i = ((a - 1) << 1) | (b - 1); /* 00-11 */
printf("Mode: %i: “, i);
while(i) {
if(i & 1)
printf(“1”);
else
printf(“0”);
i >>= 1;
}
printf(”
");
if(a == 1)
if(b == 1)
printA(0, 0, (int *) malloc(sizeof(int) * menge->k));
else
printB(0, (int *) malloc(sizeof(int) * menge->k));
else if(b == 1)
printC(0, 0, (int *) malloc(sizeof(int) * menge->k));
else
printD(0, 0, (int *) malloc(sizeof(int) * menge->k));
}
int main(void) {
int a, b, k = 1;
char *m = (char *) malloc(sizeof(char) * 1000);
menge = (Menge *) malloc(sizeof(Menge));
while(1) {
printf(“k-Permutation: 1
k-Kombination: 2
“);
scanf(”%i”, &a);
printf(“ohne Zuruecklegen: 1
mit Zuruecklegen : 2
“);
scanf(”%i”, &b);
if(a < 1 || a > 2 || b < 1 || b > 2) {
break;
}
printf(“Menge M getrennt durch %c:
“, TRENNER);
scanf(”%999s”, m);
printf(“k (Anzahl Ziehungen): “);
scanf(”%i”, &k);
if(k < 1 || k > 999 / 2 + 1) {
break;
}
menge->menge = m;
menge->n = calcN(m);
menge->k = k;
printf("a=%-5ib=%-5ik=%-5in=%-5iM=%s
", a, b, k, menge->n, m);
printAB(a, b);
}
return EXIT_SUCCESS;
}```[/spoiler]
Ausgabe
[spoiler]
C:\Users\MeinNam\Desktop>Mengen.exe
k-Permutation: 1
k-Kombination: 2
1
ohne Zuruecklegen: 1
mit Zuruecklegen : 2
1
Menge M getrennt durch _:
a_b_c
k (Anzahl Ziehungen): 2
a=1 b=1 k=2 n=3 M=a_b_c
Mode: 0:
0 1
1 0
0 2
2 0
1 2
2 1
k-Permutation: 1
k-Kombination: 2
1
ohne Zuruecklegen: 1
mit Zuruecklegen : 2
2
Menge M getrennt durch _:
a_b_c
k (Anzahl Ziehungen): 2
a=1 b=2 k=2 n=3 M=a_b_c
Mode: 1: 1
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
k-Permutation: 1
k-Kombination: 2
2
ohne Zuruecklegen: 1
mit Zuruecklegen : 2
1
Menge M getrennt durch _:
a_b_c
k (Anzahl Ziehungen): 2
a=2 b=1 k=2 n=3 M=a_b_c
Mode: 2: 01
0 1
0 2
1 2
k-Permutation: 1
k-Kombination: 2
2
ohne Zuruecklegen: 1
mit Zuruecklegen : 2
2
Menge M getrennt durch _:
a_b_c
k (Anzahl Ziehungen): 2
a=2 b=2 k=2 n=3 M=a_b_c
Mode: 3: 11
0 0
0 1
0 2
1 1
1 2
2 2
k-Permutation: 1
k-Kombination: 2
oh^C
C:\Users\MeinNam\Desktop>
[/spoiler]
printA erhöht val immer um 1 und beginnt ab da, außerdem wird wegen Permutation printA1 aufgerufen
printB beginnt immer ab val=0
printC erhöht val auch immer um 1, ruft aber nicht printA1 auf
printD beginnt immer ab val, aber erhöht val erst nach dem rekursiven Aufruf
Beachte: Anzahl kaPermutation ohne Zuruecklegen ist nicht immer gleich Anzahl kaKombination mit Zuruecklegen
Wäre in diesen Fällen Rekursionen oder Iterationen besser? In deiner aktiven c-Zeit von dir, wie hättest du die Funktionen angeordnet/sortiert und welche Bezeichnungen den Funktionen gegeben?