Programowanie i algorytmy

Ciągi znaków - prawdopodobieństwo

Zad. 3. W pliku ciagi.txt znajduje się tysiąc wierszy, a w każdym wierszu ciąg o długości trzech liter ze zbioru {A, B, C}(litery mogą się powtarzać). Napisz program, który:

 

a) obliczy prawdopodobieństwo, że w wybranym wierszu będzie ciąg składającym się z takich samych znaków. Odpowiedź zapisz do pliku a.txt

 

b) obliczy prawdopodobieństwo, że  w wybranym wierszu będzie palindrom lub litera po prawej stronie ma wartość "A". Odpowiedź zapisz do pliku b.txt.

c) skopiuje do pliku c.txt wszystkie wiersze, w których pojawił się podciąg "AC", np.:

AAC, ACB, ACC, itd.

Wskazówka. W podpunkcie a i b, należy zastosować prawdopodobieństwo klasyczne ze wzoru:

{tex}P(A) = \frac{|A|}{|\Omega|}{/tex},

gdzie |A| - ilość wierszy spełniających kryteria zadania, |Ω| - wszystkie wiersze.

 

Rozwiązanie:

Podpunkt a)

#include <iostream>
#include <fstream>


using namespace std;

int main()
{
ifstream odczyt("ciagi.txt");
ofstream zapis("a.txt");

char tab[4]; //deklaracja tablicy na cztery znaki (ciąg trzech liter i znak końca tablicy - '\0')
int i=0; //zmienna zliczająca ilość ciągów spełniających kryteria zadania

while(!odczyt.eof())
{

odczyt>>tab;

if(tab[0]==tab[1]&&tab[0]==tab[2]) //sprawdzenie, czy wszystkie znaki są takie same

i++;

}

zapis<<(float)i/1000; //i jest liczbą całkowitą, trzeba więc zrzutować do rzeczywistej

odczyt.close();
zapis.close();

return 0;
}

 

Podpunkt b)

Palindrom, to takie słowo, które czytane z od lewej do prawej i od prawej do lewej da ten sam wyraz np.:

kajak, ala, itd..

W tym zadaniu wystarczy sprawdzić pierwszą i trzecią literę. Jeśli są one takie same to dany ciąg jest palindromem (środkowa litera nie ma znaczenia w tym przypadku).

#include <iostream>
#include <fstream>


using namespace std;

int main()
{

ifstream odczyt("ciagi.txt");
ofstream zapis("b.txt");

char tab[4];
int i=0;
while(!odczyt.eof())
{

odczyt>>tab;

if(tab[0]==tab[2]||tab[2]=='A') //sprawdzenie, czy ciąg jest palindromem lub na końcu stoi litera 'A'

i++;

}

zapis<<(float)i/1000;

odczyt.close();

zapis.close();

return 0;

}

 

Podpunkt c)

#include <iostream>
#include <fstream>


using namespace std;

int main()
{

ifstream odczyt("ciagi.txt");
ofstream zapis("c.txt");

char tab[4];
int i=0;
while(!odczyt.eof())
{

odczyt>>tab;

if(tab[0]=='A'&&tab[1]=='C'||tab[1]=='A'&&tab[2]=='C')

zapis<<tab<<endl;

}

odczyt.close();

zapis.close();

return 0;

}