Delovna doba
Učence tvoje šole zanima, kateri od učiteljev ima največ let delovne dobe.
Zato so te prosili, da jim napišeš poskusni program, ki bo prebral imena
osmih (8) učiteljev in jim določil naključno število let delovne dobe
od ena (1) do štirideset (40) let.
Kot rezultat naj program izpiše imena in število let delovne dobe
tistih treh učiteljev, ki imajo največ let delovne dobe. Izpis naj
bo oblikovan tako, da je v prvi vrsti ime in leta tistega učitelja, ki
ima najdaljši staž, v drugi tisti, z drugim najdaljšim stažom, itd.
V primeru, da ima več učiteljev enako dolg staž, kot tretji izpisani učitelj,
potem se izpišejo tudi ti učitelji.
Komentar:
Program se da spreminjati oziroma dopolnjevati:
Potrebujemo tabeli, kamor vzporedno vpisujemo imena učiteljev in njihova leta delovne dobe, ki jih generira računalnik. Nato v tabeli poiščemo največjo vrednost. Ko jo najdemo, poskrbimo za izpis imena in let delovne dobe. Kaj moraš narediti, da najdeš učitelja, ki je drugi po številu let delovne dobe?
Ko poskrbiš, da se izpiše učitelj in njegovo število let delovne dobe, moraš poskrbeti, da ne more več kandidirati za ostala mesta v izpisu. To lahko narediš tako, da njegovo delovno dobo postaviš na 0.
Ko izpisujemo učitelje s tretjo najdaljšo delovno dobo, se lahko zgodi, da je takih učiteljev več. Po tem ko izpišemo učitelja s prvo in drugo najdaljšo dobo, najprej zgolj poiščemo katera je tretja najdaljša delovna doba. Potem se sprehodimo skozi tabelo in izpišemo vse učitelje s to delovno dobo.
Program naj izgleda takole:
- Rezerviramo tabelo nizov dolžine 8 in tabelo celih števil iste dolžine. V prvi bomo hranili imena učiteljev, v drugi pa njihovo delovno dobo.
- Napolnimo tabelo imen, pri čemer imena vnašamo ročno. To naredimo v zanki, ki jo ponovimo 8-krat in vsakič povprašamo po imenu naslednjega učitelja.
- Leta nam generira računalnik kot naključna cela števila med 1 in 40.
- Poiščemo največje število let delovne dobe; uporabimo zanko za iskanje maksimalnega števila v tabeli. Sproti, ko si zapomnimo trenutno maksimalno delovno dobo, si hkrati zapomnimo še indeks v tabeli, kjer se trenutno nahaja maksimum.
- Poskrbimo za izpis učitelja z najdaljšo delovno dobo. Ker smo si shranili indeks v tabeli delovnih dob, na katerem se nahaja najdaljša delovna doba, na tem istem indeksu v tabeli imen dobimo ime pripadajočega učitelja in tako pridobimo potrebna podatka za izpis.
- Vrednosti let učitelja z najdaljšim stažem priredimo vrednost 0 in s tem si označimo, da tega učitelja ne bomo upoštevali v naslednjih izpisih. Ker poznamo indeks v tabeli let, ki pripada temu učitelju, to ni težko.
- Poiščemo učitelja, ki imata po velikosti drugo število let delovne dobe, podobno, kot za učitelja z najdaljšo delovno dobo. V resnici ponovimo isti postopek, torej iščemo učitelja s trenutno najdaljšo delovno dobo. Spomnimo se, da smo učitelja z resnično najdaljšo delovno dobo "degradirali" na delovno dobo 0, kar pomeni, da je tisti z drugo najdaljšo delovno dobo tisti s trenutno najdaljšo delovno dobo.
- Postopek ponovimo za iskanje učitelja s tretjo najdaljšo delovno dobo. Ko ga najdemo, nas v resnici ne zanima več, kdo je ta učitelj. Ampak le njegova delovna doba.
- Da izpišemo vse učitelje, ki imajo tretjo najdaljšo delovno dobo, se v zanki sprehodimo čez vse učitelje, in vsakega, ki ima delovno dobo enako tretji najdaljši delovni dobi, izpišemo.
import javax.swing.JOptionPane;
public class DelovnaDoba {
public static void main(String[] args) {
// ucitelje in pripadajoce delovne dobe zlozimo v tabeli
String[] ucitelji = new String[8];
int[] doba = new int[8];
for (int i = 0; i < 8; ++i) {
ucitelji[i] = JOptionPane.showInputDialog("Vnesi ime " + (i + 1)
+ ". ucitelja:");
doba[i] = (int) (Math.random() * 40) + 1;
}
// v spremenljivko rezultat bom shranjevali izpise
String rezultat = "";
int kateri = 0;
// poiscemo ucitelja z najdaljso delovno dobo
int prvi = 0;
for (int i = 0; i < 8; ++i) {
if (prvi <= doba[i]) {
prvi = doba[i]; // zapomnimo si najdaljso delovno dobo
kateri = i; // na katerem mestu je ucitelj, ki jo je dosegel
}
}
rezultat = rezultat + ucitelji[kateri] + " " + doba[kateri] + " let\n";
doba[kateri] = 0; // ne more vec sodelovati za drugega in tretjega
// kdo je drugi najdlje v sluzbi
int drugi = 0;
for (int i = 0; i < 8; ++i) {
if (drugi <= doba[i]) {
drugi = doba[i];
kateri = i;
}
}
rezultat = rezultat + ucitelji[kateri] + " " + doba[kateri] + " let\n";
doba[kateri] = 0; // ne more vec sodelovati za tretjega
// kdo je tretji najdlje v sluzbi
int tretji = 0;
for (int i = 0; i < 8; ++i) {
if (tretji <= doba[i]) {
tretji = doba[i];
kateri = i;
}
}
rezultat = rezultat + ucitelji[kateri] + " " + doba[kateri] + " let\n";
doba[kateri] = 0;
// ce ima se kateri toliko let staza kot tretji, ga izpisemo
for (int i = 0; i < 8; ++i) {
if (doba[i] == tretji) {
rezultat = rezultat + ucitelji[i] + " " + doba[i] + " let\n";
}
}
JOptionPane.showMessageDialog(null, rezultat);
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace DelovnaDoba {
class DelovnaDoba {
static void Main(string[] args) {
//ucitelje in pripadajoce delovne dobe zlozimo v tabeli
String[] ucitelji = new String[8];
int[] doba = new int[8];
for (int i = 0; i < 8; ++i) {
Console.Write("Vnesi ime ucitelja: ");
ucitelji[i] = Console.ReadLine();
Random random = new Random();
doba[i] = random.Next(1, 40);
}
String rezultat = "";
int kateri = 0;
// poiščemo ucitelja z najdaljšo delovno dobo
int prvi = 0;
for (int i = 0; i < 8; ++i) {
if (prvi <= doba[i]) {
prvi = doba[i]; //zapomnimo si najdaljso delovno dobo
kateri = i; //na katerem mestu je ucitelj, ki jo je dosegel
}
}
rezultat = rezultat + ucitelji[kateri] + " " + doba[kateri] + " let\n";
doba[kateri] = 0; // ne more več sodelovati za drugega in tretjega
// kdo je drugi najdlje v sluzbi
int drugi = 0;
for (int i = 0; i < 8; ++i) {
if (drugi <= doba[i]) {
drugi = doba[i];
kateri = i;
}
}
rezultat = rezultat + ucitelji[kateri] + " " + doba[kateri] + " let\n";
doba[kateri] = 0; // ne more več sodelovati za tretjega
//kdo je tretji najdlje v sluzbi
int tretji = 0;
for (int i = 0; i < 8; ++i) {
if (tretji <= doba[i]) {
tretji = doba[i];
kateri = i;
}
}
rezultat = rezultat + ucitelji[kateri] + " " + doba[kateri] + " let\n";
doba[kateri] = 0;
//ce ima se kateri toliko let staza kot tretji, ga izpisemo
for (int i = 0; i < 8; ++i) {
if (doba[i] == tretji) {
rezultat = rezultat + ucitelji[i] + " " + doba[i] + " let\n";
}
}
Console.WriteLine(rezultat);
Console.ReadKey();
}
}
}
#!C:/Python30/python
#-*-encoding: utf-8 -*-
# -*- coding: latin-1 -*-
'''
Created on 2.7.2009
@author: fajdigap
'''
import random
#ucitelje in pripadajoce delovne dobe zlozimo v tabeli
ucitelji = []
doba = []
for i in range(8):
print ("Vnesi ime %s ucitelja:" %(i+1))
ucitelji.append(input())
doba.append(random.randint(1,40))
print(ucitelji)
print(doba)
#v spremenljivko rezultat bom shranjevali izpise
rezultat = ""
kateri = 0
#poiscemo ucitelja z najdaljso delovno dobo
prvi = 0
for i in range(8):
if prvi <= doba[i]:
prvi = doba[i] # zapomnimo si najdaljso delovno dobo
kateri = i # na katerem mestu je ucitelj, ki jo je dosegel
rezultat = rezultat+'%s %d let\n'%(ucitelji[kateri],doba[kateri])
doba[kateri] = 0 # ne more vec sodelovati za drugega in tretjega
# kdo je drugi najdlje v sluzbi
drugi = 0
for i in range(8):
if drugi <= doba[i]:
drugi = doba[i]
kateri = i
rezultat = rezultat+'%s %d let\n'%(ucitelji[kateri],doba[kateri])
doba[kateri] = 0 # ne more vec sodelovati za tretjega
# kdo je tretji najdlje v sluzbi
tretji = 0
for i in range(8):
if tretji <= doba[i]:
tretji = doba[i]
kateri = i
rezultat = rezultat+'%s %d let\n'%(ucitelji[kateri],doba[kateri])
doba[kateri] = 0;
# ce ima se kateri toliko let staza kot tretji, ga izpisemo
for i in range(8):
if doba[i] == tretji:
rezultat = rezultat+'%s %d let\n'%(ucitelji[kateri],doba[kateri])
print (rezultat)