0 / 0 / 0
Регистрация: 30.08.2018
Сообщений: 8
1

Алгоритмическая задача. Считать текст из файла и подсчитать частоту вхождения каждого слова

30.08.2018, 17:41. Показов 4720. Ответов 14

Братство,всем здравия!Я новичок и здесь, и в теме программинга, и в теме C#.Но очень хочу осилить стезю.
Есть возможность попасть на стажировку,но надо решить задачу.Помогите,плиз!!!

Необходимо считать текст из файла и подсчитать частоту вхождения каждого слова.
В качестве слова рассматриваем непрерывную последовательность буквенных символов из латинского алфавита разделённую одним или несколькими пробелами. “Дефис” (минус -) считается буквой, остальные небуквенные символы рассматриваются как пробелы. Большие буквы отождествляются с маленькими (все буквы в последствии надо привести к маленьким).
Получившуюся последовательность пар вида «слово частота» необходимо сгруппировать по первой букве каждого слова и получившиеся группы отсортировать по алфавиту. Внутри каждой группы пары «слово частота» должны быть отсортированы по убыванию частоты.
Результат необходимо вывести в другой файл следующим образом: для каждой группы необходимо вывести:
Строка с буквой группы
Каждая пара внутри группы должна быть выведена на отдельной строке в виде: слово частота
Имя входного и выходного файла должны задаваться как параметры командной строки и могут быть произвольными. Примеры (для имени программы в примерах используется task.exe, у вас может быть что-то другое):
task.exe input.txt result.txt
task.exe i.txt o.txt
Пример входного файла:
Aaa aaa aa bbbb bbb bbb. Ddd ddd hh.
Для этого входного файла должен получится следующий результат:
a
aaa 2
aa 1
b
bbb 2
bbbb 1
d
ddd 2
h
hh 1

Ожидается, что в результате работы над задачей, претендент проявит навыки работы с файлами, строками и коллекциями в .Net. Использование LINQ и модульных тестов приветствуется и поощряется.

Заранее благодарю откликнувшихся!!!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2018, 17:41
Ответы с готовыми решениями:

Составить список всех слов входящих в текст и подсчитать кол-во вхождения каждого слова
Для заданного текстового файла составить список всех слов, входящих в этот текст, и подсчитать...

В заданном текстовом файле подсчитать частоту использования каждого слова из словаря (другого текстового файла).
В заданном текстовом файле подсчитать частоту использования каждого слова из словаря (другого...

Считать текст из файла, добавить в конце каждого предложения, количество вхождений в него заданного слова
Вот задание: Написать программу, которая считывает текст из файла и выводит его на экран, добавляя...

Подсчитать частоту вхождений каждого слова в файле
Ребят получила такое задание написала код но он не работает может кто то подсказать как он должен...

14
Masson1848
30.08.2018, 17:45
  #2

Не по теме:

А смысл идти на стажировку, если сам не можешь решить задачу?

0
0 / 0 / 0
Регистрация: 30.08.2018
Сообщений: 8
30.08.2018, 18:02  [ТС] 3
Обычно смысл поступка или достижения цели виден только непосредственно совершающему его или стремящемуся к.
Т.к. только он находится в положении,в которое его привела вся цепочка жизненных обстоятельств и устремлений
Нелепости часто приносят самые полезные и вкусные плоды,к тому же ))

Добавлено через 2 минуты
И спасибо за первый отклик, Masson1848
0
313 / 242 / 148
Регистрация: 03.10.2017
Сообщений: 880
Записей в блоге: 1
30.08.2018, 18:11 4
ДЛя файлов-это классы StreamReader и StreamWriter.
Парсишь строку и на её основе делаешь список. Это единственное, чем я могу тут помочь
1
0 / 0 / 0
Регистрация: 30.08.2018
Сообщений: 8
30.08.2018, 18:17  [ТС] 5
Спасибо,дружище! До этого я уже дошёл путём анализа похожих задач и запустив в VSS "Привет,Мир!"
Постараюсь добраться и до решения
0
Эксперт JS
6317 / 3792 / 1944
Регистрация: 14.06.2018
Сообщений: 6,679
30.08.2018, 19:07 6
Presnia, между прочим задачка минимум для после года изучения.

В грубом приближении выглядит так:
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
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 
namespace Question2316402
{
    class Program
    {
        static void Main(string[] args)
        {
            var str = File.ReadAllText(args[0], Encoding.UTF8);
            Console.WriteLine(args[0]);
            Console.WriteLine(args[1]);
            Console.ReadKey();
            var pattern = @"[^a-z-]+";
            var regex = new Regex(pattern, RegexOptions.IgnoreCase);
 
            var arr = regex.Split(str.ToLower()).Where(e => e.Length >= 1);
            var query = arr.GroupBy(e => e).Select(e => new { Word = e.Key, Count = e.Count() }).GroupBy(e => e.Word[0]).OrderBy(e => e.Key);
 
            var sout = new StringBuilder();
            foreach (var item in query)
            {
                sout.Append(item.Key).AppendLine();
                foreach (var item2 in item)
                {
                    sout.Append($"{item2.Word} {item2.Count}").AppendLine();
                }
            }
            File.WriteAllText(args[1], sout.ToString(), Encoding.UTF8);
 
            Console.WriteLine(sout);
 
            Console.ReadKey();
        }
    }
}
И отдельно ещё модульные тесты нужны.

Добавлено через 5 минут
Цитата Сообщение от Presnia Посмотреть сообщение
Внутри каждой группы пары «слово частота» должны быть отсортированы по убыванию частоты.
Эта фишка тут забыта ))

Добавлено через 15 минут
Как обычно, на StackOverflow подсказали, как сексуально извратиться:
C#
1
2
3
4
5
var query = arr.GroupBy(e => e)
.Select(e => new { Word = e.Key, Count = e.Count() })
.OrderBy(e => e.Word[0])
.ThenByDescending(e => e.Count)
.GroupBy(e => e.Word[0]);
0
0 / 0 / 0
Регистрация: 30.08.2018
Сообщений: 8
30.08.2018, 20:26  [ТС] 7
Огромное человеческое спасибо,amr-now!!!
Я полагаю, что там не ждут идеального решения от будущего стажёра (например,для смыслового сравнения,там есть тест по английскому,который заканчивается вопросами уровня upper-intermediate,и тест не остановишь - надо проходить до конца,но заявленный уровень приёма на курс pre-intermediate).Надеюсь,и здесь важно им будет увидеть любой уровень,а возможно даже,что устроит видение желания и рвения будущего стажёра.Бывает же и так )) Потому что в программе 10-ти недельного тренинга есть С# с "нуля".
В общем,ещё раз от души благодарю за поддержку и помощь!!!
P.S. Простите мне мою безграмотность (исправлюсь со временем) - а этот блок с query надо вставить к остальным переменным?
0
Эксперт JS
6317 / 3792 / 1944
Регистрация: 14.06.2018
Сообщений: 6,679
30.08.2018, 20:42 8
Presnia, вставить вместо предыдущего query.

Еще неплохо бы показать исключения при работе с файлами. Например, файл не найден.

И да. Unit-тестирование знать надо в любом случае.
0
0 / 0 / 0
Регистрация: 30.08.2018
Сообщений: 8
30.08.2018, 20:50  [ТС] 9
Благодарствую,amr-now! Уже изучаю
0
8 / 5 / 3
Регистрация: 26.10.2015
Сообщений: 24
30.08.2018, 22:30 10
Вот мое решение
C#
1
2
3
4
5
6
7
8
9
10
11
 class DataTemp
    {
        public string Word { get; set; }
        public int Frequency { get; set; }
        public DataTemp(string Word, int Frequency)
        {
            this.Word = Word;
            this.Frequency = Frequency;
        }
            
    }
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
 
namespace thread2316402
{
    public partial class Form1 : Form
    {
        string[] args = Environment.GetCommandLineArgs();//вытягивает параметр
        List<string> words;//Все слова
        List<DataTemp> wordsAndFrequency;//результат через клас Data
        List<string> ThereAreWords;//Уникальные слова
        public Form1()
        {
            InitializeComponent();
            words  = new List<string>();
            wordsAndFrequency = new List<DataTemp>();
            ThereAreWords = new List<string>();
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
            if (args.Length > 1)//если есть параметри запускаем метод
            {
                Result();
            }
            else
            {
                label1.Text = "Запуск без параметров";
            }
           
 
        }
        public void Result()
        {
           //Считываем из файла
            string AllData = System.IO.File.ReadAllText(args[1].ToString());
            //из строки розбиваем по словам и записываем их в words
            StrigToWord(AllData);
            //Каждое слово с маленькой
            ToLowerWord();
            //отбор уникальних слов
            AllWordToOneWords();
            //сортировка по алфавиту
            ThereAreWords.Sort();
            //Считаем слова
            СountWords();
            //Формируется строка отчета в методе Otvet
            //запись в файл
            // File.WriteAllLines WriteAllText(args[2].ToString(), Otvet());
            File.WriteAllLines(args[2].ToString(), Otvet());
            label1.Text = "ГОТОВО";
 
 
 
 
        }
        public string[] Otvet()//Формируется строка отчета
        {
            List<string> temp = new List<string>();
            temp.Add(Convert.ToString(wordsAndFrequency[0].Word[0]));
            
            string OneLetter = Convert.ToString(wordsAndFrequency[0].Word[0]);
 
            for (int i = 0; i < wordsAndFrequency.Count; i++)
            {
 
                string temp2 = Convert.ToString(wordsAndFrequency[i].Word[0]);
                if (OneLetter == temp2)
                {
                    temp.Add(Convert.ToString(wordsAndFrequency[i].Word + "  " + wordsAndFrequency[i].Frequency + "\n"));
                }
                else
                {
                    OneLetter = Convert.ToString(wordsAndFrequency[i].Word[0]);
                    temp.Add(Convert.ToString(OneLetter));
 
                    temp.Add(Convert.ToString(wordsAndFrequency[i].Word + "  " + wordsAndFrequency[i].Frequency + "\n"));
                }
 
 
            }
            string[] otvet = new string[temp.Count];
                for(int y=0;y<temp.Count;y++)
                {
                    otvet[y] = temp[y];
                }
             return otvet;
            
        }
        public void СountWords()//Считаем слова
        {
            for (int i = 0; i < ThereAreWords.Count; i++)
            {
                int temp = 0;
                for (int y = 0; y < words.Count; y++)
                {
                    if (ThereAreWords[i] == words[y])
                    {
                        temp = temp + 1;
                    }
                }
                wordsAndFrequency.Add(new DataTemp(ThereAreWords[i], temp));
            }
        }
        public void AllWordToOneWords()//отбор уникальних слов
        {
            ThereAreWords.Add(words[0]);
            for (int i = 0; i < words.Count; i++)
            {
 
                bool temp = true;
                for (int y = 0; y < ThereAreWords.Count; y++)
                {
                    if (words[i] == ThereAreWords[y])
                    {
                        temp = false;
                        break;
                    }
 
                }
                if (temp)
                {
                    ThereAreWords.Add(words[i]);
                }
 
            }
        }
        public void ToLowerWord()//Каждое слово с маленькой
        {
            for (int i = 0; i < words.Count; i++)
            {
                words[i] = words[i].ToLower();
            }
        }
        public void StrigToWord(string AllData)//из строки розбиваем по словам
        {
            string temp = "";
            for (int i = 0; i < AllData.Length; i++)
            {
                if (AllData[i].ToString() != " ")
                {
                    temp += AllData[i];
                }
                else
                {
                    if (temp != "")
                    {
                        words.Add(temp);
                        temp = "";
                    }
                }
            }
            words.Add(temp);//последнее слово
        }
    }
}
Может и не идеальное но мое
Вложения
Тип файла: rar thread2316402.rar (35.6 Кб, 40 просмотров)
0
0 / 0 / 0
Регистрация: 30.08.2018
Сообщений: 8
30.08.2018, 22:54  [ТС] 11
Godster, огромное спасибо за решение и комменты в коде!!!
0
598 / 482 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
30.08.2018, 23:19 12
Цитата Сообщение от amr-now Посмотреть сообщение
1
C#
1
2
3
4
5
var query = arr.GroupBy(e => e)
.Select(e => new { Word = e.Key, Count = e.Count() })
.OrderBy(e => e.Word[0])
.ThenByDescending(e => e.Count)
.GroupBy(e => e.Word[0]);
Это можно сократить до
C#
1
2
3
4
var query = arr.GroupBy(e => e)
    .Select(e => new { Word = e.Key, Count = e.Count() })
    .OrderBy(e => Tuple.Create(e.Word[0], -e.Count))
    .GroupBy(e => e.Word[0]);
Моё решение задачки:
C#
1
2
3
4
5
6
7
8
9
var str = "textLong text, gfdg ert- gfDg gf gf ret5 rwrwer-5 54 54 r rr rr gFdg --- rhweirhih 879f";
 
var result = Regex.Split(str, @"[^-\w]")
    .Where(s => !string.IsNullOrEmpty(s))
    .ToLookup(s => s.ToLower(), s => s.ToLower())
    .OrderByDescending(l => l.Count())
    .GroupBy(l => l.Key[0])
    .OrderBy(g => g.Key)
    .ToList();
2
0 / 0 / 0
Регистрация: 30.08.2018
Сообщений: 8
30.08.2018, 23:52  [ТС] 13
Парни,искренняя благодарность!!!!!!!
Очень помогли!!! И даже согрели душу человеческим отношением.
Пойду что-нить сделаю тоже для ближнего
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
04.09.2018, 11:06 14
Presnia, Я как бы на подобной стажировке сейчас, там же и хочу сказать тебе так, нихрена это не будет лёгким и там тебе придётся вот эти 80 ч. в неделю похать почти в одиночку. Так что если на тестовом такое, то просто совет, готовься к адовой нагрузке
0
0 / 0 / 0
Регистрация: 30.08.2018
Сообщений: 8
04.09.2018, 11:53  [ТС] 15
Спасибо, Headklif! Настроен
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2018, 11:53

Подсчитать количество слов, нечетной длины, найти частоту вхождения букв и удалить текст в круглых скобках
С клавиатуры вводится строка . Разработать программу , которая реализует указанные действия . а )...

Строка: Преобразовать текст T в текст S, путем замены каждого вхождения слова A[i] на соответствующее B[i]...
Пусть задан в виде последовательности символов некоторый текст T, состоящий из слов и есть два...

Вывести все слова из файла в алфавитном порядке, указать частоту каждого слова
Вывести алфавитный список всех слов заданного текста с указанием количества вхождений слова в текст.

Задана последовательность слов. Определить частоту вхождения каждого слова в последовательность.
Доделать программу, чтобы работала как надо Задана последовательность слов. Определить частоту...

Для каждого слова подсчитать частоту его встречаемости (использовать класс HashMap)
Задан текст на английском языке. Выделить все различные слова. Для каждого слова подсчитать частоту...

Из внешнего файла в формате txt ввести текст. Подсчитать частоту встречающихся в тексте символов
Есть программа, но результат ее работы не вдохновляет( Либо у меня руки растут из...) #include...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.