In: Computer Science
Please Write C++ PROGRAM :
That will write a program that initially prompts the user for a file name. If the file is not found, an error message is output, and the program terminates. Otherwise, the program prints each token in the file, and the number of times it appeared, in a well formatted manner. To accomplish all this, do the following:
- Open the file - the user must be prompted and a file name input. DO NOT hardcode a file name.
- Read the words in the file, placing them in an array of struct with capacity I 00, where each struct has a string (the word) and an int (number of occurrences)
- Sort the array, eliminating duplicates
- Report the results
- You must write appropriate functions for each task. At minimum, you must write a function for each of the following:
• Open the file:
o Pass in an ifstream (must be a reference argument [what type of parameter is it?]). The function prompts the user and, if the file is found, it returns true and the ifstream will be a handle for that text file. Otherwise the function returns false , and the argument is assumed to be undefined.
• Populate the array of struct with the words in the file:
o Pass in two reference arguments, the ifstrcam, and the l 00 element array of word/count structs. When the function completes, the array will hold the words in the file.
• Output results:
o Pass in the variables that bold the file name and the word/count array. Use this data to
produce the desired ouput, which should be appropriately fonnatted.
• Sort an array of structs (the name/int pairs), eliminating duplicates:
o Pass in the array of struct, and the number of elements in the array. The function sorts the array, in ascending order of words, eliminating duplicates and tabulating counts as it goes. It definitely uses other functions for specific purposes, e.g. identifying duplicate tokens and swapping structs.
• Increment the counter member of a struct that holds a word and its multiplicity:
o Pass in a single struct; it will be an import/export parameter. Simply increment its counter member.
----------------------------------------------------------------------------
Notes:
» A word, or token, is whatever is read using the >> operator. A word followed by a period is distinct from the same word without the period. Words are also case sensitive, i.e. heLLo is not equal to Hello.
» When a word is placed into the array of struct, its counter is initially 1.
» When the array reaches capacity:
If there aren't 100 unique words already in the array, run the sort function to eliminate duplicates.
If the file has 100 unique words, then after the tooth unique word is added to the array, only repeats will be tabulated. New tokens will be discarded.
» While several functions are required, other functions should be written as well.
No function..should handle multiple tasks on its own. Non-modular designs will be penalized.
» In sorting, if the word being placed is a duplicate, the already placed word must have its counter incremented, and the duplicate must be removed from the array.
- The program must be well written, properly indented, and commented
PROGRAM CODE:
/*
* WordCount.cpp
*
* Created on: 22-Feb-2017
* Author: kasturi
*/
#include <iostream>
#include <fstream>
#include <string.h>
#include <iomanip>
#include <ctype.h>
#include <sstream>
using namespace std;
#define CAPACITY 100
/**
* Struct for holding the word and the count
*/
struct words
{
string word;
int count;
};
/**
* function to get the file name from the user and then open the
file
*/
bool openFile(ifstream &infile)
{
string inputFile;
cout<<"Enter the input file name: ";
cin>>inputFile;
infile.open(inputFile);
if(!infile.good())
{
cout<<"Either the file is not
available or is locked by another program\n";
return false;
}
else return true;
}
/**
* increments the counter for the word by 1
*/
void increment(struct words &word)
{
word.count++;
}
/**
* swaps two structs of words
*/
void swap(struct words &word1, struct words &word2)
{
struct words temp = word1;
word1 = word2;
word2 = temp;
}
/**
* sorts the words in ASCII order
*/
void sort(struct words wordArray[], int &size)
{
for(int m=0; m<size; m++)
{
for(int n=0; n<size; n++)
{
if(wordArray[m].word.compare(wordArray[n].word) < 0)
{
swap(wordArray[m], wordArray[n]);
}
}
}
}
/**
* checks the array for duplicate words
*/
bool isDuplicate(struct words wordsArray[], int size, string
word)
{
for(int i=0; i<size; i++)
{
if(wordsArray[i].word ==
word)
{
increment(wordsArray[i]);
return
true;
}
}
return false;
}
/*
*processes the file and adds words into the array, if already
available then increases the count of the word
*/
void process(struct words wordsArray[], ifstream &infile)
{
string line;
int counter = 0;
bool canBeAdded = true;
while(getline(infile,line ))
{
istringstream iss(line);
string word;
while(true)
{
if(!(iss>>word))
{
break;
}
if(!isDuplicate(wordsArray, counter, word) &&
canBeAdded)
{
wordsArray[counter].word = word;
wordsArray[counter].count = 1;
counter++;
}
if(counter==CAPACITY)
{
sort(wordsArray, counter);
canBeAdded = false;
}
}
if(canBeAdded)
sort(wordsArray,
counter);
}
}
/**
* prints the array to console
*/
void printResult(struct words wordsArray[])
{
cout<<"\nWord\t\t\t"<<"Count\t\t"<<"\n";
for(int i=0; i<CAPACITY; i++)
{
if(wordsArray[i].count != 0)
{
cout<<fixed<<setprecision(2);
string word =
wordsArray[i].word;
while(word.length()<25)
word+= " ";
cout<<word<<to_string(wordsArray[i].count)<<endl;
}
}
}
/**
* main function
*/
int main()
{
ifstream in;
struct words wordsArray[CAPACITY];
openFile(in);
process(wordsArray, in);
printResult(wordsArray);
in.close();
}
INPUT:
This is just sample text to check whether the program is working fine or not.
The program has many functions. Assuming that the count for the words in this file will go more than hundred words.
I have no idea what more to write here.
Make sure to keep the file int he correct location.
Otherwise once placing the file at a location, copy the path and paste it in the ifstream filename path. writing more the the the the
is is is is why why why why. face face face face
OUTPUT:
Enter the input file name: textfile.txt
Word Count
Assuming 1
I 1
Make 1
Otherwise 1
The 1
This 1
a 1
and 1
at 1
check 1
copy 1
correct 1
count 1
face 4
file 3
filename 1
fine 1
for 1
functions. 1
go 1
has 1
have 1
he 1
here. 1
hundred 1
idea 1
ifstream 1
in 2
int 1
is 6
it 1
just 1
keep 1
location, 1
location. 1
many 1
more 3
no 1
not. 1
once 1
or 1
paste 1
path 1
path. 1
placing 1
program 2
sample 1
sure 1
text 1
than 1
that 1
the 11
this 1
to 3
what 1
whether 1
why 3
why. 1
will 1
words 1
words. 1
working 1
write 1
writing 1