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
Bonjour,

je suis tout nouveau et j'aimerais que vous m'aidiez dans mon mini projet, c'est trop facile mais je suis debutant. voici l'ennocé :

"On peut représenter un entier positif à l’aide d’une liste simplement liée d’entiers compris entre 0 et 9 constituée des chiffres de l’entier placé dans l’ordre inverse de l’écriture décimale. Le nombre 1002762 pourra être représenté par la liste suivante :
2 6 7 2 0 0 1

On supposera qu’une telle liste ne peut jamais se terminer par un 0. En particulier, le nombre 0 sera représenté par la liste vide.
On demande d’écrire une fonction qui reçoit comme paramètres deux listes représentant des entiers comme décrit ci-dessus. La fonction devra soustraire le second entier du premier. On supposera que le second entier est toujours inférieur au premier. Au retour de la fonction, la première liste représentera un nombre qui correspond au résultat de la soustraction. La fonction doit donc modifier la première liste et ne pas créer une nouvelle liste.


Exemple.
Si le premier nombre est 1002762 représenté par la liste de l’exemple ci-dessus et le second nombre 5983
Représenté par la liste suivante,
3 8 9 5

La fonction doit modifier la première liste pour qu’elle devienne :
9 7 7 6 9 9
Qui correspond au nombre 996779 = 1002762 – 5983.

Attention, la première liste ne peut pas se terminer par un ou plusieurs 0, en particulier si les deux nombres sont les mêmes, au retour de la fonction, la première liste doit être vide.
La fonction demandée ne pourra créer aucun nouveau nœud. Elle pourra modifier ou supprimer des nœuds existants. La seconde liste ne sera pas modifiée par la fonction.
" .

SVP aidez moi je dois le rendre la semaine prochaine. et merci !

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 567
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)
#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;
}
1
m3ghassane Messages postés 5 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 26 mai 2009 1
12 janv. 2009 à 16:47
merci beaucoup Lamij20j c'est ce que je voulais , j'aimerai stp savoir que represente "fic.txt" et "fic2.txt".
0
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 567 > m3ghassane Messages postés 5 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 26 mai 2009
12 janv. 2009 à 16:55
Salut,

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.

0
Et il est où ton code ?!
0
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
Je n'ai pas encore commencé car je ne sais pas comment faire le stockage en inverse et la soustraction en retenue.
0
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 ?
0

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 567
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
#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();

#endif
liste_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 -lm
Exé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 5
Pour 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.


0
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
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.
0