Ohjelmoinnin ongelmanurkkaus

Liittynyt
19.12.2007
Viestejä
3 537
Nyt kun tuli raiskattua tuota toista threadia näillä ohjelmointiaiheisilla kysymyksillä niin perustetaan tälle oma threadi. Eli tänne kaikki Java-ohjelmointiin liittyvät pulmat ja vastaukset. :)
 
10% ALENNUS KOODILLA PAKKOTOISTO
Quote:
Originally Posted by H. E. Pennypacker View Post
o muuta nykyinen päivä päiviksi
o muuta käyttäjän syntymäpäivä päiviksi
o laske nykyisen päivän ja syntymäpäivän erotus
o muuta saatu erotus vuosiksi, kuukausiksi ja päiviksi
Ja sitten tuo iän laskenta. Joku vinkki vain


Lukee tehtävän tarkkaan niin ei tuohon vinkkiä tarvi.
vuodessa on 360 päivää (nyt vuosi 2009)
kuukaudessa 30 päivää (nyt on vuoden 2. kuukausi)
päivä on mikä on.
Saadaan joku luku

Sama juttu syntymäpäivälle.
Saadaan joku luku2

tehdään luvuille luku1 ja luku2 miinuslasku = nykyisen päivän ja syntymäpäivän erotus
vuosiksi/kuukausiksi tuo saadaan kun tiedetään montako päivää on vuodessa ja montako päivää on kuukaudessa

Tuli nyt mieleen, että nythän tässä on laskettu itse tuo nykypäivän ja syntymäpäivän erotus ja siltä pohjalta tehty tuo laskutoimitus. Mutta miten saa ohjelman tekemään kaiken tuon itse? Ehkä hieman epäselvästi sanottu.

Tässä nyt mitä itse sain tehtyä tuohon ylläolevaan tehtävään liittyen. Joku tässä vieläkin kusee. Pitänee käydä syömässä välillä:jahas:

import java.util.Scanner;

public class HenkilonIka {
public static void main(String[] args) {
String etunimi, sukunimi;
String paiva, kuukausi, vuosi;
String katu, taloNumero, rappu, asuntoNumero;
int nykyinenPaiva = 723308;
int syntymaPaiva = 714271;
int erotus;
int muunnos;
int muunnos2;

// Pyytää käyttäjältä henkilön nimen:

Scanner input = new Scanner(System.in);
System.out.println("Syötä etu- ja sukunimesi ");
etunimi = input.next();
sukunimi = input.next();
System.out.println(etunimi + " " + sukunimi);

// Pyytää käyttäjältä syntymäajan:

System.out
.println("Syötä syntymäaikasi(muodossa päivä kuukausi vuosi) ");
paiva = input.next();
kuukausi = input.next();
vuosi = input.next();
System.out.println(paiva + " " + kuukausi + " " + vuosi);

// Pyytää käyttäjän osoitteen:

System.out.println("Syötä osoitteesi ");
katu = input.next();
taloNumero = input.next();
rappu = input.next();
asuntoNumero = input.next();
System.out.println(katu + " " + taloNumero + " " + rappu + " "
+ asuntoNumero);

// Laskee henkilön iän päivän tarkkuudella:

erotus = (nykyinenPaiva - syntymaPaiva) / 360;
muunnos = erotus / 12;
muunnos2 = erotus / 30;

System.out.println("Ikäsi on " + erotus + " vuotta " + " " + muunnos
+ " kuukautta " + " " + muunnos2 + " päivää. ");

// Muuttaa henkilön nimen ja osoitteen suurille kirjaimille:

etunimi = etunimi.toUpperCase();
sukunimi = sukunimi.toUpperCase();
katu = katu.toUpperCase();
rappu = rappu.toUpperCase();

System.out.println("\n\n" + etunimi + " " + sukunimi + "\n" + katu
+ " " + taloNumero + " " + rappu + " " + asuntoNumero
+ "\n\n\n");

// Tulostaa lopuksi henkilön nimen, osoitteen ja iän.

System.out.println(etunimi + " " + sukunimi + "\n" + katu + " "
+ taloNumero + " " + rappu + " " + asuntoNumero + "\n" + erotus
+ " vuotta " + " " + muunnos + " kuukautta " + muunnos2
+ " päivää ");
}

}
 
Javasta en mitään tiedä mutta voin vääntää vähän pseudokoodia, josta ilmenee tuo matematiikka.

pvm1=360*vuosi1 + 12*kuukausi1 + päivä1
pvm2=360*vuosi2 + 12*kuukausi2 + päivä2

ikäpäivinä=pvm2-pvm1
ikävuosina=floor(ikäpäivinä/360) % pyöristys alaspäin kokonaislukuun
ikäpäivinä=ikäpäivinä - ikävuosina*360
ikäkuukausina=floor(ikäpäivinä/30)
ikäpäivinä=ikäpäivinä - ikäkuukausina*30


Toinen vaihtoehto voisi olla samat temput jakojäännöksen avulla jos Javassa on jokin modulo-funktio valmiina.
 
En nyt ole varma ymmärsinkö oikein mitä halutaan tehdä, mutta eikö kannattaisi käyttää esim. suoraan Javan Date- ja Calendar-olioita, josta voi vähentää (tai oikeastaan lisätä negatiivisia) päiviä, kuukausia ja vuosia? Tosin siinä joutuu luomaan muutaman olion, joten jos haluaa käyttää vain perustietotyyppejä niin sitten monimutkaisemmin.
 
Nyt kun tuli raiskattua tuota toista threadia näillä ohjelmointiaiheisilla kysymyksillä niin perustetaan tälle oma threadi. Eli tänne kaikki Java-ohjelmointiin liittyvät pulmat ja vastaukset. :)
Mulla on aika paljon valmiita ohjelmia ainakin TKK:n peruskurssille eli jos sulla on noita ohjelmien nimiä, joita joudut ohjelmoimaan niin heitä tänne. Katson jos löytyy hyviä vastaavia ohjelmia.
 
Sinähän olet tuossa alustanut nykyinenPaiva-muuttujan niin kuin pitääkin, mutta tuo syntymaPaiva-muuttuja pitäisi ohjelman laskea annetusta syntymäpäivästä. Eli, kun ohjelmaan on syötetty syntymäpäivä (paiva), -kuukausi (kuukausi) ja -vuosi (vuosi), niin silloinhan syntymaPaiva= paiva+30*(kuukausi-1)+360*vuosi.

Sellainenkin ongelma tuossa on, että nuo paiva, kuukausi ja vuosi ovat String-tyyppiä, eli merkkijonoja, joten niillä ei voi suorittaa laskutoimituksia. Muutat ne Int-tyyppisiksi vaikka näin:Rivin paiva = input.next(); tilalle laitat paiva = Integer.parseInt(input.next());.
 
Sellainenkin ongelma tuossa on, että nuo paiva, kuukausi ja vuosi ovat String-tyyppiä, eli merkkijonoja, joten niillä ei voi suorittaa laskutoimituksia. Muutat ne Int-tyyppisiksi vaikka näin:Rivin paiva = input.next(); tilalle laitat paiva = Integer.parseInt(input.next());.

Nyt tuo eclipse itkee että "cannot convert from int to String"

edit. no hätä sittenkään.
 
Voi luoja tässä tämä ohjelmahirvitys nyt sitten on. Vieläkin se näyttää omalle silmälle(kkin) oudolta. Ja iässä näyttää muuten oikein, mutta päivien kohdalla vieläkin pyöreä nolla.

import java.util.Scanner;

public class HenkilonIka {
public static void main(String[] args) {
String etunimi, sukunimi;
int paiva, kuukausi, vuosi;
String katu, taloNumero, rappu, asuntoNumero;
int nykyinenPaiva = 723308;
int syntymaPaiva;
int erotus;
int muunnos;
int muunnos2;

// Pyytää käyttäjältä henkilön nimen:

Scanner input = new Scanner(System.in);
System.out.println("Syötä etu- ja sukunimesi ");
etunimi = input.next();
sukunimi = input.next();
System.out.println(etunimi + " " + sukunimi);

// Pyytää käyttäjältä syntymäajan:

System.out
.println("Syötä syntymäaikasi(muodossa päivä kuukausi vuosi) ");
paiva = Integer.parseInt(input.next());
kuukausi = Integer.parseInt(input.next());
vuosi = Integer.parseInt(input.next());
System.out.println(paiva + " " + kuukausi + " " + vuosi);

// Pyytää käyttäjän osoitteen:

System.out.println("Syötä osoitteesi ");
katu = input.next();
taloNumero = input.next();
rappu = input.next();
asuntoNumero = input.next();
System.out.println(katu + " " + taloNumero + " " + rappu + " "
+ asuntoNumero);

// Laskee henkilön iän päivän tarkkuudella:

syntymaPaiva = paiva + 30 * (kuukausi - 1) + 360 * vuosi;
erotus = (nykyinenPaiva - syntymaPaiva) / 360;
muunnos = erotus / 12;
muunnos2 = erotus / 30;
System.out.println("Ikäsi on " + erotus + " vuotta " + " " + muunnos
+ " kuukautta " + " " + muunnos2 + " päivää. ");

// Muuttaa henkilön nimen ja osoitteen suurille kirjaimille:

etunimi = etunimi.toUpperCase();
sukunimi = sukunimi.toUpperCase();
katu = katu.toUpperCase();
rappu = rappu.toUpperCase();

System.out.println("\n\n" + etunimi + " " + sukunimi + "\n" + katu
+ " " + taloNumero + " " + rappu + " " + asuntoNumero
+ "\n\n\n");

// Tulostaa lopuksi henkilön nimen, osoitteen ja iän.

System.out.println(etunimi + " " + sukunimi + "\n" + katu + " "
+ taloNumero + " " + rappu + " " + asuntoNumero + "\n" + erotus
+ " vuotta " + " " + muunnos + " kuukautta " + muunnos2
+ " päivää ");

}

}


Pikaisesti vielä toinen:

Mikä tässä on vialla?

import java.util.Scanner;

public class Painoindeksi {
public static void main(String[] args) {
String nimi;
double pituus;
int paino;
double painoindeksi;

Scanner input = new Scanner(System.in);
System.out.println("Mikä on nimesi? ");
nimi = input.next();

System.out.println("Ilmoita pituutesi (metreinä): ");
pituus = input.nextDouble();

System.out.println("Ilmoita painosi(kilogrammoissa): ");
paino = input.nextInt();

// painoindeksi

painoindeksi = (paino / (pituus * pituus));

System.out.println(nimi + " , painoindeksisi on " + painoindeksi + ".");

}

}
 
Voi luoja tässä tämä ohjelmahirvitys nyt sitten on. Vieläkin se näyttää omalle silmälle(kkin) oudolta. Ja iässä näyttää muuten oikein, mutta päivien kohdalla vieläkin pyöreä nolla.

// Laskee henkilön iän päivän tarkkuudella:

syntymaPaiva = paiva + 30 * (kuukausi - 1) + 360 * vuosi;
erotus = (nykyinenPaiva - syntymaPaiva) / 360;
muunnos = erotus / 12;
muunnos2 = erotus / 30;
System.out.println("Ikäsi on " + erotus + " vuotta " + " " + muunnos
+ " kuukautta " + " " + muunnos2 + " päivää. ");
Miten tällä voit saada oikean iän?
erotus-muuttujassa on nyt ikä vuosina, Java varmaan pyöristää osamäärän kokonaisluvuksi.
muunnos-muuttujassa on montako 12 vuoden jaksoa henkilö on elänyt.
muunnos2-muuttujassa on montako 30 vuoden jaksoa henkilö on elänyt.

Edelleen en Javasta tiedä mitään, mutta uskoisin että sijoitukset ja jakolaskut toimivat samalla tavalla kuin c++:ssa ja Matlab-koodissa.
 
Juu huomasin tosiaan nyt kyllä saman asian kun otit puheeksi. Itsellä on niin silmät jo tiltissä että olen kiitollinen jos joku vetää koodin tuohon ikä juttuun. Kyllä siitä kuitenkin oppii kun tajuaa miten se pitää oikeasti tehdä.
 
Olin tuon jo aikaisemmin tehnyt, vaikka en java-koodina. (Unohdin (kuukausi-1)-kohdan)
Näköjään joku Math.floor(luku) Javasta löytyy, että sillä tuo toimisi.
 
Hieno ketju.

Vasta harjoittelen javaa.

En keksi millään miten saisin toteutettua seuraavan.

Eli ohjelma kysyy "anna nimesi"

Ja nimi pitäisi tulostaa siten, että etu- ja sukunimen ensinmäiset kirjaimet ovat isoja. Huolimatta siitä kirjoittaako käyttäjä nimet isolla.

Millä tai millaisilla metodeilla onnistun?
 
Eli ohjelma kysyy "anna nimesi"

Ja nimi pitäisi tulostaa siten, että etu- ja sukunimen ensinmäiset kirjaimet ovat isoja. Huolimatta siitä kirjoittaako käyttäjä nimet isolla.

Katso noista aiemmista koodeista tuon scannerin käyttö jotta saat nimet kysyttyä

Äkkiseltään ei löytynyt mitään (tunnustan, ei jaksanut etsiä...) millä voisi merkkijonon ekan merkin muuttaa isoksi, mutta kokeile seuraavaa:
Koodi:
String etu="eTuNIMi";
etu=etu.substring(0,1).toUpperCase()+etu.substring(1,etu.length()).toLowerCase();

(+tuohon sitten virheentarkastukset liian lyhyen tai puuttuvan nimen varalle...)

Ja kun opettaja kysyy että "mitvitt.... " niin toivottavasti osaat sitten selittää mitä tuossa tehdään...
 
Katso noista aiemmista koodeista tuon scannerin käyttö jotta saat nimet kysyttyä

Äkkiseltään ei löytynyt mitään (tunnustan, ei jaksanut etsiä...) millä voisi merkkijonon ekan merkin muuttaa isoksi, mutta kokeile seuraavaa:
Koodi:
String etu="eTuNIMi";
etu=etu.substring(0,1).toUpperCase()+etu.substring(1,etu.length()).toLowerCase();

(+tuohon sitten virheentarkastukset liian lyhyen tai puuttuvan nimen varalle...)

Ja kun opettaja kysyy että "mitvitt.... " niin toivottavasti osaat sitten selittää mitä tuossa tehdään...

Esimerkki näyttää hyvältä. Pitää kokeilla, kaikki nuo metodit ovat tuttuja, joten osaan selittää opettajalle. En vain tajunnut miten nuo yhdistetään.
 
^

Toimi hienosti. Kiitos.

Seuraava tyhmä kysymys.

Minulla on String arvo joka pitäisi kertoa toisella arvolla. Mutta Stringiä ei voi kertoa? Joten miten muutan Stringillä olevan arvon esim. Doubleksi (tai mihin vaan minkä voi kertoa).

Arvon on oltava String, koska minun pitää käyttää equals toimintoa.

Olen syvästi pahoillani, kun en osaa selittää tarpeeksi hyvin. Mutta en voi laittaa tehtävää tänne. Se on arvioitava tehtävä ja haluaisin tehdä sen itse. Vaikka apuja otan mielelläni.

if (vastaus.equals("A")){
vastaus = 25*lkm

Eli kertominen ei toimi, koska vastaus on String.
 
^

Toimi hienosti. Kiitos.

Seuraava tyhmä kysymys.

Minulla on String arvo joka pitäisi kertoa toisella arvolla. Mutta Stringiä ei voi kertoa? Joten miten muutan Stringillä olevan arvon esim. Doubleksi (tai mihin vaan minkä voi kertoa).

Arvon on oltava String, koska minun pitää käyttää equals toimintoa.

Olen syvästi pahoillani, kun en osaa selittää tarpeeksi hyvin. Mutta en voi laittaa tehtävää tänne. Se on arvioitava tehtävä ja haluaisin tehdä sen itse. Vaikka apuja otan mielelläni.



Eli kertominen ei toimi, koska vastaus on String.

Javassa on valmis funktio tähän, Double.valueOf(String str). valueOf() funktio löytyy muillekin muuttujatyypeille.

edit: Siis jos ongelma on tossa double/int:in muuttamisessa stringiksi mikä sun esimerkkikoodissa taitaa olla niin siihen on kans toString() funktio.
 

Suositut

Back
Ylös Bottom