By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,478 Members | 1,684 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,478 IT Pros & Developers. It's quick & easy.

C programming

P: 18
Been getting some help from you guys and i really appreciate it and hope some1 will have some idea y i'm getting oddities

Here's my code and i'll explain in between.

Expand|Select|Wrap|Line Numbers
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #define HAUTEUR 30.0
  5. #define POIDS 1.0
  6.  
  7. int main()
  8. {
  9.     // initialisation des variables
  10.     int nbrAnimaux=0;                            // Valeur que specifie l'usager pour creer les tableaux
  11.     int nbrMale=0;                            // compteur animaux males
  12.     int nbrFemelle=0;                            // compteur des femelles
  13.     int nbrMaleG=0;                            // compteur des animaux > 30cm de longueur
  14.     int nbrFemelleL=0;                        // compteur des femelles < 1kg
  15.     int i, j;                                    // compteur boucle
  16.     int ageM=0;
  17.     int    ageMoyenM=0;                            // age total et moyen des males
  18.     int ageF=0;
  19.     int ageMoyenF=0;                            // age total et moyen des femelles
  20.     int plusCourte=0;
  21.     int plusLongue=0;
  22.     char condition;                           // Oui ou Non
  23.     float taille[nbrAnimaux], poids[nbrAnimaux];
  24.     int age[nbrAnimaux];
  25.     char sexe[nbrAnimaux];
  26.  
  27.     nbrMale = 0;
  28.     nbrFemelle = 0;
  29.     nbrMaleG = 0;
  30.     nbrFemelleL = 0;
  31.  
  32.     // Boucle do ... while, pour ne pas devoir repartir le programme pour chaque calcul
  33.     do
  34.       {
  35.     nbrFemelle=0;
  36.     nbrMale=0;
  37.     // Saisi et lecture des donnees
  38.     printf("SVP entrez le nombre d'animaux pour vos calculs:\n");
  39.     scanf("%d", &nbrAnimaux);
  40.     // printf("Maintenant, SVP entrez les details comme ceci, \nSexe (M/F), Age, Poids et Longueur\n");
  41.  
  42.  //   for (i=0; i < nbrAnimaux; i++)  {
  43.    //      printf("tableau sexe: %c\n", &sexe[i]);}
  44.  
  45.     for (i = 0; i < nbrAnimaux; i++)
  46.         {
  47.         fflush(stdin);
  48.         printf("Animal %d\n", i+1);
  49.         printf("entrez sexe (M/F)\n");
  50.         scanf("%c", &sexe[i]);
  51.         printf("entrez l age en jours\n");
  52.         scanf("%d", &age[i]);
  53.         printf("entrez le poids en kg\n");
  54.         scanf("%f", &poids[i]);
  55.         printf("entrez la longueur en cm\n");
  56.         scanf("%f", &taille[i]);
  57.         }
  58.  
  59.  
  60.         for (j = 0; j < nbrAnimaux; j++)
  61.             {
  62.             if (toupper(sexe[j]) == 'M' && taille[j] > HAUTEUR)  // Compter les males > 30cm de long
  63.             nbrMaleG++;
  64.             if (toupper(sexe[j]) == 'F' && poids[j] < POIDS)    // Compter les femelles < 1k de poids
  65.             nbrFemelleL++;
  66.  
  67.             if (sexe[j] == 'M')                                    // ajouter l'age des males et femelles
  68.             ageM += age[j];
  69.             else
  70.             ageF += age[j];
  71.  
  72.             if (toupper(sexe[j]) == 'M')                // Compter les males et femelles
  73.             nbrMale++;
  74.             else
  75.             nbrFemelle++;
  76.  
  77.             }
  78.  
  79.     ageMoyenM == ageM / nbrMale;
  80.     ageMoyenF == ageF / nbrFemelle;
  81.     printf("Non demande\n");
  82.     printf("===========\n");
  83.     printf("Nombre de males: %d\n", nbrMale);
  84.     printf("Nombre de femelles: %d\n", nbrFemelle);
  85.     printf("Demande\n");
  86.      printf("=======\n");
  87.     printf("Nombre de males mesurant plus de 30cm: %d\n", nbrMaleG);
  88.     printf("Nombre de femelles pesant moins de 1kg: %d\n", nbrFemelleL);
  89.     printf("Age moyen des males: %d et l\'age moyen des femelles: %d", ageMoyenM, ageMoyenF);
  90.      // debug
  91.  
  92.   //  for (i = 0; 1<nbrAnimaux; i++)
  93.   //   printf ("a la case %d, le sexe est %c, l'age est %d, le poids est %f et la longueur est %f", i, sexe[i], age[i], poids[i], taille[i]);
  94.  
  95.  
  96.  
  97.  
  98.      // end debug
  99.  
  100.      // Condition requise pour repartir du début
  101.      printf ("\nVoulez vous faire un autre calcul, (o/n)?");
  102.      fflush (stdin);                        // Fonction pour vider stdin
  103.      condition = toupper(getchar());        // Capitaliser la letter et soumettre à condition
  104.      } while ( condition == 'O');                // Repartir du début si O
  105.      // fin du do while restart
  106.  
  107. }
  108.  
Well as i'm tryin some numbers, i found out that in my sexe table, there's 1 female no matter what...
say for instance i put 2 animals
and input the info for the animals, the print out will be 1 male one female, despite entering info for 2 males...
the calculation for the average age, ageMoyen, is just not workin 1 bit...

i'm sure i have issues with my loops there but can't really pin point where it might be.

any help is greatly appreciated :)
Marc
Nov 18 '08 #1
Share this Question
Share on Google+
19 Replies


P: 18
Been trying to tweak the code, still to no avail (maybe a little better than before)
i tried to print out the values of the tables before running the program and the int/char tables are displaying weird stuff

here's some info
SVP entrez le nombre d'animaux pour vos calculs:
4
tableau sexe: ┘
tableau age: 37813980
tableau poids: 0.000000
tableau poids: 0.000000
tableau sexe: ┌
tableau age: 37813984
tableau poids: 0.000000
tableau poids: 0.000000
tableau sexe: █
tableau age: 37813988
tableau poids: 0.000000
tableau poids: 0.000000
tableau sexe: ▄
tableau age: 37813992
tableau poids: 0.000000
tableau poids: 0.000000

my tableau sexe is a char table... it's displaying weird caracters
and the age table should be 0'd out as well right? like the age and poids tables.
Nov 18 '08 #2

10K+
P: 13,264
When you divide two integers the result is not always an integer. Some of your int variables need to be float and your division expressions need to be made aware of that fact.
Nov 18 '08 #3

weaknessforcats
Expert Mod 5K+
P: 9,197
When you divide two integers the result is not always an integer. Some of your int variables need to be float and your division expressions need to be made aware of that fact.
Not necessarily. As a general rule you try to avoid mixing integers and floating point. Floating point should be reserved for scientific work where neihter spped or accuracy are big concerns.

Division is a good example. The average of 3 and 4 is 3. It can't be 3.5 since a) 3 represents all values between 3 and <4 and b) 3.5 can't be an int since integers have no decimals. For the average to be 3.5 you have to start out with 3.0 and 4.0 and then the average is 3.5.

Financial applications use integers.

A rule of significant figures also states that a result cannot be more accurate than the coarsest of its components. That is, you do not make things more accurate by tacking on decimal places.
Nov 18 '08 #4

P: 18
i'm still having some problems coding this...
i'm not sure where to "look" to fix whatever i'm trying to do....
i really don't understand why the age table is being filled with bogus info so is the sex one... it's storing some weird characters instead...

edit: i didn't really explain what the program should be doing so here it is

first, the user inputs an int which is used to initialize the tables (should but not working for the sex & age tables)
second, the user is then asked to input the sex (M or F), the age (in days), the weight (in kg) and the height (in cm)
lastly, once these are entered for the given number of animals the program computes the following:
- the coordinates of the males with height over 30cm
- the number of females under 1.0kg
- the average age (in days) for males and females (separate obviously)
- the shortest and longest height
with print out
Nov 18 '08 #5

P: 18
new code... works a whole lot better, just a couple glitches

Expand|Select|Wrap|Line Numbers
  1. /* Ce programme saisi des données sur des animaux etudiés par une biologiste:
  2.       - 1ere ligne, leur nombre, pour créer les tableaux qui contiendront
  3.         les infos
  4.       - 2eme ligne et + (jusqu'au nombre saisi à la première ligne), leur sexe
  5.              (M ou F, char), leur age (en jours, int), leur poids (en kg, réel)
  6.              et leur taille (en cm, réel)
  7.    et affiche des résultats selon ces critères:
  8.       - les coordonnées des males de plus de 30cm
  9.       - le nombre de femelles qui pèsent moins de 1.0 kg
  10.       - l'age moyen des femelles et celui des males
  11.       - la longueur minimale et maximale des animaux */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>
  16. #define HAUTEUR 30.0
  17. #define POIDS 1.0
  18.  
  19. int main()
  20. {
  21.     // initialisation des variables
  22.     int nbrAnimaux=0;                            // Valeur que specifie l'usager pour creer les tableaux
  23.     int nbrMale=0;                            // compteur animaux males
  24.     int nbrFemelle=0;                            // compteur des femelles
  25.     //int coordMG=0;                            // compteur des animaux > 30cm de longueur
  26.     int nbrFemelleL=0;                        // compteur des femelles < 1kg
  27.     int i, j;                                    // compteur boucle
  28.     int ageTotalM=0;                       // age total et moyen des males
  29.     int ageTotalF=0;                       // age total et moyen des femelles
  30.     float taillePlusCourte=5000;
  31.     float taillePlusGrande=0;
  32.     char condition;                           // Oui ou Non
  33.     float taille[nbrAnimaux], poids[nbrAnimaux];
  34.     int age[nbrAnimaux];
  35.     char sexe[nbrAnimaux];
  36.  
  37.     // Boucle do ... while, pour ne pas devoir repartir le programme pour chaque calcul
  38.     do
  39.       {
  40.     // Saisi et lecture des donnees
  41.     printf("SVP entrez le nombre d'animaux pour vos calculs:\n");
  42.     scanf("%d", &nbrAnimaux);
  43.     // printf("Maintenant, SVP entrez les details comme ceci, \nSexe (M/F), Age, Poids et Longueur\n");
  44.  
  45.         for (i=0; i < nbrAnimaux; i++)
  46.             {
  47.             age[i] == 0;
  48.             }
  49.  
  50.         for (i = 1; i <= nbrAnimaux; i++)
  51.         {
  52.         printf("Animal %d\n", i);
  53.         printf("entrez sexe (M/F)\n");
  54.         fflush(stdin);
  55.         scanf("%c", &sexe[i]);
  56.         printf("entrez l age en jours\n");
  57.         fflush(stdin);
  58.         scanf("%d", &age[i]);
  59.         printf("entrez le poids en kg\n");
  60.         fflush(stdin);
  61.         scanf("%f", &poids[i]);
  62.         printf("entrez la longueur en cm\n");
  63.         fflush(stdin);
  64.         scanf("%f", &taille[i]);
  65.         }
  66.  
  67.                 // debug
  68.  
  69.         for (i = 1; i <=nbrAnimaux; i++)
  70.             {
  71.             printf("sexe: %c ", sexe[i]);
  72.             printf("age: %d", age[i]);
  73.             printf("poids: %f", poids[i]);
  74.             printf("taille: %f\n", taille[i]);
  75.             }
  76.  
  77.         // end debug
  78.  
  79.         for (j = 1; j <= nbrAnimaux; j++)
  80.             {
  81.             if (toupper(sexe[j]) == 'M')                // Compter les males et femelles
  82.                {
  83.                nbrMale++;
  84.                ageTotalM += age[j];
  85.                }
  86.             else
  87.                {
  88.                nbrFemelle++;
  89.                ageTotalF += age[j];
  90.                }
  91.  
  92.             if (toupper(sexe[j]) == 'F' && poids[j] < POIDS)
  93.                 nbrFemelleL++;
  94.  
  95.             if (toupper(sexe[j]) == 'M' && taille[j] > HAUTEUR)
  96.                 printf ("Coordonnes du repere Male > 30cm: %d\n", j);
  97.  
  98.             if (taille[j] < taillePlusCourte)
  99.                 taillePlusCourte = taille[j];
  100.             if (taille [j] > taillePlusGrande)
  101.                 taillePlusGrande = taille[j];
  102.   }
  103.  
  104.  
  105.     printf("Nombre de males: %d\n", nbrMale);
  106.     printf("Nombre de femelles: %d\n", nbrFemelle);
  107.     printf("Nombre de femelles pesant moins de 1kg: %d\n", nbrFemelleL);
  108.     // printf("Age moyen des mal%& %d% et l\'age moyen des femelles: %d\n", ageTotalM/nbrMale, ageTotalF/nbrFemelle);
  109.     printf("Taille plus grande: %6.2f et taille plus courte: %6.2f\n", taillePlusGrande, taillePlusCourte);
  110.     // debug
  111.  
  112.   //  for (i = 0; 1<nbrAnimaux; i++)
  113.   //   printf ("a la case %d, le sexe est %c, l'age est %d, le poids est %f et la longueur est %f", i, sexe[i], age[i], poids[i], taille[i]);
  114.  
  115.  
  116.  
  117.  
  118.      // end debug
  119.  
  120.      // Condition requise pour repartir du début
  121.      printf ("\nVoulez vous faire un autre calcul, (o/n)?");
  122.      fflush (stdin);                        // Fonction pour vider stdin
  123.      condition = toupper(getchar());        // Capitaliser la letter et soumettre à condition
  124.      } while ( condition == 'O');                // Repartir du début si O
  125.      // fin du do while restart
  126.  
  127. }
  128.  

and the results after running:

SVP entrez le nombre d'animaux pour vos calculs:
3
Animal 1
entrez sexe (M/F)
M
entrez l age en jours
12
entrez le poids en kg
3
entrez la longueur en cm
34
Animal 2
entrez sexe (M/F)
M
entrez l age en jours
123
entrez le poids en kg
1
entrez la longueur en cm
3
Animal 3
entrez sexe (M/F)
F
entrez l age en jours
134
entrez le poids en kg
.14
entrez la longueur en cm
4

// debug section
sexe: M age: 1107820544poids: 34.000000taille: 34.000000
sexe: M age: 1077936128poids: 3.000000taille: 3.000000
sexe: F age: 1082130432poids: 4.000000taille: 4.000000
// end of debug section

Coordonnes du repere Male > 30cm: 1
Nombre de males: 2
Nombre de femelles: 1
Nombre de femelles pesant moins de 1kg: 0
Taille plus grande: 34.00 et taille plus courte: 3.00

Voulez vous faire un autre calcul, (o/n)?


what works and what doesn't:
Works
- program picks up proper number of males and females
- program gives shortest and longest heights
- program gives the coordinates of the males > 1 (just not sure if that's what the teacher meant)
Doesn't work
- program will not give good reading for females under 1kg ( the condition is probably the problem (or maybe my for loop with the conditions in it)
- program doesn't/can't give out proper readings for average male and female ages.
- also i have issues flushing the memory after the user selects "o" to restart the program... it seems to keep all the data from the previous run.


thanks again
Nov 18 '08 #6

boxfish
Expert 100+
P: 469
You wrote
Expand|Select|Wrap|Line Numbers
  1. for (i=0; i < nbrAnimaux; i++) 
  2.     { 
  3.     age[i] == 0; 
  4.     }
using the comparison operator instead of the assignment operator. You'll have to fix that, but it doesn't seem to be the real problem with the program. I can't figure out what's wrong with it.
Nov 18 '08 #7

P: 63
Expand|Select|Wrap|Line Numbers
  1.     int nbrAnimaux=0;                            // Valeur que specifie l'usager pour creer les tableaux
  2.     int nbrMale=0;                            // compteur animaux males
  3.     int nbrFemelle=0;                            // compteur des femelles
  4.     //int coordMG=0;                            // compteur des animaux > 30cm de longueur
  5.     int nbrFemelleL=0;                        // compteur des femelles < 1kg
  6.     int i, j;                                    // compteur boucle
  7.     int ageTotalM=0;                       // age total et moyen des males
  8.     int ageTotalF=0;                       // age total et moyen des femelles
  9.     float taillePlusCourte=5000;
  10.     float taillePlusGrande=0;
  11.     char condition;                           // Oui ou Non
  12.     float taille[nbrAnimaux], poids[nbrAnimaux];
  13.     int age[nbrAnimaux];
  14.     char sexe[nbrAnimaux];
  15.  
Expand|Select|Wrap|Line Numbers
  1.     scanf("%d", &nbrAnimaux);
  2.     // printf("Maintenant, SVP entrez les details comme ceci, \nSexe (M/F), Age, Poids et Longueur\n");
  3.  
  4.         for (i=0; i < nbrAnimaux; i++)
  5.             {
  6.             age[i] == 0;
  7.             }
  8.  
just because you changed what number nbrAnimaux contains, does not mean that your arrays (taille, poids, age, sexe) have changed size :)

You should allocate the arrays to the maximum value that you are willing to accept (or do dynamic allocation).
Nov 18 '08 #8

P: 18
You wrote
Expand|Select|Wrap|Line Numbers
  1. for (i=0; i < nbrAnimaux; i++) 
  2.     { 
  3.     age[i] == 0; 
  4.     }
using the comparison operator instead of the assignment operator. You'll have to fix that, but it doesn't seem to be the real problem with the program. I can't figure out what's wrong with it.
yeah my bad, i had noticed and changed that but the reason i had this loops is to clear the age table as it's giving erroneous data.... but then took it out again as it proved useless
Nov 18 '08 #9

P: 18
Expand|Select|Wrap|Line Numbers
  1.     int nbrAnimaux=0;                            // Valeur que specifie l'usager pour creer les tableaux
  2.     int nbrMale=0;                            // compteur animaux males
  3.     int nbrFemelle=0;                            // compteur des femelles
  4.     //int coordMG=0;                            // compteur des animaux > 30cm de longueur
  5.     int nbrFemelleL=0;                        // compteur des femelles < 1kg
  6.     int i, j;                                    // compteur boucle
  7.     int ageTotalM=0;                       // age total et moyen des males
  8.     int ageTotalF=0;                       // age total et moyen des femelles
  9.     float taillePlusCourte=5000;
  10.     float taillePlusGrande=0;
  11.     char condition;                           // Oui ou Non
  12.     float taille[nbrAnimaux], poids[nbrAnimaux];
  13.     int age[nbrAnimaux];
  14.     char sexe[nbrAnimaux];
  15.  
Expand|Select|Wrap|Line Numbers
  1.     scanf("%d", &nbrAnimaux);
  2.     // printf("Maintenant, SVP entrez les details comme ceci, \nSexe (M/F), Age, Poids et Longueur\n");
  3.  
  4.         for (i=0; i < nbrAnimaux; i++)
  5.             {
  6.             age[i] == 0;
  7.             }
  8.  
just because you changed what number nbrAnimaux contains, does not mean that your arrays (taille, poids, age, sexe) have changed size :)

You should allocate the arrays to the maximum value that you are willing to accept (or do dynamic allocation).
if i don't specify nbrAnimaux to 0 the whole program crashes when run (MS send report window)
the weird part of this is that the other tables are fine...

also what do u mean by dynamic allocation?
Nov 18 '08 #10

boxfish
Expert 100+
P: 469
If you don't know what dynamic allocation is, don't bother with it. The sizes of taille, poids, age, and sexe are detemined by nbrAnimaux, which is not allowed. The size of an array must be constant, not a variable like nbrAnimaux. What you should do is define a macro for the maximum number of animals allowed, and make the arrays that size. It does waste space, but it will work.
Nov 18 '08 #11

P: 18
If you don't know what dynamic allocation is, don't bother with it. The sizes of taille, poids, age, and sexe are detemined by nbrAnimaux, which is not allowed. The size of an array must be constant, not a variable like nbrAnimaux. What you should do is define a macro for the maximum number of animals allowed, and make the arrays that size. It does waste space, but it will work.
the only issue with this is that i don't have a max number of animals... you're saying that having constraints is the only option ?
Nov 18 '08 #12

P: 18
i just ran some more tests...

here's my code for now...
- the "females under 1kg" counter is not work at all now, i'm guessing it's not the condition since it worked earlier but i have no idea what change in the code affected it
- the age is completely stupid.
- still need to figure out the average age calculation since the commented lines are causing my program to crash (windows send report window) when executing

Expand|Select|Wrap|Line Numbers
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #define HAUTEUR 30.0
  5. #define POIDS 1.0
  6.  
  7. int main()
  8. {
  9.     // initialisation des variables
  10.     int nbrAnimaux=0;                            // Valeur que specifie l'usager pour creer les tableaux
  11.     int nbrMale=0;                            // compteur animaux males
  12.     int nbrFemelle=0;                            // compteur des femelles
  13.     //int coordMG=0;                            // compteur des animaux > 30cm de longueur
  14.     int nbrFemelleL=0;                        // compteur des femelles < 1kg
  15.     int i, j;                                    // compteur boucle
  16.     int ageTotalM=0;                       // age total et moyen des males
  17.     int ageTotalF=0;                       // age total et moyen des femelles
  18.     // int ageMoyenM, ageMoyenF;
  19.     float taillePlusCourte=5000;
  20.     float taillePlusGrande=0;
  21.     char condition;                           // Oui ou Non
  22.         float poids[nbrAnimaux];
  23.         float taille[nbrAnimaux];
  24.         int age[nbrAnimaux];
  25.         char sexe[nbrAnimaux];
  26.  
  27.     // Boucle do ... while, pour ne pas devoir repartir le programme pour chaque calcul
  28.     do
  29.       {
  30.  
  31.  
  32.  
  33.     // Saisi et lecture des donnees
  34.     printf("SVP entrez le nombre d'animaux pour vos calculs:\n");
  35.     scanf("%d", &nbrAnimaux);
  36.  
  37.  
  38.     // printf("Maintenant, SVP entrez les details comme ceci, \nSexe (M/F), Age, Poids et Longueur\n");
  39.  
  40.         for (i = 1; i <= nbrAnimaux; i++)
  41.         {
  42.  
  43.  
  44.         printf("Animal %d\n", i);
  45.         printf("entrez sexe (M/F)\n");
  46.         fflush(stdin);
  47.         scanf("%c", &sexe[i]);
  48.         printf("entrez l age en jours\n");
  49.         fflush(stdin);
  50.         scanf("%d", &age[i]);
  51.         printf("entrez le poids en kg\n");
  52.         fflush(stdin);
  53.         scanf("%f", &poids[i]);
  54.         printf("entrez la longueur en cm\n");
  55.         fflush(stdin);
  56.         scanf("%f", &taille[i]);
  57.         }
  58.  
  59.                 // debug
  60.  
  61.         for (i = 1; i <=nbrAnimaux; i++)
  62.             {
  63.             printf("sexe: %c ", sexe[i]);
  64.             printf("age: %d ", age[i]);
  65.             printf("poids: %f ", poids[i]);
  66.             printf("taille: %f\n", taille[i]);
  67.             }
  68.  
  69.         // end debug
  70.  
  71.         for (j = 1; j <= nbrAnimaux; j++)
  72.             {
  73.             if (toupper(sexe[j]) == 'M')                // Compter les males et femelles
  74.                {
  75.                nbrMale++;
  76.                ageTotalM += age[j];
  77.                }
  78.             else
  79.                {
  80.                nbrFemelle++;
  81.                ageTotalF += age[j];
  82.                }
  83.  
  84.             if (toupper(sexe[j]) == 'F' && poids[j] < POIDS)             // something wrong with this... always returns 0
  85.                 nbrFemelleL++;
  86.  
  87.             if (toupper(sexe[j]) == 'M' && taille[j] > HAUTEUR)          // this works on the other hand
  88.                 printf ("Coordonnes du rang Male > 30cm: %d\n", j);
  89.  
  90.             if (taille[j] < taillePlusCourte)
  91.                 taillePlusCourte = taille[j];
  92.             if (taille [j] > taillePlusGrande)
  93.                 taillePlusGrande = taille[j];
  94.   }
  95.     // ageMoyenM = ageTotalM / nbrMale;                    // added these for average
  96.     // ageMoyenF = ageTotalF / nbrFemelle;                 // male and female age
  97.  
  98.     //printf("Nombre de males: %d\n", nbrMale);
  99.     //printf("Nombre de femelles: %d\n", nbrFemelle);
  100.     printf("Nombre de femelles pesant moins de 1kg: %d\n", nbrFemelleL);
  101.     // printf("Age moyen des males %d et l\'age moyen des femelles: %d\n", ageMoyenM, ageMoyenF);         // commented this line because it's crashing the program
  102.     printf("Taille plus grande: %6.2f et taille plus courte: %6.2f\n", taillePlusGrande, taillePlusCourte);
  103.     // debug
  104.  
  105.   //  for (i = 0; 1<nbrAnimaux; i++)
  106.   //   printf ("a la case %d, le sexe est %c, l'age est %d, le poids est %f et la longueur est %f", i, sexe[i], age[i], poids[i], taille[i]);
  107.  
  108.  
  109.  
  110.  
  111.      // end debug
  112.  
  113.      // Condition requise pour repartir du début
  114.      printf ("\nVoulez vous faire un autre calcul, (o/n)?");
  115.      fflush (stdin);                        // Fonction pour vider stdin
  116.      condition = toupper(getchar());        // Capitaliser la letter et soumettre à condition
  117.      } while ( condition == 'O');                // Repartir du début si O
  118.      // fin du do while restart
  119.  
  120. }
  121.  
results from testing
for only males

SVP entrez le nombre d'animaux pour vos calculs:
2
Animal 1
entrez sexe (M/F)
M
entrez l age en jours
12
entrez le poids en kg
34
entrez la longueur en cm
56
Animal 2
entrez sexe (M/F)
M
entrez l age en jours
98
entrez le poids en kg
12
entrez la longueur en cm
20
sexe: M age: 1113587712 poids: 56.000000 taille: 56.000000
sexe: M age: 1101004800 poids: 20.000000 taille: 20.000000
>>> poids and taille can't be the same >>> how's that happening ?
Coordonnes du rang Male > 30cm: 1
Nombre de femelles pesant moins de 1kg: 0
Taille plus grande: 56.00 et taille plus courte: 20.00

Voulez vous faire un autre calcul, (o/n)?

ran it for only females
===============
SVP entrez le nombre d'animaux pour vos calculs:
2
Animal 1
entrez sexe (M/F)
F
entrez l age en jours
12
entrez le poids en kg
.5
entrez la longueur en cm
14
Animal 2
entrez sexe (M/F)
F
entrez l age en jours
432
entrez le poids en kg
1.2
entrez la longueur en cm
43
sexe: F age: 1096810496 poids: 14.000000 taille: 14.000000
sexe: F age: 1110179840 poids: 43.000000 taille: 43.000000
>>> age is wrong, poids and taille are same here as well
Nombre de femelles pesant moins de 1kg: 0
>>> should be 1 (that was working earlier)
Taille plus grande: 43.00 et taille plus courte: 14.00

Voulez vous faire un autre calcul, (o/n)?

i'm thinking i should just give up at this point... i feel like it's going nowhere.
Nov 19 '08 #13

Expert 100+
P: 2,415
Referring to the source code in post #17 ...

Line 10 sets nbrAnimaux to 0, while lines 22-25 define several arrays of dimension nbrAnimaux. Later (line 35), the value of nbrAnimaux changes. Unfortunately, the arrays are already defined, so their dimension can't change. I'm surprised you don't have compiler warnings for the array definitions. You should either
a) define the arrays for some large maximum value of nbrAnimaux and then verify at line 35 that the entered value is less than that; or
b) use malloc to dynamiclly allocate space for the arrays after line 35 (but don't forget to free them before you loop back for a new nbrAnimaux).
The easiest option is (a).

You don't have any error checking following any of your scanf calls. What if the user sets nbrAnimaux to a negative value at line 35? You permit the user to enter similarly ridiculous values for the other scanf calls too.

Lines 40, 61, and 71 should iterate from (i=0; i<nbrAnimaux; i++) because the indices for an array of dimension D range from 0 to D-1.

If the user decides to run the program again at lline 116, do you want to reset all of your counters, sums, minima, and maxima? Right now you don't.

I don't think I've said anything that hasn't already been said.
Nov 19 '08 #14

10K+
P: 13,264
...

A rule of significant figures also states that a result cannot be more accurate than the coarsest of its components. That is, you do not make things more accurate by tacking on decimal places.
Are you suggesting then, that age should be declared as float if average ages need to be calculated?
Nov 19 '08 #15

Expert 100+
P: 2,415
Are you suggesting then, that age should be declared as float if average ages need to be calculated?
weaknessforcats is referring to mathematical principles that are independent of whether you solve a problem with a computer, or with a sliderule, or with pencil and paper.

For example, I happen to know as a rule of thumb that Indianapolis is about 200 miles from Chicago. Suppose I drive to Indianapolis and then fill my gas tank by buying 11 gallons of gas. How many miles/gallon did I get from my car?

If I divide 200 by 11 on my calculator I get 18.18181818, but all those decimal digits are a false precision. The distance was only approximately 200 miles; and my gas tank wasn't full when I left, so fuel usage was less than 11 gallons.

The rules of significant digits suggest that the more correct answer is 20 miles per gallon. "200 miles" has one significant digit and "11 gallons" has two significant digits. The final answer should have no more significant digits than the most inexact input; that is, one significant digit.

Referring to your specific problem ... age is entered as an integer. Unless today is the animal's birthday, an integer value is only an approximation of the animal's age. If all the animal ages are between 0 and 10, then that's one significant digit. It is false precision to compute an average age that has more than one significant digit.

On the other hand, your teacher may be expecting to see decimal digits and might reduce your grade if they are missing.
Nov 19 '08 #16

10K+
P: 13,264
I understand and appreciate all the rules of significant numbers that you are describing above. Perhaps the misunderstanding (certainly from my part) comes from what you are defining as average. The most common meaning (which I had assumed) is arithmetic mean which is always a positive real number. Arithmetic mean is not closed over integers.
Nov 19 '08 #17

boxfish
Expert 100+
P: 469
I have tested your program, and it all works correctly if you allocate space for the maximum number of animals allowed.
Nov 19 '08 #18

weaknessforcats
Expert Mod 5K+
P: 9,197
The most common meaning (which I had assumed) is arithmetic mean which is always a positive real number. Arithmetic mean is not closed over integers.
Yes it is. That is, if you are working with integers then your results have to be integers for them to exist in the set of integers.

Real numbers are not integers. Now you can map integers like 1,2,3 to real numbers 1.0, 2.0, 3.0 but the most you can say is that the set of real numbers has a higher cardinality than the set of integers. That is, the set of integers is bounded but the number of elements is indeterminate.

The problem occurs because eveyone learns how to use real numbers in school. That would correspond to the computer floating-point. So use floating-point exclusively.

Were we taught integers in school we would have learned that the average of integers is an integer.
Nov 19 '08 #19

P: 18
I appreciate your input guys.... I've managed to work that out by using a MAX value for the tables... since dynamic tables aren't what we were asked, i was going around in circles but as soon as I had changed the table initialization to a finite number of elements, everything worked out great.

here's the final version if any1 is interested
Expand|Select|Wrap|Line Numbers
  1. /* Ce programme saisi des données sur des animaux etudiés par une biologiste:
  2.       - 1ere ligne, leur nombre, pour créer les tableaux qui contiendront
  3.         les infos
  4.       - 2eme ligne et + (jusqu'au nombre saisi à la première ligne), leur sexe
  5.              (M ou F, char), leur age (en jours, int), leur poids (en kg, réel)
  6.              et leur taille (en cm, réel)
  7.    et affiche des résultats selon ces critères:
  8.       - les coordonnées des males de plus de 30cm
  9.       - le nombre de femelles qui pèsent moins de 1.0 kg
  10.       - l'age moyen des femelles et celui des males
  11.       - la longueur minimale et maximale des animaux */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>
  16. #define HAUTEUR 30.0
  17. #define POIDS 1.0
  18. #define MAX 10
  19.  
  20. int main()
  21. {
  22.     // initialisation des variables
  23.     int nbrAnimaux;            // Valeur que specifie l'usager pour creer les tableaux
  24.     char condition;         // Oui ou Non, redemarrer le programme
  25.  
  26.     // Boucle do ... while, pour ne pas devoir repartir le programme pour chaque calcul
  27.     do
  28.       {
  29.        int nbrMale=0;                           // compteur animaux males
  30.        int nbrFemelle=0;                       // compteur des femelles
  31.        int nbrFemelleL=0;                       // compteur des femelles < 1kg
  32.        int nbrMaleG=0;                         // compteur des males > 30cm
  33.        int i, j;                               // compteur boucle
  34.        int ageTotalM=0;                           // age total et moyen des males
  35.        int ageTotalF=0;                        // age total et moyen des femelles
  36.        int ageMoyenM, ageMoyenF;               // les ages moyens males et femelles
  37.        float taillePlusCourte=5000;            // variable utilisee pour le tri
  38.        float taillePlusGrande=0;               // variable utilisee pour le tri
  39.        float taille[MAX], poids[MAX];          // tableaux pour la taille et le poids
  40.        int age[MAX];                           // tableau des ages
  41.        char sexe[MAX];                         // tableau des sexes
  42.  
  43.  
  44.  
  45.     // Saisi et lecture des donnees
  46.        printf("SVP entrez le nombre d'animaux pour vos calculs:\n");
  47.        scanf("%d", &nbrAnimaux);
  48.        printf ("Entrez les infos de cette maniere:\nSexe (M ou F) Age Poids Taille\n\n");
  49.  
  50.     // printf("Maintenant, SVP entrez les details comme ceci, \nSexe (M/F), Age, Poids et Longueur\n");
  51.  
  52.         for (i = 1; i <= nbrAnimaux; i++)
  53.         {
  54.         printf("Animal %d\n", i);
  55.         fflush(stdin);
  56.         scanf ("%c%d%f%f", &sexe[i], &age[i], &poids[i], &taille[i]);
  57.         }
  58.  
  59.         for (j = 1; j <= nbrAnimaux; j++)
  60.             {
  61.             // Compteurs males et femelles
  62.             if (toupper(sexe[j]) == 'M')
  63.                {
  64.                nbrMale++;
  65.                ageTotalM += age[j];
  66.                }
  67.             else
  68.                {
  69.                nbrFemelle++;
  70.                ageTotalF += age[j];
  71.                }
  72.  
  73.             // Condition: Femelle(s) pesant(s) moins de 1.0kg
  74.             if (toupper(sexe[j]) == 'F' && poids[j] < POIDS)
  75.                 nbrFemelleL++;
  76.  
  77.             // Pour trouver la taille la plus courte ainsi que la plus longue
  78.             if (taille[j] < taillePlusCourte)
  79.                 taillePlusCourte = taille[j];
  80.             if (taille [j] > taillePlusGrande)
  81.                 taillePlusGrande = taille[j];
  82.             }
  83.  
  84.     // Calculs des ages moyens males et femelles
  85.         ageMoyenM = ageTotalM / nbrMale;
  86.         ageMoyenF = ageTotalF / nbrFemelle;
  87.  
  88.     // Afficher les tableaux
  89.         printf("\nVos donnees telles qu'entrees:\n");
  90.         printf("Sexe Age Poids Taille\n");
  91.         for (i = 1; i <=nbrAnimaux; i++)
  92.             {
  93.             printf("%4c", sexe[i]);
  94.             printf("%4d", age[i]);
  95.             printf("%6.2f", poids[i]);
  96.             printf("%7.2f\n", taille[i]);
  97.             }
  98.  
  99.     // afficher les resultats selon les conditions predefinies
  100.         printf("Un male de plus 30cm se trouve au:\n");
  101.         for (i = 1; i <=nbrAnimaux; i++)
  102.         {
  103.         // Condition: Male(s) mesurant(s) plus de 30cm de long
  104.         if (toupper(sexe[i]) == 'M' && taille[i] > HAUTEUR)
  105.            printf ("Rang %d\n", i-1);
  106.         // i-1 parce que tableau commence a element 0
  107.         }
  108.         printf("Nombre de femelle(s) pesant moins de 1kg: %d\n", nbrFemelleL);
  109.         printf("L\'age moyen des males: %d\nL\'age moyen des femelles: %d\n", ageMoyenM, ageMoyenF);
  110.         printf("La taille plus grande: %6.2f\nLa aille plus courte: %6.2f\n", taillePlusGrande, taillePlusCourte);
  111.  
  112.      // Condition requise pour repartir du début
  113.         printf ("\nVoulez vous faire un autre calcul, (o/n)?");
  114.         fflush (stdin);                        // Fonction pour vider stdin
  115.         condition = toupper(getchar());        // Capitaliser la letter et soumettre à condition
  116.       } while ( condition == 'O');                // Repartir du début si O
  117.      // fin du do while restart
  118.  
  119. }
  120.  
  121. /*
  122.  
  123. Résultats:
  124. ==========
  125. - Avec les donnees du TP
  126. ------------------------
  127. SVP entrez le nombre d'animaux pour vos calculs:
  128. 3
  129. Entrez les infos de cette maniere:
  130. Sexe (M ou F) Age Poids Taille
  131.  
  132. Animal 1
  133. F 45 1.05 12.7
  134. Animal 2
  135. M 32 1.10 17.6
  136. Animal 3
  137. M 90 1.56 22.3
  138.  
  139. Vos donnees telles qu'entrees:
  140. Sexe Age Poids Taille
  141.    F  45  1.05  12.70
  142.    M  32  1.10  17.60
  143.    M  90  1.56  22.30
  144. Un male de plus 30cm se trouve au:
  145. Nombre de femelle(s) pesant moins de 1kg: 0
  146. L'age moyen des males: 61
  147. L'age moyen des femelles: 45
  148. La taille plus grande:  22.30
  149. La aille plus courte:  12.70
  150.  
  151. Voulez vous faire un autre calcul, (o/n)?o
  152.  
  153. Avec nos propres donnees
  154. ------------------------
  155. SVP entrez le nombre d'animaux pour vos calculs:
  156. 5
  157. Entrez les infos de cette maniere:
  158. Sexe (M ou F) Age Poids Taille
  159.  
  160. Animal 1
  161. M 12 32.4 12.5
  162. Animal 2
  163. M 56 12.12 34.56
  164. Animal 3
  165. F 6 .75 32
  166. Animal 4
  167. F 90 .95 12
  168. Animal 5
  169. M 27 3.6 30.01
  170.  
  171. Vos donnees telles qu'entrees:
  172. Sexe Age Poids Taille
  173.    M  12 32.40  12.50
  174.    M  56 12.12  34.56
  175.    F   6  0.75  32.00
  176.    F  90  0.95  12.00
  177.    M  27  3.60  30.01
  178. Un male de plus 30cm se trouve au:
  179. Rang 1
  180. Rang 4
  181. Nombre de femelle(s) pesant moins de 1kg: 2
  182. L'age moyen des males: 31
  183. L'age moyen des femelles: 48
  184. La taille plus grande:  34.56
  185. La aille plus courte:  12.00
  186.  
  187. Voulez vous faire un autre calcul, (o/n)?n
  188.  
  189. */
  190.  
Thanks again for taking the time, really appreciated and lesson learned :P
Nov 20 '08 #20

Post your reply

Sign in to post your reply or Sign up for a free account.