Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Lineaarisen yhtälöparin ratkaiseminen

Sivun loppuun

stina [26.04.2007 12:32:49]

#

Moi!

Meille jaettiin ohjelmoinnin kurssilla harjoitustehtävät ja mulle lankesi tällainen:

Tee ohjelma, joka ratkaisee lineaarisen yhtälöparin

ax+by+c=0
dx+ey+f=0.

Kertoimet a, b, c, d, e ja f kysytään käyttäjältä ja x ja y saadaan kaavoilla

x=(fb-ec)/(ae-bd)
y=(dc-af)/(ae-bd).

Jos ae-bd=0, niin on kaksi vaihtoehtoa: 1) jos myös fb-ec=0, yhtälöparilla on äärettömän monta ratkaisua; 2) jos fb-ec ei ole nolla, ei yhtälöparilla ole ratkaisua.
Tee ohjelmasta sellainen, että se kysyy aina uuden yhtälöryhmän ja ratkaisee sen niin kauan kunnes käyttäjä haluaa lopettaa.

Siis esimerkiksi yhtälöparille
2x+3y-14.5=0
-x+2y+2=0
saadaan vastaukseksi x=5 ja y=1.5.
Yhtälöparilla
2x+3y-1=0
4x+6y-2=0
on äärettömän monta ratkaisua ja yhtälöparilla
2x+3y-1=0
4x+6y-3=0
ei ole ratkaisua.

Kurssilla käytetään lcc-win32 ohjelmaa (c-kieli??).
Minulla ei ole hajuakaan miten tämä ratkaistaan! (jo perusteet tuottavat ongelmia)

Voisiko joku viisaampi ystävällisesti auttaa tehtävän kanssa?

Jaska [26.04.2007 12:53:48]

#

Mihin asti olet päässyt ja missä kohtaa juuttunut jumiin? Kurssin oppikirjan lukeminen saattaa auttaa, sillä kyseessä on ihan C:n perusasioita.

Antti Laaksonen [26.04.2007 13:02:37]

#

Ohjelman pitää ensinnäkin kysyä käyttäjältä kuusi lukua, jotka sijoitetaan muuttujiin a, b, c, d, e ja f. Tämän jälkeen pitää tutkia erikoistapaukset (äärettömästi ratkaisuita ja ei ratkaisuita), joista ohjelma ilmoittaa erikseen. Muussa tapauksessa lasketaan arvot x ja y annetulla kaavalla ja tulostetaan ne näytölle.

Seuraavat funktiot ovat tarpeen:
- scanf lukujen kysymiseen
- printf tekstin tulostukseen

Muuttujien tyypiksi sopii float tai double, koska sekä yhtälön kertoimet että ratkaisut voivat olla liukulukuja (eli ei pelkkiä kokonaislukuja).

Muuten ohjelman toimintaan tarvitaan muutama if-lause erikoistapauksia varten ja kaiken muun koodin ympärille silmukka, jotta ohjelma ratkaisee monta yhtälöryhmää peräkkäin. Jossain tilanteessa ohjelman pitää myös päättyä, vaikka silloin, jos kaikki kertoimet saavat arvon 0.

Jaska [26.04.2007 14:30:35]

#

stina kirjoitti:

Tee ohjelmasta sellainen, että se kysyy aina uuden yhtälöryhmän ja ratkaisee sen niin kauan kunnes käyttäjä haluaa lopettaa.

Tätä kohtaa en tehtävänannosta ymmärrä. Miksi yksittäisen yhtälöparin ratkaiseminen pitäisi tehdä niin kauan kunnes käyttäjä kyllästyy? Yleensähän tietokone laitetaan laskemaan nopeasti asioita.

stina [26.04.2007 14:36:22]

#

Tämän verran sain toimimaan:

/* Ohjelma laskee lineaarisen yhtälöparin */
#include <stdio.h>
#include <math.h>
int main(void)
{
	double a, b, c, d, e, f, x, y;

	printf("Ohjelma laskee lineaarisen yhtälöparin.\n");
	printf("Anna a: ");
	scanf("%lf", &a);
	printf("Anna b: ");
	scanf("%lf", &b);
    printf("Anna c: ");
	scanf("%lf", &c);
	printf("Anna d: ");
	scanf("%lf", &d);
	printf("Anna e: ");
	scanf("%lf", &e);
    printf("Anna f: ");
	scanf("%lf", &f);

	x = (f * b - e * c) / (a * e - b * d) ;
	y = (d * c - a * f) / (a * e - b * d) ;

	printf("\n x %lf\n", x);
	printf("\n y %lf\n", y);
	return 0;

}

Tuottaa nuo if-lauseet ja silmukat vähän ongelmia.

(Mod. Edit. Kooditageja on hyvä käyttää.)

Metabolix [30.04.2007 01:09:45]

#

Jos näin on, niin kannattaa opetella ne vaikkapa oppikirjasta tai opassarjasta.

Läksyt ja kurssit pitäisi kuitenkin pääsääntöisesti pyrkiä tekemään itse, eihän siinä muuten opi.

Jaska [01.05.2007 13:21:39]

#

Metabolix kirjoitti:

Läksyt ja kurssit pitäisi kuitenkin pääsääntöisesti pyrkiä tekemään itse, eihän siinä muuten opi.

Kyllä sitä oppii myös jos on miettinyt tuloksetta ongelmaa, näkee malliratkaisun ja opettelee sen. Minäkin luen päivittäin toisten keksimiä asioita julkaisuista, sillä ei minulla ole aikaa keksiä pyörää uudelleen. Kun tajuan artikkelin idean, opin yleensä soveltamaan ideaa muihinkin tehtäviin.

Metabolix [01.05.2007 13:30:51]

#

Jaska kirjoitti:

Minäkin luen päivittäin toisten keksimiä asioita julkaisuista, sillä ei minulla ole aikaa keksiä pyörää uudelleen. Kun tajuan artikkelin idean, opin yleensä soveltamaan ideaa muihinkin tehtäviin.

Joo, mutkikkaammat jutut ovat tietenkin asia erikseen, mutta tällaisissa ihan perustehtävissä kyllä uskaltaisin väittää, että koodaamaan ei kovin hyvin opi kuin koodaamalla. Ja tässähän on oikeastaan kyse jo juuri siitä soveltamisesta: oppaissa on kyllä selvät ohjeet, kuinka if-lause toimii, ja nyt se pitäisi enää saada sovellettua tähän tehtävään, eli pitäisi keksiä, mitkä muuttujat ja arvot lauseeseen laitetaan.


Sivun alkuun

Vastaus

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

Tietoa sivustosta