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

Гистограммы C++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Йа
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 22
09.05.2010, 15:14     Гистограммы C++ #1
День добрый. Просьба помочь (желательно с пояснениями)
Задание.
Дан текст. Будем считать, что все слова в тексте состоят из латинских и кириллических букв (строчные и заглавные не различаются), все остальные символы - разделители. Вам необходимо для каждого слова посчитать, сколько раз оно встречается в этом тексте, и вывести гистограмму всех слов.
Входные данные
Входной файл содержит текст, который состоит из любых символов. Длина каждого слова в нем не превышает 100 символов, количество различных слов не превышает 10000, размер входного файла не превышает 5 мегабайт.
Выходные данные
Для каждого слова в выходной файл нужно вывести строчку символов '*', длина которой должна быть равна количеству вхождений данного слова в текст. Перед каждой строчкой необходимо вывести соответствующее слово. Слова выводить в нижнем регистре.
Пример
input.txt
This string is test string
output.txt

this *
is *
test *
string **

Добавлено через 21 час 42 минуты
Pascal
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
program WordGG;
type
  TPointer=^TNode;{указатель на узел}
  TNode=record{описание узла}
    strWord:string;{слово}
    count:integer;{частота встречи в файле}
    next:TPointer;{указатель на следующий элемент}
  end;
procedure InitList(var List:TPointer);
{процедура инициализации списка}
begin
  List:=nil;
end;
procedure AddToList(var List:TPointer;strWord:string);
{процедура добавления элемента в список на нужное место}
var
  NewNode,TempList:TPointer;{NewNode - новый узел, TempNode - вспомогательный указатель}
begin
  TempList:=List;{указатель на начало списка}
  while(TempList<>nil) and (TempList^.strWord<>strWord) do{пока не конец списка и не нашли повторений}
    TempList:=TempList^.next;{переход к следующему элементу списка}
  if TempList<>nil then{если не дошли до конца, то значит есть повторение}
    inc(TempList^.count){увеличиваем счетчик}
  else
  begin
    {создаем новый элемент}
    NewNode:=new(TPointer);{выделяем память в куче}
    NewNode^.strWord:=strWord;{записываем слово}
    NewNode^.count:=1;{инициализируем счетчик}
    {поиск нужного места}
    TempList:=List;{указатель на начало списка}
    if TempList<>nil then{если список не пуст}
    begin
      if NewNode^.strWord<List^.strWord then{если строка нового элемента должна стоять раньше первого в списке}
      begin
        NewNode^.next:=List;{следующий после нового первый в списке}
        List:=NewNode;{меняем указатель на первый элемент списка}
      end
      else
      begin
        while(TempList^.next<>nil) and (TempList^.next^.strWord<strWord) do{находим место вставки}
          TempList:=TempList^.next;
        {вставляем элемент}
        NewNode^.next:=TempList^.next;
        TempList^.next:=NewNode;
      end;
    end
    else{список пуст}
    begin
      NewNode^.next:=nil;{больше элементов нет}
      List:=NewNode;{первый элемент - только что созданный}
    end;
  end;
end;
procedure DeleteList(var List:TPointer);
{процедура удаления списка}
var
  TempList:TPointer;{вспомогательный указатель}
begin
  while(List<>nil) do{пока список не пуст}
  begin
    TempList:=List;{вспомогательный указатель на первый в списке}
    List:=List^.next;{двигаем указатель в списке}
    dispose(TempList);{освобождаем память для запомненного элемента}
  end;
end;
procedure CreateWordGGFile(strInputFileName,strOutputFileName:string);
{процедура создания гистограммы слов}
const
  SSymbols=['a'..'z','A'..'Z'];{мн-во символов}
var
  List,TempList:TPointer;{указатели на список и вспомогательный элемент соот-но}
  f:text;{текстовый файл}
  strWord:string;{для хранения прочитанного из файла слова}
  ch:char;{для чтения символа из файла}
  iMaxCount,iMaxLength,strLen,iLength:integer;
begin
  iMaxLength:=0;{инициализация максимальной длины строки}
  iMaxCount:=0;{инициализация максимального счетчика для слова}
  InitList(List);{инициализация списка}
  assign(f,strInputFileName);{связывание файловой переменной с файлом}
  reset(f);{открытие для чтения}
  while not eof(f) do{пока не конец файла}
  begin
    strWord:='';{инициализация слова}
    read(f,ch);{читаем символ}
    while not(eof(f) or (ch in SSymbols))do{пока прочитанный символ не буква}
      read(f,ch);{читаем символ}
    while not eof(f) and (ch in SSymbols) do{пока прочитанный символ буква}
    begin
      strWord:=strWord+ch;{добавляем букву к слову}
      read(f,ch);{читаем символ}
    end;
    if strWord<>'' then{если прочитанное слово не пусто}
    begin
      strLen:=Length(strWord);{узнаем длину слова}
      if strLen>iMaxLength then{если длина слова больше максимальной}
        iMaxLength:=strLen;{запоминаем максимальную длину слова}
      AddToList(List,strWord);{добавляем слово в список}
    end;
  end;
  close(f);{закрываем файл}
  assign(f,strOutputFileName);{связывание файловой переменной с фвйлом}
  rewrite(f);{открываем для перезаписи}
  TempList:=List;{указатель на начало списка}
  {ищем частоту слова, которое встречается чаще всего}
  while(TempList<>nil) do{пока не конец списка}
  begin
    if TempList^.count>iMaxCount then{если частота текущего слова больше}
      iMaxCount:=TempList^.count;{запоминаем максимальную частоту}
    TempList:=TempList^.next;{переход к следующему элементу}
  end;
  while(iMaxCount<>0) do{пока максимальная частота не равна 0}
  begin
    TempList:=List;{указатель на начало списка}
    while(TempList<>nil) do{пока не конец списка}
    begin
      if TempList^.count>=iMaxCount then{если частота текущего слова >= максимальной}
        write(f,'#'){печатаем символ #}
      else
        write(f,' ');{печатаем пробел}
      TempList:=TempList^.next;{переход к следующему элементу}
    end;
    writeln(f);{переход на следующую строку файла}
    dec(iMaxCount);{уменьшаем максимальную частотность}
  end;
  iLength:=1;{инициализация вспомогательной переменной}
  while(iLength<=iMaxLength) do{пока длина <= максимальной длине слова}
  begin
    TempList:=List;{указатель на начало списка}
    while(TempList<>nil) do{пока не конец списка}
    begin
      strLen:=Length(TempList^.strWord);{узнаем длину слова}
      if strLen>=iLength then{если длина текущего слова >= текущей длине}
        write(f,TempList^.strWord[iLength]){печатаем iLength'ую букву слова}
      else
        write(f,' ');{печатаем пробел}
      TempList:=TempList^.next;{переход к следующему элементу}
    end;
    writeln(f);{переходим к следующей строке файла}
    inc(iLength);{увеличиваем текущую длину}
  end;
  close(f);{закрываем файл}
  DeleteList(List);{удаляем список}
end;
var
  strInputFileName,strOutputFileName:string;
begin
  writeln('Please enter an input file name:');
  readln(strInputFileName);{вводим имя исходного файла}
  writeln('Please enter an output file name:');
  readln(strOutputFileName);{вводим имя выходного файла}
  CreateWordGGFile(strInputFileName,strOutputFileName);
  writeln('ok');
  readln;{ждем ввода}
end.
Вот код программы на Паскале...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2010, 15:14     Гистограммы C++
Посмотрите здесь:

Turbo Pascal Гистограммы
PHP Гистограммы
Одномерный массив. Печать номера, гистограммы. C++
Разработать программу вывода на экран графика дискретной функции (гистограммы). C++
MS Excel Гистограммы с условием
Напишите программу, печатающую гистограммы длин вводимых слов C++
OpenCV: получить гистограммы каналов для области изображения C++
C++ Построение гистограммы (частота встречающихся чисел типа long int)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Йа
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 22
10.05.2010, 22:01  [ТС]     Гистограммы C++ #2
Ни у кого нет никаких предположений?
Йа
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 22
13.05.2010, 13:15  [ТС]     Гистограммы C++ #3
Люди, нужно хотя бы ядро программы=) Код записи в файл и чтения из него я вроде бы написал.
Yandex
Объявления
13.05.2010, 13:15     Гистограммы C++
Ответ Создать тему
Опции темы

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