-2
votes

c Programme à l'aide d'une instruction de commutation incorrecte fonctionne

J'ai essayé d'écrire ce programme et que cela ne fait pas ce qu'il est censé, et j'ai cherché des solutions en ligne mais je ne peux pas comprendre ce qui ne va pas, pouvez-vous me donner une main? (Le programme est en portugais, car je le faisais dans ma langue mais c'est tout à fait compréhensible.

L'exercice est: Écrire un programme qui vous permet d'indiquer, d'un Nombre déterminé d'heures, quels minutes, secondes, ou même les dixièmes d'une seconde, que ce nombre d'heures Contient à l'aide d'un commutateur. P>

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

int main()
{
 int h,m,s,ds;

printf("Introduza o nr de horas:\n");
scanf( "%d" , &h);

m = h*60;
s = h*60*60;
ds = h*60*60*10;

scanf( "%d%d%d" , &m, &s, &ds);

switch (h)
{
case 'a' : printf(" Tem: %d minutos" , m);
case 'b' : printf(" Tem: %d segundos" , s);
case 'c' : printf(" Tem: %d decimos de segundo" , ds);
default : printf("Medida incorreta");
}

}

c

6 commentaires

Il suffit de deviner, mais vous devez mettre pause; s à la fin de chaque cas . Mais sans savoir ce que «c'est censé faire et ce qu'il fait à la place, il est difficile de répondre.


Vous ignorez également la valeur de retour de scanf () , vous n'avez donc aucune idée de ce que vous lisez réellement.


Quoi qu'il en soit, bienvenue. Veuillez prendre du temps pour lire la page d'aide, en particulier les sections nommées "Quels sujets puis-je poser des questions ici?" et < Un href = "http://stackoverflow.com/help/dont-ask"> "Quels types de questions dois-je éviter de demander?" . Et plus important encore, veuillez lire La liste de contrôle de la pile sur le débordement . Vous voudrez peut-être aussi en savoir plus sur Exemples minimes, complets et vérifiables .


Veuillez préciser ce qui ne va pas, les entrées qui doivent être transmises au programme, aux sorties attendues et aux sorties réelles. Et au moins commencer par permettre à tous les avertissements de votre compilateur (par exemple, -wall -wextra -werror sur gcc), pour obtenir débarrassé de toutes les constructions suspectes avant même de l'exécuter .


Et quel est le point de votre deuxième scanf () ? scanf ("% d% d% d", & m, & s, & ds); peut écraser les valeurs de m , s , et < Code> DS que vous venez de définir.


Je pense que le problème devrait être: entrez tout nombre de points flottants d'heures (ex: 6.11) et émettez le nombre de minutes, secondes, .... De cette façon, je pense que nous ne pouvons pas implémenter commutateur car il s'attend à un int pas float .


3 Réponses :


1
votes

Je ne sais pas quelle est la sortie que vous obtenez et ce que vous attendez dans la sortie, mais en consultant votre code, il y a casse après chaque cas

par exemple xxx

Quelle instruction rupture est-ce qu'elle arrête les autres cas à exécuter


0 commentaires

0
votes

dans EXAPMLE fourni, vous calculez d'abord des valeurs pour M , s et ds de la valeur de h , puis attribuer des nouvelles valeurs (écraser) de nouvelles valeurs au sein de Scanf ().

seconde - note que vous utilisez des littéraux en caractères dans des déclarations de cas, c'est-à-dire «A», 'B', 'c', au lieu d'entier, c'est-à-dire 1, 2, 3, malgré cette variable h stocke entier.

Tout d'abord, c'est une bonne idée de décider - quelles valeurs doivent être dans m , s et DS variables - calculé de h ou entré par l'utilisateur.


1 commentaires

Scanf ("% D% d% d", & Var1, & Var2, & Var3) ne produira aucune erreur si les entrées sont séparées par un caractère d'espacement.



1
votes

Vous avez besoin de plus de compréhension des déclarations de cas de commutation.
Les états de cas d'interrupteur n'exécutent pas le bloc de code après la déclaration de cas. Il saute juste à la bonne déclaration.

 Déclaration de cas de commutation p>

Après avoir exécuté le bloc de code après la déclaration de cas, il exécute simplement le code ci-dessous - Ignorer toute autre Déclarations de cas. P>

Donc, si vous souhaitez vous arrêter avant la déclaration de cas suivante, vous devez utiliser Break Strort>, qui brisera l'instruction de commutation. (Sortez de l'instruction Switch) P>

En conséquence, votre code serait comme ça. P>

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

int main()
{
    int h,m,s,ds;

    printf("Introduza o nr de horas:\n");
    scanf( "%d" , &h);

    m = h*60;
    s = h*60*60;
    ds = h*60*60*10;

    scanf( "%d%d%d" , &m, &s, &ds);

    switch (h)
    {
    case 'a' : 
        {
            printf(" Tem: %d minutos" , m); 
            break;
        }
    case 'b' :
        { 
            printf(" Tem: %d segundos" , s);
            break;
        }
    case 'c' : 
        {
            printf(" Tem: %d decimos de segundo" , ds);
            break;
        }
    default : 
        {
            printf("Medida incorreta");
            break;
        }
    }

}


3 commentaires

Utilisation des crochets {} dans les cas dans Switch n'est pas nécessaire et je pense que le code est encombrant.


@Gamalothman Utilisation des crochets {} Dans les instructions de cas de commutation permet une déclaration de variable dans le bloc de code. Sans cela, nous ne pouvons pas déclarer des variables.


Mais ici, vous ne déclarez rien. Si c'est votre style, vous êtes libre de le garder mais je vois cela déroutant. Aussi, des réponses sur cette question << A HREF = "https://stackoverflow.com/questions/4241545/c-switch -case-curly-braces-aever-every-every-every-every-Case" Titre = "Chantit Coulacement des bretelles frisées après chaque Case "> Stackoverflow.com/Questtions/4241545/... > dire qu'il n'est pas recommandé.