Задача звучит так:
Дана строка слов, разделённых пробелами. Определите количество слов, которые встречаются более одного раза.
Я пытаюсь решить её два дня. Написала какого-то монстра из пяти функций, который при этом имеет кучу багов (как то: если повторяются последнее и предпоследнее слово, программа виснет).
Не хочу продолжать, так как дело явно идёт не туда. Задача находится в разделе "простые задания", т. е. должно быть что-то очень простое, что не приходит мне в голову. Возможно, даже настолько простое, чтобы влезть в форму ответа. :)
В учебнике строки определяются, как char arrays, соответственно, ими, видимо, и нужно пользоваться. Хотя если вы подскажете, как решить задачу другими способами, я тоже буду очень благодарна.
Спасибо всем!
Другие языки программирования и технологии
C++ char arrays - прошу помощи с задачей.
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
struct compare {
bool operator()(char const* a, char const* b)const {
return strcmp(a, b) < 0;
}
};
int main() {
char line[] = "123 456 789 147 123 258 456 369 123";
char* context = nullptr;
auto separator = " ";
map<const char*, int, compare> tokens;
auto token = strtok_s(line, separator, &context);
if (token) ++tokens[token];
while (token != nullptr) {
token = strtok_s(nullptr, separator, &context);
if (token) ++tokens[token];
}
for (auto item : tokens) if (item.second > 1) cout << item.first << '\n';
cin.get();
}
#include <cstring>
#include <map>
using namespace std;
struct compare {
bool operator()(char const* a, char const* b)const {
return strcmp(a, b) < 0;
}
};
int main() {
char line[] = "123 456 789 147 123 258 456 369 123";
char* context = nullptr;
auto separator = " ";
map<const char*, int, compare> tokens;
auto token = strtok_s(line, separator, &context);
if (token) ++tokens[token];
while (token != nullptr) {
token = strtok_s(nullptr, separator, &context);
if (token) ++tokens[token];
}
for (auto item : tokens) if (item.second > 1) cout << item.first << '\n';
cin.get();
}
Вариант
создать динамический массив массивов char
и деля строку по разделителям напихать в его элементы
а потом спокойно эти субстроки сравнивать
или класс "слово"
и массив слов или список (удобнее двусвязный, а не цепной)
и опять же сравнивать и считать - хоть тем же strcmp()
___
если список
элемент из
{ массив char для слова
число, затравочное 0
указатель на следующий
}
первому слову ставить 1 а его повторы метить прибавляя по единичке
потом опять сначала от того где остался 0
в конце опять сначала посчитать количество двоек ( 3,4,5... отпадут как лишние )
создать динамический массив массивов char
и деля строку по разделителям напихать в его элементы
а потом спокойно эти субстроки сравнивать
или класс "слово"
и массив слов или список (удобнее двусвязный, а не цепной)
и опять же сравнивать и считать - хоть тем же strcmp()
___
если список
элемент из
{ массив char для слова
число, затравочное 0
указатель на следующий
}
первому слову ставить 1 а его повторы метить прибавляя по единичке
потом опять сначала от того где остался 0
в конце опять сначала посчитать количество двоек ( 3,4,5... отпадут как лишние )
Попробуй через string, так проще. Но если нужно именно через массив символов, то сейчас попробую, тогда и напишу, если выйдет.
Вот код, в нём в s будет сохраняться вся строка с пробелами.
Обработку, наверное, сделать через вложенный цикл.
#include "iostream"
#include "conio.h"
#include "stdio.h"
#include "string"
using namespace std;
int main()
{
setlocale(LC_ALL, ".1251");
char *s = new char[50];
gets_s(s,50);
cout << "\n" << s << endl;
system("pause");
}
Вот код, в нём в s будет сохраняться вся строка с пробелами.
Обработку, наверное, сделать через вложенный цикл.
#include "iostream"
#include "conio.h"
#include "stdio.h"
#include "string"
using namespace std;
int main()
{
setlocale(LC_ALL, ".1251");
char *s = new char[50];
gets_s(s,50);
cout << "\n" << s << endl;
system("pause");
}
Похожие вопросы
- [C++] char && char* && char[ ]
- что такое var c: char; в паскале? что такое var c: char; в паскале?
- Помощь по задаче на языке C++
- Прошу помочь с задачей по C++
- Народ, слезно прошу помочь решить задачу по информатике (програмирование), я просто ноль в этом(((
- Для тех кто знает c++ прошу помощи...
- Прошу помощи с написанием программ, по условиям указанных на картинке C#
- Очень сложная задача, прошу помощи знающих
- помогите пожалуйста кто смыслит в C# или в C++, очень нужна ваша помощь, нужен код программы, точнее двух
- Borland C. Чтение файла с помощью прерываний
Следующим шагом будет выделить из строки первое слово. С этим я тоже справилась.
Затем надо подсчитать, сколько раз это слово встречается в оставшейся строке и сохранить это куда-то.
Затем надо удалить из строки первое слово везде, где оно встречается.
Затем убрать лишние пробелы.
Затем из урезанной строки выделить первое слово и т. д.
Монструозная программа, которая это делает, написана, но имеет баги.
В общем, слишком сложно для "простого задания".
Я думала, может, есть какие-то библиотечные функции, о которых я не знаю...