Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22

Ввод из файла в массив и нахождение наиболее встречающегося элемента

30.11.2014, 10:42. Показов 3427. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день (вечер)! Нужно написать программу так, чтобы она создавала файл из рандомных чисел, далее нужно вывести содержимое этого файла на экран, затем в этом содержимом файла найти наиболее встречающийся символ и заменить его на '+'. Я сделал так, чтобы файл создавался, выводился на экран, а вот как найти наиболее встречающийся символ и заменить его на '+' понять не могу. Мои мысли сводятся к тому, что нужно содержимое файла записать в строчный массив, затем уже с этим массивом работать и искать символы, но как это реализовать, не могу понять.
Вот код моих наработок :
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <ctime>
#include <stdio.h>
#include<time.h>
#include <cstdio>
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <Windows.h>
#include <stdio.h> 
#include <conio.h>
#include <string.h>
using namespace std;
void fun1();
void fun2();
void fun3();
void fun4();
void fun5();
char i;
char *Array = new char(10);
char *k = new char(1);
const char N=20;
int main(){
while (1)  {
    setlocale (0,"");
      cout<<"1.Сгенерировать \n"<<"2.Показать \n"<<"3.Изменить \n"<<"4.Об Авторе \n"<<"5.Выход \n";
      int n;
      cin>>n;
      switch (n) {
             case 1: fun1(); break;
             case 2: fun2(); break;
             case 3: fun3(); break;
             case 4: fun4(); break;
             case 5: return 0; break;
             default: cout<<"Не выбран пункт меню \n"; break;
             }
      }    
}
void fun1() {
        setlocale (0,"");
     srand(time(0));
ofstream file("t.txt");
for(i=0; i<10; i++)
file<<(char)(rand()%91+32);                                                                                
     }
void fun2() {
ifstream file("t.txt");
while (!file.eof())
{
for (char i=0;i<N;i++)
{ 
file.get(Array[i]);
}
Array[i] = '\n';
for (char j = 0; j < i; ++ j)
cout << Array[j];
cout<<"\n";                                                                                                  
}    
}
void fun3() {
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2014, 10:42
Ответы с готовыми решениями:

Найти в массиве и вывести значение наиболее часто встречающегося элемента
Здравствуйте вы мне можете помочь? вот условие задачи, её надо сделать на С.... заранее благоларю... 1. Найти в массиве и вывести...

Найти в массиве и вывести значение наиболее часто встречающегося элемента.
ПАцаны помогите, попадаю... отблагадарю... 1. Найти в массиве и вывести значение наиболее часто встре* чающегося элемента.

Clojure Поиск наиболее встречающегося элемента в списке
Здравствуйте. Необходимо написать функцию, которая находит чаще всего встречающийся в списке атом типа &quot;строка&quot;. (defun moda...

43
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
30.11.2014, 15:20
Студворк — интернет-сервис помощи студентам
Serjin, тогда есть метод привязанный к компилятору, я не знаю какой. у меня VS с дев я никогда не работал.
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
30.11.2014, 15:23  [ТС]
Спасибо, теперь буду разбираться в том, что вы мне написали, спасибо за помощь
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
30.11.2014, 15:24
C++
1
#include <stdlib.h>
можно и так попробывать
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
30.11.2014, 15:43  [ТС]
Заработало, но я заметил ошибку, вот в файле создались символы зцтпцщыи, а выводятся зцтпцщыизцтпцщыи, повторение идет

Добавлено через 5 минут
Все, исправил, во второй функции два раза выводилось значение а

Добавлено через 11 минут
И еще, когда выводит содержание файла на экран, если случайно генерируется пробел, то он выводит только то, что стоит после пробела, что не является хорошо))
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
30.11.2014, 15:56
Serjin, вам тестером нужно работать, пробел там генерироваться не должен. Во всяком случае мне не удалось воспроизвести эту ошибку, но даже натыкав пробелов искусственно прога все равно их нормально выводит. включите не печатываемые знаки может то не пробел?
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
30.11.2014, 16:02  [ТС]
Что-то он меняет не самый встречающийся символ, а самый первый, и если есть в последовательности символ, похожий на первый, то он тоже меняет его, а если повторающиеся символы в середине, то он их не меняет

Добавлено через 2 минуты
И вопрос, почему стоит "-" перед рандомом?
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
30.11.2014, 16:05
Serjin, сейчас посмотрю. А то что если одинаковых по частоте символа 2(самых частых) он заменяет только первый из них я вам говорил. я не делал исключения. в массиве или переменных типа char код хранится в виде числового кода. отрицательный числовой код определенного диапазона это русские буквы
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
30.11.2014, 16:18  [ТС]
ясно, мне просто с символами работать, я переделал на свой рандом, я вроде понял, теперь он меняет каждый самый встречающийся символ, но вот с пробелом, он начинает читать строчку и как только видит пробел, думает, что это новая строка и читает ее по новой

Добавлено через 56 секунд
Вы не знаете функцию file.getline ? вроде она позволяет считать строчку целиком и вывести то, что в файле, или я не прав?

Добавлено через 9 минут
А можете мне case 3 прокомментировать? а то я не совсем понимаю, зачем нам столько массивов
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
30.11.2014, 16:20
Serjin, я не рассчитывал что вам не подайдут русские буквы. На работу с другим диапазоном. генерацию исключений я не делал, так не знал какой вариант вам подайдет, если часто встречаемых несколько. Все менять на плюсы и т.д. Можете сказать с каким знаками, диапозоном или буквами будете работать я посмотрю

Добавлено через 13 секунд
ок сейчас
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
30.11.2014, 16:25  [ТС]
Вот мой рандом (rand()%91+32) (то есть с 32 до 122)

Добавлено через 4 минуты
Вот все работает как надо, только с пробелом не понятно
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
30.11.2014, 16:29
В этот диапозон входят и знаки =- и тп. ок скиньте файл текстовый. скиньте ваш код. У вас при выводе возникают ошибки при кейс 2?

Добавлено через 2 минуты
Serjin, если ошибки связаны только с пробелом можете убрать его из ранжирования он как раз 32. т.е. сделать с 33
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
30.11.2014, 16:35  [ТС]
Сейчас скину, да, ошибка при выводе в кейс 2, сейчас увидите
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <fstream>
#include <ctime>
#include <string>
#include <stdlib.h>
using namespace std;
int main(){
while (1)  {
    setlocale (LC_ALL,"RUSSIAN");
      cout<<"1.Сгенерировать \n"<<"2.Показать \n"<<"3.Изменить \n"<<"4.Об авторе \n"<<"5.Выход \n";
      int n;int const g=8;
      cin>>n;
      switch (n) {
             case 1:
                 { 
                    srand(time(0));
                    ofstream file;
                    file.open("t.txt");
                    for(int i=0; i<g; i++) file<<(char)(rand()%91+32); 
                    file.close();
                    break;
                 }
             case 2:{
                    ifstream file;
                    file.open("t.txt");
                    string a; 
                    while (!file.eof())
                        {
                            file>>a;
                            cout<<a<<"\n";
                    }
                    file.close();
                    break;
                    }
                    
                    
             case 3:
                 {
                    ofstream f;
                     ifstream file;
                    file.open("t.txt");
                    char a[g+1]={0},b;
                    while (!file.eof())
                        {
                            file>>a;
                        }
                    int schetchik=0,c=0;
                    for (int i=0;i<g-1;i++)
                    {
                        for (int j=0;j<g;j++)
                        {
                            if (a[i]==a[j]) schetchik+=1;
                        }
                        if (schetchik>c) {c=schetchik;b=a[i];}
                        schetchik=0;
                    }
 
                    for (int i=0;i<g;i++)
                    {
                        if (a[i]==b) a[i]='+';
                    }
                   cout<<"Часто встречающийся символ"<<b;
                    file.close();
                    f.open("t.txt");
                    f<<a; f.close();cout<<endl;
                    break;
                 }
             case 4:cout<<"ФИО";cout<<endl; break;
             case 5:return 0;break;
             default: cout<<"Не выбран пункт меню \n"; break;
             }
      }   
 
 
 
}
вот содержание файла t.txt "sNd]B 6K"

Добавлено через 4 минуты
Я думаю еще надо сделать так, что если нет встречающего символа, то он никакой не менял, а то он меняет всегда первый символ, если нет повторяющегося, так как сравнивает с первым символом (если можно, конечно), и еще я жду комментарии к case 3, извините за то, что вас отвлекаю.
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
30.11.2014, 17:43
Лучший ответ Сообщение было отмечено Serjin как решение

Решение

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <fstream>
#include <ctime>
#include <string>
#include <stdlib.h>
using namespace std;
int main(){
while (1)  {
    setlocale (LC_ALL,"RUSSIAN");
      cout<<"1.Сгенерировать \n"<<"2.Показать \n"<<"3.Изменить \n"<<"4.Об авторе \n"<<"5.Выход \n";
      int n;int const g=10;
      cin>>n;
      switch (n) {
             case 1:
                 { 
                    srand(time(0));
                    ofstream file;
                    file.open("t.txt");
                    for(int i=0; i<g; i++) file<<(char)(rand()%91+33); 
                    file.close();
                    break;
                 }
             case 2:{
                    ifstream file;
                    file.open("t.txt");
                    string a; 
                    while (!file.eof())
                        {
                            file>>a;
                            cout<<a;
                    }
                    file.close();cout<<endl;
                    break;
                    }
                    
                    
             case 3:
                 {
                    ofstream f;
                     ifstream file;
                    file.open("t.txt");
                    char a[g+1]={0},b;
                    while (!file.eof())
                        {
                            file>>a;
                            
                        }
                    int schetchik=0,c=0;
 
                    
                    for (int i=0;i<g-1;i++)
                    {
                        for (int j=1;j<g;j++) 
                        {
                            if (a[i]==a[j]) schetchik+=1;
                        }
                        if (schetchik>c) {c=schetchik;b=a[i];}
                        schetchik=0;
                    }
 
 
                    for (int i=0;i<g;i++)
                    {
                        if (c<2) {cout<<"Нет символов стречающихся чаще 1 раза"<<endl;break;}
                        if (a[i]==b) a[i]='+';
                    }
                   if (c>1) cout<<"Часто встречающийся символ "<<b;
                    file.close();
                    f.open("t.txt");
                    f<<a; f.close();cout<<endl;
                    break;
                 }
             case 4:cout<<"ФИО";cout<<endl; break;
             case 5:return 0;break;
             default: cout<<"Не выбран пункт меню \n"; break;
             }
      }   
 
 
 
}
извините был занят, от пробела легче избавится чем с ним возится, с ним результат будет не правильный.
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
30.11.2014, 17:48  [ТС]
Спасибо, вот все жду комментарии к case 3, я вроде разобрался, но нужно перепроверить себя, заранее спасибо

Добавлено через 2 минуты
Тем более после подправки кода в case 3
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
30.11.2014, 18:08
Лучший ответ Сообщение было отмечено Serjin как решение

Решение

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
37
38
39
40
41
{
                    ofstream f;// создаем поток на запись
                     ifstream file;// создаем поток на чтение
                    file.open("t.txt");
                    char a[g+1]={0},b;
                    while (!file.eof())
                        {
                            file>>a;
                            
                        }
                    int schetchik=0,c=0;
 
                    
                    for (int i=0;i<g-1;i++)
                    {
                        for (int j=1;j<g;j++) 
                        {
                            if (a[i]==a[j]) schetchik+=1;/* если элемент массива a[0]равен a[1] то счетчик увеличивается на 1., далее увеличивается j пока не станет меньше g, а i все это время =0
                                                         следующий круг i увеличивается на 1. 
                                                         если элемент массива a[1]равен a[1] то счетчик увеличивается на 1., далее увеличивается j пока не станет меньше g, а i=1
                                                         и т.д.*/
                        }
 
                        if (schetchik>c) {c=schetchik;b=a[i];} /*счетчике хранится сколько раз какая перепенныя встречается в тексте, если это переменная встречается больше максимальной(переменная с)
                                                               то переменная с перезаписывается, и в b сохраняется какая именно переменная встретилась столько то раз*/
                        schetchik=0;//обнуляем счетчик
                    }
 
 
                    for (int i=0;i<g;i++)
                    {
                        if (c<2) {cout<<"Нет символов встречающихся чаще 1 раза"<<endl;break;}//если максимальна переменная встречалась только 1 раз, то выводим сообщение и прекращаем работу цикла фор(break)
                        if (a[i]==b) a[i]='+';// если a[i] равна переменной которая встречается чаще всего то перезапищем ее на +
                    }
                   if (c>1) cout<<"Часто встречающийся символ "<<b;// если максимальная(по встречам в тексте) переменная встречалась встречалась чаще одного раза то скажем что это за переменная
                    file.close();// закрываем поток записи
                    f.open("t.txt");
                    f<<a;// записываем массив а в файл
                    f.close();cout<<endl;
                    break;
                 }
1
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
30.11.2014, 18:45  [ТС]
Спасибо большое, прям огромное спасибо, теперь буду знать, как реализовывать такие программ, спасибо за книжку, очень помогает, еще раз, большое спасибо

Добавлено через 12 минут
А вот смотрите еще, программа не нашла часто встречающийся символ, если t.txt файл имеет содержание - )y0#$h)`7] , теперь, как я понял, он первую не считает за символ

Добавлено через 3 минуты
Вроде исправил, в
C++
1
int j=1;j<g;j++
он начинал смотреть с 2 символа, поэтому первый не считал, так ведь?
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
02.12.2014, 16:40
Цитата Сообщение от Serjin Посмотреть сообщение
он начинал смотреть с 2 символа, поэтому первый не считал, так ведь?
да так
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
02.12.2014, 16:44  [ТС]
Спасибо, я вот думаю, как же побороть все-таки проблему с пробелом, нашел, как сделать так, чтобы он выводил с ним нормально
C++
1
2
3
4
5
6
7
8
9
10
11
ifstream file;
                    file.open("t.txt");
                    string a; // присвоим переменно а строчный тип
                    if (!file.is_open()) {cout<<"Не найден файл"<<endl;break;}
                    else while (!file.eof())
                        {
                            getline(file,a);  
                            cout<<a<<"\n"; // выведем переменную а на экран
                    }
                    file.close();
                    break;
Может можно как-то ввести getline в процесс поиска часто встречающегося символа?
0
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
02.12.2014, 16:51
Цитата Сообщение от Serjin Посмотреть сообщение
getline
я уже подзабыл как она работает
0
0 / 0 / 0
Регистрация: 30.11.2014
Сообщений: 22
02.12.2014, 16:55  [ТС]
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
я уже подзабыл как она работает
Как я понял, она считывает неформатированные данные из потока в строку ( конечно гугл ) , из-за того, что в третьем кейсе мы пишем просто в переменную а, которая имеет сточный тип, происходит и ошибка, так как пробел считается новой строкой, а вот getline прям просто строчку копирует и не меняет ничего, я пробовал, но он ругается и с массивом не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2014, 16:55

Найти в массиве и вывести значение наиболее часто встречающегося элемента
Никогда не изучали ассемблер, а тут задали лабы написать: 1.Переписать в выходную строку слова из входной строки в порядке возрастания их...

Нахождение в массиве элемента наиболее близкому к заданному числу
Задача: Найти элемент массива А состоящий из N элементов,ближайший к заданному* числу С т.е элемент для которого А(I) -С достигается min....

Удаление из массива наиболее часто встречающегося значения
Возникла проблема, в информатике шарю очень мало, что очень обидно, а разобраться хочется. Нашёл задание: &quot;Удалить из массива...

Удаление из массива наиболее часто встречающегося значения
Задание заключается в &quot;Удаление из массива наиболее часто встречающегося значения. Если таких значений несколько, то выбрать любое из них....

Поиск наиболее часто встречающегося подмножества с помощью Select
Есть таблица вида: id letter 1 a 1 b 1 c 2 a 2 b 2 c 3 a 3 c


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru