• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja NWD dla struktur

Aruba Cloud - Virtual Private Server VPS
0 głosów
279 wizyt
pytanie zadane 27 listopada 2019 w C i C++ przez gallaxxyy Początkujący (270 p.)
#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 nwdw(ulamek w){
int c;
while(w.m!=0){
  c = (w.l % w.m);
  w.l=w.m;
  w.m=c;
}
return w.l;
}


int nwdr(ulamek r){
int c;
while(r.m!=0){
  c = (r.l % r.m);
  r.l=r.m;
  r.m=c;
}
return r.l;
}



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);

	
	printf("wynik dodawania: %d/%d\n", w.l/nwdw(w), w.m/nwdw(w));
	printf("wynik odejmowania: %d/%d\n", r.l/nwdr(r), r.m/nwdr(r));
	
	return 0;
}

Mój problem tkwi w tym ze nie mogę stworzyć jednej funkcji nwd (potrzebnej do skrócenia wyniku) dla dwóch różnych struktur czyli ułamków. 
Dodam, że jestem początkujący, liczę na wasza pomoc :)

3 odpowiedzi

+2 głosów
odpowiedź 29 listopada 2019 przez profesorek96 Szeryf (91,420 p.)

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;
}

 

+1 głos
odpowiedź 30 listopada 2019 przez mmarszik Mądrala (7,390 p.)

Widzę że kolega podał już bardzo dobry przykład NWD, ale dorzucę i swoją propozycję z kilkoma testami:

#include <stdio.h>
#include <stdlib.h>

int nwd(int a,int b) {
    while( b ){
        const int c = a % b;
        a = b;
        b = c;
    }
    return a;
}

int main(int argc, char *argv[])
{
    srand(123);
    for( int i=0 ; i<10 ; i++ ) {
        const int a = rand() % 101 + 1;
        const int b = rand() % 101 + 1;
        printf("nwd(%d,%d) = %d\n",(int)a,(int)b,(int)nwd(a,b));
    }
    return 0;
}

 

0 głosów
odpowiedź 1 grudnia 2019 przez gallaxxyy Początkujący (270 p.)
Dziękuje bardzo  za pomoc, teraz juz wszystko jasne :D

Podobne pytania

0 głosów
1 odpowiedź 297 wizyt
0 głosów
3 odpowiedzi 2,579 wizyt
pytanie zadane 23 kwietnia 2016 w C i C++ przez karola Nowicjusz (230 p.)
0 głosów
1 odpowiedź 435 wizyt
pytanie zadane 15 grudnia 2022 w SPOJ przez Pan_Blazej Nowicjusz (180 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...