programming-languages - increment++ 是如何工作的以及如何调整它以排除无效性?

标签 programming-languages c if-statement

上下文:

作为类(class)项目的一部分,我创建了这个 code (原版)。效果很好,几乎满分。在学习新 Material 时,我挑战自己重写原始代码并实现其中的新内容。所以基本上是什么 this new version (与原来的差别不大 - 随意比较)确实是:

  1. 您输入字母 c/C 表示圆形,r/R 表示矩形,k/K 表示正方形,
  2. 输入愿望尺寸,
  3. 它相应地计算周长和表面,
  4. 作为用户,如果他想继续,
  5. 重复这个过程,
  6. 在用户决定停止时显示(按相同顺序)以下信息:
    • 处理的数字总数,
    • 更大的表面,
    • 较小的圆周长,
    • 长度>7.8的矩形总数,
    • 处理过的方 block 总数,
    • 经过处理的正方形边的平均长度。

注意在下面的执行中输入的 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;

}

最佳答案

你可以这样做:

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

另请注意,没有大括号的原始代码可能无法按您预期的那样工作。只有 valide 为真时,第一个 printf 语句才会执行,但无论如何都会执行第二个语句。最好始终将花括号与 if 语句一起使用,以避免此类错误。

关于programming-languages - increment++ 是如何工作的以及如何调整它以排除无效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575310/

相关文章:

javascript - get_browser 不适用于 PHP 中的 IF 语句

programming-languages - 为什么有些语言要求在调用之前在代码中声明函数?

assembly - 机器依赖 'mean' 是什么?

c - 单独传递结构或其成员是否更快?

java - 检查用户是否至少输入了一个输入的最佳/最有效方法

JavaScript:创建将嵌套数组中的数据转换为具有多个对象的一个​​数组的函数

python - Python 作为系统和应用程序编程语言流行的主要原因是什么?

.net - 使用不同的.Net 语言?

c# - 在 C# StringBuilder 结构体中导入 C dll

c - Scintilla-无法编译诱饵示例