J'ai donc écrit un simple code C qui génère N membres de Fibonacci puis écrit chaque membre dans un nœud de liste chaînée puis écrit tout cela.Le code C simple ne fonctionne pas correctement quand le fichier input.txt lui est passé
Je code dans les fenêtres de Geany, mais j'ai testé le code dans ubuntu car gcc fonctionne bizarrement dans Windows. J'ai écrit le code, il compile les versions et les exécutions, quand j'introduis tout ce qui fonctionne, tout va bien. Par exemple l'entrée est 1 5 2 3. 1 est le choix du menu pour entrer le N nombre de membres, 5 est le nombre de membres que l'utilisateur choisit, 2 est pour générer les noeuds et l'écrire dans les noeuds et 3 est pour imprimer tout cela. Tout fonctionne bien et bien là, mais le problème est, quand je prends un fichier in.txt avec 1 5 2 3 écrit en elle et passe au code avec le chat in.txt | Commande ./fibonacci> out.txt dans Ubuntu, mon fichier out.txt est ÉNORME, avec beaucoup de sorties répétées. Si je viens d'entrer le numéro 3 directement, je reçois un message disant "La liste est vide", ce qui est bien. Mais quand j'entre seulement un nombre 3 dans mon fichier in.txt et exécute la commande je reçois 150 Mo de "la liste est vide" dans mon out.txt. Donc, quand je confie mon affectation à un vérificateur d'assignation automatisé, nous avons sur mon collège la même chose et l'affectation me donne un grand rouge non-non. Je ne comprends pas vraiment quel est le problème, pourquoi ai-je un programme fonctionnant parfaitement quand il est exécuté directement mais quand un fichier d'entrée lui est passé avec un seul numéro 3 j'obtiens des messages infinis "la liste est vide" comme ma sortie dans mon fichier out.txt.
Voici le code
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#ifndef DEBUG
#define DEBUG(...) printf(__VA_ARGS__)
#endif
typedef struct Node {
struct Node *next;
int val;
} node;
int entry()
{
int n;
scanf("%d", &n);
if(n <= 0) return -1;
return n;
}
int make_list (int val, node **head)
{
node *new, *current;
new=(node*) malloc(sizeof(node));
if(!new) return -1;
new->val = val;
new->next=NULL;
if(!*head){
*head = new;
}else {
for(current=*head; current->next != NULL; current= current->next);
current->next = new;
}
return 0;
}
int fibonacci (int n, node **head){
int i, f1=0, f2=1, next=0;
if (n <= 0) return -1;
for(i=1; i<n; i++){
if(i==1){
make_list(f1, head);
continue;
}
if(i==2){
make_list(f2, head);
continue;
}
next = f1+f2;
f1=f2;
f2=next;
make_list(next, head);
}
return 1;
}
int print(node *head){
node *current;
if(!head) return -1;
for(current=head; current!=NULL; current=current->next){
printf("%d ", current->val);
}
return 0;
}
int main(int argc, char **argv)
{
node *head=NULL;
char menu_choice;
int retval, n;
do {
DEBUG("\n(1) Enter number of Fibonacci members \n(2) Generate N numbers of Fibonacci \n(3) Print out list \n(e) Exit\n");
scanf(" %c", &menu_choice);
switch (menu_choice) {
case '1':
retval = entry();
n = retval;
if (retval == -1) printf("You entered negative number\n");
break;
case '2':
retval = fibonacci(n+1, &head);
if (retval==1) printf("Numbers are generated\n");
if (retval==-1) printf("Not possible to generate numbers\n");
break;
case '3':
retval = print(head);
if (retval==-1) printf("List is empty\n");
break;
}
} while(menu_choice!='e');
return 0;
}
Pourquoi votre txt ne contient pas la commande 'e'? Vous ne vérifiez pas le résultat de 'scanf', donc il continuera à boucler sur l'entrée qu'il n'a pas reçue. –
Vous Monsieur ... Vous êtes mon sauveur Monsieur! : D – M4cX1