增量++如何真正起作用以及如何使其适应以排除无效性?

时间:2014-10-26 06:58:35

标签: programming-languages c if-statement

上下文:

作为课程项目的一部分,我创建了这个code(原始版本)。它很棒,几乎满分。当我学习新材料时,我挑战自己重写原始代码并在其中实现新内容。所以基本上this new version(与原版没什么区别 - 可随意比较)的确是:

  1. 为圆圈输入字母c / C,为矩形输入r / R,为方形输入k / K,
  2. 输入欲望测量,
  3. 它相应地计算周长和表面,
  4. 作为用户,如果他想继续,
  5. 重复这个过程,
  6. 当用户决定停止时,显示(以相同顺序)以下信息:
    • 处理的总人数,
    • 较大的表面,
    • 较小的圆周长,
    • 长度> gt的矩形总数; 7.8,
    • 处理的方形总数,
    • 处理过的正方形边的平均长度。
  7. 请注意,在下面的执行中,输入的4个字符中有3个有效。所以我们得到它们的表面和周长。但是'T'是一个无效字符,但是当用户决定不继续时,它仍然被计为总数的一部分并且给我4而不是3:

    Entrez le caractere correspondant a la figure geometrique (c,C,r,R,k,K): c
    Veuillez entrer le rayon: 10
    Le perimetre est de: 62.83
    La surface est de: 314.16
    
    Voulez-vous continuer ? (o/n) o
    Entrez le caractere correspondant a la figure geometrique (c,C,r,R,k,K): t
    Le caractere 'T' est invalide
    
    Voulez-vous continuer ? (o/n) o
    Entrez le caractere correspondant a la figure geometrique (c,C,r,R,k,K): k
    Veuillez entrer le cote du carre: 5
    Le perimetre est de: 20.00
    La surface est de: 25.00
    
    Voulez-vous continuer ? (o/n) o
    Entrez le caractere correspondant a la figure geometrique (c,C,r,R,k,K): r
    Veuillez entrer la longeur et largeur du rectangle: 10 5
    Le perimetre est de: 30.00
    La surface est de: 50.00
    
    Voulez-vous continuer ? (o/n) n
    
    Au total, on a traite 4 figure(s)
    La surface la plus grande est: 314.16
    Il y a 1 rectangle(s) dont la longueur depasse 7.80 metres
    Le plus petit perimetre des cercles est: 62.83
    Le nombre total de carre traitees : 1
    Le cote moyen des carres traites est de: 5.00
    
    Process returned 0 (0x0)   execution time : 47.514 s
    Press any key to continue.
    

    问题:

    如何以仅计算用户输入的有效字符的方式调整增量(somFigure ++)?

    源代码:

     int main() {
        char figure,
             reponse;
        int valide,
            nbCarre = 0,
            somFigure = 0,
            nbGrRec = 0;
        float perimetre,
              surface,
              rayon,
              longueur,
              largeur,
              cote,
              somCarre = 0.0,
              plusGrandeSurface = 0.0,
              plusPetitPerimetreC = 5000.0;
        const float PI = 3.14159,
                    GRAND_RECTANGLE = 7.8;
    
        do
            {
    
    
        printf("Entrez le caractere correspondant a la figure geometrique (c,C,r,R,k,K): ");
        fflush(stdin);  
        figure = toupper(getchar());
        valide = (figure == 'C') || (figure == 'R') || (figure == 'K');
    
        somFigure++;
    
        switch (figure) {
    
            case 'C': printf("Veuillez entrer le rayon: ");
                      scanf("%f", &rayon);
                      perimetre = 2 * PI * rayon;
                      surface = PI * rayon * rayon;
                      if (surface > plusGrandeSurface)
                        plusGrandeSurface = surface;
                      if (perimetre < plusPetitPerimetreC)
                        plusPetitPerimetreC = perimetre;
                      break;
    
            case 'R': printf("Veuillez entrer la longeur et largeur du rectangle: ");
                      scanf("%f%f", &longueur, &largeur);
                      perimetre = 2 * (longueur + largeur);
                      surface = longueur * largeur;
                      if (longueur > GRAND_RECTANGLE)
                            nbGrRec++;
                      if (surface > plusGrandeSurface)
                        plusGrandeSurface = surface;
                      break;
    
    
            case 'K': printf("Veuillez entrer le cote du carre: ");
                      scanf("%f", &cote);
                      perimetre = 4 * cote;
                      surface = cote * cote;
                      nbCarre++;
                      somCarre +=  cote;
                      if (surface > plusGrandeSurface)
                        plusGrandeSurface = surface;
                      break;
    
            default:  printf("Le caractere '%c' est invalide\n", figure);
    
       }  /* Fin du Switch */
    
       if (valide) 
            printf("Le perimetre est de: %.2f\n", perimetre),
            printf("La surface est de: %.2f\n", surface);
    
    
        printf("\nVoulez-vous continuer ? (o/n) ");
        fflush(stdin);
        reponse = getchar();
        fflush(stdin);
    
            }while(toupper(reponse) == 'O'); /* Fin de la boucle do....while */
    
    
        printf("\nAu total, on a traite %d figure(s)\n", somFigure);
        printf("La surface la plus grande est: %.2f\n", plusGrandeSurface);
    
        if (nbGrRec > 0)
        {
            printf("Il y a %d rectangle(s) dont la longueur depasse %.2f metres\n", nbGrRec, GRAND_RECTANGLE);
        }
        else
            printf("Il y a aucun rectangle traite\n");
    
        if (plusPetitPerimetreC != 5000.0)
        {
            printf("Le plus petit perimetre des cercles est: %.2f\n", plusPetitPerimetreC);
        }
        else
            printf("Il y a aucun cercle traite\n");
    
        // Fait un resumer des nombre de carrés traités si l'utilisateur decise de ne plus continuer
        if (nbCarre > 0)
        {
            printf("Le nombre total de carre traitees : %d\n", nbCarre);
            printf("Le cote moyen des carres traites est de: %.2f\n", somCarre / nbCarre);
        }
        else
            printf("Il y a aucun carre traite\n");
    
            return 0;
    
    }
    

1 个答案:

答案 0 :(得分:1)

你可以这样做:

if (valide) {
  somFigure++;
  printf("Le perimetre est de: %.2f\n", perimetre),
  printf("La surface est de: %.2f\n", surface);
}

另请注意,没有花括号的原始代码可能无法正常工作。仅当printf为真时才会执行第一个valide语句,但在任何情况下都将执行第二个if语句。总是使用带有{{1}}语句的花括号来避免这样的错误是一种很好的做法。