Jag håller på med ett program som ska läsa in text filer och som sedan ska registrera vilka bokstäver den består av. Programmet ska beräkna hur stor andel av varje bokstav som finns (bokstavshistogram). Sedan ska programmet bestämma vilket språk det är mest troligt att texten är skriven på.
Mitt problem är att programmet inte kan läsa in filerna som jag vill att den ska läsa in. Det är .txt filer som jag har lagt i samma mapp som .cpp filen. Men det står ändå att det inte kan hitta filen. Programmet går att kompilera men det måste vara något fel i koden när det gäller inläsning av .txt filen. Någon som vet vad jag har gjort för fel! Skulle verkligen uppskattas om någon ville hjälpa mig. Kan vara något självklart fel men jag har blivit lite blind för mitt egna program då jag har suttit och stirrat på det i flera dar.
Mitt problem är att programmet inte kan läsa in filerna som jag vill att den ska läsa in. Det är .txt filer som jag har lagt i samma mapp som .cpp filen. Men det står ändå att det inte kan hitta filen. Programmet går att kompilera men det måste vara något fel i koden när det gäller inläsning av .txt filen. Någon som vet vad jag har gjort för fel! Skulle verkligen uppskattas om någon ville hjälpa mig. Kan vara något självklart fel men jag har blivit lite blind för mitt egna program då jag har suttit och stirrat på det i flera dar.
Kod:
#include <string>
#include <cctype>
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
// Globala konstanter:
// Tips: Använd de globala konstanterna ANTAL_BOKSTAVER och ANTAL_SPRAK
// istället för värdena 26 och 4 i programmet.
const int ANTAL_BOKSTAVER = 26; //A-Z
const int ANTAL_SPRAK = 4;
// 2d-arrayen TOLK_HJALP innehÂller bokstavsfrekvensen i %
// för fyra språk. TOLK_HJALP[0][0] är frekvensen av
// bokstaven a för engelska.TOLK_HJALP[0][25] är frekvensen av
// bokstaven z för engelska.
// Arrayen är en GLOBAL KONSTANT och skall alltså ej skickas
// som parameter till den funktion som behöver den.
const double TOLK_HJALP[ANTAL_SPRAK][ANTAL_BOKSTAVER]=
{{8.27,1.48,2.94,4.03,11.78,2.22,1.72,6.77, //engelska
7.39,0.12,0.81,3.76,2.85,6.71,7.79,1.54,
0.05,5.95,6.69,9.07,2.66,1.13,2.14,0.19,
1.89,0.03},
{7.97,1.40,3.55,3.79,16.89,1.02,1.00,0.75, //franska
7.08,0.38,0.04,5.51,2.82,8.11,5.19,2.78,
1.01,6.69,8.35,7.22,6.09,1.35,0.02,0.54,
0.30,0.15},
{9.50,1.11,1.53,5.30,8.94,1.74,3.57,3.94, //svenska
3.98,0.89,3.26,4.93,3.41,8.46,5.01,1.77,
0.00,6.73,5.56,9.20,1.94,2.42,0.00,0.05,
0.45,0.00},
{5.12,1.95,3.57,5.07,16.87,1.35,3.00,5.79, //tyska
8.63,0.19,1.14,3.68,3.12,10.64,1.74,0.42,
0.01,6.30,6.99,5.19,3.92,0.77,1.79,0.01,
0.69,1.24}};
// Globala variabler är ej tillåtna
//===========================================================================
// Funktionsdeklarationer:
//===========================================================================
int berakna_histogram_abs(string &text, double f[]);
void abs_till_rel(double f[], int &bokstaver);
void plotta_histogram_rel( double f[]);
void tolkning(double f[], int &bokstaver);
string namn_pa_fil();
string inlasning(string &filnamn);
//===========================================================================
// Huvudprogram:
//===========================================================================
int main()
{
string filnamn;
string text = "File not found";
double f[ANTAL_BOKSTAVER];
int bokstaver = 0;
while (text == "File not found")
{
filnamn = namn_pa_fil();
cout << endl;
text = inlasning(filnamn);
}
bokstaver = berakna_histogram_abs(text, f);
abs_till_rel(f, bokstaver);
tolkning(f, bokstaver);
plotta_histogram_rel(f);
return 0;
}
//===========================================================================
// Funktionsdefinitioner:
//===========================================================================
int berakna_histogram_abs(string &text, double f[])
{
int index;
int bokstaver = 0;
for(int i = 0; i < ANTAL_BOKSTAVER; i++)
f[i]=0;
for ( int i = 0; i < text.length(); i++)
{
if (text.at(i)>='a' && text.at(i)<='z')
{
index = text.at(i) - 'a';
f[index]++;
}
if (text.at(i)>='A' && text.at(i)<='Z')
{
index = text.at(i) - 'A';
f[index]++;
bokstaver++;
}
}
return bokstaver;
}
void abs_till_rel( double f[], int &bokstaver)
{
for(int i = 0; i < ANTAL_BOKSTAVER; i++)
{
f[i] = ((double) f[i] / (double) bokstaver) * 100;
}
}
void plotta_histogram_rel(double f[])
{
cout << "Bokstavsfördelning:" << endl << endl << endl << endl;
for(int i=0; i < ANTAL_BOKSTAVER; i++)
{
char c = char (i+'A');
cout << c << " ";
for(int j=0; j<f[i]*2; j++)
cout << "*";
cout << endl;
}
}
void tolkning(double f[], int &bokstaver)
{
string spraknamn[ANTAL_SPRAK] = {"Engelska", "Franska", "Svenska", "Tyska"};
double sum[ANTAL_SPRAK] = {0};
double skillnad;
double kvsumma = 999999999;
int sannolikt_sprak = 0;
cout << "Resultat för bokstäverna A-Z" << endl << endl;
cout << "Antal bokstäver: " << bokstaver << endl;
for(int i = 0; i < ANTAL_SPRAK; i++)
{
for(int j=0; j<ANTAL_BOKSTAVER; j++)
{
skillnad = TOLK_HJALP[i][j] - f[j];
sum[i] = sum[i] + skillnad * skillnad;
}
if(sum[i]<kvsumma)
{
kvsumma = sum[i];
sannolikt_sprak = i;
}
cout << spraknamn[i] << " har kvadratsumma: " << sum[i] << endl;
}
cout << spraknamn[sannolikt_sprak] << " är det mest sannolika språket."
<< endl << endl;
}
string namn_pa_fil()
{
string filnamn;
string namn = ".txt";
cout << "Ange fil att jämföra: ";
getline(cin, filnamn);
size_t key = filnamn.rfind(namn);
if(key == string::npos)
{
filnamn.append(".txt");
}
return filnamn;
}
string inlasning(string &filnamn)
{
string fil;
ifstream infil(filnamn.c_str());
if(!infil.good())
{
cout << filnamn << " existerar inte, kontrollera filnamnet." << endl;
return "file not found"; // Eller 0 för att inte få rest.
}
while(infil.good())
{
char c = infil.get();
if(infil.good())
fil += c;
}
infil.close();
return fil;
}