2010-08-11 5 views
0

J'ai un programme avec lequel dreamlax a beaucoup travaillé avec moi, qui utilise Objective-C pour convertir les températures entre les échelles de température Fahrenheit, Celsius, Kelvin et Rankine, mais en convertissant les entrées de console en Kelvin, puis de Kelvin à l'échelle de température désirée par l'utilisateur final.objectif-c chaîne, string-formatter

Maintenant, j'ai une idée que je voudrais mettre en œuvre pour l'invite finale des températures converties une fois les calculs effectués. Il est mis en place actuellement à l'affichage uniquement comme ceci:

x degrés température échelle

Où x = la température convertie finale, et la température échelle = l'échelle l'utilisateur souhaite avoir sa température converti en. Supposons que l'utilisateur final choisisse Fahrenheit comme température de sa source, souhaitant convertir 212 degrés dans son échelle de température cible de Celsius. Les conversions doivent être égaux à 100 degrés Celsius évidemment, mais je pense que le programme serait mieux d'afficher le résultat comme celui-ci:

degrés Fahrenheit est degrés Celsius.

Maintenant, j'ai fait les valeurs qui doivent être remplacées par des variables en gras. J'ai les valeurs 212 et 100 résolues facilement, car 100 variables ont été là en premier lieu, et 212 peut facilement être corrigé en le remplaçant par le formateur de chaîne de la variable sourceTemp, la variable qui contient la température d'entrée d'origine des utilisateurs.

Maintenant, la chaîne Fahrenheit est un peu différente.

J'ai essayé d'établir quelque chose de nouveau dans le commutateur d'origine comme ceci:

switch (prompt) 
{ 
    case 1: 
     //end-user chooses Fahrenheit 
     [converter setFahrenheitValue:sourceTemp]; 
     sourceTempText = 1; 
     break; 

    case 2: 
     //end-user chooses Celsius 
     [converter setCelsiusValue:sourceTemp]; 
     sourceTempText = 2; 
     break; 

    case 3: 
     //end-user chooses Kelvin 
     [converter setKelvinValue:sourceTemp]; 
     sourceTempText = 3; 
     break; 

    case 4: 
     //end-user chooses Rankine 
     [converter setRankineValue:sourceTemp]; 
     sourceTempText = 4; 
     break; 
} 

OK, j'ai donc ajouté à chaque cas différent, établissant une nouvelle variable nommée sourceTempText soit 1-4, le même valeur que l'utilisateur final a choisi de choisir la température de sa source.

Maintenant, voici comment j'ai essayé d'afficher l'invite finale à l'utilisateur final avec le commutateur final:

switch (prompt2) 
{ 
    case 1: 
     //end-user chooses Fahrenheit 
     printf("%lf degrees sourceTempText is %lf degrees Fahrenheit\n", sourceTemp, [converter fahrenheitValue]); 
     break; 

    case 2: 
     //end-user chooses Celsius 
     printf("%lf degrees sourceTempText is %lf degrees Celsius\n", sourceTemp, [converter celsiusValue]); 
     break; 

    case 3: 
     //end-user chooses Kelvin 
     printf("%lf degrees sourceTempText is %lf degrees Kelvin\n", sourceTemp, [converter kelvinValue]); 
     break; 

    case 4: 
     //end-user chooses Rankine 
     printf("%lf degrees sourceTempText is %lf degrees Rankine\n", sourceTemp, [converter rankineValue]); 
     break; 
} 

Je ne sais pas maintenant, si je peux insérer sourceTempText dans la chaîne comme je l'ai ici, au lieu de cela, peut-être que je dois utiliser un formateur de chaîne, mais je ne suis pas sûr. Ca devrait être une solution facile, je voulais juste le jeter ici! :)

P.S. désolé pour le genre de mise en forme de question désordonnée, je ne sais pas comment l'exprimer, alors s'il vous plaît demander des éclaircissements si nécessaire.

Répondre

2

Remplacer sourceTempText avec% s, et surtout la déclaration switch déclarer les chaînes possibles comme ceci:

char *scales[4] = { "Fahrenheit", "Celsius", "Kelvin", "Rankine" }; 

ajouter ensuite et des arguments à chaque printf, après la sourceTemp, comme ceci:

printf("%lf degrees %s is %lf degrees Fahrenheit\n", 
        sourceTemp, scales[prompt-1], [converter fahrenheitValue]); 

C'est prompt-1 parce que le comptage commence à zéro, et vous commencez à 1.


ps. Je vois maintenant vous définissez sourceTempText = 1/2/3/4; - Je viens d'utiliser prompt, car il a la même valeur. Qu'est-ce que vous pourriez faire, est la mise en

char *scales[5] = { "Error!", "Fahrenheit", "Celsius", "Kelvin", "Rankine" }; 

et en utilisant scales[sourceTempText], tout en veillant à ce que avant la switch, sourceTempText = 0. Cela ferait un bon exemple de désinfection d'entrée: tout ce que l'utilisateur réussit à mettre prompt, votre programme affichera toujours un texte valide.

+0

Wow qui a bien fonctionné! Juste quelques questions cependant, quelle est exactement les échelles char * [4]? Qu'est-ce que cela signifie, je comprends votre logique en lui donnant les chaînes possibles à coup sûr. Aussi, je suppose que% s est le formateur de chaîne pour la chaîne? – Qcom

+1

Oui,% s est pour la chaîne (pas pour NSString, mais c'est un autre sujet). 'char * scales [4] = {}' dit: Il y a 4 pointeurs de type 'char *'. Un pointeur 'char *' est ce que vous appelleriez "string" ici; il pointe vers la mémoire où la chaîne commence, c'est une adresse mémoire. En disant 'échelles [0]', vous dites: donnez-moi le premier pointeur ("zéro-th"). Le% s regarde alors dans cet emplacement en mémoire. Pour expérimenter, vous pouvez essayer de remplacer 'scales [prompt-1]' par 'scales [prompt-1] + 1', ce qui fera que la chaîne sera imprimée à partir du deuxième caractère. ("ahrenheit", "elsius", "elvin" et "ankine") – mvds

+0

Super, merci encore! Maintenant, dans votre mise à jour, vous avez mentionné mon sourceTempText. Juste une chose que je suis confus à propos de, est prompt = à la même chose que sourceTempText à cause des cas 1-4? Maintenant, que dois-je afficher si sourceTemptText = 0? Comment un utilisateur peut-il même obtenir cela? Oh, je devrais souligner que mon code gère réellement les entrées incorrectes en définissant une variable de résultat = à scanf. Si scanf renvoie 0, alors il y a une erreur et si elle retourne EOF, il y a une autre erreur. Je ne sais pas si c'est la même chose que ce que vous avez mentionné. – Qcom

Questions connexes