2014-11-30, 14:21
  #1
Medlem
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.

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;
}
Citera
2014-11-30, 14:29
  #2
Medlem
kinesarsles avatar
Gör om
Kod:
        filnamn = namn_pa_fil();
        cout << endl;
        
        text = inlasning(filnamn);
till
Kod:
        filnamn = namn_pa_fil();
        cout << filnamn << endl;
        
        text = inlasning(filnamn);
som en första felsökning.
Citera
2014-11-30, 14:37
  #3
Medlem
kinesarsles avatar
Såg just att du hade en felutskrift i inläsningsfunktionen. nvm.
Citera
2014-11-30, 14:38
  #4
Medlem
Citat:
Ursprungligen postat av kinesarsle
Gör om
Kod:
        filnamn = namn_pa_fil();
        cout << endl;
        
        text = inlasning(filnamn);
till
Kod:
        filnamn = namn_pa_fil();
        cout << filnamn << endl;
        
        text = inlasning(filnamn);
som en första felsökning.

Jag ändrade det men det funkar fortfarande. Nu verkar det som att den kanske hittar filen men att den skriver bara ut oändligt med * tecken... Så det måste vara något annat fel också. Jag uppskattar verkligen din hjälp!
Citera
2014-11-30, 14:41
  #5
Medlem
kinesarsles avatar
Jag körde just programmet, och det gick alldeles utmärkt att läsa in filen, så jag vet inte vad du gör för fel.
Citera
2014-11-30, 14:47
  #6
Medlem
kinesarsles avatar
Citat:
Ursprungligen postat av Fezzyface
Jag ändrade det men det funkar fortfarande. Nu verkar det som att den kanske hittar filen men att den skriver bara ut oändligt med * tecken... Så det måste vara något annat fel också. Jag uppskattar verkligen din hjälp!
Ett fel jag ser är att du enbart inkrementerar bokstäver när det är stor bokstav.

I övrigt råder jag dig till att skriva ut värdet på olika variabler för att få ett hum om var felet är.
Citera
2014-11-30, 19:16
  #7
Medlem
Citat:
Ursprungligen postat av Fezzyface
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 startar inte nödvändigtvis i mappen där källkoden ligger. Current directory kan vara vad som helst.

Citat:
Ursprungligen postat av Fezzyface
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.

Kopiera källkodsfilen till en ny test.cpp, rensa main() och testa en funktion i taget. T.ex.:

Kod:
int main() {
    cout << "->" << inlasning("C:\\AUTOEXEC.BAT") << "<-\n";
    return 0;
}
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in