Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Dev-C++ ja ohjelmointiprobleema

koodit_hukassa [30.12.2008 22:43:13]

#

Eli seuraavanlainen ongelma:

C-kurssin eräänä tehtävänä on laskea toistosilmukan avulla pallon lentorata ja -aika. Ohjelmanpätkä toimii muuten moitteetta, mutta käytettäessä lähtönopeutena ja lähtökulmana arvoa 35 tai pienempi, tulos (eli aika) on 0.05. Dev-C++:ssa ei välttämättä ole vikaa, mutta kun aiemminkin on tullut vastaan koodinpätkä, joka toimii moitteetta Borlandissa ja jumittaa Dev-C:ssä..

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#define PII 3.14
void main()
{
     float rkulma, aika, lnopeus, akulma, vaaka;
     int pysty;
     rkulma=0;
     aika=0;
     lnopeus=0;
     akulma=0;
     vaaka=0;
     pysty=0;

         printf("\nTama ohjelma laskee pallon lentoajan ja heiton pituuden,\nkun annat sille lahtonopeuden ja heittokulman.");

         printf("\n\nLahtonopeus (m/s) :");
         scanf("%f", &lnopeus);
         printf("\nHeittokulma asteina :");
         scanf("%f", &akulma);
         rkulma = akulma / (180/PII);

     do
     {
     aika += 0.05;
     pysty=(aika*lnopeus*sin(rkulma))-(9.81*aika*aika/2);
     }while(pysty!=0);

         printf("\n\nLentoaika : %.2f sekuntia", aika);
                               vaaka = aika*lnopeus*cos(rkulma);
         printf("\n\nHeiton pituus : %.2f metria", vaaka);

     getch();
}

Siinäpä tuo mainittu vitsaus. Borlandia ei tällä koneella ole, joten ei ole sillä tullut kokeiltua. Jos vika ei ole kääntäjässä, vinkkiä kaivattaisiin. =)

EDIT: Lisätään vielä sen verran, että nuo muuttujien nollaukset tein alussa lähinnä vainoharhaisuuttani (kaikkiahan ei ole tarvis nollata, pelkästään vaaka, pysty ja aika) ja varmaan kaikille mukaan otetuille tiedostoillekaan ei tässä pätkässä ole käyttöä.

temu92 [30.12.2008 22:49:45]

#

Vikana on se että olet määritellyt mainin tällä tavalla:

void main()

Kun c++:ssa se pitää määritellä

int main(void) // void sulkeiden välissä ei ole pakollinen

Lisäksi mainissa pitää olla lopussa aina return 0;

P.S. Pilkunviilaus: Dev-Cpp ei ole kääntäjä, se on vain IDE. Dev-Cpp:n mukana tuleva kääntäjä on gcc/mingw.

E: Ja noista kirjastoista, tietääkseni tuohon riittäisi vain kun laittaa

#include <iostream>
#include <cmath>
using namespace std;

hunajavohveli [30.12.2008 23:38:54]

#

temu92 kirjoitti:

#include <iostream>
#include <cmath>
using namespace std;

Nämä ovat C++:aa, nyt oli kyse C:stä. C++:ssa "return 0;" tietääkseni ei ole välttämätön, mutta C:ssä on, ja mainin on siten myös palautettava int. conio.h ei ole standardikirjaston headeri, joten joudut varmaankin korvaamaan getch():n jollain muulla. Muuten koodissa ei ainakaan syntaksin puolesta ole vikaa.

Edit: En näe, miten tuo voisi toimia eri tavalla eri ympäristöissä. Varsinainen ongelma lienee siinä, ettei int-tyypin tarkkuus riitä. Liian pienillä syötteillä pysty on heti ensimmäisellä iteraatiolla liian pieni, jolloin silmukan suoritus pysähtyy välittömästi. Ongelma ratkennee vaihtamalla int esim. floattiin. On muuten suositeltavaa vaihtaa ehto muotoon "pysty > 0". Muuttuja ei nimittäin välttämättä saa lopussa arvoa 0.

kayttaja-2499 [30.12.2008 23:52:28]

#

Onko lähtönopeus liian pieni?
Tarkista vaikka käsin laskemalla.

ps. muuta while:n ehto niin ettei ikiluuppi ole mahdollinen

koodit_hukassa [31.12.2008 00:45:01]

#

Isot kiitokset vastauksista. Olin aiemmin kokeillut tuota floatia, mutta se ei siinä vaiheessa toiminut alkuunkaan oikein, joten elin siinä käsityksessä, ettei do-whilen kanssa voi käyttää kuin int-tyyppisiä muuttujia. Olinpahan väärässä.

Nyt homma toimii ihan mitättömän pienistä luvuista järjettömän suuriin asti. Onneksi koodinpätkä luulee maapallon olevan pannukakku - olisi voinut muuten jäädä niin sanotusti silmukkaan. :D

Tuo conio.h on tosiaan ollut käytössä tällä kurssilla ja kun en täysin varma ole, mitä kyseinen tiedosto sisältää, arvelin ettei siitä varmaan haittaakaan ohjelman kannalta ole.

hunajavohveli [31.12.2008 10:46:42]

#

koodit_hukassa kirjoitti:

Olin aiemmin kokeillut tuota floatia, mutta se ei siinä vaiheessa toiminut alkuunkaan oikein, joten elin siinä käsityksessä, ettei do-whilen kanssa voi käyttää kuin int-tyyppisiä muuttujia.

Silmukkaa (tai yleensä mitään muutakaan) ei tosiaan kiinnosta, millaisia muuttujia yms. ehdossa käytetään. Ehto voi olla ihan mitä tahansa, kunhan se on jokin kelvollinen lauseke.

Edit:

koodit_hukassa kirjoitti:

Tuo conio.h on tosiaan ollut käytössä tällä kurssilla ja kun en täysin varma ole, mitä kyseinen tiedosto sisältää, arvelin ettei siitä varmaan haittaakaan ohjelman kannalta ole.

conio.h taitaa tosiaan olla käytössä lähinnä Borlandissa, joten kurssillasi se lienee ok. Myös "void main()", josta aiemman varoittelin, saattaa itse asiassa olla Borlandissa täysin laillinen. En tunne asiaa tarkemmin, toivottavasti kurssillasi osataan kertoa, mikä osa koodista on Borland-spesifistä.

ville-v [31.12.2008 11:25:38]

#

Conio.h:ssa on tuo getch(). Muistaakseni getch() ottaa vain yhden näppäinpainalluksen, jos näppäintä painetaan kutsuhetkellä. Laita tilalle getchar() (stdio.h) niin ohjelma sammuu vasta kun painat enteriä.

Vastaus

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

Tietoa sivustosta