2017-10-20 12 views
-1

J'apprends le C de base pour un cours de programmation d'introduction que je prends et j'ai deux questions liées au code ci-dessous.Programmation C: pourquoi mes décimales ne s'affichent pas et comment puis-je définir des espaces noirs

Première: dans la section //calculations, je veux que mes valeurs appelées cryr1, cryr2, cryr3 et avgcr, pour afficher les résultats sur 2 décimales. Je ne reçois que des nombres entiers avec 2 décimales. QUESTION: Y a-t-il quelque chose qui ne va pas dans la façon dont j'ai écrit mes calculs? Deuxièmement: dans la section où j'ai toutes mes instructions printf, j'ai beaucoup d'espaces blancs vides pour prendre en charge l'espacement dans la table que je veux rendre. Cependant, si les entrées de cette sortie varient en longueur numérique, les colonnes ne sont pas affichées correctement. QUESTION: Existe-t-il un code ou une syntaxe que je devrais utiliser pour calculer ou déterminer le nombre d'espaces que chaque valeur du tableau affiche?

// Global Variable declarations 
FILE *reportfile;    // report file (for output) 
FILE *inputfile;     // disk file (for input)  
char company[31];    // company name    
int assetsyr1;     // assets year 1    
int assetsyr2;     // assets year 2 
int assetsyr3;     // assets year 3 
int liabilitiesyr1;    // liabilties year 1 
int liabilitiesyr2;    // liabilties year 2 
int liabilitiesyr3;    // liabilities year 3 
float cryr1;      // current ratio yr1 
float cryr2;      // current ratio yr2 
float cryr3;      // current ratio yr3 
float avgassets;     // average assets 
float avgliabilities;   // average liabilities 
float avgcr;      // average current ratio 


//calculations 
cryr1 = (assetsyr1/liabilitiesyr1); 
cryr2 = (assetsyr2/liabilitiesyr2); 
cryr3 = (assetsyr3/liabilitiesyr3); 
avgassets = (assetsyr1 + assetsyr2 + assetsyr3)/3; 
avgliabilities = (liabilitiesyr1 + liabilitiesyr2 + liabilitiesyr3)/3; 
avgcr = (cryr1 + cryr2 + cryr3)/3; 


printf("%s\Current Ratio Report\n\n", company); 
printf("    Current   Current   Current\n"); 
printf("Year   Assets   Liabilities  Ratio\n"); 
printf("----------------------------------------------------------\n"); 
printf("2010    %d    %d    %1.2f\n", assetsyr1, liabilitiesyr1, cryr1); 
printf("2011    %d    %d    %1.2f\n", assetsyr2, liabilitiesyr2, cryr2); 
printf("2012    %d    %d    %1.2f\n", assetsyr3, liabilitiesyr3, cryr3); 
printf("----------------------------------------------------------\n"); 
printf("Average   %1.0f    %1.0f    %1.2f\n\n", avgassets, avgliabilities, avgcr); 

L'image est censée rendre comme celui-ci

expected output

Toute aide que vous pouvez offrir est très apprécié. Merci, David

J'ai placé le code source et le fichier d'entrée here

+0

Veuillez copier-coller votre sortie actuelle et la sortie désirée ** comme texte **, et assurez-vous que votre code est un [mcve] - le ** plus court possible ** code quelqu'un d'autre peut courir pour voir le problème lui-même. ("Quelqu'un d'autre peut fonctionner" signifie aussi qu'il doit être suffisamment complet pour fonctionner - typiquement, cela signifie que vous pourriez vouloir coder les valeurs plutôt que de les lire depuis un fichier, car les gens qui veulent tester leurs réponses n'auront généralement pas ce fichier d'entrée à portée de main). –

+0

https://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output Ceci vous aidera à formuler votre sortie. – Mare70

+0

@davidw shaun répondre ll résoudre vos problèmes, vous devez lancer pour flotter en premier. – Mare70

Répondre

1

Lorsque vous diviser un entier par un entier et que vous voulez un résultat de flotteur qui a sa partie décimale pas tronquée, vous devez typecast l'entier à un flotteur. Voilà ce que je comprends en regardant votre code

Le moyen le plus sûr, je dirais serait est

//calculations 
cryr1 = ((float)assetsyr1/liabilitiesyr1); 
cryr2 = ((float)assetsyr2/liabilitiesyr2); 
cryr3 = ((float)assetsyr3/liabilitiesyr3); 
avgassets = ((float)(assetsyr1 + assetsyr2 + assetsyr3))/3; 
avgliabilities = ((float)(liabilitiesyr1 + liabilitiesyr2 + liabilitiesyr3))/3; 
avgcr = ((float)(cryr1 + cryr2 + cryr3))/3; 

Essayes

Pour la deuxième partie de la question

printf les instructions ont la possibilité de "définir" le champ pour l'impression Comme vous avez utilisé le% 1.2f, il assure l'alignement à droite et imprime 2 espaces décimaux.

Il existe un concept similaire pour les types entiers et

printf("%7d", 12345);   //This will print 12345 (right aligned) 

printf("%7d", 123);    //This will print  123 (right aligned also notice that both numbers start from the right at same position) 

Vous pouvez supprimer quelques espaces des printf. Vous pouvez donc corriger les titres des onglets et travailler avec ceux-ci

+0

Merci! Cela a fonctionné pour la première des deux questions. J'apprécie vraiment ça. Que signifie "typecast"? Je suis un newb total. – davidw

+0

Hé, ouais, pas de problème du tout. Typecasting est un terme pour changer le type de données d'une variable en un autre type de données. Ce qui a été fait ici s'appelle Explicit Type Casting, ce qui signifie que nous avons forcé le programme à changer le type. (Parfois même le compilateur le fait par exemple quand vous stockez la division de deux flottants dans un entier comme int a = 3.0/1.0, il va stocker un as) J'ai également ajouté une suggestion pour la solution de votre deuxième question dans ma réponse –

+0

Shaun, merci beaucoup !! Y a-t-il un alignement gauche équivalent que je peux explorer? – davidw