Moi taas...
Olenko käsittänyt oikein tämän ?
#include <stdio.h> int main(void) { float taulukko[30], ka = .0f, yht = .0f, tunnit = .0f; int looppi = 0; int paivia = 0;
Tässä käsittääkseni alustan muuttuja float ja int tyypeiksi.
printf("Kuinka monta työpäivää:"); scanf("%d", &paivia); for(paivia = 0; looppi < paivia; looppi++){ printf("Anna %d päivän työtunnit:", looppi+1); scanf("%f", &taulukko[tunnit]); if(paivia == looppi) break; }
Tässä tiedustelen työpäivien määrää,
kun päivien määrä on syötetty, looppi vertaa kuinka monta kertaa pitää
pyörittää kysymystä läpi jotta päivien määrä ja looppi on samanarvoinen.
ja matkanvarrella scanf tallentaa tiedon taulukkoon.
Kun paivia ja looppi on samanarvoiset niin for lause lopetetaan ja mennään
eteenpäin.
yht+=taulukko[tunnit]; ka = yht/paivia;
tämä kohta lasekee taulukon tunnit ja keskiarvon.
printf("Tehdyt tunnit yhteenstä %f tuntia\n", yht); printf("Keskimääräinen työpäivän pituus %f tuntia\n", ka); printf("Syötetyt tunnit:"); }
Ja Printtailua...
En halua tietää onko koodi sinällänsä oikein tehty muuta kuin siltä osin että saan riviltä 14 errorin että array subscript is not an integer.
mielestäni en siinä käytä int vaan float tallenusta ja taulukkojin on float muuttuja niin mistä virhe johtuu?
ja sen verran vielä että miten saan tuoh syötetyt tunnit toimiin eli miten luen taulukkoon syötetyn tiedon siten että se ottaa huomioon päivien määrän ?
koska en varmaan voi käyttää
printf("%f %f %f %f %f, taulukko[0], taulukko[1], taulukko[2]...");
Että sikäli!
Jotain suuntaa saa ehkä tästä (korjatkoon fiksummat): Tunnit-muuttuja on float-tyyppinen, ja tämän tyyppisellä muuttujalla koitat osoittaa tiettyyn soluun. Mitähän tapahtuu jos tunnit-muuttuja on int-tyyppinen? Et voi osoittaa esimerkiksi taulukossa kohtaan 2.9, 1.0 tai 1.337. Käytä kokonaislukuja (mistä virheilmoituskin ulisee) niin pakka pysyy kasassa.
Tästä hieman lukemista.
Jos sit heräilisi.
Moi nomic,
käyttäisin kokonaislukuja mutta ongelma tulee siinä kun pitäisi puolikkaita tunteja käyttää eli 5.5 h etc...
Perkuskules... kattoin vain tuolta C ohjeen alta noista taulukoista juttua ja mietinkin että on aika lyhyt ohje.
pitänee tutkia tota cpp:n taulukko ohjetta.
Perusasiat ensin. Taulukon indekseillä ei ole mitään tekemistä taulukon solun arvojen kanssa.
int main(void) { float oma_taulu[10]; //Alla oleva ei toimi oma_taulu[0.5] = 15.7; //Tämä toimii oma_taulu[1] = 15.7; }
En tiedä sanoinko jotenkin väärin mutta en siis ole yrittämässä puolikkaita indexejä koska niitä ei käsittääkseni ole, vaan kokonaiseen indexiin yritän syöttää desimaalilukua muistiin...
Shooter99 kirjoitti:
En tiedä sanoinko jotenkin väärin mutta en siis ole yrittämässä puolikkaita indexejä koska niitä ei käsittääkseni ole, vaan kokonaiseen indexiin yritän syöttää desimaalilukua muistiin...
Melko selvästi yrität käyttää desimaalilukuja indekseinä. Sanoit itsekin, että tunnit voivat olla myös puolikkaita eli loogisesti ajatellen tunnit-muuttujassa voi olla desimaalilukuja. Lisäksi olet määritellyt tunnit-muuttujan, jota käytät taulukon indeksien osoittamiseen, float-tyyppiseksi.
Taulukon indeksit eivät C- tai C++-kielessä voivat olla ainoastaan kokonaislukuja, kuten myös tuo pasteamasi virheviesti sanoo: taulukon indeksi ei ole kokonaisluku.
Eipä asia jankkaamalla muuksi muutu, ei.
Tässä toimiva pääohjelma ja laskevien funktioiden prototyypit.
#include <stdio.h> float laske_tunnit(float tunnit[], int kpl); float laske_keskiarvo(float tunnit[], int kpl); int main() { int paivia; int i; printf("Kuinka monta työpäivää:"); scanf("%d", &paivia); float tunnit[paivia]; for (i = 0; i < paivia; ++i) { printf("Anna päivän %d tunnit", i+1); scanf("%f", &tunnit[i]); } printf("Yhteensä tunteja on tehty %.2f tuntia keskimäärin %.2f tuntia / päivä", laske_tunnit(tunnit, paivia), laske_keskiarvo(tunnit, paivia)); return 0; }
Se mitä yritän sanoa on että
float luku[3] luku[0] = 5.5 luku[1] = 5 luku[2] = 7
Eli indexi on kokonaisluku mutta tallennettu tieto on desimaali eikä niin että
luku[0.2] = 5.5 luku[0.5] = 6
jos haluaisin alemman mukaan niin tekisin taulukon missä on x määrä sarakkeita pystyssä ja x määrä vaaka tasossa esim:
float luku[3][3]
jolloin
luku[0][0] // olisi 0.33 luku[0][1] // olisi 0.33 luku[0][2] // olisi 0.33
eli käytännössä jokainen tallennus indeksi olisi 33% sadasta eli 0.3 desimaalia
tai luku[3][2] jolloin jokainen indexi lohko oli 0.5 käytännössä.
Shooter99 kirjoitti:
Se mitä yritän sanoa on että...Eli indexi on kokonaisluku
No kuten jo tässä moneen kertaan on sanottu, niin alkuperäisessä koodissasi indeksi ei ole kokonaisluku ja siksi se ei toimi ja virheilmoituksesikin kertoi sen suoraan:
Shooter99 kirjoitti:
float taulukko[30], ka = .0f, yht = .0f, tunnit = .0f; //... yht+=taulukko[tunnit];
Ei tässä nyt kellään muulla ole mitään ongelmia ymmärtää.
Teuho,
kiitos pääohjelmasta, ja vaikka kuinka haluaisin sen kopioida niin en tee sitä koska siinä on joitain kohtia mitä en ymmärrä niin en osaa tehdä sellaista eli voi myöskään kopioida.
Lisäys:
Siis eikö taulukko voi olla float ?
Teuho kirjoitti:
float laske_tunnit(float tunnit[], int kpl);
käsittääkseni tässä on sama tilanne kuin minun
float pelkka_taulukon_nimi[30];
Shooter99 kirjoitti:
Siis eikö taulukko voi olla float ?
Taulukko voi olla float, mutta et voi viitata taulukon n:nteen soluun niin että n on float, kuten alkuperäisessä koodissasi olet tehnyt.
Shooter99 kirjoitti:
yht+=taulukko[tunnit]; //tunnit muuttuja on tyypiltään float
(Kommentti minun lisäämäni)
Shooter99 kirjoitti:
Teuho,
kiitos pääohjelmasta, ja vaikka kuinka haluaisin sen kopioida niin en tee sitä koska siinä on joitain kohtia mitä en ymmärrä niin en osaa tehdä sellaista eli voi myöskään kopioida.
Hyvä päätös, mutta ei tuossa pitäisi olla mitään perusrakenteita kummallisempaa. Kysy ihmeessä, jos jokin kohta ihmetyttää.
Teuho kirjoitti:
float laske_tunnit(float tunnit[], int kpl);
Shooter99 kirjoitti:
käsittääkseni tässä on sama tilanne kuin minun
float pelkka_taulukon_nimi[30];
Ei ole ollenkaan sama asia, Mulla on tuossa funktion protyyppi ja sulla vain taulukon esittely.
Totta, nyt kun katsoin asiaa tarkemmin niin tottahan tuo kaikki on, ymmärsin asian vain ihan päin per...
Eli selon vuoksi kerron miten asian käsitin... eli näin...
Shooter99 kirjoitti:
scanf("%f", &taulukko[tunnit]);
Eli tämä yrittää laittaa ilmeisesti tunnit tähän idexin ilmoittajan tilalle eli taulukko[5.5]
kuten olette yrittänyt minulle jankuttaakin...
vaikka sen kuuluisikin olla taulukko[0] = 5.5
Sori... kaikille typerästä jankutuksesta koska jostain syystä en ymmärtänyt asiaa niin kuin se oli vaikka se lyötiin moneen otteeseen naaman eteen...
Tämä kohta Teuho
float laske_tunnit(float tunnit[], int kpl);
Itse asiass Teuho nyt kun luin koodinpätkän läpi niin huomasin että main ohjelman alla olikin tuo float taulukko...
Aluksi ihmettelin kun kutsut taulukoita aliohjelmiin laske_tunnit ja laske_keskiarvo mutta et ollenkaan main funktiossa että kuin toi toimii mutta jälleen kun otti silmät päähän niin huomas että se sielä oli...
mutta eikö tämä pätkä...
Teuho kirjoitti:
float tunnit[paivia]; for (i = 0; i < paivia; ++i) { printf("Anna päivän %d tunnit", i+1); scanf("%f", &tunnit[i]);
... meinaa sitä että päivä 1 = tunnit[0]
ja ulosprinttaus on silloin "Anna päivän 0 tunnit" ???
testi kirjoitti:
Kuinka monta työpäivää:5
Anna päivän 1 tunnit7.5
Anna päivän 2 tunnit8.3
Anna päivän 3 tunnit7.5
Anna päivän 4 tunnit8.6
Anna päivän 5 tunnit5.5
Yhteensä tunteja on tehty 37.40 tuntia keskimäärin 7.48 tuntia
Process returned 0 (0x0) execution time : 11.194 s
Press any key to continue.
Aivan uunituore ajo tuosta koodista.
Joo sain taulukon toimimaan näin:
#include <stdio.h> int main(void) { float taulukko[30], keskia = .0f, yht = .0f; int i; int paivia; printf("Kuinka monta päivää:"); scanf("%d", &paivia); for(i = 0; i < paivia; i++){ printf("Anna %d päivän työtunnit:", i+1); scanf("%f", &taulukko[i]); yht += taulukko[i]; keskia = yht/paivia; } printf("Tehdyt tunnit yhteenstä %.2f tuntia\n", yht); printf("Keskimääräinen työpäivän pituus %.2f tuntia\n", keskia); printf("Syötetyt tunnit:"); }
nyt yritän keksiä miten saisin nämä viimeisellä rivillä olevat syötetyt tunnit tulostettua koska en voi laittaa 30 kpl %f merkkejä tohon riville...
Tai siis voi mutta ei oo kaunista katseltavaa...
Muuten sen verran Teuro kopioin sua että otin i:n käyttöön...
Jos perfektionisti haluaa olla niin:
1) Sinun ei tarvitse nollata keskia-muuttujaa alussa, jos käytät vinkkiä 2).
2) Keskiarvon voi laskea yhden kerran tuon for-silmukan jälkeen. Nykyinen antaa kyllä oikean tuloksen, mutta se laskee välituloksen joka kysymyksen jälkeen sen max 30 kertaa (turhaa koodia).
3) Nythän käyttäjä saattaisi antaa tuohon 31 päivää ja taulukko vuotaisi yli :) (Ei tällasia koulutehtävissä aina tarvitse ottaa huomioon, mutta on hyvä opetella pikkuhiljaa.)
Saman tapaisesti kuin kysyt useita lukuja for-silmukassa, voit käyttää for:ia myös tulostamiseen.
Niin eli lisäisin tuonne
if(paivia >= 31) printf("Antamasi luku on liian iso!");
Koulutehtävänä siitä ei ole haittaa onko tuo siellä vaiko ei mutta ongelma on jo siinä että koodi jättää jostain syystä ("Anna %d päivän työtunnit:"); sekä ("Kuinka monta päivää:") jälkeen välilyönnin ennen numeroa mikä ilmoittaa virheestä ja ohjelman ajo ei mene läpi...
Siis tällä moodle ympäristössä olevalla pas*** kääntäjällä...
pitää yritää tuolla forilla tulostaa, lueskelin kanssa jostain netissä että miten se menisi mutta sitten menin hämilleni kun jossain oli juttua että c kielen taulukko pitäisi returnin kautta ajaa alkuun jos haluaa syötteet vielä erikseen ulos... tai sit johtui vain vähän huonosta enkusta että ymmärsin väärin jotain...
Kyllähän taulukkoa voi selailla miten haluaa, joskin pitää vain pitää huoli ettei osoittele taulukon ulkopuolelle. Taulukkoa ei siis tarvitse (eikä edes voi) nollata alkuun mitenkään.
Tuossa koodissa kannattaa ehkä siirtää tosiaan nuo kokonaissumman ja keskiarvon laskeminen omiin funktioihin, kuten esimerkissä hiukan vihjaisin.
Moi,
on vähän jäänyt tämäkin vähemmälle mutta tulostan valitut luvut ko. koodista rivillä:
for(i = 0; i < paivia; i++) printf("Syötetyt tunnit:%.2f", taulukko[i]);
Mutta kun tulos tulee Syötetyt tunnit:5 Syötetyt tunnit:6 Syötetyt tunnit:5
Eli miten saisin tuon tulemaan Syötetyt tunnit: 2 3 5 5 6
Shooter99 kirjoitti:
Eli miten saisin tuon tulemaan Syötetyt tunnit: 2 3 5 5 6
Kokeilepa tulostaa tuo 'Syötetyt tunnit: ' ennen silmukkaa ja pelkät luvut taulukosta silmukassa.
Koitin mutta kun en keski miten saan noi tallennetut luvut tulostettua tuohon loopiksi ilman tekstiä...
Aina tulee joko looppina toi teksti, tai sit ei tuu mitään...
Eikä mistää löydy opasta tai hyvää dokumentaatiota siitä miten taulukoista tulostetaan mitäkin...
Shooter99 kirjoitti:
Koitin mutta kun en keski miten saan noi tallennetut luvut tulostettua tuohon loopiksi ilman tekstiä...
En tiedä, miten ihmeessä olet muka yrittänyt ongelmaa ratkaista, mutta jos teksti "Syötetyt tunnit:" toistuu liian monta kertaa, eikö ole selvää, että poistamalla tekstistä tuon kohdan saa tulostettua pelkät luvut? Sen jälkeen voi miettiä uudestaan, miten saisi tulostettua yhden kerran oikeassa välissä pelkästään tuon tekstin.
Shooter99 kirjoitti:
Eikä mistää löydy opasta tai hyvää dokumentaatiota siitä miten taulukoista tulostetaan mitäkin...
Ohjelmoinnissa on miljoonia asioita, joista ei ole opasta, koska koko ohjelmoinnin idea on koota asioita pienemmistä paloista. Esimerkiksi taulukosta tulostaminen ei ole mikään erillinen taito, vaan tarvitsee vain yhdistää yhden luvun tulostaminen ja for-silmukka.
Moi Meta!
Itseasiassa olet ihan oikeassa...
Nyt kun mietin että miten ihmeessä olen yrittänyt ongelmaa ratkaista.
Olen koko ajan ajatellut että taulukosta lukujen tuonti on ongelma mutta totuus onkin että toi teksti toistuu, luvut tulee oikein.
Eli pitää koittaa lähestyä ongelmaa toisesta suunnasta...
Lisäys:
Moi!
Sain koodin toimimaan näin
#include <stdio.h> int main(void) { float taulukko[30], keskia = .0f, yht = .0f; int i; int paivia; printf("Ohjelma laskee yhteen haluamasi ajanjakson aikana\n"); printf("tehdyt työtunnit sekä keskimääräisen työpäivän pituuden.\n"); printf("Kuinka monta päivää:"); scanf("%d", &paivia); for(i = 0; i < paivia; i++){ printf("Anna %d. päivän työtunnit:", i+1); scanf("%f", &taulukko[i]); yht += taulukko[i]; keskia = yht/paivia; } printf("Tehdyt työtunnit yhteensä: %.1f\n", yht); printf("Keskimääräinen työpäivän pituus: %.1f\n", keskia); printf("Syötetyt tunnit: "); for(i = 0; i < paivia; i++){ printf("%.1f ", taulukko[i]); } }
Ja nyt kun sain ohjelman toimiin niin voisiko joku kertoa että mikä olisi paras tapa tehdä tämä.
Teuro ilmoitti että tekee erillisen funktion yhteenlaskulle sekä keskiarvolle.
Meillä on ollut vasta 1 tunti siitä että miten näitä erillisiä funktioita käytetään niin se ei ole ohjelmassa laillinen ennen kuin siihen annetaan lupa...
- Jossain oli juttua että printf / scanf yhdistelmä ei ole paras lukujen käsittelyssä... miksi ?
Aihe on jo aika vanha, joten et voi enää vastata siihen.