Experiencia en depuración de C ++ Primer ejercicio 5.14

tema:

Escriba un programa para leer cadenas de entrada estándar en busca de palabras duplicadas. El programa debe encontrar lugares en la entrada donde una palabra sea seguida inmediatamente por ella misma. Lleve un registro de la mayor cantidad de veces que ocurre una sola repetición y qué palabra se repite. Imprima el número máximo de duplicados o imprima un mensaje que diga que no se repitió ninguna palabra.

programa:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    
    
	string word_now;
	string word_last = "";
	vector<string> champion;
	int sum_last = 1;
	int sum_now = 1;
	while (cin >> word_now)
	{
    
    
		if (word_now == word_last)
			sum_now++; // the same word, count!
		else
		{
    
    
			if (sum_now > sum_last)
			{
    
    
				sum_last = sum_now;
				champion.clear();
				champion.push_back(word_last);
			} // now it is the largest, mop away the previous memory and write in new contents.
			else
			{
    
    
			    if (sum_now == sum_last)
				    champion.push_back(word_last);
			} // as large, its a champion as well as previous ones
			sum_now = 1;
		}
		word_last = word_now;
	}
	// Now test the last word.
	if (sum_now > sum_last)
	{
    
    
		sum_last = sum_now;
		champion.clear();
		champion.push_back(word_now);
	}
	else
	{
    
    
	    if (sum_now == sum_last)
		    champion.push_back(word_now);	
	}
	// output
	if (sum_last == 1) cout << "No word was repeated." << endl;
	else
	{
    
    
		if (champion.size() == 1) cout << "The max number of duplicates is " << sum_last << ".\nIt is:";
		else cout << "The max number of duplicates is " << sum_last << ".\nThey are:";
		for (auto c : champion) cout << c << " ";
		cout << endl;
	}
	return 0;
}

Nota: ¡No hay necesariamente un solo campeón! Así que usa el almacenamiento de vectores.

Al principio, solo emitía de forma continua No word was repeated., pero luego descubrió que la línea 30 se había olvidado.
Iluminación: los preparativos para el bucle que ingresa a una nueva ronda deben hacerse bien .

Más tarde, al generar el valor de campeón, a veces hubo dos, y se encontró que la influencia del orden se ignoraba al juzgar la última palabra. Después de sum_last = sum_now;la operación en la línea 37 , se debe establecer el if en la línea 43.
Ilustración: Para comprobar la lógica de funcionamiento real del programa, cambie los parámetros para prestar atención al impacto en el contenido posterior .


[Ejercicio básico de C ++ (5ª edición)] Programa de ejercicios-Capítulo 5 (Capítulo 5)

Supongo que te gusta

Origin blog.csdn.net/weixin_50012998/article/details/108280058
Recomendado
Clasificación