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.

       

Masyvas – viena pagrindinių duomenų struktūrų, naudojamų programavimo kalbose. Ši struktūra leidžia laikyti atmintyje vienu vardu daug to paties tipo reikšmių. Pavyzdžiui, žinomos šeimos kiekvienos mėnesio dienos išlaidos. Reikia apskaičiuoti viso mėnesio išlaidas. Rašant programą, iš anksto nežinoma, kelias dienas per mėnesį šeima lankėsi parduotuvėse. Todėl negalima iš anksto numatyti, kiek kintamųjų reikės išlaidoms saugoti. Be to, naudojant išlaidoms skirtingus kintamuosius, programa bus gremėzdiška ir neuniversali (apdorojant kito mėnesio duomenis programą reikės taisyti).

Aprašant masyvą, nurodomas elementų reikšmių tipas, vardas ir dydis.

Naudojantis masyvu, reikia prisiminti, kad:

  • visos masyvo reikšmės yra to paties tipo;
  • norint reikšmę įrašyti į masyvą, arba paimti iš jo, reikia nurodyti reikšmės masyve eilės numerį, vadinamą indeksu. Indeksas rašomas už masyvo vardo laužtiniuose skliaustuose;
  • masyvų elementai vadinami indeksuotaisiais kintamaisiais. Reiškiniuose ir kitose duomenų struktūrose naudojami taip pat, kaip ir paprasti kintamieji;
  • elemento indeksas gali būti sveikasis skaičius, sveikojo tipo kintamasis, arba reiškinys, kurio rezultatas yra sveikasis skaičius. C++ programavimo kalboje elementai dažniausiai pradedami numeruoti nuo nulio;
  • masyve galima laikyti ne daugiau reikšmių, negu nurodyta jo apraše;
  • programoje gali būti aprašyti ir naudojami skirtingo dydžio ir tipo masyvai. Jų vardai turi būti skirtingi.

 

Išnagrinėsime pavyzdį:

Renkama statistika apie vieną dieną autobusais važiavusius žmones: kiek suaugusiųjų ir kiek vaikų važiavo to maršruto autobusu ir kiek kainavo bilietas suaugusiam ir vaikui. Reikia parengti programą, kuri skaičiuotų, kiek iš viso žmonių važiavo kiekvieno maršruto autobusu ir kokią sumą kainavo kiekvieno maršruto keleivių bilietai.

Pradinių duomenų failo Duomenys.txt pirmoje eilutėje įrašytas maršrutų skaičius n (1 < n < 100) , tolesnėse n eilučių įrašyta po 2 sveikuosius skaičius: suaugusių ir vaikų skaičius, kurie važiavo to maršruto autobusu, ir po 2 realiuosius skaičius – kokios yra suaugusiojo ir vaikiško bilieto kainos.

Rezultatų faile Rezultatai.txt turi būti įrašytas bendras maršrutu vykstančių keleivių skaičius ir bendra maršruto keleivių bilietų kaina. Vienam maršrutui skiriama viena eilutė.

Duomenys.txt

Rezultatai.txt

4

2 2 147.00 80.15

1 2 163.00 95.50

2 1 147.00 80.15

1 1 163.00 95.50

4 454.30

3 354.00

3 374.15

2 258.50

Kurdami programą naudosime sveikųjų skaičių masyvą ZS, kuriame bus laikomi kiekvieno maršruto keleivių skaičiai ir realiųjų skaičių masyvą KK, kuriame bus laikomos maršruto keleivių bilietų kaina. Rašydami programą sukursime pradinių duomenų skaitymo funkciją Skaitymas ir rezultatų įrašymo į failą funkciją Rasymas.

// Keleiviai
#include <fstream>
#include <iomanip>
using namespace std;
const char CDfv[] = "Duomenys.txt";
const char CRfv[] = "Rezultatai.txt";
//---------------------------------------------
void Skaitymas(int ZS[], double KK[], int & n);
void Rasymas(int ZS[], double KK[], int n);
//---------------------------------------------
int main ()
{
  int  n;          // maršrutų skaičius
  int ZS[100];     // keliaujančių žmonių skaičiaus masyvas
  double KK[100];  // maršruto kelionės kainos masyvas
  Skaitymas(ZS, KK, n);
  Rasymas(ZS, KK, n);
  return 0;
}
//---------------------------------------------
void Skaitymas(int ZS[], double KK[], int & n) {
    int s, v;
    double sk, vk;
    ifstream fd(CDfv);
    fd >> n;
    for (int i = 0; i < n; i++){
       fd >> s >> v >> sk >> vk;
       ZS[i] = s + v;
       KK[i] = s * sk + v * vk;
    }
   fd.close();
}
//---------------------------------------------
void Rasymas(int ZS[], double KK[], int n) {
   ofstream fr(CRfv);
   for (int i = 0; i < n; i++)
       fr << ZS[i] << " " << fixed << setprecision(2) << KK[i] << endl;
   fr.close();
}

Modifikuosime sukurtą programą, kad ji skaičiuotų autobusais važiavusių vaikų ir suaugusiųjų skaičių ir vaikų bei suaugusiųjų bilietų kainą ir vidutinę vaiko ir suaugusiojo bilieto kainą.

// Keleiviai
#include 
#include 
#include 
using namespace std;
const char CDfv[] = "Duomenys.txt";
const char CRfv[] = "Rezultatai.txt";
//---------------------------------------------
void Skaitymas(int S[], int V[], double SK[], double VK[], int & n);
int Kiekis(int X[], int n);
double Kaina(int X[], double Y[], int n);
void Rasymas(int ss, int vs, double sk, double vk, double skv, double vkv);
//---------------------------------------------
int main ()
{
  int S[100], V[100];
  double SK[100], VK[100];
  int n;
  int ss, vs;
  double sk, vk, skv, vkv;
  Skaitymas(S, V, SK, VK, n);
  ss = Kiekis(S, n);
  vs = Kiekis(V, n);
  sk = Kaina(S, SK, n);
  vk = Kaina(V, VK, n);
  if (ss != 0) skv = sk / ss;
  else skv = 0;
  if (vs != 0) vkv = vk / vs;
  else vkv = 0;
  Rasymas(ss, vs, sk, vk, skv, vkv);
  return 0;
}
//---------------------------------------------
void Skaitymas(int S[], int V[], double SK[], double VK[], int & n) {
    ifstream fd(CDfv);
    fd >> n;
    for (int i = 0; i < n; i++){
      fd >> S[i] >> V[i] >> SK[i] >> VK[i];
    }
   fd.close();
}
//---------------------------------------------
int Kiekis(int X[], int n) {
   int k = 0;
   for (int i = 0; i < n; i++)
     k = k + X[i];
   return k;
}
//---------------------------------------------
double Kaina(int X[], double Y[], int n) {
   double s = 0;
   for (int i = 0; i < n; i++)
     s = s + X[i] * Y[i];
   return s;
}
//---------------------------------------------
void Rasymas(int ss, int vs, double sk, double vk, double skv, double vkv){
   ofstream fr(CRfv);
   fr << ss << " " << vs << endl;
   fr << fixed << setprecision(2) << sk << " " << vk << endl;
   fr << skv << " " << vkv << endl;
   fr.close();
}

Išnagrinėkite funkcijas Kiekis ir Kaina, į kurias pagrindinėje programoje kreipiamasi po 2 kartus: skaičiuojant suaugusiųjų ir vaikų skaičius (Kiekis) ir kokias pinigų sumas kainavo vaikų ir suaugusiųjų bilietai (Kaina).

Į viršų