Les sources C à compléter: wtf ?

Bonjour, j'ai commencé à faire les exos du QCM 2014 en C, mais je dois avouer que la tronche des sources à compléter en C sont loins d'être agréables à lire...

1
2
#include<stdio.h>
#include<stdlib.h>

void croissance(int* deltas, int len){
/* Complétez le code ici */
}

int is_number(char c){
return c \<= '9' && c >= '0';
}

int* read_deltas(int len){
int *result = malloc( len * sizeof(int));

{
int index;
for (index = 0 ; index \< len; index++)
{
int num = 0;
char current_char = '\000';
scanf("%c", &current_char);
int ok = is_number(current_char);
while (ok)
{
num = num * 10 + current_char - '0';
scanf("%c", &current_char);
ok = is_number(current_char);
}
result[index] = num;
}
}
return result;
}

int main(void){
int len = 0;
scanf("%d", &len);
scanf("%*[ \t\r\n]c", 0);
int* deltas = read_deltas(len);
croissance(deltas, len);
return 0;
}

Alors qu'en rajoutant des espaces dans le format de scanf, on peut obtenir un code équivalent en seulement quelques lignes:

1
2
#include <stdio.h>
#include <stdlib.h>

void croissance(int* deltas, int len){
/* Complétez le code ici */
}

int main(void){
int i, n, *deltas;

scanf("%d\n", &n);
deltas = malloc(n * sizeof(int));
for(i = 0;i\<n;i++)
scanf(" %d", deltas+i);

croissance(deltas, n);

return 0;
}

Est-ce que la personne qui a fait cette source à compléter déteste le C, ou bien y a-t-il une autre raison ?

Rien ne t'empêche d'utiliser tes propres sources :P
ils ont peut-être pas pris trop le temps, ce ne serait pas étonnant que ce code fût écrit entre 2h et 8h du matin\^\^

Les sources à compléter sont généralement lourdes pour rien, mais là on atteint des sommets.
Il est même inutile de stocker entièrement l'entrée pour ce problème.
Et en général, les allocations dynamiques ne sont pas justifiées ; autant allouer l'espace maximum directement.

Pour information, nos sources à compléter ne sont pas écrites à la main mais générées automatiquement. Je ne vois pas trop ce qui vous pose problème si vous voulez les utiliser, le principe est justement de ne pas avoir à s'en soucier ou à les lire et juste de compléter la fonction en question. Comme l'a signalé hl037, vous pouvez très bien créer vos propres sources à compléter.

Écrire des sources à compléter pour des dizaines d'exercices est assez fastidieux. Nous utilisions les années précédentes une autre solution qui contenait des sources à compléter hardcodées pour chaque langage, mais cela était très peu flexible et nécessitait très souvent de devoir repasser dessus à la main (ce qui prenait tout autant de temps). Cette année, nous utilisons un autre projet, Metalang (http://eelte.megami.fr/metalang/index.html) qui nous permet d'écrire du code dans un langage de base et le générer dans plein de langages différents.
Nous travaillons actuellement sur une stdlib de Metalang, qui permettrait d'avoir des fonctions avec des versions "idiomatiques" pour chaque langage (le code python à compléter actuel fait 200 lignes alors qu'on peut le faire en 2 lignes, mais on ne l'a bien entendu pas écrit à la main...)

On vous tiendra au courant sur l'avancement de ceci. En attendant, si ces codes vous perdent vraiment, nous allons peut-être écrire manuellement des codes à compléter plus simples à comprendre pour quelques langages, mais gardez en tête que le principe est justement de ne pas s'en soucier.

> Alors qu'en rajoutant des espaces dans le format de scanf, on peut obtenir un code équivalent en seulement quelques lignes:

Même sans les espaces ça fonctionne... Parce que sauf avec %c/%n/[ les caractères blancs sont ignorés.

Répondre au sujet

Vous devez vous enregistrer ou vous connecter pour poster des messages.