Tekstifailide kasutamise näited
Allpool on mõned näited tekstifailide kasutamisest tüüpilistes situatsioonides, mis esinevad programmeerimisolümpiaadidel.
Failist lugemine
Ülesanne
On antud koordinaattelgedega paralleelsete servadega ristküliku vasaku alumise ja parema ülemise nurga täisarvulised koordinaadid. Kirjutada programm, mis arvutab selle ristküliku pindala. Nurkade koordinaadid on tekstifailis ristkyl.sis
. Faili esimesel real on vasaku alumise nurga X- ja Y-koordinaat, teisel real parema ülemise nurga X- ja Y-koordinaat. Samal real olevad arvud on üksteisest eraldatud tühikuga. Tulemus väljastada ekraanile.
Lahendus Pascal'is
var sisf : text; { failimuutuja } x1, y1, x2, y2 : integer; { tippude koordinaadid } pind : integer; { pindala } begin { loeme andmed } assign(sisf, 'ristkyl.sis'); { seome failimuutuja failiga } reset(sisf); { avame faili lugemiseks } readln(sisf, x1, y1); { loeme esimeselt realt kaks arvu } readln(sisf, x2, y2); { loeme teiselt realt kaks arvu } close(sisf); { sulgeme faili } { arvutame pindala } pind := (x2 - x1) * (y2 - y1); { väljastame tulemuse } writeln('Pindala on ', pind); end.
Lahendus C's
#include <stdio.h> int main(void) { FILE *sisf; /* failimuutuja */ int x1, y1, x2, y2; /* tippude koordinaadid */ int pind; /* pindala */ /* loeme andmed */ sisf = fopen("ristkyl.sis", "rt"); /* avame faili lugemiseks */ fscanf(sisf, "%d %d", &x1, &y1); /* loeme kaks arvu */ fscanf(sisf, "%d %d", &x2, &y2); /* loeme veel kaks arvu */ fclose(sisf); /* sulgeme faili */ /* arvutame pindala */ pind = (x2 - x1) * (y2 - y1); /* väljastame tulemuse */ printf("Pindala on %dn", pind); return 0; }
Lahendus C++'s
#include <fstream> #include <iostream> using namespace std; int main(void) { ifstream sisf; // failimuutuja int x1, y1, x2, y2; // tippude koordinaadid int pind; // pindala // loeme andmed sisf.open("ristkyl.sis"); // avame faili lugemiseks sisf >> x1 >> y1; // loeme kaks arvu sisf >> x2 >> y2; // loeme veel kaks arvu sisf.close(); // sulgeme faili // arvutame pindala pind = (x2 - x1) * (y2 - y1); // väljastame tulemuse cout << "Pindala on " << pind << endl; return 0; }
Lahendus Java's
import java.io.*; import java.util.*; public class ristkyl { public static void main(String args[]) throws Exception { BufferedReader sisf; // failimuutuja StringTokenizer st; // rea tükeldaja int x1, y1, x2, y2; // tippude koordinaadid int pind; // pindala // loeme andmed sisf = new BufferedReader( new FileReader("ristkyl.sis")); // avame faili lugemiseks st = new StringTokenizer(sisf.readLine()); // loeme esimese rea x1 = Integer.parseInt(st.nextToken()); // eraldame X-koordinaadi y1 = Integer.parseInt(st.nextToken()); // eraldame Y-koordinaadi st = new StringTokenizer(sisf.readLine()); // loeme teise rea x2 = Integer.parseInt(st.nextToken()); // eraldame X-koordinaadi y2 = Integer.parseInt(st.nextToken()); // eraldame Y-koordinaadi // arvutame pindala pind = (x2 - x1) * (y2 - y1); // väljastame tulemuse System.out.println("Pindala on " + pind); } }
Lahendus C#'s
using System; using System.IO; // readerite, writerite ja failide klassid namespace ristkyl { class Ristkyl { static void Main() { string[] pt1; string[] pt2; string[] lines = File.ReadAllLines("ristkyl.sis"); // lihtne meetod faili kogu sisu lugemiseks int x1 = int.Parse(lines[0].Split()[0]); // eraldame koordinaadid int y1 = int.Parse(lines[0].Split()[1]); int x2 = int.Parse(lines[1].Split()[0]); int y2 = int.Parse(lines[1].Split()[1]); int s = Math.Abs((x1 - x2) * (y1 - y2)); // arvutame pindala Console.WriteLine("Pindala on " + s); // väljastame konsoolile } } }
Lahendus Python'is
# loeme andmed f = open("ristkyl.sis", "r") # avame faili lugemiseks s = f.readline() # loeme esimese rea (x1, y1) = map(int, s.split()) # eraldame sellest kaks arvu s = f.readline() # loeme teise rea (x2, y2) = map(int, s.split()) # eraldame sellest kaks arvu f.close() # sulgeme faili # arvutame pindala pind = (x2 - x1) * (y2 - y1) # väljastame tulemuse print "Pindala on", pind
Lahendus BASIC'us
DIM x1 AS INTEGER, y1 AS INTEGER ' tippude koordinaadid DIM x2 AS INTEGER, y2 AS INTEGER ' tippude koordinaadid DIM pind AS INTEGER ' pindala ' loeme andmed OPEN "ristkyl.sis" FOR INPUT AS #1 ' avame faili lugemiseks INPUT #1, x1, y1 ' loeme esimeselt realt kaks arvu INPUT #1, x2, y2 ' loeme teiselt realt kaks arvu CLOSE #1 ' sulgeme faili ' arvutame pindala pind = (x2 - x1) * (y2 - y1) ' väljastame tulemuse PRINT "Pindala on"; pind SYSTEM
Faili kirjutamine
Ülesanne
On antud kolmnurga tippude reaalaarvulised koordinaadid. Kirjutada programm, mis arvutab selle kolmnurga pindala. Tekstifailis kolmnurk.sis
on kolmnurga tippude X- ja Y-koordinaadid, iga tipu koordinaadid omaette real. Tulemus väljastada tekstifaili kolmnurk.val
.
Lahendus Pascal'is
var sisf, valf : text; { failimuutujad } x1, y1, x2, y2, x3, y3 : real; { tippude koordinaadid } a, b, c : real; { külgede pikkused } p, pind : real; begin { loeme andmed } assign(sisf, 'kolmnurk.sis'); { seome failimuutuja failiga } reset(sisf); { avame faili lugemiseks } readln(sisf, x1, y1); { loeme esimeselt realt kaks arvu } readln(sisf, x2, y2); { loeme teiselt realt kaks arvu } readln(sisf, x3, y3); { loeme kolmandalt realt kaks arvu } close(sisf); { sulgeme faili } { arvutame pindala Heroni valemi järgi } a := sqrt(sqr(x1 - x2) + sqr(y1 - y2)); b := sqrt(sqr(x2 - x3) + sqr(y2 - y3)); c := sqrt(sqr(x3 - x1) + sqr(y3 - y1)); p := (a + b + c) / 2; pind := sqrt(p * (p - a) * (p - b) * (p - c)); { väljastame tulemuse } assign(valf, 'kolmnurk.val'); { seome failimuutuja failiga } rewrite(valf); { avame faili kirjutamiseks } writeln(valf, pind); { väljastame } close(valf); { sulgeme faili } end.
Lahendus C's
#include <stdio.h> #include <math.h> int main(void) { FILE *sisf, *valf; /* failimuutujad */ double x1, y1, x2, y2, x3, y3; /* tippude koordinaadid */ double a, b, c; /* külgede pikkused */ double p, pind; /* loeme andmed */ sisf = fopen("kolmnurk.sis", "rt"); /* avame faili lugemiseks */ fscanf(sisf, "%lf %lf", &x1, &y1); /* loeme kaks arvu */ fscanf(sisf, "%lf %lf", &x2, &y2); /* loeme veel kaks arvu */ fscanf(sisf, "%lf %lf", &x3, &y3); /* loeme veel kaks arvu */ fclose(sisf); /* sulgeme faili */ /* arvutame pindala Heroni valemi järgi */ a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); b = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); c = sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)); p = (a + b + c) / 2; pind = sqrt(p * (p - a) * (p - b) * (p - c)); /* väljastame tulemuse */ valf = fopen("kolmnurk.val", "wt"); /* avame faili kirjutamiseks */ fprintf(valf, "%lfn", pind); /* väljastame */ fclose(valf); /* sulgeme faili */ return 0; }
Lahendus C++'s
#include <fstream> #include <cmath> using namespace std; int main(void) { ifstream sisf; // failimuutuja sisendiks ofstream valf; // failimuutuja väljundiks double x1, y1, x2, y2, x3, y3; // tippude koordinaadid double a, b, c; // külgede pikkused double p, pind; // loeme andmed sisf.open("kolmnurk.sis"); // avame faili lugemiseks sisf >> x1 >> y1; // loeme kaks arvu sisf >> x2 >> y2; // loeme veel kaks arvu sisf >> x3 >> y3; // loeme veel kaks arvu sisf.close(); // sulgeme faili // arvutame pindala Heroni valemi järgi a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); b = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); c = sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)); p = (a + b + c) / 2; pind = sqrt(p * (p - a) * (p - b) * (p - c)); // väljastame tulemuse valf.open("kolmnurk.val"); // avame faili kirjutamiseks valf << pind << endl; // väljastame valf.close(); // sulgeme faili return 0; }
Lahendus Java's
import java.io.*; import java.util.*; public class kolmnurk { public static void main(String args[]) throws Exception { BufferedReader sisf; // failimuutuja sisendiks StringTokenizer st; // rea tükeldaja PrintWriter valf; // failimuutuja väljundiks double x1, y1, x2, y2, x3, y3; // tippude koordinaadid double a, b, c; // külgede pikkused double p, pind; // loeme andmed sisf = new BufferedReader( new FileReader("kolmnurk.sis")); // avame faili lugemiseks st = new StringTokenizer(sisf.readLine()); // loeme esimese rea x1 = Double.parseDouble(st.nextToken()); // eraldame X-koordinaadi y1 = Double.parseDouble(st.nextToken()); // eraldame Y-koordinaadi st = new StringTokenizer(sisf.readLine()); // loeme teise rea x2 = Double.parseDouble(st.nextToken()); // eraldame X-koordinaadi y2 = Double.parseDouble(st.nextToken()); // eraldame Y-koordinaadi st = new StringTokenizer(sisf.readLine()); // loeme kolmanda rea x3 = Double.parseDouble(st.nextToken()); // eraldame X-koordinaadi y3 = Double.parseDouble(st.nextToken()); // eraldame Y-koordinaadi // arvutame pindala a = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); b = Math.sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); c = Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)); p = (a + b + c) / 2; pind = Math.sqrt(p * (p - a) * (p - b) * (p - c)); // väljastame tulemuse valf = new PrintWriter( new FileWriter("kolmnurk.val")); // avame faili kirjutamiseks valf.println(Double.toString(pind)); // väljastame valf.flush(); // tühjendame väljundfaili puhvri } }
Lahendus C#'s
using System; using System.Globalization; // CultureInfo jaoks using System.IO; namespace kolmnurk { class Kolmnurk { static void Main() { string[] pt1 = Console.ReadLine().Split(); // Loeme konsoolilt kolm rida ja tükeldame string[] pt2 = Console.ReadLine().Split(); // Kasutaja peab need õigesti sisestama :) string[] pt3 = Console.ReadLine().Split(); // Kuna olümpiaadiülesannetes on kümnendkoha eraldajaks alati punkt, // anname parsimisel kaasa CultureInfo.InvariantCulture, et tagada // punkti kasutamine juhuks, kui meil muidu on mingi muu keelne keskkond. // Alternatiivina võib kasutada // System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture // siis pole igale operatsioonile vaja seda eraldi parameetrina anda. double x1 = double.Parse(pt1[0], CultureInfo.InvariantCulture); // teisendame stringid reaalarvudeks double y1 = double.Parse(pt1[1], CultureInfo.InvariantCulture); double x2 = double.Parse(pt2[0], CultureInfo.InvariantCulture); double y2 = double.Parse(pt2[1], CultureInfo.InvariantCulture); double x3 = double.Parse(pt3[0], CultureInfo.InvariantCulture); double y3 = double.Parse(pt3[1], CultureInfo.InvariantCulture); double a = Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); // leiame pindala Heroni valemiga double b = Math.Sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); double c = Math.Sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)); double p = (a + b + c) / 2; double s = Math.Sqrt(p * (p - a) * (p - b) * (p - c)); File.WriteAllText("kolmnurk.val", s.ToString(CultureInfo.InvariantCulture)); // lihtne meetod ühe stringi kirjutamiseks faili } } }
Lahendus Python'is
import math # loeme andmed f = open("kolmnurk.sis", "r") # avame faili lugemiseks (x1, y1) = map(float, f.readline().split()) # esimeselt realt kaks arvu (x2, y2) = map(float, f.readline().split()) # teiselt realt kaks arvu (x3, y3) = map(float, f.readline().split()) # kolmandalt realt kaks arvu f.close() # sulgeme faili # arvutame pindala Heroni valemi järgi a = math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) b = math.sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)) c = math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) p = (a + b + c) / 2 pind = math.sqrt(p * (p - a) * (p - b) * (p - c)) # väljastame tulemuse f = open("kolmnurk.val", "w") # avame faili kirjutamiseks f.write("%fn" % pind) # väljastame f.close() # sulgeme faili
Lahendus BASIC'us
DIM x1 AS DOUBLE, y1 AS DOUBLE ' tippude koordinaadid DIM x2 AS DOUBLE, y2 AS DOUBLE ' tippude koordinaadid DIM x3 AS DOUBLE, y3 AS DOUBLE ' tippude koordinaadid DIM a AS DOUBLE, b AS DOUBLE, c AS DOUBLE ' külgede pikkused DIM p AS DOUBLE, pind AS DOUBLE ' loeme andmed OPEN "kolmnurk.sis" FOR INPUT AS #1 ' avame faili lugemiseks INPUT #1, x1, y1 ' loeme esimeselt realt kaks arvu INPUT #1, x2, y2 ' loeme teiselt realt kaks arvu INPUT #1, x3, y3 ' loeme kolmandalt realt kaks arvu CLOSE #1 ' sulgeme faili ' arvutame pindala Heroni valemi järgi a = SQR((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) b = SQR((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)) c = SQR((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) p = (a + b + c) / 2 pind = SQR(p * (p - a) * (p - b) * (p - c)) ' väljastame tulemuse OPEN "kolmnurk.val" FOR OUTPUT AS #2 ' avame faili kirjutamiseks PRINT #2, pind ' väljastame CLOSE #2 ' sulgeme faili SYSTEM
Mitme faili samaaegne kasutamine
Ülesanne
Kirjutada programm, mis sisestab klaviatuurilt kahe tekstifaili nimed ja kopeerib esimesest failist teise kõik read, mille pikkus on paarisarv. Võib eeldada, et ei failinimede ega ühegi rea pikkus ei ületa 80 sümbolit.
Lahendus Pascal'is
var sisnimi, valnimi : string; sisf, valf : text; s : string; begin { loeme failinimed } write('Sisendfaili nimi: '); readln(sisnimi); write('Väljundfaili nimi: '); readln(valnimi); { avame failid } assign(sisf, sisnimi); reset(sisf); assign(valf, valnimi); rewrite(valf); { kopeerime } while not eof(sisf) do begin readln(sisf, s); if length(s) mod 2 = 0 then begin writeln(valf, s); end; end; { sulgeme failid } close(sisf); close(valf); end.
Lahendus C's
#include <stdio.h> #include <string.h> int main(void) { char sisnimi[80 + 1], valnimi[80 + 1]; FILE *sisf, *valf; char s[80 + 1 + 1]; /* loeme failinimed */ printf("Sisendfaili nimi: "); scanf("%80s", sisnimi); printf("Väljundfaili nimi: "); scanf("%80s", valnimi); /* avame failid */ sisf = fopen(sisnimi, "rt"); valf = fopen(valnimi, "wt"); /* kopeerime */ /* NB! ei tööta: while (fscanf(sisf, "%80s", s)) */ while (fgets(s, sizeof(s), sisf) != NULL) { if (strlen(s) % 2 == 1) { /* reavahetus on ka sümbol */ fputs(s, valf); } } /* sulgeme failid */ fclose(sisf); fclose(valf); return 0; }
Lahendus C++'s
#include <iostream> #include <fstream> #include <string> using namespace std; int main(void) { string sisnimi, valnimi; ifstream sisf; ofstream valf; string s; // loeme failinimed cout << "Sisendfaili nimi: "; cin >> sisnimi; cout << "Väljundfaili nimi: "; cin >> valnimi; // avame failid sisf.open(sisnimi.c_str()); valf.open(valnimi.c_str()); // kopeerime // NB! ei tööta: while (sisf >> s) while (getline(sisf, s)) { if (s.length() % 2 == 0) { valf << s << endl; } } // sulgeme failid sisf.close(); valf.close(); return 0; }
Lahendus Java's
import java.io.*; public class kopeer { public static void main(String args[]) throws Exception { String sisnimi, valnimi; BufferedReader sisf; PrintWriter valf; String s; // loeme failinimed BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Sisendfaili nimi: "); sisnimi = in.readLine(); System.out.print("Väljundfaili nimi: "); valnimi = in.readLine(); // avame failid sisf = new BufferedReader(new FileReader(sisnimi)); valf = new PrintWriter(new FileWriter(valnimi)); // kopeerime while ((s = sisf.readLine()) != null) { if (s.length() % 2 == 0) { valf.println(s); } } // tühjendame väljundfaili puhvri valf.flush(); } }
Lahendus C#'s
using System; using System.IO; namespace kopeer { class Kopeer { static void Main() { // loeme failinimed Console.Write("Sisendfaili nimi: "); string input = Console.ReadLine(); Console.Write("Väljundfaili nimi: "); string output = Console.ReadLine(); using (StreamReader reader = new StreamReader(input)) { using (StreamWriter writer = new StreamWriter(output)) { string s; // kopeerime while ((s = reader.ReadLine()) != null) { if (s.Length % 2 == 0) { writer.WriteLine(s); } } } // "using" kasutamine tagab readerite ja writerite puhul, } // et failid suletakse vastava bloki lõpus automaatselt } } }
Lahendus Python'is
# loeme failinimed sisnimi = raw_input("Sisendfaili nimi: ") valnimi = raw_input("Väljundfaili nimi: ") # avame failid sisf = open(sisnimi, "r") valf = open(valnimi, "w") # kopeerime for s in sisf: if len(s) % 2 == 1: # reavahetus on ka sümbol valf.write(s) # sulgeme failid sisf.close() valf.close()
Lahendus BASIC'us
DIM sisnimi AS STRING, valnimi AS STRING DIM s AS STRING ' loeme failinimed INPUT "Sisendfaili nimi"; sisnimi INPUT "Väljundfaili nimi"; valnimi ' avame failid OPEN sisnimi FOR INPUT AS #1 OPEN valnimi FOR OUTPUT AS #2 ' kopeerime WHILE NOT EOF(1) LINE INPUT #1, s IF LEN(s) MOD 2 = 0 THEN PRINT #2, s END IF WEND ' sulgeme failid CLOSE #1 CLOSE #2 SYSTEM
Veidi keerulisem näide
Ülesanne
Kirjutada programm, mis loeb andmed tekstifailist andmed.sis
ja väljastab tulemuse tekstifaili andmed.val
vastavalt järgnevale kirjeldusele:
- sisendfaili esimesel real on täisarv K ja järgmisel K real igaühel üks täisarv; väljastada väljundfaili esimesele reale arv K ja nende K arvu summa;
- sisendfaili järgmisel real on täisarv L ja selle järel L tühikutega eraldatud reaalarvu; väljastada väljundfaili teisele reale arv L ja nende L arvu summa täpsusega 3 kohta pärast koma;
- sisendfaili järgmisel real on täisarv M ja selle järel M tühikutega eraldatud numbrit; väljastada väljundfaili kolmandale reale need M numbrit vahetult üksteise kõrvale;
- sisendfaili järgmisel real on täisarv N ja selle järel N rida kujul
<kbd>X sõna1 sõna2 sõna3 ...</kbd>,
kus X on täisarv ja iga sõna ees on täpselt üks tühik; väljastada väljundfaili järgmisele reale komadega eraldatult need sõnad, mille pikkus on X (esimese sõna ees ja viimase järel koma olla ei tohi).
Võib eeldada, et ühegi sisendrea pikkus ei ületa 200 sümbolit.
Lahendus Pascal'is
var sisf, valf : text; n, i : integer; x1, s1 : integer; x2, s2 : real; x : integer; s : string; i1, i2 : integer; e : boolean; begin { avame failid } assign(sisf, 'andmed.sis'); reset(sisf); assign(valf, 'andmed.val'); rewrite(valf); { esimene plokk: täisarvude summa } readln(sisf, n); s1 := 0; for i := 1 to n do begin readln(sisf, x1); s1 := s1 + x1; end; writeln(valf, n, ' ', s1); { teine plokk: reaalarvude summa } read(sisf, n); s2 := 0; for i := 1 to n do begin read(sisf, x2); s2 := s2 + x2; end; readln(sisf); writeln(valf, n, ' ', s2 :0:3); { kolmas plokk: numbrite kuhjamine } read(sisf, n); for i := 1 to n do begin read(sisf, x); write(valf, x); end; readln(sisf); writeln(valf); { neljas plokk: antud pikkusega sõnad } readln(sisf, n); for i := 1 to n do begin readln(sisf, x, s); e := true; i1 := 1; s := s + ' '; for i2 := 2 to length(s) do begin if s[i2] = ' ' then begin if i2 - i1 = x + 1 then begin if not e then begin write(valf, ','); end; write(valf, copy(s, i1 + 1, i2 - i1 - 1)); e := false; end; i1 := i2; end; end; writeln(valf); end; { sulgeme failid } close(sisf); close(valf); end.
Lahendus C's
#include <stdio.h> #include <string.h> int main(void) { FILE *sisf, *valf; int n, i; int x1, s1; double x2, s2; int x; char s[200 + 1 + 1]; int i1, i2; int e; /* avame failid */ sisf = fopen("andmed.sis", "rt"); valf = fopen("andmed.val", "wt"); /* esimene plokk: täisarvude summa */ fscanf(sisf, "%d", &n); s1 = 0; for (i = 0; i < n; ++i) { fscanf(sisf, "%d", &x1); s1 += x1; } fprintf(valf, "%d %dn", n, s1); /* teine plokk: reaalarvude summa */ fscanf(sisf, "%d", &n); s2 = 0; for (i = 0; i < n; ++i) { fscanf(sisf, "%lf", &x2); s2 += x2; } fprintf(valf, "%d %0.3lfn", n, s2); /* kolmas plokk: numbrite kuhjamine */ fscanf(sisf, "%d", &n); for (i = 0; i < n; ++i) { fscanf(sisf, "%d", &x); fprintf(valf, "%d", x); } fprintf(valf, "n"); /* neljas plokk: antud pikkusega sõnad */ fscanf(sisf, "%d", &n); for (i = 0; i < n; ++i) { fscanf(sisf, "%d", &x); fgets(s, sizeof(s), sisf); e = 1; i1 = 0; s[strlen(s) - 1] = ' '; for (i2 = 1; s[i2] != 0; ++i2) { if (s[i2] == ' ') { if (i2 - i1 == x + 1) { if (!e) { fprintf(valf, ","); } s[i2] = 0; fprintf(valf, "%s", s + i1 + 1); e = 0; } i1 = i2; } } fprintf(valf, "n"); } /* sulgeme failid */ fclose(sisf); fclose(valf); return 0; }
Lahendus C++'s
#include <fstream> #include <sstream> #include <iomanip> #include <string> using namespace std; int main(void) { ifstream sisf; ofstream valf; int n, i; int x1, s1; double x2, s2; int x; string s; stringstream ss; int i1, i2; int e; // avame failid sisf.open("andmed.sis"); valf.open("andmed.val"); // esimene plokk: täisarvude summa sisf >> n; s1 = 0; for (i = 0; i < n; ++i) { sisf >> x1; s1 += x1; } valf << n << " " << s1 << endl; // teine plokk: reaalarvude summa sisf >> n; s2 = 0; for (i = 0; i < n; ++i) { sisf >> x2; s2 += x2; } valf << n << " " << fixed << setprecision(3) << s2 << endl; // kolmas plokk: numbrite kuhjamine sisf >> n; for (i = 0; i < n; ++i) { sisf >> x; valf << x; } valf << endl; // neljas plokk: antud pikkusega sõnad sisf >> n; for (i = 0; i < n; ++i) { sisf >> x; getline(sisf, s); ss.clear(); ss << s; e = 1; while (ss >> s) { if (s.length() == x) { if (!e) { valf << ","; } valf << s; e = 0; } } valf << endl; } // sulgeme failid sisf.close(); valf.close(); return 0; }
Lahendus Java's
import java.io.*; import java.util.*; public class andmed { public static void main(String args[]) throws Exception { BufferedReader sisf; StringTokenizer st; PrintWriter valf; int n, i; // avame failid sisf = new BufferedReader(new FileReader("andmed.sis")); valf = new PrintWriter(new FileWriter("andmed.val")); // esimene plokk: täisarvude summa n = Integer.parseInt(sisf.readLine()); int s1 = 0; for (i = 0; i < n; ++i) { s1 += Integer.parseInt(sisf.readLine()); } valf.println(Integer.toString(n) + " " + Integer.toString(s1)); // teine plokk: reaalarvude summa st = new StringTokenizer(sisf.readLine()); n = Integer.parseInt(st.nextToken()); double s2 = 0; for (i = 0; i < n; ++i) { s2 += Double.parseDouble(st.nextToken()); } valf.println(String.format("%d %.3f", n, s2)); // kolmas plokk: numbrite kuhjamine st = new StringTokenizer(sisf.readLine()); n = Integer.parseInt(st.nextToken()); for (i = 0; i < n; ++i) { valf.print(st.nextToken()); } valf.println(); // neljas plokk: antud pikkusega sõnad n = Integer.parseInt(sisf.readLine()); for (i = 0; i < n; ++i) { st = new StringTokenizer(sisf.readLine()); int x = Integer.parseInt(st.nextToken()); boolean e = true; while (st.hasMoreTokens()) { String s = st.nextToken(); if (s.length() == x) { if (!e) { valf.print(","); } valf.print(s); e = false; } } valf.println(); } // tühjendame väljundfaili puhvri valf.flush(); } }
Lahendus C#'s
using System; using System.Globalization; using System.IO; using System.Linq; namespace andmed { class Andmed { static void Main() { // avame failid StreamReader reader = new StreamReader("andmed.sis"); StreamWriter writer = new StreamWriter("andmed.val"); // esimene plokk: täisarvude summa int n = int.Parse(reader.ReadLine()); int sum1 = 0; for (int i = 0; i < n; i++) { sum1 += int.Parse(reader.ReadLine()); } writer.WriteLine(n + " " + sum1); // teine plokk: reaalarvude summa string line = reader.ReadLine(); // Linq on Lahe double sum = line.Split().Skip(1).Select(s => double.Parse(s, CultureInfo.InvariantCulture)).Sum(); writer.WriteLine("{0:F3}", sum); // F3 formaaditäpsustaja ütleb, et tuleb kirjutada 3 kohta pärast koma // kolmas plokk: numbrite kuhjamine line = reader.ReadLine(); string res = string.Join("", line.Split().Skip(1).ToArray()); writer.WriteLine(res); // neljas plokk: antud pikkusega sõnad n = int.Parse(reader.ReadLine()); for (int i = 0; i < n; ++i) { string[] parts = reader.ReadLine().Split(); int x = int.Parse(parts[0]); res = String.Join(",", parts.Skip(1).Where(s => s.Length == x).ToArray()); writer.WriteLine(res); } // suleme sisendfaili ja tühjendame väljundfaili puhvri reader.Close(); writer.Close(); } } }
Lahendus Python'is
# avame failid sisf = open("andmed.sis", "r") valf = open("andmed.val", "w") # esimene plokk: täisarvude summa n = int(sisf.readline()) s1 = 0 for i in range(n): s1 += int(sisf.readline()) valf.write("%d %dn" % (n, s1)) # teine plokk: reaalarvude summa s = sisf.readline().split() n = int(s[0]) s2 = 0 for i in range(n): s2 += float(s[i + 1]) valf.write("%d %.3fn" % (n, s2)) # kolmas plokk: numbrite kuhjamine s = sisf.readline().split() n = int(s[0]) for i in range(n): valf.write(s[i + 1]) valf.write("n") # neljas plokk: antud pikkusega sõnad n = int(sisf.readline()) for i in range(n): s = sisf.readline().split() n = int(s[0]) e = 1 for ss in s[1:]: if len(ss) == n: if e == 0: valf.write(",") valf.write(ss) e = 0 valf.write("n") # sulgeme failid sisf.close() valf.close()
Lahendus BASIC'us
DIM n AS INTEGER, i AS INTEGER DIM x1 AS INTEGER, s1 AS INTEGER DIM x2 AS DOUBLE, s2 AS DOUBLE DIM x AS INTEGER DIM s AS STRING DIM i1 AS INTEGER, i2 AS INTEGER DIM e AS INTEGER ' avame failid OPEN "andmed.sis" FOR INPUT AS #1 OPEN "andmed.val" FOR OUTPUT AS #2 ' esimene plokk: täisarvude summa INPUT #1, n s1 = 0 FOR i = 1 TO n INPUT #1, x1 s1 = s1 + x1 NEXT i PRINT #2, n; s1 ' kui on hädasti vaja saada väljund ilma liigsete tühikuteta, võib kasutada ' PRINT #2, LTRIM$(STR$(n)); STR$(s1) ' teine plokk: reaalarvude summa INPUT #1, n s2 = 0 FOR i = 1 TO n INPUT #1, x2 s2 = s2 + x2 NEXT i PRINT #2, n; PRINT #2, USING "#######.###"; s2 ' kolmas plokk: numbrite kuhjamine INPUT #1, n FOR i = 1 TO n INPUT #1, x PRINT #2, USING "#"; x; NEXT i PRINT #2, ' neljas plokk: antud pikkusega sõnad INPUT #1, n FOR i = 1 TO n INPUT #1, x, s e = 1: i1 = 0: s = s + " " FOR i2 = 1 TO LEN(s) IF MID$(s, i2, 1) = " " THEN IF i2 - i1 = x + 1 THEN IF e = 0 THEN PRINT #2, ","; END IF PRINT #2, MID$(s, i1 + 1, i2 - i1 - 1); e = 0 END IF i1 = i2 END IF NEXT i2 PRINT #2, NEXT i ' sulgeme failid CLOSE #1 CLOSE #2 SYSTEM