C ++, я делаю программу, которая считает, сколько раз письмо появляется в файле - PullRequest
0 голосов
/ 15 мая 2018

Следует отметить, что мы также проверяем самое длинное слово, включающее эту букву, а также самое короткое слово.

следует указать, что я студент, и в моем коде есть несколько ошибок

ВНИМАНИЕ: ОТСУТСТВУЕТ КОММЕНТАРИЙ. Также следует указать, что я понятия не имел, что делал во время выполненияэто из-за расплывчатых инструкций, данных учителем моему коду;word.cpp

#include<iostream>
#include<fstream>
#include<string>
#include<cstdlib>
#include<iomanip>
#include"myStrCharFunc.h"
using namespace std;

const int SIZE=26; //Size of the area, one for each letter
const int MAX=30; //Size of the c string that will store word from the input file

typedef char cstr[MAX];

struct let
 {
   int count;//nummber of words that start with thr letter
   int shortest;
   int longest;
 };

void initializeArray(let ar[]);
void readData(let ar[]);
void processWord(cstr word, let ar[]);

int main()
 {
   //cstr s="Hi";
   let ar[SIZE];

   return 0;
 }

void initializeArray(let ar[])
 {
   for(int i=0;i<SIZE; i++)
    {
      ar[i].count=0;
      ar[i].shortest=9999;
      ar[i].longest=0;
    }
 }

void readData(let ar[])
 {
  ifstream fin;
  fin.open("project2.dat");
  if(!fin)
   {
     cout<<"Your input file doesn't exist"<<endl;
   }
  else
   {

     //let temp;
     //fin>>temp.count;
     //fin>>temp.shortest;
     //fin>>temp.longest;
     cstr word=" ";
     fin>>word;
     while(fin)
      {
        processWord(word, ar);
        fin>>word;
      }
   }
 fin.close();
}

void processWord(cstr word, let ar[])
 {

  for(int i=0; i < SIZE; i++)
   {
    ar[i].count++;
    myToUpper(word);
    int fev = myStrLen(word);
    if(ar[i].longest < fev)
      {
        ar[i].longest = fev;
      }
    if(ar[i].shortest > fev)
     }
       ar[i].shortest=fev;
     }

}

другая программа, связанная с этим;myStrCharFunc.h

 //myToUpper('a')-->'A'
//myToUpper('A')-->'A'
char myToUpper(char b)
 {

   if('a'<= b && b <= 'z')
    {
      b-=('a'-'A');
    }
   return b;
 }

int myStrLen(const char cstr[])
 {
  int i=0;
  for(i; cstr[i] != '\0'; i++)
    ;
  return i;

 }

myToUpper предполагалось взять символ или C-строку и использовать таблицу ASCII, чтобы сделать ее заглавной буквой

Между тем myStrLen предполагал записать длинукаждое отдельное слово, которое оно принимает.

Ошибки для кода, который я написал:

word.cpp: В функции 'void processWord (char *, let *)': word.cpp: 77: 21: ошибка: неправильное преобразование из 'char *' в 'char' [-fpermissive]

   myToUpper(word);
                 ^ In file included from word.cpp:6:0:  myStrCharFunc.h:3:6: error:   initializing argument 1 of ‘char

myToUpper (char) '[-fpermissive] char myToUpper (char b)

/ Следует отметить, что ни один из написанного здесь кода не был должным образом отформатирован после нажатия CTRL + K и вырезания и вставки его в заданную область, поэтому все это было сделано вручную /

Также файл, который мы используем;project2.dat содержит только это:

Economists attributed the jump in tourism to a strengthening
economy high consumer confidence and pent up demand among
Americans who put off travel during the recession Also
a growing middle class in China is pushing visits from that
country experts said

The state persistent drought although weighing heavily on
residents does not appear to bother travelers interested in
sunshine shopping and sightseeing

Visitors to Los Angeles are not going to care if it gets a
little brown around the edges quipped Dean Runyan a
consultant who studied the tourism economy for Visit
California report released Tuesday

Still Runyan cautioned the drought could affect tourism
in rural counties where fishing and boating are popular pastimes

Some experts worry that a bigger issue is the US dollar
strength compared to other currencies

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Предполагая, что вы еще не покрыли контейнеры в C ++

Итак, вы хотите посчитать частоты букв в файле, который вы читаете.

Единственное, что вам сейчас нужно, это массив, в котором все буквымогут быть представлены.

int freq[MAXCHARS] = {0};  // e.g. 26

Предполагая, что мы работаем с символами ASCII, они начинаются со значения ASCII 65, которое равно 'A'

В массивах C ++ начинаются с индекса 0, поэтому вам нужен способ отобразить символв массив 'freq'

Рассчитайте индекс, вычтя из символа 'A', затем вы получите индекс 0 для 'A', 1 для 'B' и т. д.

ТекстВозможно, это может быть смешанный регистр, поэтому преобразуйте все в верхний регистр, используя функцию toupper()

ch = std::toupper(ch);  // make sure it is upper case
auto index = ch - 'A';  // calculate the index in the array
freq[index]++;          // add one for the character found

Теперь вам нужно прочитать один файл за раз и определить, является ли это буква.если так, то обновите массив

#include <iostream>
#include <string>
#include <fstream>
#include <cctype>

const int MAXCHARS = 26;

int main(/*int argc, char* argv[]*/)
{
  using namespace std;

  int freq[MAXCHARS] = {0};

  std::ifstream f("yourfile");
  do
  {
    auto ch = f.get();
    if (std::isalpha(ch))
    {
      ch = std::toupper(ch);
      auto index = ch - 'A';
      freq[index]++;
    }
  }
  while (!f.eof());

  for (int i = 0; i < MAXCHARS; ++i)
  {
    std::cout << char(65+i) << ":" << freq[i] << '\n';
  }
  std::cout << std::endl;    

  return 0;
}
0 голосов
/ 15 мая 2018

Я не знаю, сможете ли вы использовать конструкции STL для вашего проекта / задания (если нет, мои извинения за плохого преподавателя), так что если нет, то это будет на пользу любым посетителямкому нужен / sane / подход к решению этой проблемы, так как легкое разбрызгивание STL делает это невероятно простым:

#include<fstream>
#include<iostream>
#include<map>
#include<string>
#include<cctype>

int main() {
    //Container for the frequency data
    std::map<char, size_t> char_map;

    //Read the whole file into memory, for efficient reads
    std::string file_contents;
    std::ifstream file("project2.dat");
    size_t length;
    file.seekg(0, std::ios::end);
    length = file.tellg();
    file.seekg(0, std::ios::beg);
    file_contents.resize(length);
    file.read(file_contents.data(), length);
    //If you don't have a C++17 compiler, use this instead:
    //file.read(&file_contents.front(), length);

    //Iterate over the file, which we've stored in memory.
    for(char c : file_contents)
        //Omit if we're including spaces
        if(c != ' ')
            ++char_map[char(std::toupper(c))];

    //Display the results
    for(auto const& pair : char_map) {
        std::cout << "Occurrences of \'" << pair.first << "\': " << pair.second << '\n';
    }
}

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

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

//Input:
I watched as nobody attended my fourth grade birthday party.

//Output:
Occurrences of '.': 1
Occurrences of 'A': 6
Occurrences of 'B': 2
Occurrences of 'C': 1
Occurrences of 'D': 6
Occurrences of 'E': 4
Occurrences of 'F': 1
Occurrences of 'G': 1
Occurrences of 'H': 3
Occurrences of 'I': 2
Occurrences of 'M': 1
Occurrences of 'N': 2
Occurrences of 'O': 3
Occurrences of 'P': 1
Occurrences of 'R': 4
Occurrences of 'S': 1
Occurrences of 'T': 6
Occurrences of 'U': 1
Occurrences of 'W': 1
Occurrences of 'Y': 4

Намного проще, если мы читаем из стандартного .Это / может / быть адаптировано для использования с файлами, но, вероятно, будет медленнее, чем подход, который я использовал выше, для особенно больших файлов.

#include<iostream>
#include<map>
#include<string>
#include<cctype>

int main() {
    std::map<char, size_t> char_map;
    std::string line;

    while(std::getline(std::cin, line))
        for(char c : line)
            if(c != ' ')
                ++char_map[char(std::toupper(c))];

    for(auto const& pair : char_map) {
        std::cout << "Occurrences of \'" << pair.first << "\': " << pair.second << '\n';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...