Как я могу эффективно очистить эту программу и по-прежнему определять, когда на входе файла нет буквы?

Вот вся моя программа, я должен рассчитать среднее количество букв в словах из входного файла с именем hw4pr11input.txt. Я занимался программированием всего пару недель, поэтому я был бы признателен за простые ответы, которые я мог бы реализовать, используя свои небольшие знания. Я еще не знаю, что такое массивы, глава, для которой я делаю домашнее задание, находится в файле io.

#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;

//function declaration
void average_letters(ifstream& fin);
//Precondition: there is a input file with text ready to be read
//postcondition: Text from the input file is read then the average length of
//words is calculated and output to the screen

//start main program
int main()
{
ifstream fin;

fin.open("hw4pr11input.txt");                                               //opening input file
if (fin.fail())                                                            //checking for input file opening failure
{
cout << "Input file open fail";
exit(1);                                                               //terminating program if check fails
}
cout << "File Open\n";
average_letters(fin);                                                     //calling function to remove spaces
system("pause");
return 0;
}
//function definition, uses iostream and fstream
void average_letters(ifstream& fin)
{
char next, last_char = 0;
double letter_count = 0, word_count = 0;
double average = 0;
while(!(fin.eof()))
{
fin.get(next);
if(!(next == ' ' || next == ',' || next == '.' || next == '/'
|| next =='(' || next == ')'))
{
letter_count++;
}

else
{
if((next == ' ' || next == ',' || next == '.' || next == '/'
|| next =='(' || next == ')') && (last_char == ' ' || next == ','
|| next == '.' || next == '/' || next =='(' || next == ')' ))

{
continue;
}
else
{
word_count++;
}
}
last_char = next;                  //stores previous value of loop for comparison
}
average = letter_count/word_count;
cout << "The average length of the words in the file is:" << " " <<average;
cout << endl;
}

Я полагаю, что эта программа работает для выполнения назначения, но моя главная задача связана с частью функции average_letters, которая проверяет, является ли она буквой или символом. Я выбрал этот список символов, посмотрев на файл .txt. Я удалил комментарии, потому что они затрудняют их копирование и вставку. Я извиняюсь, если это усложняет понимание моей логики.

Спасибо за вашу помощь. Полегче со мной :).

0

Решение

Вы можете использовать std::bitset<255> с использованием символа, преобразованного в целое число без знака, и устанавливают в качестве true только те символы, которые являются символами слова. В вашем цикле вы просто ищите правильное слово.

Обратите внимание, это предполагает, что символ будет 255 битами вместо юникода. Вы можете увеличить свой бит установлен соответственно.

Это позволяет вам очень быстро проверить, является ли этот символ символом слова, и позволяет вам определить, какие символы вы хотите включить (например, если требование внезапно меняется на «-».

0

Другие решения

Вы можете украсить этот код, сохраняя эти группы символов в строках. Затем вы могли бы написать функцию, которая принимает символ и строку и проверяет, равен ли символ любому символу в данной строке. Но для этого нужно научиться использовать массивы, потому что строки i C являются массивами символов.

0

По вопросам рекламы [email protected]