VILNIAUS UNIVERSITETAS EKONOMIKOS FAKULTETAS EKONOMINĖS INFORMATIKOS KATEDRA Darbas su paprastaisiais bei kai kuriais struktūriniais duomenų tipais I LABORATORINIS DARBAS Darbą tikrino doc. dr. Ona Barčkutė VILNIUS, 2002 m. Telefonų stoties abonentų ataskaitos skaičiavimas 1. Uždavinio esmė Programa, kurios sukūrimą numato ši užduotis, skirta telefonų stoties abonentų sarašui sudaryti ir kiekvienam iš jų pateikiamos sąskaitos sumai nustatyti. Programą galimą būtų naudoti nedidelėse telefonų stotyse, kai mėnesio pabaigoje pagal abonentų prakalbėto laiko duomenis ir esamą tarifą reikia apskaičiuoti kiekvieno abonento sąskaitos už paslaugas sumą. Ši programa žymiai palengvina darbą, nes ją naudojant reikia tik įvesti duomenys apie abonentus, o programa apskaičiuos sumą ir pateiks suvestinę ataskaitą. 2. Programos algoritmo blokinė schema Pagrindinės programos blokinė schema Funkcijos „gautiasmduomenys“ blokinė schema Funkcijos „gautikalb_trukme“ blokinė schema Procedūros „skaiciuok“ blokinė schema Procedūros „isvesti_rez“ blokinė schema 3. Panaudotos duomenų struktūros ir jų parinkimo pagrindimas Programoje panaudoti keli struktūriniai duomenų tipai. Tai yra mėnesių pavadinimų masyvas „mėnesiai“, įrašai „klientas“, susidedantys iš kelių laukų, kuriuose yra saugoma tokia informacija apie klientus, kaip vardas, pavardė, telefono numeris, kiekvieno mėnesio kalbėjimo trukmė, suma apmokėjimui bei paskutinė aptarnavimo kliento mėnuo. Be to, visų klientų įrašai sudaro įrašų masyvą „klientai“. Kiekviename įraše „klientas“ saugomi kaip pirminiai, taip ir rezultatiniai duomenys. Pirminiai duomenys — tai „vardas“ (string), „pavarde“ (string), „tel_num“ (string) ir „pask_men“. Kintamajam „pask_men“ galima priskirti tik vieno iš mėnesių pavadinimą. Rezultatiniai duomenys — tai įrašo „klientas“ laukas „mok“ (real), jame laikoma sumą, kurią kiekvienas klientas turės apmokėti po sąskaitos pateikimo, šis laukas apskaičiuojamas programos vykdymo metu. Programos algoritme kliento vardas ir pavardė aprašomi kaip eilutės tipo kintamieji, t.y. ‚string‘, nes tai yra simbolių sekos, o joms labiausiai tinka ‚string‘ duomenų tipas. Telefono numeris irgi aprašytas kaip ‚string‘, nes jokių skaičiavimų su telefono numerių mes neatliekame, ir yra galimas atvejis, kad telefono numeriai bes saugomi su pašaliniais simboliais, pvz. 45-65-78. 4. Programos algoritmo struktūrograma Pagrindinės programos struktūrograma Pradžia... to be continued :) 5. Programos tekstas „Pascal“ kalba Pagrindinė programa program telefonu_stotis; uses crt; const maks_kl_sk = 10; maks_men_sk = 12; menesiai: array[0..11] of string = ('Gruodis','Sausis','Vasaris','Kovas','Balandis', 'Geguze','Birzelis','Liepa','Rugpjutis', 'Rugsejis','Spalis','Lapkritis'); type klientas = record vardas: string; pavarde: string; tel_num: string; kalb_trukme: array[1..maks_men_sk] of longint; mok: real; pask_men: 1..maks_men_sk; end; var klientai: array[1..maks_kl_sk] of klientas; tarifas: real; kl: 1..maks_kl_sk; menuo: integer; pabaiga: boolean; kl_sk: integer; function gautiasmduomenys(kl: integer): boolean; begin clrscr; with klientai[kl] do begin repeat writeln('Iveskite vartotojo varda [pvz. Jonas]'); readln(vardas); writeln('Iveskite vartotojo pavarde [pvz. Jonaitis]'); readln(pavarde); if (vardas = '') or (pavarde = '') then writeln('Irasykite varda ir pavarde'); until ((vardas'') and (pavarde '')); writeln('Iveskite vartotojo telefono numeri [pvz. 404012]'); readln(tel_num); end; end; function gautikalb_trukme(kl:integer): boolean; var laikas: string; valan: string; minut: string; tmp: longint; valcode: integer; men: 1..maks_men_sk; klaida: boolean; begin clrscr; klientai[kl].pask_men := 1; laikas:='x'; with klientai[kl] do for men:= 1 to maks_men_sk do if laikas '' then begin writeln('Vartotojas: ',vardas,' ',pavarde); writeln('Menuo: ',menesiai[men mod 12]); writeln('Iveskite vartotojo prakalbeta laika uz si menesi (vvvv:mm) [pvz. 12:05]'); writeln('Paspauskite tik ENTER, jeigu norite uzbaigti ivedima.'); repeat klaida:=false; readln(laikas); if (laikas'') then begin {jei ivesta ne tuscia eilute} valan := copy( laikas, 0, pos(':', laikas) - 1 ); minut := copy( laikas, pos(':', laikas) + 1, length(laikas)-pos(':', laikas) ); val(valan,tmp,valcode); if valcode0 then begin {jeigu negavom skaiciu} writeln('> neteisingai ivesti duomenis: '#13#10' laikas negali buti ',laikas); klaida:=true; end else begin {jeigu gavom skaiciu} kalb_trukme[men] := tmp*60; val(minut, tmp, valcode); if (valcode 0) or (tmp > 59) then begin {jeigu negavom skaiciu} writeln('> neteisingai ivesti duomenis: '#13#10' laikas negali buti ',laikas); klaida:=true; end else kalb_trukme[men] := kalb_trukme[men] + tmp; {jeigu gavom skaiciu} end; end else if men = 1 then begin writeln('> jus privalote nurodyti bent vieno menesio kalbejimo trukme'); klaida:=true; end else klientai[kl].pask_men := men - 1; until not (klaida);{jeigu padaryta klaida tai pakartoti ivedima} end; end; procedure isvesti_rez(kl:integer); var men: 1..maks_men_sk; per_metus: longint; sum_lt: real; begin per_metus := 0; sum_lt := 0; for men := 1 to 12 do per_metus := per_metus + klientai[kl].kalb_trukme[men]; sum_lt := per_metus * tarifas; with klientai[kl] do writeln('і',(copy(vardas,0,1)+'. '+ pavarde ):15,'і', per_metus:35,'і',sum_lt:25:2,'і'); end; procedure skaiciuok(kl: integer); var men: 1..maks_men_sk; begin with klientai[kl] do begin mok:=0; for men:= 1 to pask_men do mok := mok + tarifas * kalb_trukme[men]; end; end; begin clrscr; writeln('Iveskite minutes pokalbio kaina [pvz. 0.12]:'); readln(tarifas); pabaiga:=false; for kl:=1 to maks_kl_sk do if not pabaiga then with klientai[kl] do begin gautiasmduomenys(kl); gautikalb_trukme(kl); skaiciuok(kl); if pask_men > menuo then menuo := pask_men; writeln('Ar norite ivesti informacija apie dar viena klienta?[T/N]'); if upcase(readkey) = 'N' then pabaiga:=true; kl_sk := kl_sk + 1; end; clrscr; writeln('Ataskaita uz ',menuo,' menesi (-ius)',' nuo "Sausis" iki "',menesiai[menuo mod 12],'"'); writeln('іV. pavarde', 'іlaikotarpio kalbejimo trukme(min)':39,' і','viso moketi(lt)':25,'і'); for kl:=1 to kl_sk do with klientai[kl] do begin isvesti_rez(kl); end; readln; end. 6. Uždavinio sprendimo algorimo aprašymas Programoje atliekamas keletas darbų, kai kurie iš jų kartojasi, dėl to naudojamos paprogramės: procedūros ir funkcijos. Programos pradžioje aprašomi naudojami duomenų tipai, tarp kurių ir struktūriniai, kintamieji. Po to išdėstytos paprogramės: • Funkcija „gautiasmduomenys“, kuri naudojama asmeniniams (vardas, pavardė, telefono numeris) duomenims apie klientus įvesti. • Funkcija „gautikalb_trukme“, kuri naudojama klientų kalbėjimo trūkmei per kiekvieną mėnesį įvesti. Šioje paprogramėje realizuota įvedimo korektiškumo kontrolė ir įvestų duomenų formato keitimas, pavyzdžiui „15:45“, kur 15 reiškia valandų skaičių, o 45 – minučių skaičių, yra pakeičiamas į 15*60+45=945 minučių. • Procedūra „isvesti_rez“, kurios pagalba įvesti ir apskaičiuoti duomenys spausdinami ekrane. • Procedūra „skaiciuok“, kuri apskaičiuoja kiekvieno kliento suma apmokėjimui. Pradėjus vykdyti pagrindinę programą, iš pradžių vartotojo prašo įvesti pokalbio minutės kainą, po to programa nuosekliai kreipiasi į funkcijas „gautiasmduomenys“, „gautikalb_trukme“ ir procedūrą „skaiciuok“. Toliau vartotojo klausia, ar jis nori dar įvedinėti duomenis. Šių funkcijų ir procedūros ciklas yra kartojamas tol, kol nebus įvesti duomenys apie visus klientus ir vartotojas neatsakys „Ne“ į klausimą. Kai tik įvesti visi duomenys, programa formuoja išvedimo lentelę ir kreipiasi į procedūrą „isvesti_rez“, kuri spausdina pirminius ir rezultatinius duomenis lentelės pavidalu. Po to paspaudus ENTER klavišą programa baigia savo darbą ir grįžtama į „Pascal“ aplinką. 7. Programos vykdymo rezultatas Paleidus šią programą ir įvedus duomenis apie kelis abonentus gauname tokį rezultatą: Ataskaita uz 3 menesi (-ius) nuo „Sausis“ iki „Kovas“ V. Pavarde Laikotarpio kalbejimo trukme(min) Viso moketi(Lt) J. Jonaitis P. Baranauskas J. Panavas 2831 384 4724 339.72 46.08 566.88
Šį darbą sudaro 1012 žodžiai, tikrai rasi tai, ko ieškai!
★ Klientai rekomenduoja
Šį rašto darbą rekomenduoja mūsų klientai. Ką tai reiškia?
Mūsų svetainėje pateikiama dešimtys tūkstančių skirtingų rašto darbų, kuriuos įkėlė daugybė moksleivių ir studentų su skirtingais gabumais. Būtent šis rašto darbas yra patikrintas specialistų ir rekomenduojamas kitų klientų, kurie po atsisiuntimo įvertino šį mokslo darbą teigiamai. Todėl galite būti tikri, kad šis pasirinkimas geriausias!
Norint atsisiųsti šį darbą spausk ☞ Peržiūrėti darbą mygtuką!
Mūsų mokslo darbų bazėje yra daugybė įvairių mokslo darbų, todėl tikrai atrasi sau tinkamą!
Panašūs darbai
Atsisiuntei rašto darbą ir neradai jame reikalingos informacijos? Pakeisime jį kitu nemokamai.
Pirkdamas daugiau nei vieną darbą, nuo sekančių darbų gausi 25% nuolaidą.
Išsirink norimus rašto darbus ir gauk juos akimirksniu po sėkmingo apmokėjimo!