Besoin d'aide : un petit programme en c
Résolu/Fermé
m3ghassane
Messages postés
5
Date d'inscription
dimanche 11 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2009
-
11 janv. 2009 à 21:48
m3ghassane Messages postés 5 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 - 12 janv. 2009 à 23:07
m3ghassane Messages postés 5 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 - 12 janv. 2009 à 23:07
6 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
11 janv. 2009 à 22:55
11 janv. 2009 à 22:55
Salut,
Voici un exemple, mais qui ne teste pas toutes les conditions (liste ne se termine pas par zéro)
Voici un exemple, mais qui ne teste pas toutes les conditions (liste ne se termine pas par zéro)
#include<stdio.h> #include"liste.h" #include<math.h> Liste *SoustractionListe(Liste *L1, Liste *L2); int main() { Liste *L1,*L2; FILE *F1,*F2; int n; F1=fopen("fic.txt","r"); F2=fopen("fic2.txt","r"); L1=InitialiserListe(); L2=InitialiserListe(); while((n=fgetc(F1))!=EOF) if(n!='\n') L1=InsertionDebutListe(L1,n-'0'); while((n=fgetc(F2))!=EOF) if(n!='\n') L2=InsertionDebutListe(L2,n-'0'); AfficheListe(L1); AfficheListe(L2); L1=SoustractionListe(L1,L2); AfficheListe(L1); AfficheListe(L2); ViderListe(&L1); ViderListe(&L2); return 0; } Liste *SoustractionListe(Liste *L1,Liste *L2){ int n1,n2,i,j,diff,r; Liste *p; n1=n2=i=j=0; for(p=L1;p!=NULL;p=p->suivant) n1 += (p->donnee)*pow(10,i++); for(p=L2;p!=NULL;p=p->suivant) n2 += (p->donnee)*pow(10,j++); ViderListe(&L1); diff = n1 - n2; r = diff % 10; while(diff !=0){ diff /=10; L1=InsertionDebutListe(L1,r); r = diff %10; } return L1; }
m3ghassane
Messages postés
5
Date d'inscription
dimanche 11 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2009
1
11 janv. 2009 à 22:51
11 janv. 2009 à 22:51
Je n'ai pas encore commencé car je ne sais pas comment faire le stockage en inverse et la soustraction en retenue.
J'ai du mal à te suivre Lami20j parce qu'on qu'à notre 1 er semestre et on est pas encore arrivé au stade des fichiers, stp est ce que tu peux m'expliquer comment tu as fait pour le stockage en inverse ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
12 janv. 2009 à 20:44
12 janv. 2009 à 20:44
Salut,
stp est ce que tu peux m'expliquer comment tu as fait pour le stockage en inverse ?
Une liste simplement chaînée a un début et une fin.
Si chaque nouveau élément est inséré au début on obtiens une liste inverse par rapport à l'ordre d'insertion.
Pourquoi?
Supposons la liste vide, donc ni début ni fin
Insertion du 1er élément
1
En ce cas 1 c'est le début et aussi la fin - la liste a un seul élément.
Insertion du deuxième élément au début de la liste
1 deviendra le deuxième élément
01
Insertion du troisième élément au début de la liste
1 passe de deuxième place au troisième
0 passe de 1er place au deuxième
001
Insertion du quatrième élément au début de la liste
1 passe de troisième place au quatrième
0 passe de deuxième place au troisième
0 passe de 1er place au deuxième
2001
et ainsi de suite.
Tout est fait par la fonction InsertionDebutListe
J'ai modifié le code pour ne pas utiliser les fichiers.
La liste sera rempli au clavier.
Le programme utilise 3 fichiers (plus bas tu verras la compilation et l'exécution)
liste.h
Testé sous Linux Debian
gcc (Debian 4.3.2-1.1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
Les 3 fichiers doivent se trouver dans le même répertoire
A savoir que dans ton exemple je n'ai pas utiliser les mêmes fonctions présentés dans le tutoriel, mais le principe reste le même.
Dans le tutoriel tu as aussi des images qui explique l'insertion des éléments.
stp est ce que tu peux m'expliquer comment tu as fait pour le stockage en inverse ?
Une liste simplement chaînée a un début et une fin.
Si chaque nouveau élément est inséré au début on obtiens une liste inverse par rapport à l'ordre d'insertion.
Pourquoi?
Supposons la liste vide, donc ni début ni fin
Insertion du 1er élément
1
En ce cas 1 c'est le début et aussi la fin - la liste a un seul élément.
Insertion du deuxième élément au début de la liste
1 deviendra le deuxième élément
01
Insertion du troisième élément au début de la liste
1 passe de deuxième place au troisième
0 passe de 1er place au deuxième
001
Insertion du quatrième élément au début de la liste
1 passe de troisième place au quatrième
0 passe de deuxième place au troisième
0 passe de 1er place au deuxième
2001
et ainsi de suite.
Tout est fait par la fonction InsertionDebutListe
J'ai modifié le code pour ne pas utiliser les fichiers.
La liste sera rempli au clavier.
Le programme utilise 3 fichiers (plus bas tu verras la compilation et l'exécution)
liste.h
#ifndef __LISTE__ #define __LISTE__ typedef struct Element{ int donnee; struct Element *suivant; }Liste; Liste *InitialiserListe(); Liste *InsertionDebutListe(Liste *L,int donnee); Liste *InsertionFinListe(Liste *L,int donnee); Liste *CreerListeDansOrdre(); Liste *CreerListeInverse(); void ViderListe(Liste **L); void AfficheListe(Liste *L); Liste *alloc(); #endifliste_funct.c
#include "liste.h" #include<stdio.h> #include<stdlib.h> #include<string.h> Liste *InitialiserListe(){ return NULL; } Liste *alloc(){ return (Liste *)malloc(sizeof(Liste)); } Liste *InsertionDebutListe(Liste *L,int donnee){ Liste *nouveau; nouveau = alloc(); nouveau->donnee = donnee; nouveau->suivant = NULL; nouveau->suivant=L; return nouveau; } Liste *CreerListeInverse(){ Liste *L; char c = 'o'; int N; L=InitialiserListe(L); while(c=='o'){ printf("Entrez numéro : "); scanf("%d",&N); getchar(); L = InsertionDebutListe(L,N); printf("Continuer ? o/n : "); c=getchar(); } return L; } Liste *InsertionFinListe(Liste *L,int donnee){ Liste *nouveau,*pL; nouveau = alloc(); nouveau->donnee = donnee; nouveau->suivant = NULL; if(L==NULL) L=nouveau; else{ for(pL=L;pL->suivant!=NULL;pL=pL->suivant) ; pL->suivant=nouveau; } return L; } Liste *CreerListeDansOrdre(){ Liste *L; char c = 'o'; int N; L=InitialiserListe(L); while(c=='o'){ printf("Entrez numéro : "); scanf("%d",&N); getchar(); L = InsertionFinListe(L,N); printf("Continuer ? o/n : "); c=getchar(); } return L; } void AfficheListe(Liste *L){ Liste *pL; for(pL=L;pL!=NULL;pL=pL->suivant) printf("%d ",pL->donnee); printf("\n"); } void ViderListe(Liste **L){ Liste *courant; while(*L!=NULL){ courant=*L; *L=(*L)->suivant; free(courant); } *L=NULL; }Le fichier soustractionliste.c
#include<stdio.h> #include"liste.h" #include<math.h> Liste *SoustractionListe(Liste *L1, Liste *L2); int main() { Liste *L1,*L2; FILE *F1,*F2; int n; char choix; choix='o'; L1=InitialiserListe(); L2=InitialiserListe(); printf("******Remplire la 1ère liste*****\n"); while(choix=='o'){ printf("Entrez numéro : "); scanf("%d",&n); getchar(); L1=InsertionDebutListe(L1,n); printf("Voulez-vous continuer? o/n : "); choix=getchar(); getchar(); } choix='o'; printf("******Remplire la 2ème liste*****\n"); while(choix=='o'){ printf("Entrez numéro : "); scanf("%d",&n); getchar(); L2=InsertionDebutListe(L2,n); printf("Voulez-vous continuer? o/n : "); choix=getchar(); getchar(); } AfficheListe(L1); AfficheListe(L2); L1=SoustractionListe(L1,L2); AfficheListe(L1); AfficheListe(L2); ViderListe(&L1); ViderListe(&L2); return 0; } Liste *SoustractionListe(Liste *L1,Liste *L2){ int n1,n2,i,j,diff,r; Liste *p; n1=n2=i=j=0; for(p=L1;p!=NULL;p=p->suivant) n1 += (p->donnee)*pow(10,i++); for(p=L2;p!=NULL;p=p->suivant) n2 += (p->donnee)*pow(10,j++); ViderListe(&L1); diff = n1 - n2; r = diff % 10; while(diff !=0){ diff /=10; L1=InsertionFinListe(L1,r); r = diff %10; } return L1; }La compilation
Testé sous Linux Debian
gcc (Debian 4.3.2-1.1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
Les 3 fichiers doivent se trouver dans le même répertoire
$ gcc -c liste_funct.c soustractionliste.c $ gcc liste_funct.o soustractionliste.o -o soustractionliste -lmExécution
$ ./soustractionliste ******Remplire la 1ère liste***** Entrez numéro : 1 Voulez-vous continuer? o/n : o Entrez numéro : 0 Voulez-vous continuer? o/n : o Entrez numéro : 0 Voulez-vous continuer? o/n : o Entrez numéro : 2 Voulez-vous continuer? o/n : o Entrez numéro : 7 Voulez-vous continuer? o/n : o Entrez numéro : 6 Voulez-vous continuer? o/n : o Entrez numéro : 2 Voulez-vous continuer? o/n : n ******Remplire la 2ème liste***** Entrez numéro : 5 Voulez-vous continuer? o/n : o Entrez numéro : 9 Voulez-vous continuer? o/n : o Entrez numéro : 8 Voulez-vous continuer? o/n : o Entrez numéro : 3 Voulez-vous continuer? o/n : n 2 6 7 2 0 0 1 3 8 9 5 9 7 7 6 9 9 3 8 9 5Pour comprendre l'implémentation des listes tu peux regarder aussi Liste simplement chaînée
A savoir que dans ton exemple je n'ai pas utiliser les mêmes fonctions présentés dans le tutoriel, mais le principe reste le même.
Dans le tutoriel tu as aussi des images qui explique l'insertion des éléments.
m3ghassane
Messages postés
5
Date d'inscription
dimanche 11 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2009
1
12 janv. 2009 à 23:07
12 janv. 2009 à 23:07
Bonsoir ,j'ai bien compris le principe du stockage inversé que vous m'aviez expliqué mais là je suis un peu perdu en ce qui concerne les 3 fichiers , est ce qu'il n'ya pas un seul programme qui résume le tout?! ca sera plus clair pour moi autant que débutant, et c'est gentil de votre part Merci.
12 janv. 2009 à 16:47
12 janv. 2009 à 16:55
Je remplis les listes depuis deux fichiers.
Mais à savoir qu'il manque les fonctions de l'implementation de la liste.
InitialiserListe
InsertionDebutListe
AfficherListe
ViderListe
sont des fonctions qui se trouvent dans liste_funct.c
Le fichier liste.h contient les prototypes des fonctions.