Ohjelmointi 1, syksy 2024, luento18
- M: 25. Tietojen lukeminen ulkoisesta lähteestä
- MSDN: How to: Read From a Text File
- Isoksi.cs - esimerkki filtteristä, eli joka lukee syötettä ja tulostaa sitä jotenkin muutettuna
- TiedostoIsoksi.cs - esimerkki, joka lukee tiedoston ja tulostaa sen isoilla kirjaimilla
- Kaino.cs - esimerkki, joka muuttaa Kotus-sanaston sanat Hirsipuupeliä varten sopivaksi
- Syksyllä 2011 tehtiin ohjelma, jonka avulla voi korjata luentomonisteen rikkinäiset linkit
- KorjaaMoniste.cs - "valmiiksi" korjattu versio
- KorjaaMoniste.cs - luennon jälkeinen tilanne
- Syksyn 2011 luennon koodit versionhallinnassa
- Syksyn 2011 videot: Osa 1 MP4 alkuperäinen, MP4 kännykkäversio
- Syksyllä 2019 tehtiin ohjelma, jolla havainnolistetaan ajankäyttöä vs saatuja pisteitä
- Aika.cs - ajankäyttö vs demopisteet, esimerkki, jossa yhdistetään kahden erilaisen tiedoston sisältöä
- Syksyn 2019 videot: Osa 1 MP4 alkuperäinen
- Katsottiin kuvankäsittelyä (nykyisin videot demojen yhteydessä)
- Kuvankasittely
- Konvoluutio kuvan käsittelyyn - lataa ja aja
java -jar konvo.jar - Kuva.cs - demo9 pohjatiedosto kuvan käsittelylle
- Palapeli.cs - demo9 pohjatiedosto palapelille
- Hirsiauta.cs - apuohjelma hirsipuun pelaamiseksi
- Luennolle tehdyt koodit versionhallinnassa
- Luennon koodit versionhallinnassa
- 18. luento videona: Osa 1 ja 2 MP4 alkuperäinen
- luentoseinä
Luentoesimerkkien haku versionhallinnasta
siirry hakemistoon johon haluat esimerkit
ekalla kertaa (tai jos olet ennen su 23.10 hakenut niin tuhoa vanha)
git clone https://gitlab.jyu.fi/tie/ohj1/2024s/esimerkit.git .jatkossa samassa hakemistossa
git pullkopsi tuo hakemisto tai ainakin sinua kiinnostava alihakemisto toiseen paikkaan
periaatteessa tuonne syntyneen solutionin voi avata sellaisenaankin, mutta jos siihen tekee muutoksia, niin seuraavalla
pull-komennolla tulee helposti konflikti
Mitä osataan?
Kurssin aikana sinun on tarkoitus oppia seuraavia asioita (osaamisen taso sovelletulla Bloomin asteikolla: 1=muistaa, 2=ymmärtää, 3=osaa soveltaa, 4=osaa analysoida, 5=osaa arvioida, 6=osaa luoda)
Siirrä alla osaamisesi (punainen pallukka) aina sitä vastaavalle kohdalle. Keltainen ruutu on tavoite johon tulisi päästä kurssin lopuksi. Ruksaa ensin muokkaa.
Please
| Osattava asia | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Rakenteisen ohjelmoinnin perusajatus | o | |||||
| Algoritminen ajattelu | o | |||||
| C#-kielen perusteet | o | |||||
| Peräkkäisyys | o | |||||
| Muuttujat | o | |||||
| Aliohjelmat ja funktiot | o | |||||
| Parametrin välitys | o | |||||
| Ehtolauseet | o | |||||
| Silmukat | o | |||||
| Taulukot | o | |||||
| Tiedostot ohjelmasta käytettynä | o | |||||
| Olioiden käyttö | o | |||||
| Yksikkötestit (TDD) | o | |||||
| Debuggerin käyttö | o | |||||
| Lukujärjestelmät, ASCII-koodi | o | |||||
| Rekursio | o | |||||
| Dokumentointi ja sen lukeminen | o |
Konvoluutio-demon malliohjelma
- Demo 9, B1-3 harjoittelu
- konvo.jar
- lataa ja aja
java -jar konvo.jar- laita yläreunassa olevalle riville kuvan www-osoite ja lokaalilla levyllä olevan kuvan koko tiedostopolku
- valitse kuinka monta kertaa mikäkin maskimatriisin ajetaan
- paina
Aja muunnokset
- lataa ja aja
Filtteri
Filtteri on ohjelma, joka lukeee standardi syötettä (standard input, stdin) ja tekee riveille jotakin ja tulostaa sen standarditulosvirtaan (standard out, stdout).
Filtteri
using System;
public class Isoksi
{
/// <summary>
/// Tulostetaan isona syötettä
/// </summary>
public static void Main()
{
while (true)
{
string jono = Console.ReadLine();
if (jono == null) break;
Console.WriteLine(jono.ToUpper());
}
}
}
Tyypillisesti filtteriohjelmia ajetaan komentoriviltä ja niitä sovelletaan johonkin tiedostoon. Esimerkiksi tiedosto voisi olla:
kissa istuu puussa
Esimerkiksi syöte voidaan antaa suuntaamalla tulos jostakin tiedostosta:
dotnet-run isoksi.exe < kissa.txt
Edellä
dotnet-run
on erikseen vain TIMiin tehty komento, jotta käännetty ohjelma voidaan ajaa. Omassa koneessa vastaava tehtäisiin
dotnet run <kissa.txt
jos ohjelmalle on projekti ja ollaan projektin hakemistossa ks:
Jos ohjelma käännetään Windowsissa csc-komennolla, niin tällöin voi ajaa myös:
./Isoksi.exe <kissa.txt
Ohjelmalle voidaan putkittaa toisen ohjelman tulos, esim grep etsii tiedostosta rivit joilla toteutuu haluttu regular expresstion. Eli jos haluttaisiin muuttaa isoksi vain rivit joilla aluneprin esiintyy pienellä kirjoitettu kissa, se voitaisiin tehdä:
grep kissa kissa.txt | dotnet-run isoksi.exe
Vastaavasti jos haluttaisiin näkyviin vain rivit, joissa muunnoksen jälkeen lukee KISSA, voitaisiin muunnos ajaa ensin ja sitten tehdä grepillä etsiminen:
dotnet-run isoksi.exe < kissa.txt | grep KISSA
Hyvin yleistä on myös suunnata filtterin tulos tiedostoon:
dotnet-run isoksi.exe < kissa.txt >isokissa.txt
cat isokissa.txt
Tehtävä 1
Anna shell komento, joilla saat tehtyä tiedoston vainisokissa.txt jossa on vain ne rivit, joilla alunperin esiintyi sana kissa.
# oma komento tähän cat vainisokissa.txt
Tiedoston käsittely tiedostona
Tiedosto isoksi
using System;
using System.IO;
public class TiedostoIsoksi
{
public static void Main(string[] args)
{
// string dir = Directory.GetCurrentDirectory();
// Console.WriteLine(dir);
string nimi = "kissa.txt";
if (args.Length > 0) nimi = args[0];
string[] luetutRivit = File.ReadAllLines(nimi);
foreach (string rivi in luetutRivit)
{
Console.WriteLine(rivi.ToUpper());
}
}
}
- Sanalistan saa haettua: http://kaino.kotus.fi/sanat/nykysuomi/
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE kotus-sanalista SYSTEM "kotus-sanalista.dtd"> <!-- Copyright (C) Kotimaisten kielten tutkimuskeskus 2006 Kotimaisten kielten tutkimuskeskuksen nykysuomen sanalista, versio 1 Julkaistu 15.12.2006 Sanalista julkaistaan GNU LGPL -lisenssillä. Lisenssiteksti luettavissa osoitteessa http://www.gnu.org/licenses/lgpl.html --> <kotus-sanalista> <st><s>aakkonen</s><t><tn>38</tn></t></st> <st><s>aakkosellinen</s><t><tn>38</tn></t></st> <st><s>aakkosellisesti</s><t><tn>99</tn></t></st> <st><s>aakkosellisuus</s><t><tn>40</tn></t></st> <st><s>aakkosittain</s><t><tn>99</tn></t></st> <st><s>aakkosjärjestys</s></st> <st><s>aakkosnumeerinen</s></st> <st><s>aakkostaa</s><t><tn>53</tn></t></st> <st><s>aakkosto</s><t><tn>2</tn></t></st> <st><s>aakkostus</s><t><tn>39</tn></t></st> <st><s>aalloittain</s><t><tn>99</tn></t></st> <st><s>aalloittainen</s><t><tn>38</tn></t></st> <st><s>aalloittaisuus</s><t><tn>40</tn></t></st> <st><s>aallokas</s><t><tn>41</tn><av>A</av></t></st> <st><s>öykkäröinti</s><t><tn>5</tn><av>J</av></t></st> <st><s>öylätti</s><t><tn>5</tn><av>C</av></t></st> </kotus-sanalista>
Etsitään vain sanat ja muutetaan ne isoksi
using System;
using System.IO;
using System.Text.RegularExpressions;
/// @author vesal
/// @version 1.11.2016
/// <summary>
/// Muutetaan Kotus sanalistan XML tiedostooa niin, että siellä olevat
/// sanat tulostetaan isolla.
/// Rivien muoto:
/// <pre>
/// <st><s>aakkonen</s><t><tn>38</tn></t></st>
/// </pre>
/// </summary>
public class Kaino
{
/// <summary>
///
/// </summary>
public static void Main(string[] args)
{
string nimi = "kotus.xml";
if (args.Length > 0) nimi = args[0];
string[] luetutRivit = File.ReadAllLines(nimi);
foreach (string rivi in luetutRivit)
{
// <st><s>aakkonen</s><t><tn>38</tn></t></st>
Match match = Regex.Match(rivi, @".*<s>(.*)</s>.*", RegexOptions.IgnoreCase);
if (match.Success)
{
string sana = match.Groups[1].Value;
Console.WriteLine(sana.ToUpper());
}
}
}
}
Hirsiauta
- demo9 tehtävänä
- tarkoitus auttaa hirsipuun pelaamisessa
Johdantoa
Hirsiapu
Tuota tarvittava regexp
//
let s = "?????";
let m = "[^]";
let r = s.replaceAll("?", m);
out.writeln(r);
Tiedosto
APINA KISSA KETTU KOIRA
Ohjelma joka käsittelee tiedostoa
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
/// @author Omanimi
/// @version Päivämäärä
/// <summary>
/// <pre>
/// Aluksi kysyy
/// Anna tulos>?????
/// APINA
/// KISSA
/// KETTU
/// KOIRA
/// ...
/// Anna arvaamasi kirjain>A
/// Anna tulos >A???A
/// APINA
/// Anna arvaamasi kirjain>I
/// Anna tulos >A?I?A
///
/// </pre>
/// </summary>
public class Hirsiauta
{
/// <summary>
///
/// </summary>
public static void Main(string[] args)
{
string nimi = "sanat.txt";
if (args.Length > 0) nimi = args[0];
string[] sanat = File.ReadAllLines(nimi);
StringBuilder kaytetyt = new StringBuilder();
string piste = ".";
string tulos = "";
while (true)
{
Console.Write($"Anna tulos ({tulos})>");
string t = Console.ReadLine();
if (t == null || t == "!") break;
if (t != "") tulos = t;
Jakauma jakauma = new Jakauma(kaytetyt.ToString());
string maski = tulos.Replace("?", piste);
Regex regex = new Regex("^" + maski + "$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
foreach (string rivi in sanat) // tutkitaan mitkä rivit täsmäävät
{
Match match = regex.Match(rivi);
if (match.Success)
{
Console.WriteLine(rivi);
jakauma.Add(rivi);
}
}
Console.WriteLine(jakauma.ToString(5));
Console.Write("Anna arvaamasi kirjain >");
string kirjain = Console.ReadLine() ?? "";
if (string.IsNullOrEmpty(kirjain) || kirjain == "!") break;
kirjain = kirjain.ToUpper();
kaytetyt.Append(kirjain);
piste = "[^" + kaytetyt + "]"; // tulee esim [^AUO]
}
}
}
/// <summary>
/// Jakaumalaskuri joka laskee kuinka paljon mitäkin kirjainta esiintyy.
/// Alustuksessa voidaan antaa mitä kirjaimia ei oteta huomioon.
/// </summary>
public class Jakauma
{
// TODO: tähän sopiva attribuutti tai attribuutit jotta saadaan laskettua
// ReSharper disable once NotAccessedField.Local
private readonly string eiLisata;
/// <summary>
/// Alustaan jakaumalaskuri niin, että laskuihin ei oteta annettua kirjainjoukkoa
/// </summary>
/// <param name="eiLisata">mitä kirjaimia ei lasketa mukaan</param>
public Jakauma(string eiLisata = "")
{
this.eiLisata = eiLisata;
}
/// <summary>
/// Lisätään rakenteesen yksi kirjain jollei se ole kielletyissä
/// </summary>
/// <param name="c">lisättävä kirjain</param>
/// <example>
/// <pre name="test">
/// Jakauma jakauma = new Jakauma();
/// jakauma.Add('a');
/// jakauma.Add('i');
/// jakauma.Add('a');
/// jakauma.ToString(4) === "a:2 i:1";
/// </pre>
/// </example>
public void Add(char c)
{
// TODO: tee kuten kommenteissa on ja niin että testit menevät läpi
}
/// <summary>
/// Lisätään kaikki jonon kirjaimet jotka eivät ole kielletyissä
/// </summary>
/// <param name="rivi">jono jonka kirjaimet lisätään jakaumaan</param>
/// <example>
/// <pre name="test">
/// Jakauma jakauma = new Jakauma("ei ");
/// jakauma.Add("kissa ei istu puussa");
/// jakauma.ToString(10) === "s:5 u:3 a:2 k:1 t:1 p:1";
/// </pre>
/// </example>
public void Add(string rivi)
{
// TODO: lisää kirjaimet
}
/// <summary>
/// Palautetaan jakauma merkkijonona jossa on n ensimmäistä yleisintä kirjainta
/// </summary>
/// <param name="n">kuinka monta kirjainta laitetaan jonoon</param>
/// <returns></returns>
/// <example>
/// <pre name="test">
/// Jakauma jakauma = new Jakauma(" ");
/// jakauma.Add("kissa ei istu puussa");
/// jakauma.ToString(2) === "s:5 i:3";
/// </pre>
/// </example>
public string ToString(int n)
{
return "S:5 I:3";
}
}
Demoihin käytettyjen aikojen laskeminen
- tämä vastaa hyvin ei-peli harjoitustyötä.
- vastaava: Työaikaraportti-tutorial
- Aika.cs - esimerkki, jossa yhdistetään kahden erilaisen tiedoston sisältöä
- Syksyn 2019 videot: Osa 1 MP4 alkuperäinen
- Exceliin:
- copy/paste syntynyt tiedosto
- lisätään rpist,raika (round)
- aluelle nimeksi data
- filtteriksi
- lisätään pivot data-alueesta
- riveiksi demo ja rpist
- sarkkeiksi raika
- sisällöksi count(raika)
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.