#include <iostream> // bibl
#include <fstream>
#include <conio.h>
#include <cstdlib>


using namespace std;

main()
{
fstream plikin,plikout;
string deklarujemy napisy
int deklarujemy liczby
plikin.open ("dane.txt", ios::in);
plikout.open("wyniki.txt", ios::out);
while(!plikin.eof())

a tutaj buszujemy po zadaniu
}
plikin.close();  plikout.close();
}


=========================== RÓŻNE MATEMATYCZNE
1. 
int los(int poczatek, int przedzial)
{
return poczatek + rand()%przedzial;
w funkcji glownej trzeba umiescic srand(time(NULL));
a w bibliotekach dodac #include <ctime>
}


2a.
int sumacyfrwwierszu(string wiersz)

int suma=0,dlugosc;
string cyfra;
dlugosc = wiersz.length();
for (int j=0;j<dlugosc;j++) {
cyfra=wiersz[j];suma+= atoi(cyfra.c_str());
}
return suma;
}


2b.
int sumacyfrwwierszu(int liczba)

gdy wygodnie jest podac liczbe w postaci liczby
int suma=0, reszta;
while(liczba>0) {
reszta=liczba%10;suma+=reszta;
liczba/=10;
}
return suma;
}


2c.
int suma_cyfr_o_dowolnejpodstawie(int liczba,int p) 
{
int suma=0; 
while (liczba>0){
suma=suma+liczba%p; liczba/=p; 

return suma; 
}


3.
int silnia(int liczba) 

if (liczba<2) return liczba;
return liczba*silnia(liczba-1);
}


4a.
unsigned long long int fib1(int n)
{
unsigned long long int f[n];
f[0]=1; f[1]=1;
for (int i=2; i<n; i++) f[i]=f[i-1]+f[i-2];
return f[n-1];
}

 


4b.
unsigned long long int fib2(int m)
{
int i=2,f[m];
f[0]=1;f[1]=1;
while (true){
f[i]=f[i-1]+f[i-2];i++;
if(f[i-2]>=m) return f[i-3];
}
}

 
4c.
float zlotypodzial(float jaki_blad)
{
int i;
float zp[100],f[100],blad;
f[0]=1; f[1]=1; il[1]=1; i=2;
do
{
f[i]=f[i-1]+f[i-2];
zp[i]=f[i]/f[i-1];
blad = fabs(zp[i]-zp[i-1]);
i++;
}
while (blad>jaki_blad);
return zp[i-1];
}


5.
bool czy_pierwsza(int n)
{
if (n==0) return false; if (n<0) n*=-1;//n=n*(-1);
for(int i=2;i*i<=n;i++) if(n%i==0) return false;
return true;
}

 

6.
void czynniki(int n)
{
    int i=2,j=0,reszta,koniec=n/2;
    int dz[10];
    while(n>1){
reszta=n%i;
if(reszta==0) {
dz[j]=i;j++; n=n/i;}
else if (i<=koniec) i++; else break;
    }
    for (i=0;i<j;i++) cout << dz[i];
}

 
7.
int nwd(int a, int b)
{
while(a!=b) if (a>b) a-=b; else b-=a;
return a;
}

 


8.
int nww(int a, int b)
{
int d=a*b;
while(a!=b) if (a>b) a-=b; else b-=a;
return d/a;
}

 


9.
int onpToDec(string onp[100], int onpL){
int k=0;
int T[100];
for(int i=0;i<onpL;i++){
if(!ifope(onp[i])) T[k]=strToDec(onp[i]);
if(ifope(onp[i])){
int b=T[k-1];
int a=T[k-2];
k-=2;
if(onp[i]=="+") T[k]=a+b;
if(onp[i]=="-") T[k]=a-b;
if(onp[i]=="*") T[k]=a*b;
if(onp[i]=="/") T[k]=a/b;
}
k++;
}
return T[0];
}

 


10. Najdłuższy rosnący ciąg w danych (tablicy jednowymiarowej)
int max_rosnacy(int g[], int n){
int maxl=1, maxf=1;
for (int i=0;i<n;i++)
if (g[i]<g[i+1]) maxl++;
else {
if (maxl>maxf) maxf=maxl;
maxl=1;
}
return maxf;
}

 

11. Dzielniki liczba oraz ich suma

void dzielniki(int liczba, int &sd){
for (int i=1;i<=liczba/2;i++)
if (liczba%i==0) {cout << i << " ";sd+=i;}
}


============================ SYSTEMYY LICZENIA
1.
string int10_na_dowolny(int liczba, int system)
{
char wynik[100];
itoa (liczba, wynik, system);
return wynik;
}

 


2.
int dowolny_na_10(string wiersz, int podstawa)
{
string cyfra_s;
int suma=0,dlugosc,cyfra_l;
dlugosc=wiersz.length();
for (int j=0;j<dlugosc;j++)
{
cyfra_s=wiersz[j];cyfra_l= atoi(cyfra_s.c_str());
suma=suma*podstawa+cyfra_l;
}
return suma;
}

 


3.
string z10_na_2(int liczba)
{
string wynik="";
while(liczba!=1) {
if ((liczba%2)==1) wynik='1'+wynik; else wynik = '0'+wynik;
liczba/=2;
};
return "1"+wynik;
}

 


4.
int z16_na_10(string heksadecymalna)
{
return strtol(heksadecymalna.c_str(), NULL, 16);
}

 


=============================== NAPISY I TAKIE TAM INNE :-)
1. a)
bool czy_palindrom(string wiersz)
{
int dlugosc = wiersz.length();
for (int j=0;j<=dlugosc/2;j++)
if (wiersz[j]!=wiersz[dlugosc-j-1]) return false;
return true;
}

 


1. b)
string tworze_palindrom(string napis)
{
int dlugosc=wyraz.length();
string palindrom="";
for (int i=0;i<dlugosc;i++) palindrom+=wyraz[dlugosc-i-1];
return palindrom;
}

 


2.
string sortbable(string napis)
{
for (int i=napis.length()-1;i>=0;i--){
for (int j=0;j<i;j++) {
if (napis[j]>napis[j+1]) swap(napis[j], napis[j+1]);
}
}
return napis;
}

 


3.
bool czy_anagram(string napis1, string napis2)
{
if (napis1.length()!=napis2.length()) return false; 
for (int i=napis1.length()-1; i>=0; i--){
for (int j=0;j<i;j++) {
if (napis1[j]>napis1[j+1]) swap(napis1[j], napis1[j+1]);
if (napis2[j]>napis2[j+1]) swap(napis2[j], napis2[j+1]);
}
}
return napis1==napis2;
}

 


4.
void tablica_ze_zdania(string zdanie, int kol, int wie)
{
string tab[10][10];
int dlugosc;
int k=0, rozmiar;
rozmiar=kol*wie;
dlugosc=zdanie.length();
for (int j=0;j<wie;j++) {
for (int i=0;i<kol;i++) {
tab[i][j] = zdanie[k%dlugosc];k++;
cout << tab[i][j] << "\t";
}
cout << endl;
}
}

 


5.
string szyfrzdaniakluczem(string zdanie, string klucz)
{
int dlugosc_zdania, dlugosc_klucza;
int intz, intk, nowy_kod;
string haslo="";
dlugosc_zdania=zdanie.length(); dlugosc_klucza=klucz.length();
for (int i=0;i<dlugosc_zdania;i++){
intz=int(zdanie[i]);intk=int(klucz[i%dlugosc_klucza]);
nowy_kod=(intz+intk); // TUTAJ tworzę SUMĘ kodów
haslo+=char(nowy_kod);
}
return haslo;
}

 


6a.
bool czywystepuje(string tekst, string szukany)  // oddaje tylko info czy jest
{
int pozycja = tekst.find(szukany);
if(pozycja!=string::npos) return true;
else return false;
}

 


6b.
bool szukaj(string tekst, string szukany) // można przebudować do zwracani numeru pozycji
{
int pozycja = tekst.find(szukany);
if(pozycja!=string::npos) {cout << pozycja; return true;}
else return false;
}

 


7.
double napis(char *literki)
{
return atof(literki);
}

 


8.
transform(a.begin(), a.end(), a.begin(), ::toupper); //ew. ::tolower

 


9.
string wiersz_bezspacji(string wiersz)
{
string wiersz_bsp="";
for (int i=0;i<wiersz.length();i++)
if (wiersz[i]!=' ') {
wiersz_bsp+=wiersz[i];
}
return wiersz_bsp;
}

 


10. 
void tablica_ze_statystyka_liter(string wyraz, int wynik[])
{
int ascii, dl=wyraz.length();
char znak;
for (int i=0;i<dl;i++) {
znak=wyraz[i]; ascii=int(znak);
wynik[ascii]++;
}
}


11. ile razy napis b mieści się w napisie a
int ile(string a, string b){
int k=0, dla=a.length(), dlb=b.length();
string l="";
for (int j=0;j<dla-dlb+1;j++){
for (int i=0;i<dlb;i++) l+=a[j+i];
if (l==b) k++; l="";
}
return k;
}

void czestosc_wystepowania_zankow_w_tekscie(int znak[], string wyraz){
// znak - tablica przechowująca kody ASCII (0..122),
// wyraz - kolejne wyrazy z pliku
int dl=wyraz.length();
for (int i=0;i<dl;i++) znak[int(wyraz[i])]++;
}


=============== BLIKI DANYCH - PRZEGLĄDANIE
1.
//mamy liczbę i wyznaczamy najdłuższy ciąg cyfr nieparzystych w tej liczbie
int blokcn(int liczba)
{
int max=0, reszta;
int blok=0;
while (liczba!=0){
reszta=liczba%10;
if (reszta%2==1) blok++;
else 
if (blok>max) {
max=blok;
blok=0;
}
liczba/=10;
}
return max;
}

 


2.
//mamy liczbe i wyznaczamy najdłuższy ciąg konkretnej cyfry w tej liczbie
int blokjc(int liczba, int cyfra)
{
int max=0, reszta;
int blok=0;
while (liczba!=0){
reszta=liczba%10;
if (reszta==cyfra) blok++;
else if (blok>max) {max=blok;blok=0;
}
liczba/=10;
}
return max;
}

 


3.
//mamy jakiś napis i wyznaczamy najdłuższy ciąg konkretnego znaku w tym napisie
int blokjz(string napis, char cos)
{
int max=0, blok=0;
char znak;
int dlugosc=napis.length();
for (int i=0;i<dlugosc;i++){
znak=napis[i];
if (znak==cos) blok++;
else 
if (blok>max) {
max=blok;
blok=0;
}
}
if (blok>max) max=blok;
return max;
}

 


Zwracam ilość elementów rosnących w tablicy jednowymiarowej
int max_rosnacy(int g[], int n){
int maxl=1, maxf=1;
for (int i=0;i<n;i++)
if (g[i]<g[i+1]) maxl++;
else {
if (maxl>maxf) maxf=maxl;
maxl=1;
}
return maxf;
}

 


4.
// najdłuższy podciąg rosnący w jakiejś tablicy (jednowymiarowej)  (wywołanie podciag(wektor,n)) // 
void podciag(int wektor[], int n) 
{
int biez=0, max=0, start=0;
for (int i=1;i<n;i++) {
if (wektor[i-1] < wektor[i]) {// główne pytanie - czy rośnie!!
biez++;
if (biez >= max) {
max=biez;
start=i-biez+1; // zapamiętam gdzie początek najdłuższego rosnącego "podciągu"
}
} else biez=1;
}
for (int i=0;i<max;i++) { // 1. np. wyświetlam ów podciąg - wówczas fukcja void ciag()
cout<<wektor[start+i] << " ";
}
cout << endl << max; // ew. 2. pobieram wartość max - wówczas funkcja int ciag()
}

================= SORTOWANIA ==================

void sort_tablica_bąbelkowo(int tab[], int n){ // bez swap w miejse tablicy może być cokolwiek indeksowanego
int t;
for (int i=n;i>=0;i--)
      for (int j=0;j<i;j++)
            if (tab[j]>tab[j+1]) {t=tab[j];tab[j]=tab[j+1];tab[j+1]=t;}
}

void sortstringi(string t[], int ile){ //bąbelkowo sortowanie TABLICY napisów, ile - rozmiar tablicy
for (int j=ile;j>0;j--)
      for (int k=0;k<j;k++) if ((t[k]>t[k+1])) swap(t[k],t[k+1]);
}

===============================================

PONIŻEJ SORTOWANIA WBUDOWANE W C++
(konieczne dodatkowe biblioteki
#include <algorithm>
#include <cctype> // do zamiany literek na małe/duże


Ważne: Zmienna "elementow" to zmienna przechowująca ilość elementów, ważne aby była realna!!
jeśli ją wyznaczymy dynamicznie (np. podczas pobierania danych) to nie ma sensu deklaracja 
int elementow ... a do sortowania wtawiamy po prostu realną/zliczaną ilość elementów (liczb, napisów)

 
1. Sortowanie (po literkach) pojedynczych wyrazów/napisów
sort(napis.begin(),napis.end(),greater <char>()); // malejąco
sort(napis.begin(),napis.end()); // rosnąco

 


2. Sortowanie  z liczb
najpierw wyznaczamy ilość elementów w tablicy
int elementow = sizeof(tablica)/sizeof(tablica[0]);
... i teraz
sort(tablica,tablica+elementow,greater<int>()); // malejąco
sort(tablica,tablica+elementow) // rosnąco

 


3. Sortowanie wektora z napisów/zdań (prymitywnie - wg kodów ASCII)
int elementow = sizeof(tablica)/sizeof(tablica[0]);
sort(tablica,tablica+elementow,greater <string>()); // rosnąco
sort(tablica,tablica+elementow); // malejąco
--------------------------------------------------
Jeśli sortowanie ma odbywać się "alfabetycznie" należy wcześniej zamienić na na wielkie/małe litery....
for (i=0; i<elementow; i++) {
transform(tablica[i].begin(),tablica[i].end(),tablica[i].begin(),::toupper); // ew. tolower
}
... i dopiero wówczas zastosować funkcję sortowania!!