Erreur : windows bloque mon app

Résolu
biyob0 Messages postés 5 Date d'inscription vendredi 8 juillet 2011 Statut Membre Dernière intervention 19 février 2012 - 12 févr. 2012 à 15:11
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 15 févr. 2012 à 17:30
Bonjour

voila j'ai écrie un programme qui permet de réaliser des opérations de base sur les fractions
le code :


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

typedef struct resultat {
        float resd;
        float resn;
}res;

res*a;


void  lire(float*,float*);
void  ecrire(float*,float*,float*,float*,res*,int);
res   addition(float*,float*,float*,float*,res*);
res   soustraction(float*,float*,float*,float*,res*);
res   division(float*,float*,float*,float*,res*);
res   multiplication(float*,float*,float*,float*,res*);


int main() {
    
    float *deno1,*nume1,*nume2,*deno2;
    int c;
    a=malloc(sizeof(res));
          system("color a");
          printf("\n\t\t Lecture De la premier fraction  : \n\n");
          lire(deno1,nume1);
          printf("\n\t\t Lecture De la deuxieme fraction  : \n\n");
          lire(deno2,nume2);
          system("cls");
          
                    for(;;){
                            system("cls");
                          printf("\t\t\t\t *** MENU *** \n");
                      printf("\t Pour Calculer L'addition..........................1\n\n");
                      printf("\t Pour Calculer la soustraction.....................2\n\n");
                      printf("\t Pour Calculer la multiplication...................3\n\n");
                      printf("\t Pour Calculer la division.........................4\n\n");
                      printf("\t Pour Quiter.......................................5\n\n");
                      printf("\t\tvotre choix est :\t");
                      scanf("%d",&c);
                          if(c==1){
                             system("cls") ;   
                             addition(deno1,nume1,deno2,nume2,a);
                             ecrire(deno1,nume1,deno2,nume2,a,1);                   
                             
                          }
                          if(c==2){
                             system("cls")  ;  
                             soustraction(deno1,nume1,deno2,nume2,a);
                             ecrire(deno1,nume1,deno2,nume2,a,2);                     
                            
                          }
                          if(c==3){
                             system("cls")   ;
                             multiplication(deno1,nume1,deno2,nume2,a);
                             ecrire(deno1,nume1,deno2,nume2,a,3);    
                             
                          }
                          if(c==4){
                             system("cls")    ;
                             division(deno1,nume1,deno2,nume2,a);
                             ecrire(deno1,nume1,deno2,nume2,a,4);  
                             
                          }
                          if(c==5)
                           break;
                          
                          
                      }
     free(a);
     
     
}

void  lire(float*deno,float*nume){

      printf("Donner le Denominateur:\t");
      scanf("%f",&deno);
      printf("Donner le numerateur:\t");
      scanf("%f",&nume);
}

void  ecrire(float*deno,float*nume,float*deno2,float*nume2,res*a,int opp){
      if (opp == 1){
      printf("\t\t %.2f/%.2f [+] %.2f/%.2f = %.2f/%.2f",deno,nume,deno2,nume2,a->resd,a->resn);
      }
      if (opp == 2){
      printf("\t\t %.2f/%.2f [-] %.2f/%.2f = %.2f/%.2f",deno,nume,deno2,nume2,a->resd,a->resn);
      }
      if (opp == 3){
      printf("\t\t %.2f/%.2f [X] %.2f/%.2f = %.2f/%.2f",deno,nume,deno2,nume2,a->resd,a->resn);
      }
      if (opp == 4){
      printf("\t\t %.2f/%.2f [/] %.2f/%.2f = %.2f/%.2f",deno,nume,deno2,nume2,a->resd,a->resn);
      }       
}

res addition(float*deno,float*nume,float*deno2,float*nume2,res*a){
      
      a->resd = ( (*deno)*(*nume2))+((*deno2) * (*nume) );
      a->resn =   (*nume) * (*nume2)  ;
      
      return *a;


      
}

res soustraction(float*deno,float*nume,float*deno2,float*nume2,res*a){
      
      a->resd = ( (*deno)*(*nume2) )-((*deno2) * (*nume) );
      a->resn = (  (*nume) * (*nume2)  );
      return *a;
      
}

res division(float*deno,float*nume,float*deno2,float*nume2,res*a){

      a->resd = ( *deno ) * ( *deno2 );
      a->resn = ( *nume ) * ( *nume2 );
      return *a;     

}

res multiplication(float*deno,float*nume,float*deno2,float*nume2,res*a){

      a->resd = ( *deno ) * ( *nume2 );
      a->resn = ( *nume ) * ( *deno2 );
      return *a;  

}




mon problème est l'application se compile mais ca marche pas a un moment windows a cessé de fonctionner

merci de m'aider

9 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 févr. 2012 à 07:51
for (i=0;i<100;i++){
if( res[0] % i == 0 ) {

sais tu ce qu'est un modulo ?

mais la fonctionne simplification tjr ne marche pas


n'as tu pas vu que la seule chose que tu obtenais ainsi est une erreur de division par 0...

inutile de faire commencer cette boucle à 0 ni même à 1...

tu as inversé numerateur et denominateur dans le prompt de saisie

simplifiant ton code, j'ai obtenu :

#if defined(WIN32)
#define _CRT_SECURE_NO_WARNINGS
#endif

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

void  lire(int*t){
      printf("\n\t Donner le numerateur:\t");
      scanf("%d",&t[0]);
      printf("\t Donner le denominateur  :\t");
      scanf("%d",&t[1]);
}

void simplification(int* res){
int i;
for (i=2; i<100; i++)
if(res[0]%i == 0 && res[1]%i == 0){
res[0] /= i;
res[1] /= i;
break;
}
}

void  ecrire(int* t1, int* t2, int* res, char opp){
// simplification(t1);
// simplification(t2);
simplification(res);
printf("\n\n\n\t\t %d/%d [%c] %d/%d = %d/%d\n\n", t1[0], t1[1], opp, t2[0], t2[1], res[0], res[1]);
}

void addition(int* t1, int* t2, int* res) { 
res[0] = t1[0] * t2[1] + t2[0] * t1[1];
res[1] = t1[1] * t2[1];      
}

void soustraction(int* t1, int* t2, int* res) {
res[0] = t1[0] * t2[1] - t2[0] * t1[1];
res[1] = t1[1] * t2[1];      
}

void division(int* t1, int* t2, int* res) {
      res[0] = t1[0] * t2[1];
      res[1] = t1[1] * t2[0];
}

void multiplication(int* t1, int* t2, int* res) {
      res[0] = t1[0] * t2[0];
      res[1] = t1[1] * t2[1];
}

int main() {
    int f1[2],f2[2],res[2];
    int c;
    
system("color a");
ChangerFraction:
printf("\n\t\t Lecture De la premier fraction  : \n\n");
lire(f1);
printf("\n\t\t Lecture De la deuxieme fraction  : \n\n");
lire(f2);
system("cls");
          
for(;;){
system("cls");
printf("\n\n\n\n\t\t\t\t * * * MENU * * * \n\n");
printf("\t Pour Calculer l'addition..........................1\n\n");
printf("\t Pour Calculer la soustraction.....................2\n\n");
printf("\t Pour Calculer la multiplication...................3\n\n");
printf("\t Pour Calculer la division.........................4\n\n");
printf("\t Pour Changer de fraction..........................5\n\n");                      
printf("\t Pour Quiter.......................................6\n\n");                      
printf("\t\t Votre choix est :\t");
scanf("%d",&c);
system("cls") ;   
switch(c) {
case 1:
                addition(f1, f2, res);
                ecrire(f1, f2, res, '+');                  
break;

case 2:
soustraction(f1, f2, res);
ecrire(f1, f2, res, '-');
break;

case 3:
multiplication(f1, f2, res);
ecrire(f1, f2, res, '*');
break;	

case 4:
division(f1, f2, res);
ecrire(f1, f2, res, '/');
break;	
                             
case 5:
goto ChangerFraction;

case 6:
return 0;              
}
system("pause");                
}             
}



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 févr. 2012 à 17:30
1/ Addition, soustraction, multiplication, division... 4 opérations prenant les mêmes arguments. On peut passer par un pointeur de fonctions pour limiter la duplication de code.

2/ Le code de simplification qui boucle de 2 à 100 est limité. Autant passer par quelque chose qui fonctionne dans tous les cas.

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

void lire(int* t){
  printf("\n\t Donner le numerateur:\t");
  scanf("%d",&t[0]);
  printf("\t Donner le denominateur  :\t");
  scanf("%d",&t[1]);
}

int PlusGrandCommunDiviseur(int a, int b) {
  int c;

  while (b != 0) {
    c = a % b;
    a = b;
    b = c;
  }
  return a;
}

void simplification(int* res) {
  int r;

  r = PlusGrandCommunDiviseur(res[0], res[1]);
  res[0] /= r;
  res[1] /= r;
    /* Pas de - au dénominateur */
    if(res[1] < 0 ){
      res[0]=-res[0];
      res[1]=-res[1];
    }
}

void ecrire(int* t1, int* t2, int* res, char opp) {
  /* simplification(t1); */
  /* simplification(t2); */
  simplification(res);
  printf("\n\n\n\t\t %d/%d [%c] %d/%d = %d/%d\n\n", t1[0], t1[1], opp, t2[0], t2[1], res[0], res[1]);
}

#define OPERATION_COUNT 4
#define CHANGER_FRACTIONS OPERATION_COUNT + 1
#define QUITTER OPERATION_COUNT + 2

/* Pointeur sur une opération */
typedef void (* OPERATION) (int* t1, int* t2, int* res);

/* Info sur une opération */
typedef struct _OPERATION_INFO
{
  char description[128];
  char signe;
  OPERATION operation;
}
OPERATION_INFO;

void addition(int* t1, int* t2, int* res) {
  res[0] = t1[0] * t2[1] + t2[0] * t1[1];
  res[1] = t1[1] * t2[1];
}

void soustraction(int* t1, int* t2, int* res) {
  res[0] = t1[0] * t2[1] - t2[0] * t1[1];
  res[1] = t1[1] * t2[1];
}

void multiplication(int* t1, int* t2, int* res) {
  res[0] = t1[0] * t2[0];
  res[1] = t1[1] * t2[1];
}

void division(int* t1, int* t2, int* res) {
  res[0] = t1[0] * t2[1];
  res[1] = t1[1] * t2[0];
}

/* Tableau des opérations */
OPERATION_INFO operations[OPERATION_COUNT] = {
  {"l'addition..........................", '+', addition},
  {"la soustraction.....................", '-', soustraction},
  {"la multiplication...................", '*', multiplication},
  {"la division.........................", '/', division},
};

int main() {
  int f1[2],f2[2],res[2];
  int c;
  int operationIndex;

  system("color a");
ChangerFraction:
  printf("\n\t\t Lecture De la premier fraction  : \n\n");
  lire(f1);
  printf("\n\t\t Lecture De la deuxieme fraction  : \n\n");
  lire(f2);
  system("cls");

  for(;;) {
    system("cls");
    printf("\n\n\n\n\t\t\t\t * * * MENU * * * \n\n");
    for (operationIndex = 0; operationIndex < OPERATION_COUNT; operationIndex++)
      printf("\t Pour Calculer %s%d\n\n", operations[operationIndex].description, operationIndex + 1);

    printf("\t Pour Changer de fraction..........................%d\n\n", CHANGER_FRACTIONS);
    printf("\t Pour Quiter.......................................%d\n\n", QUITTER);
    printf("\t\t Votre choix est :\t");
    scanf("%d",&c);
    system("cls") ;
    if ((c > 0) && (c <= OPERATION_COUNT)) {
      operations[c - 1].operation(f1, f2, res);
      ecrire(f1, f2, res, operations[c - 1].signe);
    }
    else if (c == CHANGER_FRACTIONS)
      goto ChangerFraction;
    else if (c == QUITTER)
       return 0;
    else
      printf("Entrez un nombre entre 1 et %d\n", QUITTER);
    system("pause");
  }
}
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 févr. 2012 à 18:23
Salut,

C'est la faute à Windows, il faut le réinstaller 4 fois. Pour la première, il faut allumer 4 cierges, pour la deuxième, faire une danse du ventre, pour la troisième, taper avec un marteau sur le PC dès que la loupiote du disque dur s'affole, et pour la quatrième, il faut m'envoyer un chèque avec pleins de zéros.

float *deno1

Donc là tu déclares un pointeur vers un float.

Tu le passes à lire.
lire(deno1,nume1);


Tu fais un scanf en passant l'adresse du pointeur (<- déjà rien qu'en le disant, on sent un souci, non ?) :
scanf("%f",&deno);


Ma question est: mais où est donc stocké ce float ?
J'espère que quand tu aura trouvé la réponse, tu aura compris au moins une de tes erreurs.
0
biyob0 Messages postés 5 Date d'inscription vendredi 8 juillet 2011 Statut Membre Dernière intervention 19 février 2012
12 févr. 2012 à 20:45
merci a vous j'ai fixé le problème merci comme même j'ai un autre problème de simplification j'arrive pas a le résoudre

voila le code :

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



void lire(int*);
void ecrire(int*,int*,int*,int);
int  addition(int*,int*,int*);
int  soustraction(int*,int*,int*);
int  division(int*,int*,int*);
int  multiplication(int*,int*,int*);
void  simplification(int*);


int main() {
    
    int f1[2],f2[2],res[2];
    int c;
    
          system("color a");
          printf("\n\t\t Lecture De la premier fraction  : \n\n");
          lire(f1);
          printf("\n\t\t Lecture De la deuxieme fraction  : \n\n");
          lire(f2);
          system("cls");
          
                    for(;;){
                            system("cls");
                          printf("\n\n\n\n\t\t\t\t * * * MENU * * * \n\n");
                      printf("\t Pour Calculer L'addition..........................1\n\n");
                      printf("\t Pour Calculer la soustraction.....................2\n\n");
                      printf("\t Pour Calculer la multiplication...................3\n\n");
                      printf("\t Pour Calculer la division.........................4\n\n");
                      printf("\t Pour changer de fraction..........................5\n\n");                      
                      printf("\t Pour Quiter.......................................6\n\n");                      
                      printf("\t\t Votre choix est :\t");
                      scanf("%d",&c);
                          if(c==1){
                             system("cls") ;   
                             addition(f1,f2,res);
                             ecrire(f1,f2,res,1); 
                             printf("\n");  
                             system("pause");                
                             
                          }
                          if(c==2){
                             system("cls")  ;  
                             soustraction(f1,f2,res);
                             ecrire(f1,f2,res,2);
                             printf("\n") ; 
                             system("pause");                       
                            
                          }
                          if(c==3){
                             system("cls")   ;
                             multiplication(f1,f2,res);
                             ecrire(f1,f2,res,3);
                             printf("\n")  ;
                             system("pause");      
                             
                          }
                          if(c==4){
                             system("cls")    ;
                             division(f1,f2,res);
                             ecrire(f1,f2,res,4);
                             printf("\n")  ;
                             system("pause");   
                             
                          }
                          if(c==5){
                             system("cls")    ;
                             printf("\n\t\t Lecture De la premier fraction  : \n\n");
                             lire(f1);
                             printf("\n\t\t Lecture De la deuxieme fraction  : \n\n");
                             lire(f2);                             
                               
                             
                          }
                          if(c==6)
                           break;              
                      }
                      
     
}

void  lire(int*t){
      
      printf("Donner le Denominateur:\t");
      scanf("%d",&t[1]);
      printf("Donner le numerateur:\t");
      scanf("%d",&t[2]);
}

void  ecrire(int*t,int*t2,int*res,int opp){
      if (opp == 1){
      printf("\n\n\n\t\t %d/%d [+] %d/%d = %d/%d\n\n",t[1],t[2],t2[1],t2[2],res[1],res[2]);
      }
      if (opp == 2){
      printf("\n\n\n\t\t %d/%d [-] %d/%d = %d/%d\n\n",t[1],t[2],t2[1],t2[2],res[1],res[2]);
      }
      if (opp == 3){
      printf("\n\n\n\t\t %d/%d [X] %d/%d = %d/%d\n\n",t[1],t[2],t2[1],t2[2],res[1],res[2]);
      }
      if (opp == 4){
      printf("\n\n\n\t\t %d/%d [/] %d/%d = %d/%d\n\n",t[1],t[2],t2[1],t2[2],res[1],res[2]);
      }       
}

int addition(int*t,int*t2,int*res){
      
      res[1] = ( (t[1]) * (t2[2]) ) + ( (t2[1]) * (t[2]) );
      res[2] = ( (t[2]) * (t2[2]) ) ;

      return *res;


      
}

int soustraction(int*t,int*t2,int*res){
      
      res[1] = ( (t[1]) * (t2[2]) ) - ( (t2[1]) * (t[2]) );
      res[2] = ( (t[2]) * (t2[2]) ) ;

      return *res;
      
}

int division(int*t,int*t2,int*res){

      res[1] = ( t[1] ) * ( t2[1] );
      res[2] = ( t[2] ) * ( t2[2] );

      return *res;     

}

int multiplication(int*t,int*t2,int*res){

      res[1] = ( t[1] ) * ( t2[2] );
      res[2] = ( t[2] ) * ( t2[1] );
    
      return *res;   
      

}

void simplification(int*res){

      int i;
      for (i=0;i<100;i++){
          if( res[1] % i == 0 ) {
              if( res[2] % i == 0){
            
                 res[1] = res[1]/i;
                 res[2] = res[2]/i;
             
             }
          }
      
      }
      
      
}
 



merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 févr. 2012 à 07:40
tu sors des limites de ton tableau...

tu déclares :

int f[2]

donc, tableaux de deux int

et tu fais :

f[1]
f[2]

pas bon, ça, on commence à 0...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
biyob0 Messages postés 5 Date d'inscription vendredi 8 juillet 2011 Statut Membre Dernière intervention 19 février 2012
13 févr. 2012 à 23:44
MErcii
mais la fonctionne simplification tjr ne marche pas
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 févr. 2012 à 06:02
quel es ton code actuel ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
biyob0 Messages postés 5 Date d'inscription vendredi 8 juillet 2011 Statut Membre Dernière intervention 19 février 2012
14 févr. 2012 à 19:51
Merci
le voila
# include <stdio.h>
# include <stdlib.h>i



void lire(int*);
void ecrire(int*,int*,int*,int);
int  addition(int*,int*,int*);
int  soustraction(int*,int*,int*);
int  division(int*,int*,int*);
int  multiplication(int*,int*,int*);
int simplification(int*);


int main() {
    
    int f1[2],f2[2],res[2];
    int c;
    
          system("color a");
          printf("\n\t\t Lecture De la premier fraction  : \n\n");
          lire(f1);
          printf("\n\t\t Lecture De la deuxieme fraction  : \n\n");
          lire(f2);
          system("cls");
          
                    for(;;){
                            system("cls");
                          printf("\n\n\n\n\t\t\t\t * * * MENU * * * \n\n");
                      printf("\t Pour Calculer L'addition..........................1\n\n");
                      printf("\t Pour Calculer la soustraction.....................2\n\n");
                      printf("\t Pour Calculer la multiplication...................3\n\n");
                      printf("\t Pour Calculer la division.........................4\n\n");
                      printf("\t Pour changer de fraction..........................5\n\n");                      
                      printf("\t Pour Quiter.......................................6\n\n");                      
                      printf("\t\t Votre choix est :\t");
                      scanf("%d",&c);
                          if(c==1){
                             system("cls") ;   
                             addition(f1,f2,res);
                             ecrire(f1,f2,res,1); 
                             printf("\n");  
                             system("pause");                
                             
                          }
                          if(c==2){
                             system("cls")  ;  
                             soustraction(f1,f2,res);
                             ecrire(f1,f2,res,2);
                             printf("\n") ; 
                             system("pause");                       
                            
                          }
                          if(c==3){
                             system("cls")   ;
                             multiplication(f1,f2,res);
                             ecrire(f1,f2,res,3);
                             printf("\n")  ;
                             system("pause");      
                             
                          }
                          if(c==4){
                             system("cls")    ;
                             division(f1,f2,res);
                             ecrire(f1,f2,res,4);
                             printf("\n")  ;
                             system("pause");   
                             
                          }
                          if(c==5){
                             system("cls")    ;
                             printf("\n\t\t Lecture De la premier fraction  : \n\n");
                             lire(f1);
                             printf("\n\t\t Lecture De la deuxieme fraction  : \n\n");
                             lire(f2);                             
                               
                             
                          }
                          if(c==6)
                           break;              
                      }
                      
     
}

void  lire(int*t){
      
      printf("\n\t Donner le Denominateur:\t");
      scanf("%d",&t[0]);
      printf("\t Donner le numerateur  :\t");
      scanf("%d",&t[1]);
}

void  ecrire(int*t,int*t2,int*res,int opp){
      if (opp == 1){
      printf("\n\n\n\t\t %d/%d [+] %d/%d = %d/%d\n\n",t[0],t[1],t2[0],t2[1],res[0],res[1]);
      }
      if (opp == 2){
      printf("\n\n\n\t\t %d/%d [-] %d/%d = %d/%d\n\n",t[0],t[1],t2[0],t2[1],res[0],res[1]);
      }
      if (opp == 3){
      printf("\n\n\n\t\t %d/%d [X] %d/%d = %d/%d\n\n",t[0],t[1],t2[0],t2[1],res[0],res[1]);
      }
      if (opp == 4){
      printf("\n\n\n\t\t %d/%d [/] %d/%d = %d/%d\n\n",t[0],t[1],t2[0],t2[1],res[0],res[1]);
      }       
}

int addition(int*t,int*t2,int*res){
      
      res[0] = ( (t[0]) * (t2[1]) ) + ( (t2[0]) * (t[1]) );
      res[1] = ( (t[1]) * (t2[1]) ) ;
      
      return *res;


      
}

int soustraction(int*t,int*t2,int*res){
      
      res[0] = ( (t[0]) * (t2[1]) ) - ( (t2[0]) * (t[1]) );
      res[1] = ( (t[1]) * (t2[1]) ) ;

      return *res;
      
}

int division(int*t,int*t2,int*res){

      res[0] = ( t[0] ) * ( t2[1] );
      res[1] = ( t[1] ) * ( t2[0] );

      return *res;     

}

int multiplication(int*t,int*t2,int*res){

      res[0] = ( t[0] ) * ( t2[0] );
      res[1] = ( t[1] ) * ( t2[1] );

      return *res;   
      

}

int simplification(int*res){

      int i;
      for (i=0;i<100;i++){
          if( res[0] % i == 0 ) {
              if( res[1] % i == 0){
            
                 res[0] = res[0]/i;
                 res[1] = res[1]/i;
             
             }
             
          }
          
      
      }
      
     return *res; 
}

0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 févr. 2012 à 05:26
Je regarderais plus en détail arrivé au boulot...

tes fonctions retourne un int ... c'est étrange...

"ecrire" pourrait etre plus court et clair

plutot que opp
transmet directement un char avec le caractère a afficher pour l'opération (%c)



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Rejoignez-nous