Kurs maturalny z języka angielskiego!
kurs-maturalny-jezyk-angielski

PROGRAMOWANIE I ALGORYTMY

Zajęcia maturalne z informatyki
Olimpiada Informatyczna Juniorów
    Prowadzący: Marcin Kasprowicz
  • właściciel serwisu algorytm.edu.pl
  • wrzesień 2024 — start zajęć
  • czytaj więcej

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:

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

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<<(double)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<<(double)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;
}

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;

}