1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
void generate_1(char* sequence, size_t sequence_length, size_t nb_samples, size_t nb, size_t start_pos, char* result) {
size_t pos;
// printf("debug: generate_1 %lu, %lu, %s\n", nb, start_pos, result);
if (nb < (nb_samples - 1)) {
for (pos=start_pos; pos <= (sequence_length - nb_samples + nb); ++pos) {
result[nb] = sequence[pos];
// printf("debug: for %lu (%lu) -> %lu\n", start_pos, pos, (sequence_length - nb_samples + nb));
generate_1(sequence, sequence_length, nb_samples, (nb + 1), (pos + 1), result);
}
} else {
for (pos=start_pos; pos < sequence_length; ++pos) {
result[nb] = sequence[pos];
printf("*) %s\n", result);
}
}
result[nb] = '\0'; // maybe useless, clean current element
}
void generate(char* sequence, size_t sequence_length, size_t nb_samples) {
if (nb_samples < sequence_length) {
if (nb_samples > 0) {
char* result = malloc((nb_samples + 1) /* * sizeof(char)*/);
if (result != NULL) {
memset(result, '\0', (nb_samples + 1));
generate_1(sequence, sequence_length, nb_samples, 0, 0, result);
free(result);
result = NULL;
} else {
printf("generate - error: malloc\n");
}
} else {
printf("generate: nothing to do\n");
}
} else if (nb_samples == sequence_length) {
printf("*) %s\n", sequence);
} else {
printf("generate - error: nb_samples > sequence_length\n");
}
}
/*****************************************************************************/
/*********************************** Main **********************************/
/*****************************************************************************/
int main(int argc, char* argv[])
{
char sequence[] = {'A', 'B', 'C', 'D', 'E', '\0'};
size_t nb;
for(nb=0; nb <= 5; ++nb) {
printf("\nNb elements %lu:\n", nb);
generate(sequence, 5, nb);
}
return EXIT_SUCCESS;
} |
Partager