Форум программистов, компьютерный форум CyberForum.ru

Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
05.06.2013, 19:46     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int _tmain()
{
    ifstream f ("d:\\base1.txt");
    char a,b;
    int n=4;
    int kolvo;
    int pos;
    f.get(a);
    while (!f.eof())
    {
        pos=f.tellg();
        f.seekg(0);
        kolvo=1;
        b=f.get();
    while (!f.eof())
    {
        if (a==b)
        {
            if (((int)f.tellg()-1)>(pos-1))
            kolvo++;
            else if (((int) f.tellg()-1)<(pos-1))
                break;
        }
        b=f.get();
    }
    if (kolvo>n/2) cout<<a<<endl;
    f.seekg(pos);
    f.get(a);
    }
    return 0;
}
[/CPPQT]
Здравствуйте. Есть файл. В нем нужно найти и вывести на экран все элементы, которые которые повторяются более N/2 раз. Программа зацикливается. Почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2013, 19:46     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз
Посмотрите здесь:

Каждое второе число в массиве, которые повторяются более 2 раз, удалить C++
C++ Написать функцию, которая выводит на экран все слова за данной строки, в которые заданная буква входит N или более раз.
Вывести элементы массива, которые повторяются ровно два раза C++
C++ Пользователь вводит 8 чисел, вывести числа которые повторяются 2 или больше раз
C++ Одномерный массив. Найти и вывести все элементы, которые меньше заданного b
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2013, 20:04     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #2
Файл нужен, с которым зацикливается.
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
05.06.2013, 20:11  [ТС]     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #3
содержимое файла:aaannn, по идее должен выдавать a и n, а выдаёт то, что на скрине и зацикливается
Миниатюры
Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз  
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
05.06.2013, 21:51     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #4
C++
1
2
        f.clear(ios::eofbit);
        f.seekg(pos);
в строке 32
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
05.06.2013, 22:53  [ТС]     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #5
Цитата Сообщение от Olivеr Посмотреть сообщение
C++
1
2
        f.clear(ios::eofbit);
        f.seekg(pos);
в строке 32
Да, спасибо, работает. А в чём суть строк f.clear(ios::eofbit)?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
05.06.2013, 23:09     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <fstream>
#include <unordered_map>
 
typedef std::unordered_map<char, int> umap;
 
int main()
{
    std::ifstream ifs("input.txt");
    if (!ifs)
        return 1;
    umap m;
    char c;
    int counter = 0;
 
    while(!ifs.eof() && ifs >> c)
    {
        ++m[c];
        counter++;
    }
    for (auto w : m)
        if (w.second > counter / 2)
            std::cout << w.first << " - " << w.second << std::endl;
    std::cout << std::endl;
}
Добавлено через 1 минуту
Denis123456789, сначала сбрасываем флаги ошибок, потом устанавливаем курсор считывания на начало файла.
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
05.06.2013, 23:34  [ТС]     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #7
MrGluck, логшпг

Добавлено через 6 минут
MrGluck, последнее сообщение случайно отправил. А почему если не сбрасывать флаги ошибок, то курсор ставится не на заданную в аргументе метода seekg() позицию, а на позицию -1. Просто я проверял, tellg(), после этого возвращает -1
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
05.06.2013, 23:41     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #8
Denis123456789, скорее всего у вас EOF == -1, некое число, обозначающее "ошибку".
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
05.06.2013, 23:46     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #9
Denis123456789, по поводу seekg:
If the eofbit flag is set before the call, the function fails (sets failbit and returns).
То есть, когда seekg вызывается для потока, у которого поднят флаг eofbit, то функция не меняет курсор. В C++11 seekg автоматически сбрасывает этот флаг.
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
05.06.2013, 23:55  [ТС]     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #10
MrGluck, не могу понять какую роль играют флаги ошибок на установку курсора в то или иное место?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
06.06.2013, 00:03     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #11
Denis123456789, иначе оно не даст дальше считать, будет думать, что поток находится в состоянии ошибки.
Denis123456789
43 / 43 / 17
Регистрация: 02.06.2013
Сообщений: 180
06.06.2013, 00:13  [ТС]     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #12
MrGluck, а почему поток вообще оказывается в состоянии ошибки?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
06.06.2013, 00:13     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #13
Denis123456789, потому что мы достигли конца файла EOF - ошибка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 00:14     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз
Еще ссылки по теме:

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

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 00:14     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз #14
Цитата Сообщение от Denis123456789 Посмотреть сообщение
не могу понять какую роль играют флаги ошибок на установку курсора в то или иное место?
Когда установлен флаг ошибки, поток находится в нерабочем состоянии, т.е. ничего не работает, в том числе и передвижение курсора.
Yandex
Объявления
06.06.2013, 00:14     Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз
Ответ Создать тему
Опции темы

Текущее время: 07:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru