Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: C-kieli, keskiarvosuodinfunktio

myy [14.03.2006 13:49:29]

#

Nyt on sormi suussa ja ihan totaalisesti..
Pitäis vääntää C-kielen ohjelma.
Käytetään 1-ulotteista taulukkoa ja alustetaan taulukko alkuarvoilla. Lisäksi ohjelmassa käytetään kolmea arvoa keskiarvon lasketaan. Määritellään symbooliseksi vakioksi.
Lasketaan sizeof-varatulla sanalla taulukossa olevien alkioiden lukumäärä, joka välitetään kutsuvalle funktiolle.

Funktion toiminnassa;
*funktiokutsussa funktiolle välitetään mittaustulokset sisältävä taulukko ja taulukossa olevien alkoiden lukumäärä.
* Taulukon indeksi jätetään tyhjäksi.
* Funktio laskee annetun keskiarvossa käytettävien alkioiden lukumäärän mukaisia keskiarvoja taulukon alusta lukien. * Funktion tulostaa laskemansa keskiarvot.
* Funktio palauttaa paluuarvona keskiarvojen lukumäärän.
* Kutsuva ohjelma tulostaa seuraavan tulostuksen paluuarvon perusteella, esim: Laskettujen keskiarvojen lkm:23.

Siis olen ihan sekaisin. Yksiulotteisen taulukon osaan tehdä, mutta siihen se loppuu. Siis plärään opuksia, mutta ei valkene, miten lähden kokonaisuutta muovaamaan. Tämä "ohjelma" on yksi sekamelska minulle, jota olen ratkonut aika tovin. Help me...

-Myy-

os [14.03.2006 17:15:43]

#

Vähän epäselvästi ilmaisit. Haluako siis funktion, keskiarvosuodin, joka laskee taulukon jokaista tai jokaista mahdollista alkiota kohden sen ja n:n edellisen alkion keskiarvon ja tulostaa sen sekä palauttaa lopuksi tulostettujen lukujen määrän? Lukeeko ohjelma taulukkodatan jostakin syötetiedostosta? Entä mitä ovat "lisäksi symbolisiksi vakioiksi määritellyt kolme keskiarvon laskentaan käytettävää arvoa"? Onko kyseessä kenties jokin painotettu keskiarvo tai konvoluutio?

double *taulukkodata;
int n_alkiota, n_alkiota_keskiarvossa, i;

scanf("%d %d", &n_alkiota, &n_alkiota_keskiarvossa);
taulukkodata = (double*)malloc(sizeof(double)*n_alkiota);
for(i=0; i<n_alkiota; i++) scanf("%lf", &(taulukkodata[i]));

printf("Keskiarvojen lkm: %d\n", keskiarvosuodin(taulukkodata, n_alkiota, n_alkiota keskiarvossa));

free(taulukkodata);

myy [15.03.2006 13:23:59]

#

Sorry. Mitä itse olen ymmärtänyt "sekasotkusta", et laskennassa määritellään keskiarvoon mukaan otettaivien "näytteiden" (mittausarvojen) lukumäärä. Oletetaan siis, että liukuvan keskiarvon laskentaan käytetään kolmen päivän lämpötila-arvoja (6.2, 7.6 ja 8.5) siten, että otetaan tämän päivän lisäksi edellinen ja seuraava päivä. Sitten siirretään eteenpäin aina yksi päivä kerrallaan ja lasketaan uusi liukuvakeskiarvo. (Mittaustulokset ovat liukulukuja)
Fuktio on keskiarvoSuodin

os [15.03.2006 18:58:04]

#

Mitä osaa et osaa ohjelmoida?

Jos "mukaan otettavien näytteiden määrä" on n, lasket n ensimmäisestä päivästä keskiarvon ja tallennat sen muuttujaan k. Tämän jälkeen vain käyt mittausdatan läpi taulukon n. alkiosta lähtien tulostaen ensin muuttujan k arvon, lisäten siihen sen jälkeen ensimmäisen läpikäymättömän arvon ja n:n osamäärän ja poisten lopuksi ko. keskiarvoon ensimmäisenä lisätyn arvon ja n:n osamäärän:

int keskiarvosuodin(double *data, int n_alkiota, int n) {
  int i;
  double k;

  for(i=0, k=0; i<n; i++) k += data[i];
  for(i=n; i<n_alkiota; i++) {
    printf("%lf ", k/(double)n);
    k -= data[i-n];
    k += data[i];
  }
  return n_alkiota-n+1;
}

Vastaus

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

Tietoa sivustosta