Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tietty merkki muuttujasta

Sivun loppuun

Meitsi [29.10.2004 20:43:27]

#

Miten saan selville int muuttujan viimeisen numeron. Siis esim. jos luku olisi 123 niin saisin tietoon että vika on 3.

Antti Laaksonen [29.10.2004 20:59:10]

#

Näppärä tapa on käyttää jakojäännöstä:

vika = luku % 10

Meitsi [29.10.2004 21:16:01]

#

Joo toimii. Mutta miten saa int muuttujan pituuden selville? Siis jos luku on 12345 niin pituus on 5.

EDIT: Ja sittne pitäisi saada selville luku intin keskeltä. Esim jos luku on 1763 ja tahdomme kolmannen luvun se olisi 6.

Blaze [29.10.2004 21:33:09]

#

Luulenpa, että tuossa tapauksessa helpointa on muuntaa tuo merkkijonoksi ja veivailla sitä.

Meitsi [29.10.2004 21:39:44]

#

Äh

Antti Laaksonen [29.10.2004 22:32:48]

#

Tietyn numeron selvittäminen onnistuu kaavalla:

numero = luku / kohta % 10

Jos kohta on 1, tulee viimeinen numero. Jos kohta on 10, tulee toiseksi viimeinen numero. Jos kohta on 100, tulee kolmanneksi viimeinen numero. Jne. Ja tämä toimii vain kokonaislukumuuttujilla.

petterik [30.10.2004 11:03:22]

#

Meitsi kirjoitti:

Miten saan selville int muuttujan viimeisen numeron.

,,,...,,, pilkunviilausta:
Et mitenkään. Ensinnäkin koska "int" on tyypin tunnus ja varattu sana ei se voi olla muuttuja. Toiseksi, koska "int":ssä ei ole numeroa ei siinä ole myöskään ole viimeistä numeroa. Kolmanneksi tarkoitit varmaan muuttujan arvoa, etkä muuttujaa.

Olisit kysynyt "Miten saan selville int tyyppisen muuttujan arvon viimeisen numeron?"

Tulosta se screenille ja katso mikä se on ;)

jrantala [30.10.2004 23:56:22]

#

petterik:n kommentti oli melko turha...

Metabolix [31.10.2004 00:14:40]

#

Eipä tuo jrantalan viestikään ole mikään hyödyllinen...
Luvun pituuden saa vaikkapa tarkistamalla, onko se suurempi kuin jokin muu. Esimerkiksi tällä makrolla (kai tämä oli C:tä tai C++:aa?)

#define Pituus(X) (X < 10 ? 1 : (X < 100 ? 2 : (X < 1000 ? 3 : (/* Jatka tästä itse. */))))

petterik [31.10.2004 00:48:37]

#

jrantalan kommentti oli melko turha...
(a) Jos petterikoon kommentti oli turha, niin turhaan kommenttiin on turha vastata.
(b) Jos se ei ollut turha, niin jrantalan oli.
Ja tämä vasta turha kommetti on.(c)
Minulla täytyy olla erilainen huumorintaju kuin teillä muilla vakavikoilla. Mielestäni kommentti oli hauska.
Varsinkin koska kysyjä oli kirjoittanut

lainaus:

Siis esim. jos luku olisi 123 niin saisin tietoon että vika on 3.

Siis ihminenhän ei saa tietoon mitään dataa ilman jonkin output laitteen kautta. Että esim. screenille se on tulosettava. Ja ei noi jrantalankaan kaikki aikaansaannokset niin hyödyllisiä ole http://mbnet.fi/jrantala/kakka/prinssi.swf
----------------
No niin. Lopetetaanpas ja pysytään asiassa. Yksi keino saada luvun pituus on pituus=(int)(log(i)/log(10))+1; Siis otetaan 10-kantaisen logaritmi pyöristettynä ylöspäin. Ehkä ei tehokkain, mutta ehkä selkeempi kuin Metalboxin lauseke - siis siitähän tulee pitkä jos X saa olla vaikka 2^32 -1 eli 4294967295 missä on 10 numeroa.
käytin log(i)/log(10) kun en muista onko C:ssä suoraa 10-kantalogaritmia. Minkä tahansa Y-kantainen logaritmi x:lle saadaan log(x)/log(Y) oli tuo log() mikä tahansa logaritmi. Selkee siinä mielessä, että 10-kantainen logaritmihan kertoo juuri sen, että mihin potenssiin 10 on korotettava että saadaan luku ~= luvun pituus 10 kantajärjestelmässä. Varmuuden vuoksi testasin:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int i = 0, lkm=0;
    float r;

    for (i=1;i<=20 ;i++)
    {
        lkm=(int)(log(i)/log(10))+1;
        r=log(i)/log(10);
        printf("\n pituus=%d , log=%f luku=%d",lkm,r,i);
    }
    system("PAUSE");
    return 0;
}

Meitsi [31.10.2004 16:07:35]

#

Huhhuh, nyt alko mennä yli hilseen... Mutta täytyy joskus paremmalla ajalla väsätä tuo apsi loppuun, nyt ei ole aikaan.

FooBat [31.10.2004 16:35:48]

#

int i, vikanumero;
int luku = 12345;
int n = 1;
while (luku) {
  vikanumero = luku % 10;
  luku /= 10;
  n++;
  //tee jotain muuttujalla vikanumero
}
//n == luvun pituus

Tuo siis käy läpi luvun viimeiset numerot yksi kerrallaan. (Jos 0 on tärkeä luku, joudut tarkistamaan sen kertaalleen ennen silmukkaa). Tuossa silmukassa n laskee luvun pituutta.

Metabolix [31.10.2004 16:47:52]

#

Itse asiassa tuossa pitäisi olla int n = 0;
Jos tuolle koodille antaa luvun 1, silmukan jälkeen n == 2.

Nollan tapauksessa n on edelleen sama kuin aluksi, joten jos n on aluksi 0 ja lopuksi 0, tiedämme, että annettu luku oli 0. Ei siihen mitään ylimääräistä tarvita, ainakaan nimenomaisesti ennen silmukkaa.

petterik [31.10.2004 19:40:57]

#

Meitsi kirjoitti:

väsätä tuo apsi loppuun.

Apsi loppuun? Siis luvun i pituus on
lkm=(int)(log(i)/log(10))+1;

Tai itseasissa lkm=(int)(log10(i))+1;

Jossa log10 on 10-kantainen logaritmi. Eikös sellainenkin löydy C:stä. Siis ei mitään silmukoita luvun pituuden laskemiseksi vaan yksi lauseke. Tuossa ohjelmassa vain tulostin lukujen 1..20 pituudet.

Meitsi [31.10.2004 19:46:17]

#

Siis et koodaan oman ohjelmani loppuun noilla koodeilla varustettuna joskus myöhemmin.

petterik [31.10.2004 22:05:11]

#

Toi ohjelma tulosti:
pituus=1 , log=0.000000 luku=1
pituus=1 , log=0.301030 luku=2
pituus=1 , log=0.477121 luku=3
pituus=1 , log=0.602060 luku=4
pituus=1 , log=0.698970 luku=5
pituus=1 , log=0.778151 luku=6
pituus=1 , log=0.845098 luku=7
pituus=1 , log=0.903090 luku=8
pituus=1 , log=0.954243 luku=9
pituus=2 , log=1.000000 luku=10
pituus=2 , log=1.041393 luku=11
pituus=2 , log=1.079181 luku=12
pituus=2 , log=1.113943 luku=13
pituus=2 , log=1.146128 luku=14
pituus=2 , log=1.176091 luku=15
pituus=2 , log=1.204120 luku=16
pituus=2 , log=1.230449 luku=17
pituus=2 , log=1.255273 luku=18
pituus=2 , log=1.278754 luku=19
pituus=2 , log=1.301030 luku=20
Press any key to continue . . .
Eli näyttää tomivan. Ja testasin vielä tuon lausekkeella:
lkm=(int)(log10(i))+1;
ja se toimi.
Siis muuttujaan lkm sijoitetaan luvun i 10-kantainen logaritmi, tehdään tyypin muunnos (int) ja lisätään yksi.
Tarvitset omassa ohjelmassasi #include <math.h> alkuun, koska logaritmi funktiota käytetään.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta