Skip to content

Specifikācija

🔸 Ziemas krājumu veidošana

Problēmsituācija

Šogad bijusi ļoti laba ābolu raža. Vecvecāki gatavojas vārīt ievārījumu, bet viņi gribētu aprēķināt un izplānot ievārījuma izmaksas.

Omes formulējums

Tik daudz ābolu un ogu! Un visādas jaunas receptes atradu! Naudas cukuram gan ir tik, cik ir. Palīdzi, lūdzu, sarēķināt cik mēs varam savārīt.

Specifikācija

Funkcijai jāaprēķina cik izmaksās ābolu ievārījums

  • Nepieciešama iespēja definēt recepti un tās sastāvdaļas
  • Nepieciešama iespēja definēt, cik maksā katra sastāvdaļa
  • Sistēmai jāaprēķina kopējās ievārījuma izmaksas, balstoties uz ievadīto ābolu apjomu
Programmas kods
def ievarijums(aboli_svars, cukurs_uz_kg):
    cukura_cena = 0.75
    izmaksa_kg = cukura_cena * cukurs_uz_kg
    return izmaksa_kg * aboli_svars

aboli = 1.5
cukurs = 0.7
print("Uz {} kg ābolu izmaksas būs {} EUR".format(aboli, ievarijums(aboli, cukurs)))
def izmaksas_receptei(recepte, cena):
    summa = 0
    for sastavdala, daudzums in recepte:
        summa += daudzums * cena[sastavdala]
    return summa

def izmaksas_kopa(abolu_svars):
    recepte = {"cukurs": 0.6, "kanelis": 0.08, "aboli": 2.0, "udens": 0.2}
    cenas = {"cukurs": 0.75, "kanelis": 30.0, "aboli": 0.0, "udens": 0.0}
    izmaksas_kg = izmaksas_receptei(recepte, cenas) / recepte["aboli"]
    return abolu_svars * izmaksas_kg

aboli = 1.5
print("Uz {} kg ābolu izmaksas būs {} EUR".format(aboli, izmaksas_kopa(aboli)))

aboli = 5
print("Uz {} kg ābolu izmaksas būs {} EUR".format(aboli, izmaksas_kopa(aboli)))
function izmaksas_receptei(recepte, cenas) {
    let summa = 0
    for (const [sastavdala, daudzums] of Object.entries(recepte)) {
        summa = summa + (cenas[sastavdala] || 0) * daudzums
    }
    return Math.round(summa * 100) / 100
}

function izmaksas_kopa(abolu_svars) {
    const recepte = {"cukurs": 0.6, "kanelis": 0.08, "aboli": 2.0, "udens": 0.2}
    const cenas = {"cukurs": 0.75, "kanelis": 30.0, "aboli": 0.0, "udens": 0.0}
    const izmaksas_kg = izmaksas_receptei(recepte, cenas) / recepte["aboli"]
    return Math.round(izmaksas_kg * abolu_svars * 100) / 100
}

let aboli = 1.5
console.log(`Uz ${aboli} kg ābolu izmaksas būs ${izmaksas_kopa(aboli)} EUR`)

aboli = 5
console.log(`Uz ${aboli} kg ābolu izmaksas būs ${izmaksas_kopa(aboli)} EUR`)
Komentāri

Problēma ir aprakstīta pārāk vispārīgi, specifikācija nav pietiekosi detalizēta, bet var kalpot par pamatu diskusijai par nepieciešamo informāciju.

Lai varētu to atrisināt, būtu jānoskaidro daudz dažādas detaļas, piemēram:

  • kādas receptes ome lietos - kādā proporcijā tiek lietoti augļi un cukurs, kāds ir galarezultāts
  • kādas mērvienības ir minētas receptē, kā tas pārvērst SI mērvienībās, piemēram, ja minēti 6 vidēja izmēra āboli uz 100g cukura, kā to pārvērst gramos
  • ko tieši ome grib zināt, piemēram, kuru recepti ņemt, cik izmaksās cukurs noteiktam augļu daudzumam, cik ievārījuma iznāks izmantojot noteiktu daudzumu cukura

🔸 Grīdas maiņas izmaksu aprēķinu programma

Problēmsituācija

Pasūtītājs Andris Ziediņš, remontē dzīvokļus un sagatavo tāmes. Andra draugs, kas ir programmētājs, izveidoja specifikāciju pēc Andra prasībām. Jūsu uzdevums ir uzrakstīt funkciju, kas no dotiem argumentiem aprēķina un atgriež Andrim derīgu rezultātu.

Andra formulējums

Gribu zināt cik izmaksās ieklāt linoleju. Apnicis katru reizi uz papīra rēķināt.

Specifikācijas
  • ievadīt linoleja cenu
  • ievadīt telpas izmēru
  • izvadīt izmaksas
  • ievadīt linoleja cenu EUR/m^2
  • ievadīt linoleja ruļļa platumu m
  • ievadīt telpas platumu un garumu m
  • aprēķināt izmaksas, noapaļojot telpas garumu un platumu uz augšu
  • izvadīt izmaksas EUR
Programmas kods
import math

def gridas_izmaksa(cena, linoleja_platums, telpas_platums, telpas_garums):
    telpas_izmers = math.ceil(telpas_garums) * math.ceil(telpas_platums)
    izmaksa = cena * telpas_izmers / linoleja_platums

    return izmaksa

cena1 = 2.25
linoleja_platums1 = 2.0
platums1 = 5.25
garums1 = 6.0

print("izklājot garumā:")
print(gridas_izmaksas(cena1, linoleja_platums1, platums1, garums1))
print("izklājot platumā")
print(gridas_izmaksas(cena1, linoleja_platums1, garums1, platums1))
function gridas_izmaksas(cena, linoleja_platums, telpas_platums, telpas_garums) {
    var telpas_izmers = Math.ceil(telpas_garums) * Math.ceil(telpas_platums);
    var izmaksa = cena * telpas_izmers / linoleja_platums;

    return izmaksa;
}

var cena1 = 2.25;
var linoleja_platums1 = 2.0;
var platums1 = 5.25;
var garums1 = 6.0;

console.log("izklājot garumā:");
console.log(gridas_izmaksas(cena1, linoleja_platums1, platums1, garums1));
console.log("izklājot platumā");
console.log(gridas_izmaksas(cena1, linoleja_platums1, garums1, platums1));
Rezultātu piemēri
    izklājot garumā:
    13.43
    izklājot platumā:
    23.45

🔸 Stabili podesti

Problēmsituācija

Pie jums ir vērsies uzņēmums SIA Stabili podesti, ar vēlmi atvieglot materiālu sagatavošanu finiera podestu ražošanai. Podestus ražo gan standarta izmēros, gan pēc pasūtītāja izmēriem.

Jūs uzaicina uz ražotni iepazīties ar produkciju, un var novērot, ka podesti principā ir taisnstūra paralēlskaldņi, kas izveidoti no sešām finiera plāksnēm, kas savā starpā sastiprināti ar divpadsmit leņķveida līstēm, un stūros nostiprināti ar astoņiem stūra savienojumiem.

Uzņēmums vēlas automatizēt izlietoto materiālu uzskaiti un jums tiek uzticēts uzrakstīt kodu funkcijai, kas nosaka materiālu veidu un daudzumu dotā izmēra podestam.

Ražošanas vadītājs

Šobrīd mēs skatāmies, kas mums noliktavā sāk pietrūkt, un tad pasūtām, bet gribētos jau rēķināt uz priekšu, lai varam bez kavēšanās izpildīt lielākus pasūtījumus.

Specifikācijas
  • Funkcijai jāaprēķina podesta ražošanai nepieciešamie materiāli: finieris, malu stiprinājuma līstes un stūra stiprinājumi.
  • Dotie lielumi ir podesta izmēri un skaits.
  • Aprēķinātos datus jānodod uzskaites programmai.
  • Funkcijai “materialuAprekins” ir četri parametri, saskaņā ar šo formātu: materialuAprekins(garums, platums, augstums, skaits). Parametri “garums”, “platums” un “augstums” raksturo podesta izmēru cm, tiem var būt arī viena zīme aiz komata. Parametrs “skaits” ir vesels skaitlis, kas norāda nepieciešamo podestu skaitu.
  • Uzskaites programmai informācija tiek nodota ar funkcijas “materialaUzskaite” palīdzību. Šī funkcija vēl nav pagatavota, un to rakstīs citi programmētāji. Šai funkcijai ir četri parametri, saskaņā ar šo formātu: materialaUzskaite(tips, izmers1, izmers2, skaits). Parametrs “tips” ir simbolu virkne, kam atļautas trīs vērtības: “FINIERIS”, “LISTE” un “STURIS”. Ja tips ir “FINIERIS”, tad parametri “izmers1” un” izmers2” apraksta taisnstūrveida finiera plāksnes izmērus, secība nav svarīga. Ja tips ir “LISTE”, tad parametrs “izmers1” apraksta līstes detaļas garumu, savukārt parametra “izmers2” vērtība nav svarīga. Ja tips ir “STURIS”, tad parametru “izmers1” un “izmers2” vērtības nav svarīgas.
  • Funkcijas “materialuAprekins” izpildes laikā ir jāizsauc funkcija “materialaUzskaite” ar nepieciešamajiem parametriem katram atšķirīgajam materiālu tipam un izmēram. Ideāli būtu, ja šo izsaukumu skaits būtu pēc iespējas mazāks.
Programmas kods
    def materialuAprekins(garums, platums, augstums, skaits):

        materialaUzskaite(tips, izmers1, izmers2, skaits)
        return
Rezultātu piemēri
    ...

🔸 Slinkais astrologs

Problēmsituācija

Laikraksts “Apvidus vēstis” katru nedēļu pasūta astrologam Mārim Zvaigznem astroloģiskās prognozes. Māri šie uzdevumi garlaiko, jo rakstīt katru nedēļu visai vienveidīgus tekstus ir apgrūtinoši, viņš gribētu fokusēties uz individuālu klientu apkalpošanu. Taču attiecības ar šo laikrakstu Mārim ir svarīgas, jo populārais iknedēļas izdevums palīdz viņam gūt nepieciešamo publicitāti.

Māris

Būsim reāli, šis process nav pārāk radošs. Tam, kādai horoskopa zīmei tiek sastādīts teksts, vispār nav nekādas nozīmes. Es pamatā lietoju vienus un tos pašus trafaretus, izmantojot neskaidri formulētus apgalvojumus, kur katrs var saskatīt kaut ko sev piemērotu. Esmu pārliecināts, ka šo uzdevumu var uzticēt datoram.

Specifikācijas

Še, palūko manu iepriekšējo prognožu arhīvu, es gribētu no datora saņemt kaut ko līdzīgu. Negribētos gan, ka tie teikumi atkārtojas, vismaz vienas prognozes ietvaros. Tātad, principā es gribētu, ka piespiež pogu, un dators uz ekrāna parāda tekstu, ko es tad varu iekopēt e-pastā, ko sūtu uz laikraksta izdevniecību. Visām divpadsmit horoskopa zīmēm uzreiz.

  • Specifikācijas pielikumā ir pievienots iepriekš veidotu prognožu arhīvs. To ir jāizmanto kā materiālu tādu teksta frāžu saraksta izveidošanai, ko pēc tam ir iespējams izmantot automātiskai teksta ģenerēšanai.
  • Funkcijai jāizvada uz ekrāna teksts divpadsmit horoskopa zīmju astroloģiskajām prognozēm: vispirms vienā rindā virsraksts, tad jaunā rindā prognozes teksts. Neviens teikums nedrīkst atkārtoties.
  • Teikumi ir veidoti pēc kāda no šiem trafaretiem (bet var pievienot vēl citus!):
    • Apgalvojums: divdabja teiciens, apgalvojums.
    • Apgalvojums: apgalvojums, apgalvojums
    • Rīkojums: rīkojums
  • Vienas prognozes teksts sastāv no 3 līdz 4 apgalvojuma teikumiem, un dažreiz noslēdzas ar uzmundrinošu vai brīdinošu rīkojuma teikumu.
Programmas kods
    import math

    def nedelas_horoskopi()

        return
Rezultātu piemēri
    ...