Nie wiem dlaczego tak kombinowałeś z tymi funkcjami NWD. Wystarczyło zrobić jedną funkcje obliczającą po prostu NWD, a następnie zrobić funkcje która by skracała ułamek podany jako argument i zwracała już skrócony ułamek.
Proszę bardzo:
#include <stdio.h>
#include <stdlib.h>
struct ulamek{
int l;
int m;
};
typedef struct ulamek ulamek;
ulamek suma_ulamkow(ulamek a, ulamek b){
ulamek w;
w.l = (a.l*b.m)+(b.l*a.m);
w.m = a.m*b.m;
return w;
}
ulamek roznica_ulamkow(ulamek a, ulamek b){
ulamek r;
r.l = (a.l*b.m)-(b.l*a.m);
r.m = a.m*b.m;
return r;
}
int nwd(int a,int b)
{
int r;
while(b!=0){
r = a%b;
a=b;
b=r;
}
return a;
}
ulamek skroc_ulamek(ulamek a)
{
ulamek nowy;
int dziel=nwd(a.l,a.m);
nowy.l=a.l/dziel;
nowy.m=a.m/dziel;
return nowy;
}
int main(int argc, char *argv[]) {
ulamek a;
a.l = 1;
a.m = 2;
ulamek b;
b.l = 1;
b.m = 4;
ulamek w = suma_ulamkow(a, b);
ulamek r = roznica_ulamkow(a, b);
w=skroc_ulamek(w);
r=skroc_ulamek(r);
printf("wynik dodawania: %d/%d\n", w.l, w.m);
printf("wynik odejmowania: %d/%d\n", r.l, r.m);
return 0;
}