• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program nie zwraca 0 na jednej maszynie, natomiast na drugiej nie działa poprawnie.

Cloud VPS
0 głosów
178 wizyt
pytanie zadane 25 października 2017 w C i C++ przez Kyatt Początkujący (400 p.)

Witam. Oto program, który ma na celu porównać plik tekstowy z 3 innymi i ustalić w jakim języku został on napisany.

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <cmath>
#include <algorithm>

using namespace std;

void PokazTablice(int *tab,int rozmiar=26)
{
    for(int i=0;i<rozmiar;i++)
    {
        cout<<(char)(i+97)<<": "<<tab[i]<<"\t";
    }
}

float *ParametryzujPlik(string plikWyjscia, string nazwaPliku , float *parametry , int rozmiar=26)
{
    string linijka;
    fstream myfile;
    fstream yourfile;
    int licznik_liter=0;
    float przechowalnia=0.0;

    myfile.open(nazwaPliku.c_str(), ios_base::in);

    for(int i=0;i<rozmiar;i++)
    {
        parametry[i]=0;
    }
    if (myfile.good())
    {
        while ( getline(myfile,linijka) )
        {
          transform(linijka.begin(), linijka.end(), linijka.begin(), ::tolower);

          for(unsigned int i=0;i<linijka.length();i++)
          {
                parametry[linijka[i]-97]++;

                if(linijka[i] > 96 && linijka[i] < 123){
                    licznik_liter++;
                }
          }

          for(int i=0;i < 26; i++){
                przechowalnia = parametry[i];
                parametry[i] = przechowalnia/licznik_liter;

                cout << setprecision(5) << (char)(i+97) << ": " << parametry[i] <<"\n";
          }

        }
        myfile.close();
    }
    else cout << "Unable to open file";


    yourfile.open(plikWyjscia.c_str(), ios_base::trunc | ios_base::out);

    if(!yourfile.good()){
        cout << "Cos sie popsulo!!!\n";
    }

    for(int i=0; i < 26; i++){
        yourfile << setprecision(5) << (char)(i+97) << ": " << parametry[i] <<"\n";
    }

    yourfile.close();

    licznik_liter=0;
    przechowalnia=0.0;

    return parametry;
}

int *LiczbaWystapienLitery(string tekst,int rozmiar=26)
{
    int *liczebnosci;
    liczebnosci = new int[rozmiar];
    for(int i=0;i<rozmiar;i++)
    {
        liczebnosci[i]=0;
    }
    for(unsigned int i=0;i<tekst.length();i++)
    {
        liczebnosci[tekst[i]-97]++;
    }
    return liczebnosci;
}

double PorownywanieTekstow(float *parametry1, float *parametrySzukane){

    double sum = 0;
    double wynik=0.0;

    for(int i = 0; i < 26; i++){
        sum += pow((parametrySzukane[i]-parametry1[i]), 2);
        cout << sum << endl;
    }
    wynik = sqrt(sum);

    return wynik;
}

int main()
{
    float *parametry1, *parametry2, *parametry3, *parametrySzukane;
    double wynik1, wynik2, wynik3;

    parametry1 = new float[26];
    parametry2 = new float[26];
    parametry3 = new float[26];
    parametrySzukane = new float[26];

    string plik, plik2, plik3;

    cin >> plik;

    parametry1 = ParametryzujPlik(plik.c_str() + (string)"_wynik.txt", plik.c_str() + (string)".txt", parametry1);


    cin >> plik2;

    parametry2 = ParametryzujPlik(plik2.c_str() + (string)"_wynik.txt", plik2.c_str() + (string)".txt", parametry2);

    cin >> plik3;

    parametry3 = ParametryzujPlik(plik3.c_str() + (string)"_wynik.txt", plik3.c_str() + (string)".txt", parametry3);

    parametrySzukane = ParametryzujPlik("losowy_wynik.txt", "losowy.txt", parametrySzukane);

    wynik1 = PorownywanieTekstow(parametry1, parametrySzukane);
    wynik2 = PorownywanieTekstow(parametry2, parametrySzukane);
    wynik3 = PorownywanieTekstow(parametry3, parametrySzukane);

    if(wynik1 <= wynik2 && wynik1 <= wynik3){
        cout << "Jezyk " << plik << endl;
    }
    else if (wynik2 <= wynik1 && wynik2 <= wynik3){
        cout << "Jezyk " << plik2 << endl;
    }
    else if(wynik3 <= wynik1 && wynik3 <= wynik2){
        cout << "Jezyk " << plik3 << endl;
    }
    else{
        cout << "Nie mozna ustalic wyniku!\n";
    }

    cout << plik << ": " << wynik1 << endl;
    cout << plik2 << ": " << wynik2 << endl;
    cout << plik3 << ": " << wynik3 << endl;

    delete[] parametry1;
    delete[] parametry2;
    delete[] parametry3;
    delete[] parametrySzukane;

    return 0;
}

Program dochodzi do samiutkiego końca, jednak po wykonaniu wszysktiego zawiesza się i wyświetlana jest windowsowa informacja "Program przestał działać" oraz zwraca ogromną ujemną liczbę całkowitą zamiast 0.

 

P.S. int *LiczbaWystapienLitery i void PokazTablice są nieużywane w tym programie. Usunięcie ich nic nie zmienia. Funkcje po prostu zostały z poprzedniego programu (wiem , mój błąd)

2 odpowiedzi

+1 głos
odpowiedź 26 października 2017 przez j23 Mędrzec (195,240 p.)
wybrane 26 października 2017 przez Kyatt
 
Najlepsza

Nie wiem, co jest powodem błędu, ale takie konstrukcje:

parametry[ linijka[i] - 97 ]++;

nie są zbyt bezpieczne, bo wystarczy, że w linijka pojawi się znak zmniejszy od 97 (np. znak końca linii) i indeks będzie minusowy. To samo w drugą stronę - parametry ma 26 pozycji, a kody znaków mogą być większe od 123. Dodaj do tego znaki większe od 127, które dla typu char będą miały wartości ujemne. Bezpieczniej będzie, jeśli parametry będą miały rozmiar 256. Wtedy indeksowanie powinno wyglądać tak:

parametry[ static_cast<unsigned char>(linijka[i]) ]++;

 

parametry1 = new float[26];
parametry2 = new float[26];
parametry3 = new float[26];
parametrySzukane = new float[26];

Dlaczego na stercie i dlaczego nie vector?

komentarz 26 października 2017 przez Kyatt Początkujący (400 p.)

Okej, dzięki wielkie, wreszcie znalazłem odpowiedź na mój problem ;P wystarczy dać

	
parametry[ linijka[i] - 97 ]++;

pod tego ifa:

                if(linijka[i] > 96 && linijka[i] < 123){
                    parametry[linijka[i] - 97]++;
                    licznik_liter++;
                }

i już nie powinno wychodzić poza litery. Z tego co widzę przynajmniej program działa bez problemów.

+1 głos
odpowiedź 25 października 2017 przez Lrror Bywalec (2,720 p.)
Gdzieś błąd walnąłeś i tyle. Niestety nie powiem ci gdzie bo nie fajnie czyta się kody innych. Ale spróbuj przepisać kod na nowo. Wtedy może wyłapiesz błąd. Lub poprostu przejrzyj go na spokojnie.

Podobne pytania

0 głosów
1 odpowiedź 348 wizyt
0 głosów
2 odpowiedzi 1,020 wizyt

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,833 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...