Programavimo pamokėlės

pamokelesm

Mokymų ciklas „Programavimo pamokėlės" skirtos visiems, kurie nori išmokti programuoti.

IT galvosūkiai

itgalvosukiai

Konkurso tikslas – skatinti moksleivius domėtis IT sprendžiant įvairiausius galvosūkius.

Informikas

informikasm

Konkurso tikslas – supažindinti moksleivius su menu informacinėse technologijose ir mūsų talismanu.

Dr. J. P. Kazicko konkursai

kkonkursai

Žemaitijos, Aukštaitijos, Suvalkijos ir Dzūkijos regionuose vykdomas IT konkursas.

       

Ieškodami didžiausios reikšmės naudosime funkciją, kuri suranda didžiausios masyvo A(n) reikšmės vietą masyve:

int Didziausias(int A[], int n)
{
  int vieta = 0;
  for (int i = 1; i < n; i++)
    if (A[i] > A[vieta])
      vieta = i;
  return vieta;
}

 

Analogiškai užrašoma funkcija, randanti mažiausios masyvo A(n) reikšmės vietą masyve:

int Maziausias(int A[], int n)
{
  int vieta = 0;
  for (int i = 1; i < n; i++)
    if (A[i] < A[vieta])
      vieta = i;
  return vieta;

 

Išnagrinėkime pavyzdį:

 

Šeima rengiasi pirkti kokybiškus svetainės baldus. Internete šeima išrinko n baldų komplektų ir surašė duomenis apie juos: pagaminimo metai, kėdžių skaičius, baldų pardavimo kaina ir išlaidos baldų komplekto atnaujinimui ir priežiūrai.

Parenkite programą, kuri išrinktų šeimai tinkamiausių baldų komplektų duomenis:

·         naujausio baldų komplekto;

·         baldų komplekto, turinčio daugiausiai kėdžių;

·         baldų komplekto, kainuojančio pigiausiai;

·         baldų komplekto, kurio atnaujinimas ir priežiūra kainuoja mažiausiai.

Pradinių duomenų faile Duomenys.txt:

  • pirmoje eilutėje įrašytas šeimos pasirinktų baldų komplektų skaičius n;
  • tolesnėse n eilučių surašyti duomenys apie baldų komplektus: pagaminimo metai, kėdžių skaičius, baldų komplekto pardavimo kaina ir išlaidos baldų komplekto atnaujinimui ir priežiūrai.

Rezultatų faile Rezultatai.txt turi būti įrašyti atskirose eilutėse išrinktų baldų komplektų duomenys:

  • naujausio baldų komplekto;
  • baldų komplekto, turinčio daugiausiai kėdžių;
  • baldų komplekto, kainuojančio pigiausiai;
  • baldų komplekto, kurio atnaujinimas ir priežiūra kainuoja mažiausiai.

Jei yra keli tokie baldų komplektai, tai turi būti surašyti visų jų duomenys atskirose eilutėse.

Reikalavimai programai:

  • naudokite sveikųjų ir realiųjų skaičių masyvus;
  • sukurkite pradinių duomenų skaitymo procedūrą (funkciją void C++);
  • sukurkite didžiausios reikšmės paieškos funkciją. Ją panaudokite ieškodami naujausio ir daugiausiai kėdžių turinčio baldų komplekto;
  • sukurkite mažiausios reikšmės paieškos funkciją. Ją panaudokite ieškodami pigiausio baldų komplekto ir baldų komplekto, kurio atnaujinimas ir priežiūra kainuoja mažiausiai;
  • sukurkite rezultatų rašymo į failą procedūrą (funkciją void C++).

Pradiniai duomenys

Rezultatai

4

2008 5 2000.00 400.25

2010 5 4000.00 320.25

2009 9 3385.00 254.45

2008 6 1900.00 612.59

2010 5 4000.00 320.25

2009 9 3385.00 254.45

2008 6 1900.00 612.59

2009 9 3385.00 254.45

 

// Baldai
#include <fstream>
#include <iomanip>
#include <iostream>
using namespace std;
const char CDfv[] = "Duomenys.txt";
const char CRfv[] = "Rezultatai.txt";
//---------------------------------------------
void Skaitymas(int B[], int K[], double KP[], double KI[], int & n);
int Didziausias(int X[], int n);
int Maziausias(double X[], int n);
void Rasymas(int B[], int K[], double KP[], double KI[], int  n);
//---------------------------------------------
int main ()
{
  int n;
  int B[100], K[100];
  double KP[100], KI[100];
  Skaitymas(B, K, KP, KI, n);
  Rasymas(B, K, KP, KI, n);
  return 0;
}
//---------------------------------------------
void Skaitymas(int B[], int K[], double KP[], double KI[], int & n) {
    ifstream fd(CDfv);
    fd >> n;
    for (int i = 0; i < n; i++){
      fd >> B[i] >> K[i] >> KP[i] >> KI[i];
    }
   fd.close();
}
//---------------------------------------------
int Didziausias(int X[], int n) {
   int m = 0;
   for (int i = 0; i < n; i++)
     if (X[i] > X[m]) m = i;
   return m;
}
//---------------------------------------------
int Maziausias(double X[], int n) {
   int m = 0;
   for (int i = 0; i < n; i++)
     if (X[i] < X[m]) m = i;
   return m;
}
//---------------------------------------------
void Rasymas(int B[], int K[], double KP[], double KI[], int  n) {
   ofstream fr(CRfv);
   int mm;
   mm = Didziausias(B, n);
   for (int i = 0; i < n; i++)
     if (B[i] == B[mm])
        fr << B[i] << " " << K[i] << " " << fixed << setprecision(2) << KP[i] << " "  
           << KI[i] << endl;
   mm = Didziausias(K, n);
   for (int i = 0; i < n; i++)
     if (K[i] == K[mm])
        fr << B[i] << " " << K[i] << " " << fixed << setprecision(2) << KP[i] << " "
           << KI[i] << endl;
   mm = Maziausias(KP, n);
   for (int i = 0; i < n; i++)
     if (KP[i] == KP[mm])
        fr << B[i] << " " << K[i] << " " << fixed << setprecision(2) << KP[i] << " "
           << KI[i] << endl;
   mm = Maziausias(KI, n);
   for (int i = 0; i < n; i++)
     if (KI[i] == KI[mm])
        fr << B[i] << " " << K[i] << " " << fixed << setprecision(2) << KP[i] << " "
           << KI[i] << endl;
   fr.close();
}

 

Jei iš masyvo A(n) turime pašalinti k-tąjį elementą, rašome void funkciją Salinti:

void Salinti(int A[], int & n, int k)
{
   for (int i = k; i < n - 1; i++)
     A[i] = A[i+1];
   n = n - 1;

 

Išnagrinėkime pavyzdį, iliustruojantį, kaip iš masyve ieškoma reikiamų elementų ir jie pašalinami.

Džinsų parduotuvėje vyksta išpardavimas. Apie tai sužinoję Violeta ir Vidas ir nusprendė įsigyti madingus džinsus. Violeta dėvi  29, o Vidas 35 dydžio džinsus. Parašysime programą, kuri nustatys, ar parduotuvėje yra Violetos ir Vido pageidaujamo tipo reikalingo dydžio džinsai, ir jei džinsai yra, jie turės būti pašalinti iš parduotuvės prekių sąrašo.

Pirmoje pradinių duomenų failo eilutėje įrašytas parduotuvėje esančių džinsų skaičius. Kiekvienoje kitoje eilutėje įrašytas džinsų tipas (m – moteriški, v – vyriški) ir nurodytas džinsų dydis (sveikasis skaičius), atskirti tarpais.


Rezultatų faile lentele turi būti nurodytas pradinis ir galutinis džinsų asortimentas.

Pradiniai duomenys

Rezultatai

11

v 36

v 35

v 34

m 28

m 29

v 33

m 29

m 27

v 34

m 36

v 39

Pradinis džinsų asortimentas

--------------

 Tipas Dydis

--------------

   v     36

   v     35

   v     34

   m     28

   m     29

   v     33

   m     29

   m     27

   v     34

   m     36

   v     39

--------------

Galutinis džinsų asortimentas

--------------

 Tipas Dydis

--------------

   v     36

   v     34

   m     28

   m     29

   v     33

   m     27

   v     34

   m     36

 

// Džinsai
#include <fstream>
#include <iomanip>
#include <iostream>
#include <cmath>
using namespace std;
const char CDfv[] = "Duomenys1.txt";
const char CRfv[] = "Rezultatai1.txt";
const int CMax    = 100;
//-------------------------------------------------------------------
void Skaityti(const char fv[], char A[], int B[], int & n);
void Spausdinti(const char fv[], char A[], int B[], int n, string koks);
int IeskotiDzinsu(char A[], int B[], int n, char tp, int dd);
void SalintiDzinsus(char A[], int B[], int & n, int ind);
//-------------------------------------------------------------------
int main()
{
  char T[CMax];
  int D[CMax];
  int n;
  int dzind;
  string koks;
  ofstream fr;
  Skaityti(CDfv, T, D, n);
  fr.open(CRfv);
  fr.close();
  koks = "Pradinis džinsų asortimentas";
  Spausdinti(CRfv, T, D, n, koks);
  fr.open(CRfv, ios::app);
  dzind = IeskotiDzinsu(T, D, n, 'v', 35);
  if (dzind >= 0) SalintiDzinsus(T, D, n, dzind);
  else fr << "Parduotuvėje Vido 35 dydžio džinsų nebuvo" << endl;
  dzind = IeskotiDzinsu(T, D, n, 'm', 29);
  if (dzind >= 0) SalintiDzinsus(T, D, n, dzind);
  else fr << "Parduotuvėje Violetos 29 dydžio džinsų nebuvo" << endl;
  koks = "Galutinis džinsų asortimentas";
  Spausdinti(CRfv, T, D, n, koks);
  fr.close();
  return 0;
}
//-------------------------------------------------------------------
void Skaityti(const char fv[], char A[], int B[], int & n)
{
  ifstream fd(fv);
  fd >> n;
  for (int i = 0; i < n; i++)
  fd >> A[i] >> B[i];
  fd.close();
}
//-------------------------------------------------------------------
void Spausdinti(const char fv[], char A[], int B[], int n, string koks)
{
  ofstream fr(fv, ios::app);
  fr << koks << endl;
  fr << "--------------" << endl;
  fr << " Tipas Dydis " << endl;
  fr << "--------------" << endl;
  for (int i = 0; i < n; i++)
    fr << setw(4) << A[i] << "     " << setw(2) << B[i] << endl;
  fr << "--------------" << endl;
  fr.close();
}
//-------------------------------------------------------------------
int IeskotiDzinsu(char A[], int B[], int n, char tp, int dd)
{
  int ind = -1;
  for (int i = 0; i < n; i++)
    if ((A[i] == tp) && (B[i] == dd))
      ind = i;
  return ind;
}
//-------------------------------------------------------------------
void SalintiDzinsus(char A[], int B[], int & n, int ind)
{
  for (int i = ind; i < n-1; i++) {
    A[i] = A[i+1];
    B[i] = B[i+1];
  }
n--;
}
//-------------------------------------------------------------------

Jei į masyvą A(n) k-toje vietoje norime įterpti naują reikšmę b, rašome void funkciją Iterpti:

void Iterpti(int A[], int & n, int k, int b)
{
   for (int i = n; i > k; i--)
     A[i] = A[i-1];
   n = n + 1;
   A[k] = b;
}

Išnagrinėkime pavyzdį, iliustruojantį, kaip į masyvą įterpiamos naujos reikšmės:

Monetų kolekcionierius savo kolekciją išdėstęs monetų nominalų didėjimo tvarka. Išdėstyta kolekcija įrašyta pirmame pradinių duomenų faile: pirmoje eilutėje įrašytas kolekcijos monetų skaičius, antroje – monetos, išdėstytos nominalų didėjimo tvarka, viena nuo kitos atskirtos tarpais. Kolekcionierius aukcione įsigijo m monetų. Duomenys apie įsigytas monetas įrašytos kitame duomenų faile: pirmoje failo eilutėje įrašytas įsigytų monetų skaičius, antroje – įsigytų monetų nominalai, išdėstyti bet kuria tvarka. Parengsime programą, kuri papildytų kolekciją naujai įsigytomis monetomis, išlaikant monetų išsidėstymą nominalų didėjimo tvarka.

Pradiniai duomenys

Rezultatai

8

1 1 2 5 5 5 10 10

1 1 1 2 2 5 5 5 5 10 10 10 20

5

2 1 10 20 5

// Kolekcija
#include <fstream>
#include <iomanip>
#include <iostream>
#include <cmath>
using namespace std;
const char CDfv[] = "Duomenys2.txt";
const char CD1fv[] = "Duomenys2_1.txt";
const char CRfv[] = "Rezultatai2.txt";
const int CMax    = 1000;
//-------------------------------------------------------------------
void Skaityti(const char fv[], int A[], int & n);
void Spausdinti(const char fv[], int A[], int n);
int IeskotiKur (int A[], int n, int k);
void IterptiSkaiciu(int A[], int & n, int sk, int ind);
//-------------------------------------------------------------------
int main()
{
  int D[CMax]; int kur;
  int n; int gr; int k;
  Skaityti(CDfv, D, n);
  ifstream fd(CD1fv);
  fd >> gr;
  for (int i = 1; i <= gr; i++){
    fd >> k;
    kur = IeskotiKur(D, n, k);
    IterptiSkaiciu(D, n, k, kur);
  }
  fd.close();
  ofstream fr;
  fr.open(CRfv); fr.close();
  Spausdinti(CRfv, D, n);
  fr.close();
  return 0;
}
//-------------------------------------------------------------------
// Skaito duomenis iš failo fv į masyvą A(n)
void Skaityti(const char fv[], int A[], int & n)
{
  ifstream fd(fv);
  fd >> n;
  for (int i = 0; i < n; i++)
    fd >> A[i];
  fd.close();
}
 
//-------------------------------------------------------------------
void Spausdinti(const char fv[], int A[], int n)
{
  ofstream fr(fv, ios::app);
  for (int i = 0; i < n; i++)
    fr << A[i] << " ";
  fr << endl;
}
//-------------------------------------------------------------------
int IeskotiKur (int A[], int n, int k){
  int i = 0;
  while ((i < n) && (A[i] < k)) i++;
  return i;
}
//-------------------------------------------------------------------
void IterptiSkaiciu(int A[], int & n, int sk, int ind)
{
  for (int i = n-1; i >= ind; i--)
    A[i+1] = A[i];
  A[ind] = sk;
  n++;
}
//-------------------------------------------------------------------
Į viršų