reduce a fraction to lowest terms.

Tags:    c++

<< < 12 > >>
som sædvanlig kan jeg ikke få mit program til at virke. Jeg skal skrive et program, som beder brugeren om at indtaste en brøkdel, så reducerer den brøken til det mindst mulige.

fx: 6/12=1/2

Det kan gøres ved først at beregne gcd af tælleren og nævneren. Derefter dividere både tæller og nævner som gcd.

men jeg kan ikke få min kode til overhovedet at printe noget ud:

#include <stdio.h>

int gcd(int m,int n)
{while(m>0)
if(n>m)
{ int t = m; m = n; n = t; }
m -= n;
}
int main()
{
int m,n;
printf("Enter two numbers to find its GCD:");
fflush(stdout);
scanf("%d/%d",&m,&n);
printf("The GCD of %d and %d is %d",m,n,gcd(m,n));
return 0;
}



Hej

Dit program er ganske tæt på at være korrekt, men du mangler et sæt { } efter din while-løkke. Lige nu er det kun:

if(n>m)
{ int t = m; m = n; n = t; }

Der bliver gentaget i løkken. Det er måske ikke så nemt at se af din kode, fordi du ikke har gjort særlig meget ud af formateringen af din kode - hvis du altid sørger for at sætte den pænt op, vil det være meget nemmere at finde den slags fejl (du bør desuden skrive [ code ] kode ... [ /code ] rundt om din kode, når du poster her, så din formatering bliver vist korrekt). Du mangler desuden at retunere en værdi i din gcd-funktion. Jeg har nedenfor postet en rettet version:

Fold kodeboks ind/udKode 


Håber det hjalp :-)



Indlæg senest redigeret d. 18.11.2008 21:33 af Bruger #2416
Nårh ja det kan jeg godt se nu:), men hvorfor giver 6/12=6??
Den skal da istedet skrive 1/2, da det er den mindst mulig reducerede til 6/12.



Det som gcd (greatest common divisor) gør, er som navnet antyder, at finde den største fælles divisor (dvs. det største tal der går help op i begge tal). Den største fælles nævner er korrekt 6 (i 6/12), for at få vist 1/2 i stedet, skal du blot dividere tæller og nævner med værdien fra gcd. Eksempelvis kan du rette main til:

Fold kodeboks ind/udKode 






Indlæg senest redigeret d. 18.11.2008 22:33 af Bruger #2416
okay så er jeg mere med. Tænkte på om man kunne bruge følgende funktioner istedet:

void reduce(int numerator, int denominator,
int *reduced_numerator,
int *reduced_denominator);
er bare lidt usikker på hvor de så skal være??



Det kan man da - hvad grunden så end er til det? Men det bedste er jo du selv prøver at løse det, og så skriver du her med din kode, når du ikke kan få det til at virke :-)

Jeg har dog lavet et eksempel på det alligevel:

Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 18.11.2008 22:57 af Bruger #2416
Okay, tak for eksemplet:), men jeg har lige et spørgsmål angående den anden sidste sætning:

reduce(numerator, denominator, &reduced_numerator, &reduced_denominator);

Er det nødvendigt at skrive den???

og forresten hvorfor bruger du ikke
fflush(stdout) efter din printf sætning? Bruger du programmet eclipse?


Håber ikke jeg er for besværlig, men er bare nysgerrig. (Er lige startet med at programmere for ca. 1 måned siden).



Nej, du kan ikke undvære sætningen der. Det er der funktionen rent faktisk bliver kaldt - har du ikke den, vil der ikke blive gemt nogen værdier i redued_numerator og reduced_denominator. Prøv at udkommenter linjen, og se hvad der sker! Det gælder om bare at prøve sige frem :-)

Der er som sådan ikke nogen gund til jeg har fjernet fflush(stdout) - jeg ved ikke af, at det skulle være nødvendigt at kalde den i den her sammenhæng, og har derfor bare fjernet den. Og nej, jeg benytter ikke eclipse (benytter normalt CodeBlocks)

Og det er altid godt at være nysgerrig, når man vil lære noget nyt :-)



Indlæg senest redigeret d. 18.11.2008 23:09 af Bruger #2416
Ja Øvelse gør mester:), og tak for din forklaring omkring funktionen.
, men ved du hvad TUSIND tak for hjælpen denne gang og fortsat en god aften. Det må være programmering nok for iaften:)



Forresten hvis du lige har tid kan du så ikke lige forklare hvorfor min kode nedenunder ikke tager højde for (=). Når jeg taster 12+ giver den 3, hvilket jo passer, men det er meningen den skal printe "Not enough operands" ud da man har glemt at taste (=).

[ code ] kode
#include <stdbool.h>
#include <stdlib.h>

#define STACK_SIZE 100

int contents[STACK_SIZE];
int top = 0;
int stack_overflow (){return 0;}
int stack_underflow ()
{
printf("Not enough operands in expression.\n");
exit(EXIT_FAILURE);
return 0;
}

void make_empty(void)
{
top = 0;
}

bool is_empty(void)
{
return top == 0;
}

bool is_full(void)
{
return top == STACK_SIZE;
}

void push(int i)
{
if (is_full())
stack_overflow();
else
contents[top++] = i;
}

int pop(void)
{
if (is_empty())
stack_underflow();
else
return contents[--top];
}

int main (void)
{

char ch;
int n1, n2, n3;
scanf("%c", &ch);

while(ch != '=' && ch != '\n')
{
if(ch>='0' && ch<='9')
push(ch-'0');
else switch(ch)
{
case '+':
n1 = pop();
n2 = pop();
n3 = n2 + n1;
printf("%d + %d = %d\n", n1, n2, n3);
push(n3);
break;
case '-':
n1 = pop();
n2 = pop();
n3 = n2 - n1;
printf("%d - %d = %d\n", n2, n1, n3);
push(n3);
break;
case '*':
n1 = pop();
n2 = pop();
n3 = n1 * n2;
printf("%d * %d = %d\n", n1, n2, n3);
push(n3);
break;
case '/':
n1 = pop();
n2 = pop();
n3 = n2 / n1;
printf("%d / %d = %d\n", n2, n1, n3);
push(n3);
break;
default: printf("Expression is too complex.");
}
scanf("%c", &ch);
}
return 0;
}
[ /code ]



ups.. hvorfor virkede
[ code ] kode ...[ /code ] ikke??

Nu ser koden jo alt for uoverskueligt ud, men det gør den ikke i mit program:(



<< < 12 > >>
t