Avatar billede dinirex Nybegynder
18. november 2007 - 16:59 Der er 6 kommentarer og
1 løsning

Ligning beregning

Hey... Jeg har fået en opgave i programmering (niveau C) hvor jeg skal skrive et program der kan løse en simpel ligning, som f.eks. 2x + 4 = 8

Jeg har så selv skrevet noget kode, hvor jeg lager ligningen ind i en string array. Derefter gøre den arrayet igennem for at finde x.

KODE:
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

int main()
{
    string ligning;
    //string mellemregning[10];
    int y(0), x, n;
    float foerx, efterx, efterligmed;
   
    cout << "Indtast en ligning du \x9bnsker at l\x9bse: ";
    getline(cin, ligning);
   
    x = ligning.length();
   
    for(y = 0; y <= x; y++)
    {
        //2x+2 = 4
       
        n = ligning[y];
       
        if(n == 'x')
        {   
            foerx = ligning[y-1];
            efterx = ligning[y+2];
        }   
       
        if(n == '=')
        {
            efterligmed = ligning[y+1];
        }
    }
   
    cout << foerx << "x = " << efterligmed - efterx;
    cout << foerx << "x = " << (efterligmed - efterx)/foerx;
   
}

Problemet er så at variablerne foerx, efterx, efterligmed osv. får en ASCII værdi, altså 50, 52 og 42 eller noget i den stil, istedet for de tal, der står!

Hvordan konventere jeg dem om, sådan at jeg kan få de rigtige tal ind i min float? og derved udregne x?
Avatar billede arne_v Ekspert
18. november 2007 - 17:16 #1
Der er flere ting som er galt.

Jeg vil anbefale dig at starte med at lave programmet så det først prompter for a og derefter for b
og at du så løser det udfra de to værdier fremfor at læse hele ligningen ind som streng.
Avatar billede dinirex Nybegynder
18. november 2007 - 18:34 #2
øhh, er ikke helt med, kan du evt. give et eksempel?
Avatar billede arne_v Ekspert
18. november 2007 - 21:52 #3
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    double a, b;
    cout << "Vi skal nu løse en ligning af formen a * x + b = 0" << endl;
    cout << "Indtast a: ";
    cin >> a;
    cout << "Indtast b: ";
    cin >> b;
    cout << "Løsningen er x = " << (-b/a) << endl;
    return EXIT_SUCCESS;
}
Avatar billede arne_v Ekspert
18. november 2007 - 22:18 #4
Med noget linie:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    string eq;
    cout << "Vi skal nu løse en ligning af formen a * x + b = 0" << endl;
    cout << "Indtast ligning: ";
    getline(cin, eq);
    string::size_type ixmul = eq.find('*');
    string::size_type ixadd = eq.find('+', ixmul);
    string::size_type ixeq = eq.find('=', ixadd);
    if(ixmul == string::npos || ixadd == string::npos || ixeq == string::npos)
    {
        cout << "Ligning ikke på korrekt format" << endl;
    }
    else
    {
        string astr = eq.substr(0, ixmul);
        string xstr = eq.substr(ixmul + 1, ixadd - ixmul - 1);
        string bstr = eq.substr(ixadd + 1, ixeq - ixadd - 1);
        string zstr = eq.substr(ixeq + 1);
        char *pa, *pb, *pz;
        double a = strtod(astr.c_str(), &pa);
        double b = strtod(bstr.c_str(), &pb);
        double z = strtod(zstr.c_str(), &pz);
        if(pa > astr.c_str() && pb > bstr.c_str() && pz > zstr.c_str() && a != 0 && z == 0)
        {
            cout << "Løsningen er x = " << (-b/a) << endl;
        }
        else
        {
            cout << "Ligning ikke på korrekt format" << endl;
        }
    }
    return EXIT_SUCCESS;
}
Avatar billede intel4004 Novice
19. november 2007 - 01:34 #5
Jeg tror det arne_v mener er at et problem som løsning af a * x + b = 0 altid vil kunne beskrives udfra parametrene a og b. Så derfor er det nærliggende at begrænse programmets parametre til disse.

Et andet spørgsmål du har: Du vil konvertere en ASCII værdi for cifre 0-9? Du kan trække 48 eller hex 30 (0x30) fra ascii-værdien, da ciffer 0 har ascii værdi 48.

0 = '0' - 48
1 = '1' - 48
2 = '2' - 48

Mvh Intel4004
Avatar billede arne_v Ekspert
19. november 2007 - 15:11 #6
Det er ihvertfald meget nemmere at laese a og b ind end at parse en streng.
Avatar billede dinirex Nybegynder
19. november 2007 - 22:25 #7
Hej... Fordi jeg har lavet en string, hvor i min ligning bliver lagret, var fordi min lærer, sagde det var den nemmeste måde vi kunne gøre det på...

Som jeg skrev har jeg programmering på niveau C... vil beskæftige os med c++... Det er ikke ret lang tid siden vi startede og har lært om

Variabler (int, double, string, char, float)
Switch
enums
if funktion
while funktion

osv. altså det mest grundlæggende...

Derfor er jeg ikke så meget inde i det med kodning endnu, men arbejder da på det... arne_v, du har lavet et indlæg der har givet mig en rigtig god ide til hvordan man burde lave det, og vil helt sikkert prøve at se om jeg selv ville være istand til at kode noget ligende, når jeg har fået min egen version til at virke.

Da mit egentlige spørgsmål var hvordan jeg kunne tage min værdi fra min string over i min float, har jeg valgt at give pointene til intel4004... Men jeg siger tusind tak for hjælpen, og håber ikke at dette undlader dig (arne_v) fra at hjælpe mig en anden gang... :D

Mvh. Dennis
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester