Pieniä kysymyksiä ohjelmoinnista

Liittynyt
19.10.2016
Viestejä
3 441
Siis periaatteessa tarviiko tuon lisäksi mitään muuta, vai onko tuossa koko setti?
Voitko vähän selventää tuota.
Siinä on luokka, joka sisältää tietoa ja tulostusfunkkarin sille tiedolle. Seuraavaksi siinä luodaan olio, joillakin tiedoilla. Tämän jälkeen tuon olion tulostusfunkkaria kutsutaan, ja se suorittaa siellä luokassa määritetyn tulostuksen.

Eli tuon esimerkin perusteella näet miten luokassa olevaa tietoa voidaan tulostaa funkkarissa. Omassa toteutuksessasi sitten tallentelet mitä tallentelet, ja tulostuksessa tulostat mitä haluat, viittaamalla esimerkin näyttämällä tavalla siihen tietoon (mahdollisesti luuppaamalla jos tarvii).
 
Liittynyt
23.10.2016
Viestejä
1 476
...pitäisikö täällä olla erikseen joku ohjelmoinnin kädestäpitäen opetuksen topic, vai pitäisikö ohjata jollekin oikeasti fiksun opiskelumateriaalin tarjoavalle ohjelmoinnin alkeiden kurssille (esim. MOOC)? Ei vaikuta millään tavalla järkevältä ajankäytöltä millekään osapuolelle tällaisten vatvominen foorumilla.
 
Liittynyt
23.12.2016
Viestejä
653
Vois olla ehkä paras joku omat topic aloittelijoille niin ei tuu tänne liian paljoa näitä viestejä.
Täytyy sanoa silti että viimeisimmän tän olio-jutun kysyttyäni huomasin että olin jo muutoin tehnytkin oikeanlaisen ratkaisumallin (poislukien tuo const-rivi sekä tostring).
 
Liittynyt
23.10.2016
Viestejä
658
Tämän vuoden Full Stack Open -kurssiin on lisätty osio TypeScriptille, jota nyt tietysti aloin kahlaamaan läpi. Olen ollut jo vähän aikaa jumissa yhdessä tehtävässä ja en vain keksi miksi se ei toimi. Tässä linkki komponenttiin.

Tässä virheilmoitus:
1587142398054.png


Varmaan jossain tyyppimäärittelyissä on jotain vikaa, mutta en keksi missä. Omaan silmään kaikki on kunnossa, mutta näin ei taida olla.

Kerkeisikö joku vilkaisemaan?
 
Liittynyt
17.10.2016
Viestejä
14 703
Kerkeisikö joku vilkaisemaan?
Defaultti näyttää palauttavan...ei mitään. Se pitänee fiksata.

EDIT: Eli se sun default aiheuttaa sen, että funktion yksi paluuarvovaihtoehto on undefined. Mutta se ei ole yhteensopiva määritellyn paluutyypin kanssa, joka on React.FC<CoursePart> (EDIT: no eikä ole, vaan se on Part:n tyyppi ja sisältää paluutyypin). Siksi herja. Sun pitää pitää huoli, että kaikki polut palauttavat oikean tyypin.
 
Viimeksi muokattu:
Liittynyt
23.10.2016
Viestejä
658
Defaultti näyttää palauttavan...ei mitään. Se pitänee fiksata.

EDIT: Eli se sun default aiheuttaa sen, että funktion yksi paluuarvovaihtoehto on undefined. Mutta se ei ole yhteensopiva määritellyn paluutyypin kanssa, joka on React.FC<CoursePart>. Siksi herja. Sun pitää pitää huoli, että kaikki polut palauttavat oikean tyypin.
Juu, kiitos. :redface:
 
Liittynyt
23.10.2016
Viestejä
658
Defaultti näyttää palauttavan...ei mitään. Se pitänee fiksata.

EDIT: Eli se sun default aiheuttaa sen, että funktion yksi paluuarvovaihtoehto on undefined. Mutta se ei ole yhteensopiva määritellyn paluutyypin kanssa, joka on React.FC<CoursePart>. Siksi herja. Sun pitää pitää huoli, että kaikki polut palauttavat oikean tyypin.
Luin nyt hieman tarkemmin ton sun selityksen. Käsittääkseni määritelty paluutyyppi ei ole React.FC<CoursePart>. Tuolla määrittelen mitä propseja komponentti hyväksyy. Määritelty paluutyyppi lähdekoodissa on ReactElement | null. Eli riittää, että defaultista palautan joko nullin tai minkä tahansa ReactElementin.

Vai ymmärsinkö väärin mitä tarkoitat paluutyypillä?
 
Liittynyt
17.10.2016
Viestejä
14 703
Luin nyt hieman tarkemmin ton sun selityksen. Käsittääkseni määritelty paluutyyppi ei ole React.FC<CoursePart>. Tuolla määrittelen mitä propseja komponentti hyväksyy. Määritelty paluutyyppi lähdekoodissa on ReactElement | null. Eli riittää, että defaultista palautan joko nullin tai minkä tahansa ReactElementin.

Vai ymmärsinkö väärin mitä tarkoitat paluutyypillä?
Puhuin todella shittia :facepalm: React.FC<CoursePart> kertoo siis komponentin/funktion tyypin. Se toki sisältää myös tyypin paluuarvoille. Mutta joka tapauksessa se herja tulee kun undefined ei mahdu tuohon React.FC<CoursePart>:n paluutyyppiin.
 
Liittynyt
23.10.2016
Viestejä
1 476
Nettisivuprojektini päätyi Herokuun.

Ohjelmani ei sisällä tietokantaa tai muutettavaa dataa, paitsi yhden tiedoston. Koska olin laiska ja "keep it simple stupid", halusin pitää kirjaa kävijöiden määrästä (ja koska on kyse on visailusta, oikeiden vastauksien määristä per kysymys), jota päivitetään muistissa javascript-objektina, ja kerran kymmenessä minuutissa käydään kirjoittamassa levylle ja luetaan ohjelman käynnistyessä, jonka arvelin riittävän minun käyttööni vaikka dyno sammuisi 30 minuutin käyttämättömyyden jälkeen, koska tarkka statistiikka ei ole niin justiinsa.

...nyt selvisi että heroku käyttää ephemereal filesystemiä, ja vaikka tiedosto on olemassa jo suoraan herokulle upattavassa projektissa, kaikki siihen tehdyt muutokset katoavat kun dyno tippuu pois alta.

Olisiko jotain mahdollisimman lightweight keinoa, jolla saisin tiedoston päivitettyä johonkin säntilliseen paikkaan, johon voisin lähettää tiedoston ~toisinaan ja lukea softan käynnistyessä? Vaihtoehtoisesti olisiko joku muu ilmainen alusta, jossa voisi kirjoittaa edes ihan minimäärän tavaran levylle ja se säilyisi? Maksimikokoisenakin tuo tiedosto on alle 10 kilotavua. S3 bucketit ja AWS eivät ole lightweight - tai ainakaan minulla ei ole intoa mihinkään AWS infrastruktuurin käyttöön tämmöisessä.
 
Liittynyt
16.10.2016
Viestejä
543
Olisiko jotain mahdollisimman lightweight keinoa, jolla saisin tiedoston päivitettyä johonkin säntilliseen paikkaan, johon voisin lähettää tiedoston ~toisinaan ja lukea softan käynnistyessä?
AWS S3 ja muut blob storaget ovat kyllä tosi iisi pystyttää ja oikea työkalu tähän. Toinen vaihtoehto on dumpata se johonkin kantaan joko json tai blob muodossa. Esim. firebasen firestore tai Herokun Postgres johon varmaan sen saa myös dumpattua. Firebasella on myös firebase cloud storage joka on tarkoitettu blobeille. Jotkut palvelinten levynkulmat kuulostavat todella jäätäviltä ratkaisuilta, eihän niissä ole varmaan edes backupeja defaulttina.
 
Liittynyt
23.10.2016
Viestejä
658
Nettisivuprojektini päätyi Herokuun.

Ohjelmani ei sisällä tietokantaa tai muutettavaa dataa, paitsi yhden tiedoston. Koska olin laiska ja "keep it simple stupid", halusin pitää kirjaa kävijöiden määrästä (ja koska on kyse on visailusta, oikeiden vastauksien määristä per kysymys), jota päivitetään muistissa javascript-objektina, ja kerran kymmenessä minuutissa käydään kirjoittamassa levylle ja luetaan ohjelman käynnistyessä, jonka arvelin riittävän minun käyttööni vaikka dyno sammuisi 30 minuutin käyttämättömyyden jälkeen, koska tarkka statistiikka ei ole niin justiinsa.

...nyt selvisi että heroku käyttää ephemereal filesystemiä, ja vaikka tiedosto on olemassa jo suoraan herokulle upattavassa projektissa, kaikki siihen tehdyt muutokset katoavat kun dyno tippuu pois alta.

Olisiko jotain mahdollisimman lightweight keinoa, jolla saisin tiedoston päivitettyä johonkin säntilliseen paikkaan, johon voisin lähettää tiedoston ~toisinaan ja lukea softan käynnistyessä? Vaihtoehtoisesti olisiko joku muu ilmainen alusta, jossa voisi kirjoittaa edes ihan minimäärän tavaran levylle ja se säilyisi? Maksimikokoisenakin tuo tiedosto on alle 10 kilotavua. S3 bucketit ja AWS eivät ole lightweight - tai ainakaan minulla ei ole intoa mihinkään AWS infrastruktuurin käyttöön tämmöisessä.
Mitä tiedoston pitää pitää sisällään? Voisiko Google Sheets olla vaihtoehto?
 
Liittynyt
23.10.2016
Viestejä
1 476
Mitä tiedoston pitää pitää sisällään? Voisiko Google Sheets olla vaihtoehto?
Json-dataa muodossa:

Koodi:
{
    "visitors": 5,
    "correctAnswers": {
        "Super mario bros.": 3,
        "Fallout": 1
    }
}
~70 riviä, eikä tiedosto muutu kuin numeroiden osalta.

Esim. firebasen firestore tai Herokun Postgres johon varmaan sen saa myös dumpattua.
Herokun Postgres ilmeisesti riittäisi jo ilmaisella Hobby Dev-tasolla. Ehkä pitänee vaivautua tuohon.
 
Liittynyt
09.03.2018
Viestejä
375
Json-dataa muodossa:

Koodi:
{
    "visitors": 5,
    "correctAnswers": {
        "Super mario bros.": 3,
        "Fallout": 1
    }
}
~70 riviä, eikä tiedosto muutu kuin numeroiden osalta.



Herokun Postgres ilmeisesti riittäisi jo ilmaisella Hobby Dev-tasolla. Ehkä pitänee vaivautua tuohon.
Onko mlab tuttu vai joutuuko rukkaamaan liikaa?
 
Liittynyt
23.10.2016
Viestejä
658
Uutta TypeScript-kysymystä taas samasta aiheesta, kun ei vaan aukene.

Mulla on tämä selektorikomponentti:

Koodi:
import React from "react";
import { Entry } from "../types";
import HospitalEntry from "./HospitalEntry";
import HealthCheckEntry from "./HealthCheckEntry";
import OccupationalHealthcareEntry from "./OccupationalHealthcareEntry";

interface Props {
  entry: Entry;
}

const assertNever = (value: never): never => {
  throw new Error(
    `Unhandled discriminated union member: ${JSON.stringify(value)}`
  );
};

const EntryComponent: React.FC<Props> = ({ entry }) => {
  switch (entry.type) {
    case "Hospital":
      return <HospitalEntry entry={entry} />;
    case "OccupationalHealthcare":
      return <OccupationalHealthcareEntry entry={entry} />;
    case "HealthCheck":
      return <HealthCheckEntry entry={entry} />;
    default:
      return assertNever(entry);
  }
};

export default EntryComponent;
Ja tällaisia Entry-komponentteja:

Koodi:
import React from "react";
import { Entry } from "../types";
import { useStateValue } from "../state";
import { Item } from "semantic-ui-react";

interface Props {
  entry: Entry;
}

const HospitalEntry: React.FC<Props> = ({ entry }) => {
  const [{ diagnoses }, _dispatch] = useStateValue();
  console.log(entry);
  console.log(diagnoses);
  return <div />
};

export default HospitalEntry;
Entry-tyyppi taas on tällainen:
Koodi:
export type Entry =
  | HealthCheckEntry
  | OccupationalHealthCareEntry
  | HospitalEntry;
Koska käytän tota switch-case statementia, niin eikös Typescriptin kuuluisi automaattisesti tietää, että esim. HospitalEntry-komponentin propsien Entryn tarkempi tyyppi on HospitalEntry? Nyt mulla tulee HospitalEntry-komponentissa tämä virheilmoitus:

1587293937211.png


Discharge-property on vain HospitalEntry-tyypissä, mutta Typescript-errori viittaa HealthCheckEntryyn, jota ei tuossa komponentissa ei pitäisi olla.
 
Liittynyt
17.10.2016
Viestejä
14 703
@Nigel, TS ei tiedä mitään sun switch-casesta tuossa HospitalEntryn tyyppimäärittelyssä. Se kyllä tietää, että siellä kutsuvassa päässä tunget propseihin rajatumman tyypin, mutta HospitalEntry-komponentissa tätä tietoa ei ole. TS siis tietää vain, etä entry on tyyppiä Entry ja yrität päästä käsiksi johonkin, jota siellä ei ole.

Tuo virheilmo kertoo, että et voi käyttää dischargea, sillä ainakaan HealthCheckEntryssä sitä ei ole. Voit siis käyttää vain niitä propertyjä, jotka löytyvät kaikista kolmesta Entryn alatyypistä, jos käytät Entry-tyyppiä entrylle.

Voisitko määritellä tuon komponentin propsin tyypiksi HospitalEntry? Silloin voit casessa tunkea tuonne sen HospitalEntryn ilman mutinoita jos pystyt tyypin siellä rajaamaan.
 
Viimeksi muokattu:
Liittynyt
23.10.2016
Viestejä
658
@Nigel, TS ei tiedä mitään sun switch-casesta tuossa HospitalEntryn tyyppimäärittelyssä. Se kyllä tietää, että siellä kutsuvassa päässä tunget propseihin rajatumman tyypin, mutta HospitalEntry-komponentissa tätä tietoa ei ole. TS siis tietää vain, etä entry on tyyppiä Entry ja yrität päästä käsiksi johonkin, jota siellä ei ole.

Tuo virheilmo kertoo, että et voi käyttää dischargea, sillä ainakaan HealthCheckEntryssä sitä ei ole. Voit siis käyttää vain niitä propertyjä, jotka löytyvät kaikista kolmesta Entryn alatyypistä, jos käytät Entry-tyyppiä entrylle.

Voisitko määritellä tuon komponentin propsin tyypiksi HospitalEntry? Silloin voit casessa tunkea tuonne sen HospitalEntryn ilman mutinoita jos pystyt tyypin siellä rajaamaan.
Joo, näin tein nyt ja noin toimii. Ihan järkevältä kuulostaa tuo selitys ja noin se varmasti menee. Sekoitti tämä:

1587304125661.png


Eli tosiaan kun kutsuvassa päässä oikea tyyppi oli jo selvillä, niin kuvittelin sen tyypin välittyvän jotenkin kutsuttuun komponenttiin.
 
Liittynyt
23.10.2016
Viestejä
1 476
Onko mlab tuttu vai joutuuko rukkaamaan liikaa?
Ei ole ennestään tuttu, mutta voisihan tässä harrasteprojektissa myös opetella uutta eikä vain verestyttää vanhoja. Pistän muistiin tutkittavaksi tuon Postgren lisäksi, jahka jaksan vetää projektin loppun.
 
Liittynyt
16.10.2016
Viestejä
543
Ei ole ennestään tuttu, mutta voisihan tässä harrasteprojektissa myös opetella uutta eikä vain verestyttää vanhoja. Pistän muistiin tutkittavaksi tuon Postgren lisäksi, jahka jaksan vetää projektin loppun.
Harrasteprojekteissa just kannattaa kokeilla kaikkea uutta. Varsinkin tietokantoihin tutustuminen kannattaa kyllä aina.
 
Liittynyt
17.10.2016
Viestejä
14 703
Joo, näin tein nyt ja noin toimii. Ihan järkevältä kuulostaa tuo selitys ja noin se varmasti menee. Sekoitti tämä:



Eli tosiaan kun kutsuvassa päässä oikea tyyppi oli jo selvillä, niin kuvittelin sen tyypin välittyvän jotenkin kutsuttuun komponenttiin.
Joo, ei voi ihan noin toimia. Tuota komponenttia HospitalEntry kun voi käyttää muuallakin kuin tuossa switch-lauseessa, joten sen on toimittava juuri oman tyyppimäärittelynsä mukaan ihan joka paikassa. Ja se alkup. tyyppi tosiaan rajasi dischargen pois entrystä. Mutta nyt se on joka tavalla parempi: HospitalEntry-komponentti voidaan laittaa toimimaan suoraan sen rajatumman tyyppinsä kanssa, eikä sen enää tarvitse tehdä mitään tyyppitsekkauksia ajonaikana. Komponentin ei tarvitse tietää tuon taivaallista muista Entry-unionin tyypeistä.
 
Liittynyt
02.12.2017
Viestejä
89
Kokeilin konsolipohjaista testiohjelmaa (c#) ja mistähän johtuu, etten saa kerrottua kahta taulukon elementtiä (hinta x määrä) keskenään yksinkertaisesti lisäämällä kertomerkin väliin?

Taulukon 5 ensimmäistä elementtiä 0-4 määritellään käyttäjän toimesta, mutta kuudes pitäisi pystyä jo laskemaan aiempien perusteella.

Mahtaako ongelma liittyä siihen että, taulukon datatyyppi on object? Valitsin sen koska taulukkoon syötetään muutakin kuin numeroita.
Koodi:
using System;

namespace AMD
{
    class Program
    {
        static void Main(string[] args)
        {
            object[] testArray = new object[6];     
                       
                Console.WriteLine("Product Name: ");
                testArray[0] = Console.In.ReadLine();
                
                Console.WriteLine("Product Category: ");
                testArray[1] = Console.In.ReadLine();
                Console.WriteLine("Serial Number: ");
                testArray[2] = Console.In.ReadLine();
                Console.WriteLine("Unit Price: ");
                testArray[3] = Convert.ToInt32(Console.In.ReadLine());
                Console.WriteLine("Amount: ");
                testArray[4] = Convert.ToInt32(Console.In.ReadLine());
             
              
                           
                testArray[5] = testArray[3];       
                
// testArray[5] = testArray[3] * testArray[4]; /* herjaa "*" merkistä */



            // print
                Console.WriteLine("Product Name: " + testArray[0]);
                
                Console.WriteLine("Product Category: " + testArray[1]);
                
                Console.WriteLine("Serial Number: " + testArray[2]);
                
                Console.WriteLine("Unit Price: " + testArray[3]);
                
                Console.WriteLine("Amount: " + testArray[4]);
                
                Console.WriteLine("Total Price: " + testArray[5]);
           
        }
    }
}
 
Liittynyt
17.10.2016
Viestejä
22 118
Ei taida C# tukea dynaamista tyypitystä. Laita vaan array täyteen stringejä ja tee tuo Convert.ToInt32() siinä kertolaskussa.
 
Liittynyt
02.12.2017
Viestejä
89
Ei taida C# tukea dynaamista tyypitystä.
^Olen ihan täys untuvikko tässä, mutta tämän perusteella olisin kuvitellut sen tukevan?


Laita vaan array täyteen stringejä ja tee tuo Convert.ToInt32() siinä kertolaskussa.
Hyvä idea!

ps: kommentoikaa vielä tuota, tukeeko vai eikö... saan varmuuden mistä ongelma johtuu.
 
Liittynyt
17.10.2016
Viestejä
22 118
^Olen ihan täys untuvikko tässä, mutta tämän perusteella olisin kuvitellut sen tukevan?

Mutta se ei tajua, että esim. kohdassa kolme on numero ja et voi tehdä objekteilla kertolaskuja. Siitä se valittaa.
 
Liittynyt
02.12.2017
Viestejä
89
Mutta elementit 3 ja 4 on konvertoitu jo syöttäessä. Eikö se riitä?

Viimeisessä yritetään kertoa kahta elementtiä, jotka sisältävät numeroita (Int32). Kummaa ettei se onnistu...


edit n+1: Toimihan se hsalosen ohje: eli näin "
testArray[5] = Convert.ToInt32(testArray[3]) * Convert.ToInt32(testArray[4])
"

Kiitoksia!
 
Viimeksi muokattu:
Liittynyt
17.10.2016
Viestejä
22 118
Ideaalitapauksessa sinulla olisi olio, jossa on nuo oikeina tietotyyppeinä ja metodi, joka laskee tuon kertolaskun - ja tekisit siitä instansseja. Mutta nyt haluat luoda geneerisen taulukon, jossa on kaikkea. Ehkä C# on väärä ohjelmointikieli tähän ja kannattaa kokeilla esim. Pythonia. Siinäkään ei ole kyllä kaunista laittaa asioita taulukkoon, josta täytyy tietää maaginen kohta, jossa on tieto x.
 
Liittynyt
02.12.2017
Viestejä
89
Juu, varmasti näin on. En ole vielä ehtinyt oliohin asti.

Yritän opetella C:n alkeita (tässä vaiheessa lähinnä syntaxia ja logiikkaa) ja tulee kokeiltua kaikenlaista...
 
Liittynyt
23.12.2016
Viestejä
653
Tämäntyylisestä koodista (ei ole oma vaan esimerkki netistä) pitäisi saada tulostettua noiden 5:n käyttäjän syöttämän luvun summa sekä keskiarvo:

var inputArray = [];
var size = 5; //Maximum Array size

for(var i=0; i<size; i++) {

//Taking Input from user
inputArray = prompt('Enter Element ' + (i+1));
}



Mitä tulee muuttaa? Vinkkejä jolla saisin toimimaan. Yritän itse tehdä saman koodin mutta alusta asti.
 
Viimeksi muokattu:
Liittynyt
20.10.2016
Viestejä
1 371
Vaikkapa käymällä array läpi, tallettaa summa (summa += luku) muuttujaan ja sit vielä jakaa lukujen määrällä.

Esimerkiksi.
 
Liittynyt
19.10.2016
Viestejä
1 563
Kokeilin konsolipohjaista testiohjelmaa (c#) ja mistähän johtuu, etten saa kerrottua kahta taulukon elementtiä (hinta x määrä) keskenään yksinkertaisesti lisäämällä kertomerkin väliin?

Taulukon 5 ensimmäistä elementtiä 0-4 määritellään käyttäjän toimesta, mutta kuudes pitäisi pystyä jo laskemaan aiempien perusteella.

Mahtaako ongelma liittyä siihen että, taulukon datatyyppi on object? Valitsin sen koska taulukkoon syötetään muutakin kuin numeroita.
Koodi:
using System;

namespace AMD
{
    class Program
    {
        static void Main(string[] args)
        {
            object[] testArray = new object[6];    
                      
                Console.WriteLine("Product Name: ");
                testArray[0] = Console.In.ReadLine();
               
                Console.WriteLine("Product Category: ");
                testArray[1] = Console.In.ReadLine();
                Console.WriteLine("Serial Number: ");
                testArray[2] = Console.In.ReadLine();
                Console.WriteLine("Unit Price: ");
                testArray[3] = Convert.ToInt32(Console.In.ReadLine());
                Console.WriteLine("Amount: ");
                testArray[4] = Convert.ToInt32(Console.In.ReadLine());
            
             
                          
                testArray[5] = testArray[3];      
               
// testArray[5] = testArray[3] * testArray[4]; /* herjaa "*" merkistä */



            // print
                Console.WriteLine("Product Name: " + testArray[0]);
               
                Console.WriteLine("Product Category: " + testArray[1]);
               
                Console.WriteLine("Serial Number: " + testArray[2]);
               
                Console.WriteLine("Unit Price: " + testArray[3]);
               
                Console.WriteLine("Amount: " + testArray[4]);
               
                Console.WriteLine("Total Price: " + testArray[5]);
          
        }
    }
}
C# ei tosiaan tue varsinaisesti dynaamista tyypitystä. Saat kyllä tuolla tavalla tungettua taulukon täyteen erityyppisiä arvoja, mutta kun otat ne myöhemmin taulukosta ulos, kääntäjä tietää vain, että olioita siellä on. Epämääräisillä olioilla kääntäjä taas ei osaa tehdä juuri mitään eikä kuulukaan osata, sillä yksi kääntäjän tehtävistä on ottaa kiinni tyyppivirheet. En kylläkään usko, että haluat oikeasti edes tunkea taulukkoon erityyppisiä arvoja. Tässä tapauksessa sinulle riittäisi ihan hyvin tallentaa kukin arvo omaan tyypitettyyn muuttuujaansa, ja näin varmaan kannattaisikin tehdä. Muuten sopivampi tietorakenne on esim. jonkinlainen olio (joka C#:ssa tarvitsee luokan). Jos ihan välttämättä haluat taulukkoon erityyppisiä arvoja, muiden neuvoma luvuksi muuttaminen taulukosta lukemisen jälkeen toiminee kyllä.

Tämäntyylisestä koodista (ei ole oma vaan esimerkki netistä) pitäisi saada tulostettua noiden 5:n käyttäjän syöttämän luvun summa sekä keskiarvo:

var inputArray = [];
var size = 5; //Maximum Array size

for(var i=0; i<size; i++) {

//Taking Input from user
inputArray = prompt('Enter Element ' + (i+1));
}



Mitä tulee muuttaa? Vinkkejä jolla saisin toimimaan. Yritän itse tehdä saman koodin mutta alusta asti.
Ensinnäkin tässä on jo valmiiksi virhe. Halutaan varmastikin, että inputArray on taulukko, joka sisältää kaikki luvut. Kuitenkin tuossa for-silmukan sisällä sen sijaan, että taulukkoon laitettaisiin käyttäjän antama arvo, taulukkomuuttujaksi asetetaankin käyttäjältä saatu arvo. Tämän jälkeen ei siis nimestä huolimatta ole enää taulukkomuuttujaa. Ensin lienee siis syytä korjata tuo ongelma ennen kuin on mieltä jatkaakaan.

Tuon ongelman korjaamisen jälkeen silmukan valmistuttua taulukossa on käyttäjän antamat arvot, ja niistä pitää vain laskea keskiarvo. Pitää siis laskea taulukon arvot yhteen ja jakaa saatu luku taulukon arvojen lukumäärällä.

Koko homman pystyy myös tekemään ilman taulukkomuuttujaa, jos taulukon sijaan tallentaakin käyttäjän antamien lukujen summan suoraan ja jakaa sen lopuksi annettujen arvojen lukumäärällä. Tulee vähän epäelegantti ratkaisu mutta toimii kyllä sekin.
 
Liittynyt
23.12.2016
Viestejä
653
Ensinnäkin tässä on jo valmiiksi virhe. Halutaan varmastikin, että inputArray on taulukko, joka sisältää kaikki luvut. Kuitenkin tuossa for-silmukan sisällä sen sijaan, että taulukkoon laitettaisiin käyttäjän antama arvo, taulukkomuuttujaksi asetetaankin käyttäjältä saatu arvo. Tämän jälkeen ei siis nimestä huolimatta ole enää taulukkomuuttujaa. Ensin lienee siis syytä korjata tuo ongelma ennen kuin on mieltä jatkaakaan.

Tuon ongelman korjaamisen jälkeen silmukan valmistuttua taulukossa on käyttäjän antamat arvot, ja niistä pitää vain laskea keskiarvo. Pitää siis laskea taulukon arvot yhteen ja jakaa saatu luku taulukon arvojen lukumäärällä.

Koko homman pystyy myös tekemään ilman taulukkomuuttujaa, jos taulukon sijaan tallentaakin käyttäjän antamien lukujen summan suoraan ja jakaa sen lopuksi annettujen arvojen lukumäärällä. Tulee vähän epäelegantti ratkaisu mutta toimii kyllä sekin.
Hylkään tuon netti-version samantien, nimittäin huomasin tehtävänannossa erään asian joten teen mieluummin tämän itse uudestaan.
 
Liittynyt
02.12.2017
Viestejä
89
Hylkään tuon netti-version samantien, nimittäin huomasin tehtävänannossa erään asian joten teen mieluummin tämän itse uudestaan.
Minun ei varmaan pitäisi antaa täällä ideoita saatikka neuvoa, mutta kokeilin kötöstellä saman tyylistä, voit katsoa siitä vähän ideaa..

Haluaisin toki itsekkin kuulla onko kaksi erillistä for loopia tarpeen jotta tuon himmelin saa toimimaan? Jotain muuta huomioitavaa?




Koodi:
using System;

namespace AverageArray
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Kuinka monta pistettä haluat syöttää?");
            int size = Convert.ToInt32(Console.In.ReadLine()); //Käyttäjä määrittelee koon "size" string --> int32.
            // TAi vaihtoehtoisesti esim " int size = 5; "
            int[] points = new int[size];
      
            for (int i = 0; i < size; i++)                          // Taulukon täyttö
            {
                Console.WriteLine("Syötä piste: ");
                points[i] = Convert.ToInt32(Console.In.ReadLine());     
            }
                Console.WriteLine("Syötit seuraavat pisteet: ");
            for (int i = 0; i < size; i++)                          // Taulukon tulostus
            {
                Console.Write(" " + points[i]);           
            }
                int sum = 0;                                          // Summa
                Array.ForEach(points, i => sum +=i);
                Console.WriteLine("\n Pisteiden summa on: " + sum);
      
                double avg = ((double) sum) / size;                 // Keskiarvo
                Console.WriteLine(" Pisteiden keskiarvo on: " + avg);
        }
    }
}
 
Viimeksi muokattu:
Liittynyt
19.10.2016
Viestejä
3 441
Minun ei varmaan pitäisi antaa täällä ideoita saatikka neuvoa, mutta kokeilin kötöstellä saman tyylistä, voit katsoa siitä vähän ideaa..

Haluaisin toki itsekkin kuulla onko kaksi erillistä for loopia tarpeen jotta tuon himmelin saa toimimaan? Jotain muuta huomioitavaa?




Koodi:
using System;

namespace AverageArray
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Kuinka monta pistettä haluat syöttää?");
            int size = Convert.ToInt32(Console.In.ReadLine()); //Käyttäjä määrittelee koon "size" string --> int32.
            // TAi vaihtoehtoisesti esim " int size = 5; "
            int[] points = new int[size];
     
            for (int i = 0; i < size; i++)                          // Taulukon täyttö
            {
                Console.WriteLine("Syötä piste: ");
                points[i] = Convert.ToInt32(Console.In.ReadLine());    
            }
                Console.WriteLine("Syötit seuraavat pisteet: ");
            for (int i = 0; i < size; i++)                          // Taulukon tulostus
            {
                Console.Write(" " + points[i]);          
            }
                int sum = 0;                                          // Summa
                Array.ForEach(points, i => sum +=i);
                Console.WriteLine("\n Pisteiden summa on: " + sum);
     
                double avg = ((double) sum) / size;                 // Keskiarvo
                Console.WriteLine(" Pisteiden keskiarvo on: " + avg);
        }
    }
}
Ks. Xiyngin huomiot yllä, nuo luvut voisi summata ensimmäisessä silmukassa (ja tällöin arrayta ei välttämättä tarvita, jos luvuille itsessään ei käyttöä) . Outputissa voisi harkita, käyttötapauksesta riippuen, pyöristystä.
 
Liittynyt
23.10.2016
Viestejä
658
Kysymys tällä kertaa express-appin testaamisesta jestiltä ja tarkemmin mockaamisesta. Olen tässä nyt pari tuntia googlaillut tuloksetta.

Mulla on tällainen endpoint expressissä:
Koodi:
import express from "express";
import { googleSheetsService } from "../services";

const router = express.Router();

router.get("/", async (_req, res, next) => {
  try {
    const raceCalendar = await googleSheetsService.getRaceCalendar();
    return res.status(200).json(raceCalendar);
  } catch (err) {
    return next(err);
  }
});

export default router;
Haluaisin testata tuota endpointtia ja tarkistaa, että sieltä tulee ulos sitä mitä pitää. Toi googleSheetsService on seuraavanlainen:

Koodi:
const { GoogleSpreadsheet } = require("google-spreadsheet");

import config from "../config";
import { toRaceCalendarEvents, RaceCalendarEvent } from "./googleSheetsUtils";

export const getDocument = async () => {
  const doc = new GoogleSpreadsheet(config.GS_ID);
  await doc.useServiceAccountAuth(config.GS_AUTH);
  await doc.loadInfo();
  return doc;
};

const getRaceCalendar = async (): Promise<RaceCalendarEvent[]> => {
  const doc = await getDocument();
  const sheet = doc.sheetsById[0];
  const rawRows = await sheet.getRows();
  const raceCalendarEvents = toRaceCalendarEvents(rawRows);
  return raceCalendarEvents;
};

export default {
  getRaceCalendar,
};
Servicessä on riippuvuus google-spreadsheets kirjastoon, jonka haluaisin mockata tuon GoogleSpreadsheet-luokan osalta, jotta yhteyksiä verkon läpi ei testien aikana oteta.

Sen verran olen ymmärtänyt, että projektijuuressa node_modules-hakemiston tasolla pitäisi olla __mocks__-kansio ja siellä vissiin google-spreadsheet.js-niminen tiedosto, mutta en tiedä mitä sinne tiedostoon pitää laittaa.

Osaisiko joku neuvoa?
 
Liittynyt
23.10.2016
Viestejä
658
Pääsin vähän eteenpäin, joten voin supistaa kysymystä.

Eli riittää ilmeisesti, että node_modules-kansion rinnalla on tyhjä __mocks__-kansio, niin sitten moduleita voi mockata suoraan testeistä.

Koitan nyt saata mockattua uuden class-instanssin paluuarvoa:

Koodi:
## route.test.ts

import app from "../app";
import supertest from "supertest";

jest.mock("google-spreadsheet");
const { GoogleSpreadsheet } = require("google-spreadsheet");

console.log(new GoogleSpreadsheet());
Tuo console.log tulostaa seuraavaa:
Koodi:
_isMockFunction: true,
getMockImplementation: [Function],
mock: [Getter/Setter],
mockClear: [Function],
mockReset: [Function],
mockRestore: [Function],
mockReturnValueOnce: [Function],
mockResolvedValueOnce: [Function],
mockRejectedValueOnce: [Function],
mockReturnValue: [Function],
mockResolvedValue: [Function],
mockRejectedValue: [Function],
mockImplementationOnce: [Function],
mockImplementation: [Function],
mockReturnThis: [Function],
mockName: [Function],
getMockName: [Function]
Olen noille kaikille koittanut antaa omia arvoja tyyliin GoogleSpreadsheet.mockReturnValue = { test: "test" }, mutta joka tapauksessa testattavassa koodissa console.log(new GoogleSpreadsheet()) tulostaa koko luokan mokatun sisällön. Voiko tuota paluuarvoa edes mitenkään mockata?
 
Viimeksi muokattu:
Liittynyt
23.10.2016
Viestejä
658
Visitin nyt seuraavanlaisen ratkaisun:

JavaScript:
import app from "../app";
import supertest from "supertest";
import { googleSheetsService } from "../services/";
import { RaceCalendarEvent } from "../services/googleSheetsUtils";

const api = supertest(app);

const mockData: RaceCalendarEvent[] = [
  {
    eventId: "0401",
    isReady: true,
    isCompleted: true,
    date: "20200101",
    trackName: "Test Track",
    qLaps: 5,
    raceLaps: 4,
  },
  {
    eventId: "0402",
    isReady: true,
    isCompleted: true,
    date: "20200101",
    trackName: "Test Track",
    qLaps: 5,
    raceLaps: 4,
  },
];

describe("GET /api/calendar", () => {
  let mockGoogleSheetService: jest.SpyInstance;

  beforeAll(() => {
    mockGoogleSheetService = jest
      .spyOn(googleSheetsService, "getRaceCalendar")
      .mockImplementation(
        () =>
          new Promise((resolve, _reject) => {
            resolve(mockData);
          })
      );
  });

  afterAll(() => {
    mockGoogleSheetService.mockRestore();
  });

  it("should return json", async () => {
    await api
      .get("/api/calendar")
      .expect(200)
      .expect("Content-Type", /application\/json/);
  });
  it("calls getRaceCalendar from googleSheetService", async () => {
    await api.get("/api/calendar").expect(200);
    expect(mockGoogleSheetService).toHaveBeenCalled;
  });
Eli mockasin lopulta pelkästään sen getRaceCalendar-funktion ja siten koko ulkoisesta modulista ei tarvitse välittää. Täytyy kyllä tuolle googleSheetServicelle tehdä erikseen jotain unit testejä varmaankin, mutta on muutenkin varmaan fiksumpaa erottaa routejen ja servicejen testit toisistaan.
 
Liittynyt
02.12.2017
Viestejä
89
Olen yrittäny hahmottaa luokkia ja funktioita, mutta aika epämääräiseltä vaikuttaa.

Miten esim tälläinen sanapari vertailu ohjelma tulisi jakaa fiksusti osiin. Yritin laittaa nuo sanojen kyselyt tuohon pääohjelmaan. Siten että, VERTAILU funktioon jäi ainoastaan nuo (vertailu)loopit, mutta en saanut toimimaan vaan herjan
"
Program.cs(20,17): error CS0103: The name 'sana1' does not exist in the current context
Program.cs(20,32): error CS0103: The name 'sana2' does not exist in the current context"



Mikä olisi fiksu toteutustapa?



"sanojen kyselyt:
Koodi:
Console.WriteLine("Kirjoita sana 1:");
string sana1 = Console.ReadLine();
    
Console.WriteLine("Kirjoita sana 2:");
string sana2 = Console.ReadLine();


Toimiva versio, mutta tökerö toteutus.
Koodi:
using System;

namespace sanaVRT
{
    class Program
    {
        static void Main(string[] args)
        {

            VERTAILU();
        }

        static void VERTAILU()
        {
            Console.WriteLine("Kirjoita sana 1:");
            string sana1 = Console.ReadLine();
    
            Console.WriteLine("Kirjoita sana 2:");
            string sana2 = Console.ReadLine();                           
    
            if (sana1.Length > sana2.Length)
            {
                Console.WriteLine("Sana 1 on pidempi");       
            }
            else if (sana2.Length > sana1.Length)
            {
                Console.WriteLine("Sana 2 on pidempi");
            }
            if (sana2.Length == sana1.Length)
            {
                Console.WriteLine("Sanat ovat yhtä pitkiä");
            }
        }
    }
}
edit: Tässä on muokattu versio jota olen yrittänyt saada toimimaan.
Koodi:
using System;

namespace sanaVRT
{
    class Program
    {
        static void Main(string[] args)
        {
 
            Console.WriteLine("Kirjoita sana 1:");
            string sana1 = Console.ReadLine();
     
            Console.WriteLine("Kirjoita sana 2:");
            string sana2 = Console.ReadLine();
     
           VERTAILU();                // Herja: " No overload for method 'VERTAILU' takes 0 arguments "
        }

        static string VERTAILU(string sana1, string sana2)  // Herja "'sanaVRT.Program.VERTAILU(string, string)': not all code paths return a value "
        {                                      
            if (sana1.Length > sana2.Length)
            {
                Console.WriteLine("Sana 1 on pidempi");        
            }
            else if (sana2.Length > sana1.Length)
            {
                Console.WriteLine("Sana 2 on pidempi");
            }
            if (sana2.Length == sana1.Length)
            {
                Console.WriteLine("Sanat ovat yhtä pitkiä");
            }
        }
    }
}
 
Viimeksi muokattu:
Liittynyt
17.10.2016
Viestejä
14 703
Olen noille kaikille koittanut antaa omia arvoja tyyliin GoogleSpreadsheet.mockReturnValue = { test: "test" }, mutta joka tapauksessa testattavassa koodissa console.log(new GoogleSpreadsheet()) tulostaa koko luokan mokatun sisällön. Voiko tuota paluuarvoa edes mitenkään mockata?
Kokeilitko tätä:


Eli annat tuolle mock-kutsulle toisen parametrin, joka on funktio, joka palauttaa funktion, joka palauttaa haluamasi mockin, jonka voit sitten instantioida new;:llä. En kokeillut, mutta tuo saattaisi ehkä toimia.
 
Liittynyt
23.12.2016
Viestejä
653
Eräs tehtävä on sellainen että käyttäjän antamien tietojen, esim. hetun perusteella pitäisi siitä numerorimpsusta poimia joku tieto (yksi annettu merkki).
Millä käskyllä voi jonkun tietyn merkin eristää ja sen pohjalta tehdä if else alertin? Ei ratkaisua vaan joku vinkki mitä kaikkea tässä array tarvitsee.
Pyörittelen tässä pohjaa jolle rakennan tämän. Regex:iä ilmeisesti käytetty näissä yleensä mutta pitäs saada joku aloittelijalle helpompi.
 
Viimeksi muokattu:

Hessu

Tukijäsen
Liittynyt
29.10.2016
Viestejä
4 420
Olen yrittäny hahmottaa luokkia ja funktioita, mutta aika epämääräiseltä vaikuttaa.

Miten esim tälläinen sanapari vertailu ohjelma tulisi jakaa fiksusti osiin. Yritin laittaa nuo sanojen kyselyt tuohon pääohjelmaan. Siten että, VERTAILU funktioon jäi ainoastaan nuo (vertailu)loopit, mutta en saanut toimimaan vaan herjan
"
Program.cs(20,17): error CS0103: The name 'sana1' does not exist in the current context
Program.cs(20,32): error CS0103: The name 'sana2' does not exist in the current context"



Mikä olisi fiksu toteutustapa?



"sanojen kyselyt:
Koodi:
using System;

namespace sanaVRT
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Kirjoita sana 1:");
            string sana1 = Console.ReadLine();
    
            Console.WriteLine("Kirjoita sana 2:");
            string sana2 = Console.ReadLine();
    
           VERTAILU();                // Herja: " No overload for method 'VERTAILU' takes 0 arguments "
        }

        static string VERTAILU(string sana1, string sana2)  // Herja "'sanaVRT.Program.VERTAILU(string, string)': not all code paths return a value "
        {                                     
            if (sana1.Length > sana2.Length)
            {
                Console.WriteLine("Sana 1 on pidempi");       
            }
            else if (sana2.Length > sana1.Length)
            {
                Console.WriteLine("Sana 2 on pidempi");
            }
            if (sana2.Length == sana1.Length)
            {
                Console.WriteLine("Sanat ovat yhtä pitkiä");
            }
        }
    }
}
Vihje: Katsoppas tuota funktiokutsua VERTAILU(); mainin sisällä. Siitä se vika löytyy.


Koodi:
using System;

namespace sanaVRT
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Kirjoita sana 1:");
            string sana1 = Console.ReadLine();
    
            Console.WriteLine("Kirjoita sana 2:");
            string sana2 = Console.ReadLine();
    
           VERTAILU(sana1, sana2);                // Herja johtui parametrien puuttumisesta. 
//VERTAILU(); -funktio vaatii kaksi stringiä parametrikseen, eli sinun täytyy antaa sana1 ja 2 parametrina,
        }

        static string VERTAILU(string sana1, string sana2)  // Herja "'sanaVRT.Program.VERTAILU(string, string)': not all code paths return a value "
        {                                     
            if (sana1.Length > sana2.Length)
            {
                Console.WriteLine("Sana 1 on pidempi");       
            }
            else if (sana2.Length > sana1.Length)
            {
                Console.WriteLine("Sana 2 on pidempi");
            }
            if (sana2.Length == sana1.Length)
            {
                Console.WriteLine("Sanat ovat yhtä pitkiä");
            }
        }
    }
}
 
Liittynyt
19.10.2016
Viestejä
3 441
Eräs tehtävä on sellainen että käyttäjän antamien tietojen, esim. hetun perusteella pitäisi siitä numerorimpsusta poimia joku tieto (yksi annettu merkki).
Millä käskyllä voi jonkun tietyn merkin eristää ja sen pohjalta tehdä if else alertin? Ei ratkaisua vaan joku vinkki mitä kaikkea tässä array tarvitsee.
Pyörittelen tässä pohjaa jolle rakennan tämän. Regex:iä ilmeisesti käytetty näissä yleensä mutta pitäs saada joku aloittelijalle helpompi.
Piirrä paperille hetu ruudukkoon kuvaamaan arrayta, kirjoita sisälle hetu. Numeroi arrayn kentät yläpuolelle. Katso mistä tahansa perusteusta miten yksittäisiin kenttiin viitataan. Päässet alkuun.
 
Liittynyt
17.10.2016
Viestejä
14 703
Eräs tehtävä on sellainen että käyttäjän antamien tietojen, esim. hetun perusteella pitäisi siitä numerorimpsusta poimia joku tieto.
Millä käskyllä voi jonkun tietyn merkin eristää ja sen pohjalta tehdä if else alertin? Ei ratkaisua vaan joku vinkki mitä kaikkea tässä array tarvitsee.
Pyörittelen tässä pohjaa jolle rakennan tämän.
Jos meillä on merkkijono muuttujassa hetu, voidaan näin ottaa siitä tietty merkki talteen esim.

JavaScript:
const checkSum = hetu[10];
Jonkun pätkän siitä voi eristää esim. slice-metodilla.

JavaScript:
const date = hetu.slice(0, 6);
Noilla päässet alkuun. Ja yleensä vähän robustimpi tapa on, ettei koskaan oleta, että siellä hetu-muuttujassa on oikeanlainen merkkijono, vaan se kannattaa ensin validoida (pitää olla oikean mittainen, tarkistusmerkki kunnossa jne.). Samalla sen voi purkaa valmiiksi joksikin objektiksi jne. Mutta se on seuraava vaihe.

 
Liittynyt
09.03.2018
Viestejä
375
Vihje: Katsoppas tuota funktiokutsua VERTAILU(); mainin sisällä. Siitä se vika löytyy.


Koodi:
using System;

namespace sanaVRT
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Kirjoita sana 1:");
            string sana1 = Console.ReadLine();
 
            Console.WriteLine("Kirjoita sana 2:");
            string sana2 = Console.ReadLine();
 
           VERTAILU(sana1, sana2);                // Herja johtui parametrien puuttumisesta.
//VERTAILU(); -funktio vaatii kaksi stringiä parametrikseen, eli sinun täytyy antaa sana1 ja 2 parametrina,
        }

        static string VERTAILU(string sana1, string sana2)  // Herja "'sanaVRT.Program.VERTAILU(string, string)': not all code paths return a value "
        {                                  
            if (sana1.Length > sana2.Length)
            {
                Console.WriteLine("Sana 1 on pidempi");    
            }
            else if (sana2.Length > sana1.Length)
            {
                Console.WriteLine("Sana 2 on pidempi");
            }
            if (sana2.Length == sana1.Length)
            {
                Console.WriteLine("Sanat ovat yhtä pitkiä");
            }
        }
    }
}
Tämä ainakin. Tää korjattu koodi ei toisin ainakaan mulla toimi eikä C# kuulu vahvuuksiin, mutta jos lisää vaikka return "moikka" tohon vertailu-metodin loppuun niin ei tule erroreita. Osaako mestarit sanoa miksi?

Koodi:
        static string VERTAILU(String sana1, String sana2)  // Herja "'sanaVRT.Program.VERTAILU(string, string)': not all code paths return a value "
        {
            if (sana1.Length > sana2.Length)
            {
                Console.WriteLine("Sana 1 on pidempi");
            }
            else if (sana2.Length > sana1.Length)
            {
                Console.WriteLine("Sana 2 on pidempi");
            }
            if (sana2.Length == sana1.Length)
            {
                Console.WriteLine("Sanat ovat yhtä pitkiä");
            }
            return "toimii";
        }
 
Liittynyt
09.11.2016
Viestejä
1 355
Koska aikuisten ohjelmointikielissä on paluuarvon antavan metodin/funktion aina palautettava arvo. Joten on parempi, että ei sallita kääntäjän kääntää sellaista ohjelmakoodia joka ei pysty täyttämään annettuja lupauksia.
 
Liittynyt
09.03.2018
Viestejä
375
Koska aikuisten ohjelmointikielissä on paluuarvon antavan metodin/funktion aina palautettava arvo. Joten on parempi, että ei sallita kääntäjän kääntää sellaista ohjelmakoodia joka ei pysty täyttämään annettuja lupauksia.
Mitä tuollaisessa tapauksessa aikuiset palauttaa? Defaulttia? Vai pitäskö olla metodi joka ottaa inputtia vastaan ja vertailu erikseen tjsp
 
Liittynyt
09.11.2016
Viestejä
1 355
Kerrotko, mitkä on aikuisten kieliä ja mitkä siis lasten?
Aikuiset tekevät kirjallisia sopimuksia ja lupauksia, kun sen sijaan lapset tekevät/leikkivät enemmän Ad hoc - tai Laisser faire -tyylillä. Eli kun syötteet ja ulostulot ovat tyypitettyjä, niiden järjestys on määrätty ja tyyppejä ei voida "vahingossa" muuttaa toisiksi, ollaan aika lähellä sopimusta, jota voivat hyödyntää muut ihmiset (ja luonnollisesti muut ohjelmat) kanssakäymisessä.
 
Liittynyt
21.10.2016
Viestejä
9 281
Aikuiset tekevät kirjallisia sopimuksia ja lupauksia, kun sen sijaan lapset tekevät/leikkivät enemmän Ad hoc - tai Laisser faire -tyylillä. Eli kun syötteet ja ulostulot ovat tyypitettyjä, niiden järjestys on määrätty ja tyyppejä ei voida "vahingossa" muuttaa toisiksi, ollaan aika lähellä sopimusta, jota voivat hyödyntää muut ihmiset (ja luonnollisesti muut ohjelmat) kanssakäymisessä.
Pointti lienee oli se, että tollaisen "aikuistelun" voisi jättää pois? Vai mitä? :)
 
Toggle Sidebar

Statistiikka

Viestiketjut
240 268
Viestejä
4 192 792
Jäsenet
70 895
Uusin jäsen
olsteri

Hinta.fi

Ylös Bottom