У меня следующая проблема:
Учитывая число N и N имен, сортируйте имена по определенному значению (в порядке возрастания). Имена с одинаковым значением сортируются в алфавитном порядке.
Значение каждого имени определяется количеством пар гласных или согласных. Таким образом, каждая пара гласных добавляет 1 к значению слова, каждая пара согласных вычитает 1 из значения, а пара гласных-согласных или согласных-гласных не меняет значение слова.
Что я сделал:
Я создал вектор, используя структуру. Каждый элемент имеет имя и свое значение. Я рассчитал значение каждого имени и дал его в поле .value. После этого я отсортировал свой вектор, используя 2 для циклов (у меня не было эффективной идеи для сортировки значений и сортировки по алфавиту все в одном), и отобразил вектор.
Что происходит:
Я не получаю результата, и я также думаю, что может быть ошибка сегментации. Я все еще новичок, когда дело доходит до обнаружения таких ошибок.
Можете ли вы дать мне несколько советов?
Спасибо.
Прикрепленный код ниже.
#include <vector>
#include <string>
#include <cstring>
using namespace std;
const char voc[] = "aeiouAEIOU";
struct stud
{
string name;
int value;
};
typedef vector<stud> vect;
void data(int& n, vect& v)
{
cin>>n;
for(int i = 0; i < n; ++i)
{
cin>>v[i].name;
}
}
int getValue(string name)
{
int value = 0;
int len = name.length();
for(int i = 0; i < len; ++i)
{
if(strchr(voc, name[i]) && strchr(voc, name[i+1]))
value++;
else if(!strchr(voc, name[i]) && !strchr(voc, name[i+1]))
value--;
}
return value;
}
void updateValues(vect& v)
{
vector<stud>::size_type v_size = v.size();
for(unsigned i = 0; i < v_size; ++i)
{
int value = getValue(v[i].name);
v[i].value = value;
}
}
void sortByValue(vect& v)
{
vector<stud>::size_type v_size = v.size();
for(unsigned i = 0; i < v_size; ++i)
for(unsigned j = i+1; j < v_size; ++j)
{
if(v[i].value > v[j].value)
swap(v[i], v[j]);
else if(v[i].value == v[j].value)
if(v[i].name.compare(v[j].name) > 0)
swap(v[i], v[j]);
}
}
void display(vect v)
{
vector<stud>::size_type sz = v.size();
for(unsigned i = 0; i < sz; ++i)
cout<<v[i].name<<'\n';
}
int main()
{
int n;
vect myvec;
data(n, myvec);
updateValues(myvec);
sortByValue(myvec);
display(myvec);
return 0;
}