Професионална програма
Loading...
+ Нов въпрос
LoshaPanda avatar LoshaPanda 8 Точки

Puctuation - {1}

Извинете ! Имам проблем и не съм сигурен къде точно съм сгрешил.

 

Линк към judge : https://judge.softuni.bg/Contests/Practice/Index/1716#0

 

Код

#include <iostream>
#include <string>

#include <queue>
#include <stack>

#include <sstream>
#include <utility>

bool equal(std::queue<int> x, int symb)
{
	int const size = x.size();

	for (int i = 0; i < size; i++)
	{
		if (x.front() == symb)
		{
			return true;
		}
		x.pop();
	}

	return false;
}

std::pair <std::queue<int>, std::queue<int>> Input()
{
	std::string sentence; std::getline(std::cin, sentence);

	std::istringstream input(sentence); char symb;
	std::pair<std::queue<int>, std::queue<int>> x; int symbs = 0, time = 1;

	while (input >> symb)
	{
		if ((symb < 'a' || symb > 'z') && (symb < 'A' || symb > 'Z') && symb != '|')
		{
			symbs++;
		}
		else if (symb == '|')
		{
			if (!equal(x.first, symbs))
			{
				x.first.push(symbs); x.second.push(1);
			}
			else {
				int swap = x.second.front(); x.second.pop();
				x.second.push(++swap);
			}
			time++; symbs = 0;
		}
	}

	return x;
}

int main(void)
{
	std::pair<std::queue<int>, std::queue<int>> information = Input();

	int const size = information.first.size();
	for (int i = 0; i < size; i++)
	{
		std::cout << information.first.front() << " symbol sentences: " << information.second.front() << std::endl;

		information.first.pop(); information.second.pop();
	}
}

 

Дава ми 40/100 точки. Някой може ли да каже къде може да е проблема , освен факта, че пише "   "!"#$%&'()*+,-./:;<=>?@[]^_`{}~  ", че трябва да бъдат считани за символи, а аз казвам всичко без '|' и буквите. Също така ако някой има по-дорба идея ще се радвам да я напише !

0
C++ Fundamentals
MartinBG avatar MartinBG 2781 Точки

Защо си се спрял на std::pair <std::queue<int>, std::queue<int>> като един std::map<int, int> е достатъчен за задачата?

Филтрирането на символите също е по-сложно (и непълно) от необходимото.

Ето едно просто решение:

#include <iostream>
#include <sstream>
#include <string>
#include <map>

int main() {
  std::string essay;
  std::getline(std::cin, essay);

  std::istringstream iss(essay);

  std::map<size_t, size_t> symbolsSentences{ };
  std::string sentence;
  while (std::getline(iss, sentence, '|')) {
    size_t symbols = 0;
    for (char ch :sentence) {
      if (!isalnum(ch) && ch != ' ') {
        ++symbols;
      }
    }
    symbolsSentences[symbols]++;
  }

  for (const auto& pair: symbolsSentences) {
    std::cout << pair.first << " symbol sentences: " << pair.second << std::endl;
  }

  return 0;
}

 

0
22/05/2020 17:39:15
LoshaPanda avatar LoshaPanda 8 Точки

Благодаря за кода и обяснението ! Значи проблема в моя код е бил в това , че не е хващал всеки символ ?

1
MartinBG avatar MartinBG 2781 Точки

@LoshaPanda

Не съм дебъгвал решението Ви, но ако държите да запазие концепцията му, може за начало да подмените кода за анализ на стринга (той със сигурност е непълен - например ако има числа в изречението) с вариант на моя и да видите дали ще е достатъчно.

0