Дан список слов, найти наиболее общих исходных символов и других статистических данных


20 разных слова вводятся с помощью строкового массива.

Программы на языке C++ для отображения алфавита, которое произошло максимальное количество раз, как начальную букву слова в списке,и сколько раз это произошло.

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

Я хотел бы знать, как эта программа может быть написана более 'разумно'.

#include<iostream.h>
#include<string.h>
int main()
{
int i,n,len=0,sum=0,j,max,min,c=0,c2=0,k=0;
int maxo=0,len1,maxi=0,c1=0,len2,counter=0,maxo1=0,len3;
 float avg;
char list[100][100] = { 0 };
char vow[] = "AEIOUaeiou";
char letter;
for(i=0;i<2;i++) 
{
cout<<"Enter word:  ";
gets(list[i]);

len=strlen(list[i]);                                
sum=sum+len;
cout<<"Length of word:  "<<len<<endl;
if(list[i][len-1]=='s')
{cout<<"The Word "<<list[i]<<" ends with s"<<endl;
 c2++;
 }

}
//Word input by user.Prints word along with length.       
min=strlen(list[0]);
max=strlen(list[0]);
//Initialising max and min.
for(i=0;i<2;i++)
 {
   if(strlen(list[i])<min)
   {min=strlen(list[i]);}
    if(strlen(list[i])>max)
    {max=strlen(list[i]);}

     }
  for(i=0;i<2;i++)
  {
  if(max==strlen(list[i]))
  cout<<"The max value of the lengths stored:"<<list[i]<<endl<<"Word count:"
  <<max<<endl;               
  if(min==strlen(list[i]))
  cout<<"The min value of the lengths stored:"<<list[i]<<endl<<"Word count:"
  <<min<<endl;
  }
//Max and Min value of string lengths are printed.
 avg=sum/2; 
 cout<<"Avg length:"<<avg<<endl;
 //Average value printed.
 cout<<"The number of words with s:"<<c2<<endl;
//Word ending with s.


 for (i = 0; i <2; i++) 

 {len1 = strlen(list[i]);
 for (k = 0; k < len1; k++) 
 {
    for (j = 0; j < strlen(vow); j++)
        //if (list[j][k] == vow[j])
        if (list[i][k] == vow[j])
            c++;
}
cout << "Number of vowels in line " << i << ": " << c << '\n';
if (c>maxo) maxo = c;
c = 0;
cout << "Maximum Vowel count so far:" << maxo << "\n\n";

 cout << "Maximum Vowel count:" << maxo << endl;
   }


 //Vowel maximum count 



 for(i = 0 ;i < 2 ;i++)
 { len3 = strlen(list[i]);
    letter = list[i][0];
 {for(j=0;j<len3;j++)
  if(list[i][j]==letter)
   counter++;

 }
 cout << "Number of identical letters as  first letter in line " << i << ": " << counter << '\n';
if (c>maxo1) maxo1 = counter;
counter = 0;
cout << "Maximum letter count so far:" << maxo1 << "\n\n";

 cout << "Maximum letter count:" << maxo1 << endl;
   }





fflush(stdin);
getchar();
return 0;
} 


229
2
задан 26 февраля 2018 в 11:02 Источник Поделиться
Комментарии
2 ответа

Вот несколько вещей, которые я вижу:

Старые Заголовки

#include<iostream.h>

iostream.h следует заменить современные день iostream. Вы можете также рассмотреть вопрос о замене string.h С cstring. Когда вы сделаете это, вы должны префикс все функции/классы из стандартной библиотеки с std::. using namespace std; может показаться короче, но это лучше избегать.


Вмятие

int main()
{
int i,n,len=0,sum=0,j,max,min,c=0,c2=0,k=0;

Вы, кажется, не имеют каких-либо отступов в main функция. Выбрать какой-то длины, такой как 4 пробела или табуляции, и использовать его постоянно. Отступ облегчает чтение кода.


Waaaaaaay слишком много переменных в одном месте

int i,n,len=0,sum=0,j,max,min,c=0,c2=0,k=0;
int maxo=0,len1,maxi=0,c1=0,len2,counter=0,maxo1=0,len3;

Это честно выглядит ужасно на первый взгляд. Объявление переменных в начале функции-это не то, что c++ требует. Я предлагаю вам перенести все эти переменные там, где они будут использоваться, и используйте инициализации, а не отдельная декларация и определение. Например:

len=strlen(list[i]);

Можно заменить:

std::size_t len=strlen(list[i]);


Использование стиля c многомерные массивы

char list[100][100] = { 0 };

С многомерные массивы в стиле ошибок, не знают своих размеров, и могут легко распадаться на указатели. Как таковые, их лучше избегать. Рассмотрите возможность использования std::arrayС std::stringы, которые более универсальны и менее подвержено ошибкам.


Использование строки c стиль

char vow[] = "AEIOUaeiou";

Если вы используете C++, то почему вы используете строки c стиль? Перейти на намного лучше std::string.


Никогда не используйте gets

gets(list[i]);

Это переполнение стека ответ говорит вам все, что вам нужно знать. Когда вы начинаете использовать std::string, а затем использовать getline читать в строку.


Не использовать endl если вы хотите сбросить выход

... << endl;

Большинство людей не знают при запуске C++, который endl излишне сбрасывает выход. Перейти к \n.


Не использовать strlen в качестве контура состоянии

for (j = 0; j < strlen(vow); j++)

Если ваш компилятор умеет оптимизировать это, strlen можно было бы назвать каждой итерации в этом коде. Чтобы избежать этого, положите длину в своей собственной переменной.


Лучше Имена Переменных

Имена переменных, такие как i и c должны быть зарезервированы для петли индексов. Лучше использовать имена переменных, которые разъясняют свои намерения.


fflush(stdin)

fflush(stdin)

https://stackoverflow.com/a/18170435/6525260. Не играй с неопределенным поведением.


getchar

В C++, а лучше всего ждать персонажа:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

4
ответ дан 26 февраля 2018 в 12:02 Источник Поделиться

Помимо основных материалов указаны в Arnav Borborah ответ, код, написанный здесь, могут извлечь большую пользу от использования функций, чтобы лучше организовать функциональности кода.

Это те конкретные вещи, которые вы хотите сделать на список слов:


  • наиболее частые начальную букву

  • длинная длина

  • короткая длина

  • средняя длина

  • максимальное количество гласных

  • количество слова, заканчивающиеся на 'Ы'

Каждый из них может быть превращен в функцию, которая принимает список слов в качестве параметра, например, для последней:

int CountWordsEndingWithS(const std::vector<std::string>& words)
{
int count = 0;
for (const auto& word : words)
{
if (!word.empty() && (word.back() == 's' || word.back() == 'S'))
{
++count;
}
}
return count;
}

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

Вы могли бы также поставить значение слов в собственную функцию, оставив main() функция, как ясно и самодокументируемыми:

int main()
{
auto words = ReadWordsFromUser(20);
std::cout << "Most frequent starting letter: " << FindMostFrequentStartingLetter(words) << '\n';
std::cout << "Longest word length: " << FindLongestWordLength(words) << '\n';
std::cout << "Shortest word length: " << FindShortestWordLength(words) << '\n';
std::cout << "Average word length: " << CalculateAverageWordLength(words) << '\n';
std::cout << "Number of vowels in word with the most vowels: " << FindLargestVowelCount(words) << '\n';
std::cout << "Number of words ending with 's': " << CountWordsEndingWithS(words) << '\n';
}

(Не нужно ставить return 0 В конце main)

Правка: добавление дополнительных Пример FindMostFrequentStartingLetter согласно запросу в комментариях:

char FindMostFrequentStartingLetter(const std::vector<std::string>& words)
{
auto letterCounts = std::array<int, 26>{};
for (const auto& word : words)
{
if (!word.empty())
{
char startingLetter = word.front();
if ('a' <= startingLetter && startingLetter <= 'z')
{
++letterCounts[startingLetter - 'a'];
}
else if ('A' <= startingLetter && startingLetter <= 'Z')
{
++letterCounts[startingLetter - 'A'];
}
}
}
return 'a' + std::distance(letterCounts.begin(), std::max_element(letterCounts.begin(), letterCounts.end()));
}

Вам нужно будет изменить код, если вы хотите вернуть все письма, которые привязаны к наиболее частым, или если вы также хотите, чтобы вернуться, сколько раз это происходило.

3
ответ дан 26 февраля 2018 в 03:02 Источник Поделиться