C++ en boucle jusqu'à ce qu'un caractère est entré

Un exercice pratique à partir du livre que je suis en utilisant (rechapage le chapitre sur les différents types de boucles) m'a demandé de créer un programme qui demande sans cesse à l'utilisateur de saisir des caractères individuels. Il y a deux caractéristiques:

  1. Le programme doit se terminer lorsque le caractère "$" est entré.
  2. Le programme devrait conserver un contrôle du nombre de périodes d'entrée et de sortie le total à mesure que le programme se termine. Fondamentalement, l'idée est de la boucle de l'invite d'entrée -> compter les périodes -> afficher ce nombre puis la fin du programme, lorsque "$" est entré.

Voici le code que j'ai:

//Takes character input, tallies periods, stops on dollar sign

#include <iostream>
using namespace std;

int main() {

    char i; //input received
    int j = 0; //counter for # of periods

    cout << "This program will accept single-character entries and report the number of periods you've entered.\n";

    for (;;) {
        do {
            cout << "Please enter a single character, using $ to stop: ";
            cin >> i;

            if(i == '.')
                j++;
        } while(i != '$');

    if(i == '$')
        cout << "Total number of periods entered is " << j << " .";
        break;

    }
    return 0;
}

Le programme fonctionne très bien et le code est efficace pour moi, s'il vous plaît corrigez-moi si je me trompe. Ce qui semble étrange pour moi, c'est l'utilisation de l'infini pour{} la boucle autour de la majorité du code. Le chapitre utilisés une ou deux fois donc c'est la seule façon que je connaisse pour faire une boucle de fonctionner de cette manière.

Peut-être que c'est juste mon inexpérience avec la langue, mais est l'utilisation d'une boucle avec (;;) ici typique d'un événement en C++? La syntaxe d'avoir une boucle sans paramètres définis semble faire sens de ce que je devais faire, mais l'ensemble de la for(;;){} bloc semble toujours étrange pour moi.

  • Le for(;;) boucle n'est pas pertinent dans cette situation,la boucle avec au moins une condition j'.e for(;some condition;) aura encore un sens, mais pas ici.
  • Merci, j'ai pris que la boucle et tout fonctionne toujours correctement. Le livre avait utilisé un for(;;) boucle de démontrer la même fonction (en boucle jusqu'à l'entrée spécifique) plus tôt dans le chapitre, donc c'est là que j'ai eu l'idée. Je ne suis pas sur l'ordinateur avec ce code en ce moment, donc je vais prendre un autre coup d'oeil demain. For(;;) en boucle comme je l'ai eu, sans conditions, utile en aucune façon, ou est-ce superflu que c'est ici?
  • Dans ce cas, la boucle for est de ne rien faire, depuis la rupture des sauts hors de lui avant qu'il ne boucles. Mais en général, il y a certainement des moments où, tel un "pour toujours" de la boucle est nécessaire, avec une pause ou un retour en son sein. Il est probablement plus fréquent pour ce faire avec un while(true){...} la boucle.
  • oui tout à fait raison, ça aurait pu être une réponse avec quelques détails. c'est pourquoi j'ai dit hors de propos dans cette situation, il y a certaines situations où cette boucle est nécessaire.
  • Merci, il me semblait étrange, une utilisation de la{} boucle pour moi.
  • Il ya quelques façons de faire une boucle infinie, certaines personnes préfèrent while (1) ou while (true). Personnellement, je préfère for (;;). Et non, il n'est pas rare.
  • Ce qui fait que vous pensez que vous avez besoin d'une boucle for? Lire votre code, vous disposez d'un "while (!condition)", immédiatement suivi par un "si (condition)". Demandez-vous: "Comment voulez-vous atteindre le "si", sans la condition d'être vrai? Si c'est le cas, whey avez-vous besoin de le "pour()"? Certains programmeurs C utilisation for(;;) { if (...) break; work; if (...) break; more work; break; } comme un contrôle de flux paradigme qui n'est pas destiné à boucle. Il est, en effet, un goto, et ne devrait probablement pas être utilisé en "C++". Utilisez uniquement "for(;;)" lorsque vous avez l'intention de boucle.
  • C'est vrai, sur le relisant, je vois que le "tout" et "si" les conditions de couvrir tout par eux-mêmes. La raison pour laquelle j'inclus for (;;), c'est que le livre avait utilisé lors de l'introduction de la notion de boucle qui s'exécute jusqu'à ce qu'un utilisateur d'entrée, et donc pensé que c'était de l'approche standard. Je n'ai pas cherché à l'exécution du programme sans le for(;;), mais je vais garder cela à l'esprit pour l'avenir.