ADS logo Algoritmai ir duomenų struktūros

Atsiskaityti privalote iki paskutinės praktinės paskaitos.

Pasirinktinai atlikti vieną užduotį 3.1 arba 3.2:

3.1. užduotis.

Ekspertinė sistema.

  • Sukurti konsolinę programą, kuri gebėtų atspėti jūsų sugalvotą žodį laisvai pasirinkta tema.
  • Pavyzdžiui tema yra gyvūnai: Sistema užduodą klausimą ar šis gyvunas yra šiltakraujis? taip/ne, atsakome taip.
  • Sistema toliau klausia ar šis gyvūnas su plunksnomis? taip/ne, atsakome taip. Sistema atsako spėju: Gandras. taip/ne, atsakome ne.
  • Tada sistema paklausia, o koks tai gyvūnas? Įvedame savo atsakymą pvz: Gervė ir papildomą klausimą: Ar tas gyvūnas turi kuodą? Sistemos sąrašas yra papildomos nauju klausimu ir atsakymu. Sekantį kartą užduos papildomą klausimą, kurį mes nesenai įvedėme.

Užduoties palengvinimas žemiau rasite pateiktą pavyzdį Paskalio programavimo kalba.


type  el = record
      info : string;
      id, lid, rid : integer;
end;

var
  F : text;
  data : array[1..100] of el;
  data_length : integer;
  i: integer;
  
procedure load;
begin
  Assign(F,'duom.txt');  Reset(F);
  readln(f, data_length);
  for i:=1 to data_length do
    begin
      Readln(F,
               data[i].id,
               data[i].lid,//lid
               data[i].rid,
               data[i].info);
    end;
  Close(F);
end;

procedure save;
begin
  Assign(F,'duom.txt');  Rewrite(F);
  writeln(f, data_length);
  for i:=1 to data_length do
    begin
      writeln(F,
               data[i].id, ' ',
               data[i].lid, ' ',    //lid
               data[i].rid, ' ',      //rid
               data[i].info);
    end;
  Close(F);
end;

procedure pildysim(i:integer);
var kl,s:string;
begin
  writeln('O koks tavo teisingas atsakymas ? ');
  readln(s);
  writeln('Koks klausimas ? ');
  readln(kl);
  data_length := data_length + 1;
  with data[data_length] do
    begin
      id := data_length;
      lid := 0;
      rid := 0;
      info := data[i].info;
      data[i].rid := data_length;   //lid
    end;
  data_length := data_length + 1;
  with data[data_length] do
    begin
      id := data_length;
      lid := 0;
      rid := 0;
      info := s;
      data[i].lid := data_length; //rid
    end;
  data[i].info := kl;
  
  save;
end;


procedure zaidimas;
var i:integer;
    c:char;
begin
 i:=1;
 writeln(data[i].lid, ' ', data[i].rid);   // lid rid
 while (data[i].lid <> 0) and  (data[i].rid <> 0) do
    begin
      writeln(data[i].info);
      writeln('Taip/Ne?');
      readln(c);
      if upcase(c) = 'T' then
         i := data[i].lid //rid  lid
       else
         i := data[i].rid; //lid    rid
   end;
 writeln('Spëju: ' +data[i].info);
 writeln('Ar teisingai? Taip/Ne');
 readln(c);
 if upcase(c) = 'N' then
    pildysim(i);
end;


begin
  load;
  zaidimas;
  readln;
end.

Duomenų failas duom.txt

11
1 2 3 Ar turi uodegà?
2 4 5 Ar skraido?
3 0 0 Þmogus
4 6 7 Ar su plunksnom?
5 9 8 Ar duoda pienà?
6 0 0 Paukðtis
7 0 0 Ðikðnosparnis
8 11 10 Ar gyvena Dziunglese ?
9 0 0 Karve
10 0 0 Ðuo
11 0 0 Driezas

3.2. užduotis.

Tikslas sukurti unikalią momentinę loteriją arba pasirinkti iš esamų momentinių loterijų, kurių taisykles privalote sugalvoti patys arba surasti medžiaga internete jau egzistuojančių momentinių loterijų.

  • Atkreipti dėmesį į esamų loterijų taisykles ir prizinį fondą, nuo kurio ir priklausys laimėjimai.
  • Turi būti galimybė žaisti: įsygyti bilietą/-us, nutrinti (užtenka išvesti pranešimą, kad bilietas yra trinamas), kaupti statistiką apie laimėjimus ir pan.
  • Bilietų rezultatus išvesti HTML formatu naršyklėje.
  • Sukurti momentinės loterijos šabloną, kurį atvaizduosite HTML formatu pvz:

bilietas

Studento atliktas Loterijos algoritmo C++ kalba pavyzdys.


#include <iostream>
#include <fstream>
#include <stdio.h>
#include <cstdlib>
using namespace std;

int pasirinkimas /* meniu pasirinkimas */;

// Þaidëjas:

int zPinigai = 3000 /* zaidejo pradiniai pinigai */, zBilietai /* zaidejo bilietai */;

// Loterija

int pinigai = 3000 /* loterijos fondas */, bilietai = 1000 /* biudzeto bilietai */, bilSuma /* bilieto skaiciu suma*/;
int Bilietas[3][3];
int kiekBuvoLaimingu[5] = {0};
bool arLaimingas = false;

void Meniu();
void Pirkimas();
void Tikrinimas();
void SugeneruotiBilieta();
void Statistika();
void IrasytiLaimejima(int lotNR);

int main()
{
    printf("Loterijos fonda sudaro 1000 bilietu ir 3000 EU. bilieta sudaro atsitiktiniai skaiciai nuo 1 iki 9, kurie\n");
    printf("yra sugeneruojami i tris eilutes ir tris stulpelius. Zaidejas, turintis bilieta dalyvauja dvejose zaidimuose:\n\n");
    printf("\tPagrindinis zaidimas (kombinacijos):\n");
    printf("\t\tPagrindine istrizaine, prizas: 500 EU.\n");
    printf("\t\tSalutine istrizaine, prizas: 250 EU.\n");
    printf("\t\tVidurine eilute, prizas: 100 EU.\n");
    printf("\t\tVidurinis stulpelis, prizas: 100 EU.\n\n");
    printf("\tPapildomas zaidimas (skaiciu suma):\n");
    printf("\t\tBiliete esanciu skaiciu suma didesne nei 60, prizas: 10 EU.\n");
    printf("\t\tBiliete esanciu skaiciu suma didesne nei 50, prizas: 5 EU.\n\n");
    printf("\tLaimingu bilietu tikimybes (1000 bilietu):\n");
    printf("\t\t0-1 - pagrindine istrizaine\n");
    printf("\t\t0-2 - salutine istrizaine\n");
    printf("\t\t0-3 - vidurine eilute\n");
    printf("\t\t0-3 - vidurinis stulpelis\n");
    printf("\t\t0-50 - biliete esanciu skaiciu suma didesne nei 60\n");
    printf("\t\t0-60 - biliete esanciu skaiciu suma didesne nei 50\n\n");
    Meniu();
    return 0;
}

void Meniu()
{
    cout << "Isrinkite norima punkta:" << endl;
    cout << "0 - Baigti loterija" << endl;
    cout << "1 - Nusipirkti bilieta(-us)" << endl;
    cout << "2 - Nutrinti bilieta(-us)" << endl;
    cout << "3 - Zaidimo statistika" << endl;
    cin >> pasirinkimas;

    switch(pasirinkimas)
    {
        case 0: break;
        case 1: Pirkimas(); break;
        case 2: Tikrinimas(); break;
        case 3: Statistika(); break;
    }
}

void Pirkimas()
{
    cout << "Jus turite " << zPinigai << " EU." << endl;
    cout << "Vieno bilieto kaina - 3 EU." << endl;
    cout << "Iveskite, kiek pirksite bilietu (daugiausiai 1000):" << endl;
    cin >> pasirinkimas;

    if(pasirinkimas > zPinigai) cout << "Jus neturite tiek pinigu" << endl, Meniu();
    zBilietai += pasirinkimas;
    bilietai -= zBilietai;
    zPinigai -= pasirinkimas;
    pinigai += pasirinkimas * 3;
    cout << "Nusipirkote " << pasirinkimas << " bilietu" << endl;
    Meniu();
}

void Tikrinimas()
{
    if(zBilietai == 0) cout << "Jus neturite bilietu" << endl, Meniu();
    cout << "=====" << endl;
    for(int i=1 ; i <= zBilietai ; i++)
    {
        SugeneruotiBilieta();
        cout << "-----" << endl;
        cout << "Pagrindinis zaidimas (kombinacijos):" << endl;
        if(Bilietas[1][1] == Bilietas[2][2] && Bilietas[1][1] == Bilietas[3][3]) // Pagrindine istrizaine
        {
            if(kiekBuvoLaimingu[0] > 0)
            {
                cout << "Deja, bet bilietas neatitiko jokios kombinacijos, taciau jus turite galimybe laimeti papildomoje loterijoje" << endl, cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                cout << "-----" << endl;
                cout << "Papildomas zaidimas (skaiciu suma):" << endl;
                cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                continue;
            }
            cout << "Pagrindine istrizaine, jusu laimejimas - 500 EU." << endl;
            pinigai -= 500;
            zPinigai += 500;
            arLaimingas = true;
            kiekBuvoLaimingu[0] ++;
            IrasytiLaimejima(1);
        }
        if(Bilietas[3][1] == Bilietas[2][2] && Bilietas[3][1] == Bilietas[1][3]) // Salutine istrizaine
        {
            if(kiekBuvoLaimingu[1] > 2)
            {
                cout << "Deja, bet bilietas neatitiko jokios kombinacijos, taciau jus turite galimybe laimeti papildomoje loterijoje" << endl, cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                cout << "-----" << endl;
                cout << "Papildomas zaidimas (skaiciu suma):" << endl;
                cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                continue;
            }
            cout << "Salutine istrizaine, jusu laimejimas - 250 EU." << endl;
            pinigai -= 250;
            zPinigai += 250;
            arLaimingas = true;
            kiekBuvoLaimingu[1] ++;
            IrasytiLaimejima(2);
        }
        if(Bilietas[2][1] == Bilietas[2][2] && Bilietas[2][1] == Bilietas[2][3]) // Vidurine eilute
        {
            if(kiekBuvoLaimingu[2] > 3)
            {
                cout << "Deja, bet bilietas neatitiko jokios kombinacijos, taciau jus turite galimybe laimeti papildomoje loterijoje" << endl, cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                cout << "-----" << endl;
                cout << "Papildomas zaidimas (skaiciu suma):" << endl;
                cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                continue;
            }
            cout << "Vidurine eilute, jusu laimejimas - 100 EU." << endl;
            pinigai -= 100;
            zPinigai += 100;
            arLaimingas = true;
            kiekBuvoLaimingu[2] ++;
            IrasytiLaimejima(3);
        }
        if(Bilietas[1][2] == Bilietas[2][2] && Bilietas[1][2] == Bilietas[3][2]) // Vidurinis stulpelis
        {
            if(kiekBuvoLaimingu[3] > 3)
            {
                cout << "Deja, bet bilietas neatitiko jokios kombinacijos, taciau jus turite galimybe laimeti papildomoje loterijoje" << endl, cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                cout << "-----" << endl;
                cout << "Papildomas zaidimas (skaiciu suma):" << endl;
                cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                continue;
            }
            cout << "Vidurinis stulpelis, jusu laimejimas - 100 EU." << endl;
            pinigai -= 100;
            zPinigai += 100;
            arLaimingas = true;
            kiekBuvoLaimingu[3] ++;
            IrasytiLaimejima(4);
        }
        if(!arLaimingas)
        {
            cout << "Deja, bet bilietas neatitiko jokios kombinacijos, taciau jus turite galimybe laimeti papildomoje loterijoje" << endl;
        }
        cout << "-----" << endl;
        cout << "Papildomas zaidimas (skaiciu suma):" << endl;
        if(bilSuma >= 60)
        {
            if(kiekBuvoLaimingu[4] > 50)
            {
                cout << "Deja, bet bilietas neatitiko jokios kombinacijos, taciau jus turite galimybe laimeti papildomoje loterijoje" << endl, cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                cout << "-----" << endl;
                cout << "Papildomas zaidimas (skaiciu suma):" << endl;
                cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                continue;
            }
            cout << "Jusu tureto bilieto skaiciu suma didesne nei 60, laimejote 10 EU." << endl;
            pinigai -= 10;
            zPinigai += 10;
            kiekBuvoLaimingu[4] ++;
            IrasytiLaimejima(5);
        }
        else if(bilSuma >= 50)
        {
            if(kiekBuvoLaimingu[5] > 60)
            {
                cout << "Deja, bet bilietas neatitiko jokios kombinacijos, taciau jus turite galimybe laimeti papildomoje loterijoje" << endl, cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                cout << "-----" << endl;
                cout << "Papildomas zaidimas (skaiciu suma):" << endl;
                cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
                continue;
            }
            cout << "Jusu tureto bilieto skaiciu suma didesne nei 50, laimejote 5 EU." << endl;
            pinigai -= 5;
            zPinigai += 5;
            kiekBuvoLaimingu[5] ++;
            IrasytiLaimejima(6);
        }
        else
        {
            cout << "Deja, bet bilietas nebuvo laimingas ir papildomame zaidime" << endl;
        }
        cout << "=====" << endl;
        cout << endl;
    }
    Meniu();
}

void SugeneruotiBilieta()
{
    bilSuma = 0;
    for(int i=1 ; i <= 3 ; i++)
    {
        for(int j=1 ; j <= 3 ; j++)
        {
            Bilietas[i][j] = rand() % 9 + 1;
            cout << Bilietas[i][j] << " ";
            bilSuma += Bilietas[i][j];
        }
        cout << endl;
    }
    arLaimingas = false;
    //Bilietas[1][2] = 2, Bilietas[2][2] = 2, Bilietas[3][2] = 2;
}

void Statistika()
{
    cout << "Fonde yra bilietu: " << bilietai << " vnt." << endl;
    cout << "Fonde yra pinigu: " << pinigai << " EU." << endl;
    Meniu();
}

void IrasytiLaimejima(int lotNR)
{
    ofstream fr("laimejimai.txt", ios::app);
    switch(lotNR)
    {
        case 1: fr << "Nutrintas bilietas, kuris turejo pagrindine istrizaine. Zaidejas laimi 500 EU. Dabar fonde: " << pinigai << " EU." << endl; break;
        case 2: fr << "Nutrintas bilietas, kuris turejo salutine istrizaine. Zaidejas laimi 250 EU. Dabar fonde: " << pinigai << " EU." << endl; break;
        case 3: fr << "Nutrintas bilietas, kuris turejo vidurine eilute. Zaidejas laimi 100 EU. Dabar fonde: " << pinigai << " EU." << endl; break;
        case 4: fr << "Nutrintas bilietas, kuris turejo vidurini stulpeli. Zaidejas laimi 100 EU. Dabar fonde: " << pinigai << " EU." << endl; break;
        case 5: fr << "Nutrintas bilietas, kuris turejo skaiciu suma didesne nei 60. Zaidejas laimi 10 EU. Dabar fonde: " << pinigai << " EU." << endl; break;
        case 6: fr << "Nutrintas bilietas, kuris turejo skaiciu suma didesne nei 50. Zaidejas laimi 5 EU. Dabar fonde: " << pinigai << " EU." << endl; break;
    }
    fr.close();
}

Tekstinio dokumento laimejimai.txt turinys.


Nutrintas bilietas, kuris turejo skaiciu suma didesne nei 50. Zaidejas laimi 5 EU. Dabar fonde: 3025 EU.
Nutrintas bilietas, kuris turejo skaiciu suma didesne nei 60. Zaidejas laimi 10 EU. Dabar fonde: 3015 EU.
Nutrintas bilietas, kuris turejo skaiciu suma didesne nei 50. Zaidejas laimi 5 EU. Dabar fonde: 3004 EU.
Nutrintas bilietas, kuris turejo skaiciu suma didesne nei 60. Zaidejas laimi 10 EU. Dabar fonde: 2994 EU.