Peršokti į turinį

Pagalbos su programa, kuri skaičiuoja tam tikrų simbolių skaičių faile


Simonas142

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2555 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Reikėtų pagalbos su vienu uždaviniu, jeigu kažkas pabaigs, numeskit galutinį kodą į komentarus, paskui aš išsinagrinėsiu kas, kur ir kaip.

Sąlyga skamba taip: 
//duomenų faile duota n ir n simbolių, suskaičiuokite kiek kartų faile pasikartoja raidė, kurią įvedėte
//*T/N leidžia valdyti raidžių įvedimo kartus

Kokios pagalbos man dabar iš jūsų reikia?

  • reikia padaryt, kad kai nei n, nei t įvedi, rašytų "įvedei blogą simbolį, reikia vesti t/n" ir ten paskui kai eina viskas, kad iš naujo nuskaitytu failą, kiekviena simbolį vedant
  • duomenys imami iš duomenų failo "Duomenys.txt", rezultatai išvedami į konsolę.
  • KODAS GALI PASIRODYT "GREMĖZDIŠKAS", NETVARKINGAS, NESU PROFESIONALAS, KITU ATVEJU NESIKREIPČIAU ČIA PAGALBOS.
  • Tikiuosi supratot, ko noriu rezultate.

Kodas:

#include <iostream>
#include <fstream>
using namespace std;
//duomenu faile duota n ir n simboliø, suskaièiuokite kiek kartø faile pasikartoja raidë, kurià ávedëte
//*T/N leidþia valdyti raidþiø ávedimo kartus
int main()
{
    ifstream in ("Duomenys.txt");
    int a, k, kartai;
    char c, ivestis, x;
    cout << "Ar noresite skaiciuoti simboliu kieki duomenu faile? (t/n); ";
    cin >> x;
    kodas:
    {
        if (x=='n')
    {
        return 0;
    }
    cout << "Kiek kartu noresite tai daryti?: ";
    cin >> kartai;
    for (int kartojam=1; kartojam<=kartai; kartojam++)
        {
            if (x=='t')
            {
                k=0;
                in >> a;
                cout << "Is viso duomenu faile simboliu yra: " << a << endl;
                cout << "Iveskite simboli: ";
                cin >> ivestis;
                for (int b=1; b<=a; b++)
                {
            in >> c;
            //cout << c << endl;
            if (ivestis==c)
            {
                k++;
            }
                }
            }


        cout << "Simboliu " << ivestis << " duomenu faile yra: " << k << endl;
        }
    }
    cout << " " << endl;
    cout << "***" << endl;
    cout << " " << endl;
    cout << "Ar noresite skaiciuoti simboliu kieki duomenu faile? (t/n); ";
    cin >> x;
    if (x=='n')
    {
        return 0;
    }
        else if (x=='t')
        {
            goto kodas;
        }
    return 0;
}

 

Redaguota , nario Tautedorus
Nuoroda į komentarą
Dalintis per kitą puslapį

Pirmiausiai, laikykis stiliaus ir formatavimo taisyklių, nes sunku skaityti kodą. Čia nereikia būti profesionalu, tai turi tapti natūralus dalykas bet kokio lygio programuotojui. Taip yra daroma todėl, kad būtų lengviau analizuoti kodą kitiems programuotojams ir, žinoma, tau pačiam. Apie stilių gali paskaityti čia. Antra, iš karto dėmesys nukrypsta į komandą goto. Ji įprastai nenaudojama, tik gana išskirtinuose atvejuose. Ji nenaudojama dėl to, nes vėlgi tai apsunkina kodo analizę. Vietoje jos naudok ciklus.

Turbūt nesuklydau bandydamas suprasti sąlygą. Štai kodas:

// ===== Preprocesoriaus direktyvos ===== //

// Include'iname bibliotekas. Jų reikėjo būtent šioje programoje, nes...
// Dirbome su įvesties/išvesties stream'ais (cin/cout).
#include <iostream>

// Dirbome su failais.
#include <fstream>

// Naudojome assert(), kad crash'intume programą, jei duomenų failo nėra.
// Juk duomenų failo vardas yra hard code'intas.
#include <assert.h>

// Panaudojome ribas dirbdami su įvesties srauto netinkamų reikšmių išvengimu.
#include <limits>

// =====                           =====  //

// Naudojame standartinį std namespace'ą.
// Be jo reikėtų rašyti std::cout, std::cin, std::endl ir pnš.
using namespace std;

// Hard code'intas failo vardas. Tai statinis konstantinis string'as (char'ų masyvas):
static const char IVESTIES_FAILAS[] = "duomenys.txt";

int main(int argc, char* argv[]) {
    int kartojimuSkaicius;
    
    int simboliuSkaicius;
    
    char ieskomasSimbolis;
    int ieskomuSimboliuSkaicius;
    
    char varotojoPasirinkimas;
    
    // Įvesties srauto, kuris operuoja su failais, klasės objektas.
    ifstream fin;

    // Begalinis viso algoritmo ciklas.
    // Taip daroma, kad programą būtų galima kartoti tiek, kiek norima.
    while (true) {
        fin.open(IVESTIES_FAILAS);
        // Jei tokio failo nėra, tada crash'iname programą.
        assert(fin.is_open());
        
        cout << "Kiek kartu noresite vykdyti algortima?" << '\n';
        cout << "Iteracijos: ";
        // Apsauga nuo netinkamų reikšmių įvestyje, t.y. kitų simbolių nei skaičiai.
        while (!(cin >> kartojimuSkaicius)) {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "KLAIDA! Ivestas ne skaicius. Bandykite dar karta.\n\n";
            cout << "Iteracijos: ";
        }
        
        // Ciklas, kuriame bus vykdomas pagr. algoritmas.
        for (int i = 0; i < kartojimuSkaicius; i++) {
            ieskomuSimboliuSkaicius = 0;
            fin >> simboliuSkaicius;
            cout << "\nIs viso duomenu faile yra " << simboliuSkaicius << " simboliai (-u).\n";
            cout << "Iveskite ieskoma simboli: ";
            cin >> ieskomasSimbolis;
            
            // Ciklas, kuriame skaitomas failas po simbolį ir tinkami simboliai yra skaičiuojami.
            for (int j = 0; j < simboliuSkaicius; j++) {
                char simbolisFaile;
                fin >> simbolisFaile;
                if (ieskomasSimbolis == simbolisFaile) {
                    ieskomuSimboliuSkaicius++;
                }
            }
            cout << "Duomenu faile yra " << ieskomuSimboliuSkaicius << " '"
                 << ieskomasSimbolis << "' simboliai (-u)." << '\n';
                 
            // Grįžtame į failo pradžią.
            // Tą galėjome padaryti ir uždarę bei vėl atidarę failą.
            fin.clear();
            fin.seekg(0, ios::beg);
        }
        
        // Begalinis vartotojo pasirinkimo įvesties ciklas.
        // Ciklas sukasi tol, kol įvedami TIK TINKAMI duomenys.
        while (true) {
            cout << "\nAr norite kartoti (T/N)? ";
            cin >> varotojoPasirinkimas;
    
            if (varotojoPasirinkimas == 'n' || varotojoPasirinkimas == 'N') {
                return 0;
            } else if (varotojoPasirinkimas == 't' || varotojoPasirinkimas == 'T') {
                // Jei vartotojas nori tęsti programos vykdymą, stabdome šį ciklą ir tęsiame programą.
                cout << "\n*******************************************************************************\n\n";
                break;
            } else {
                cout << "KLAIDA! Tokio pasirinkimo nera. Bandykite dar karta.\n\n";
            }
        }
        // Uždarome failą.
        fin.close();
    }
    return 0;
}

Su šiais duomenimis testavau:

200
xdrafpfewplxxkhgbckxxcvitjgybgjpdiccpgjbuveebygfnnkthzanezkbaoxengeypueqzbqogbvvbpmakwbqplkptkfutiuwiiudhvbmeckvqhangfwhadokwodzyvrtfnsyazwhaxtiwmwezrcobfvelexjbyhakzbnlywxcisdhnglilbedymhpwwevumcdopu

Na, o https://charactercounttool.com/ svetainėje sulyginau rezultatus. Viskas veikia.

Redaguota , nario Tautedorus
  • Teigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 2555 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Svečias
Ši tema yra užrakinta.
  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...