En ce moment, j'utilise MPLAB X IDE 3.45 et pour une mission, je dois imprimer une table de température avec les conditions requises. Je suis capable de tous les satisfaire sauf un. Lorsque j'essaie de compléter les nombres avec des 0, les signes plus et négatifs remplacent les zéros Par exemple, ils ressemblent à 00-7 ou 0 + 123 . Cependant, je souhaite pouvoir les imprimer sous la forme -007 ou +0123.

Voici le code que j'ai actuellement:

// **** Include libraries here ****
// Standard libraries
#include <stdio.h>

//Class specific libraries
#include "BOARD.h"

// Microchip libraries
#include <xc.h>

// User libraries
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    BOARD_Init();
/***************************************************************************************************
 * Your code goes in between this comment and the following one with asterisks.
 **************************************************************************************************/
    // Declare Variables
    float fahr, celcius;
    int lower, upper, step;

    // Initialize Variables
    lower = 0; // lower limit of temperature
    upper = 300; // upper limit
    step = 20; // step size
    fahr = lower;

    // Print out table
    while (fahr <= upper) {
        celcius = (5.0 / 9.0) * (fahr - 32.0);
        printf("%7.1f %04.0f\n", (double)fahr, (double)celcius);
        fahr = fahr + step;
    }
/***************************************************************************************************
 * Your code goes in between this comment and the preceding one with asterisks.
 **************************************************************************************************/

    // Returning from main() is bad form in embedded environments. So we sit and spin.
    while (1);
}

Sortie de la fonction

Fahr      Celc
0.0 0-18
20.0 00-7
40.0 0004
60.0 0016
80.0 0027
100.0 0038
120.0 0049
140.0 0060
160.0 0071
180.0 0082
200.0 0093
220.0 0104
240.0 0116
260.0 0127
280.0 0138
300.0 0149

Remarque: j'utilise le simulateur pour cette partie.

c
2
Anil Celik Maral 16 janv. 2017 à 07:50

2 réponses

Meilleure réponse

Il semble y avoir un bogue dans l'implémentation de printf() sur votre système:

7.21.6.1: La fonction fprintf

6 Les caractères du drapeau et leur signification sont:

+ Le résultat d'une conversion signée commence toujours par un signe plus ou moins. (Il commence par un signe uniquement lorsqu'une valeur négative est convertie si cet indicateur n'est pas spécifié.)

0 Pour les conversions d, i, o, u, x, X, a, A, e, E, f, F, g et G, des zéros non significatifs (après toute indication de signe ou de base) sont utilisés pour pad à la largeur du champ plutôt que d'effectuer un remplissage d'espace, sauf lors de la conversion d'un infini ou NaN. Si les indicateurs 0 et - apparaissent tous les deux, l'indicateur 0 est ignoré.

%04.0f doit compléter le nombre avec des 0 s de début après le signe négatif et ne doit pas afficher un + à moins que vous ne passiez également l'indicateur + comme dans:

printf("%7.1f %+04.0f\n", (double) fahr, (double) celcius);
3
Community 20 juin 2020 à 09:12

L'OP printf() ne parvient pas à imprimer les nombres à virgule flottante avec le format souhaité.

Parfois le compilateur / binaire est défectueux par spécification @chqrlie

Vous trouverez ci-dessous une solution entière uniquement pour contourner le problème.

  // Declare Variables
  int fahr;
  int milli_celcius;
  int lower, upper, step;

  // Initialize Variables
  lower = 0; // lower limit of temperature
  upper = 300; // upper limit
  step = 20; // step size
  fahr = lower;

  // Print out table
  while (fahr <= upper) {
    printf("%5d.0 ", fahr);
    milli_celcius = ((fahr - 32) * 5 * 1000) / 9;
    // round to nearest whole degree;
    int celcius = milli_celcius < 0 ? 
        (milli_celcius - 1000 / 2) / 1000 :  
        (milli_celcius + 1000 / 2) / 1000;
    printf("%+04d  Ref:%f\n", celcius, (fahr - 32.0) * 5 / 9.0);
    fahr = fahr + step;
  }

Production

    0.0 -018  Ref:-17.777778 
   20.0 -007  Ref:-6.666667 
   ...
  280.0 +138  Ref:137.777778 
  300.0 +149  Ref:148.888889 
0
Community 23 mai 2017 à 12:33