From d9d27b6a945c42e446c12bf90cdce319edcfb231 Mon Sep 17 00:00:00 2001 From: Abreu Date: Sat, 11 Sep 2021 14:29:47 -0300 Subject: [PATCH] Restored modular version, added EPSILON for float comparisons --- 2020/01/balance.c | 69 ++++++++++++++++++++++++++++++++++++++++++++ 2020/01/balancear | Bin 16280 -> 16384 bytes 2020/01/balancear.c | 55 ----------------------------------- 2020/01/main.c | 4 +-- 4 files changed, 71 insertions(+), 57 deletions(-) create mode 100644 2020/01/balance.c delete mode 100644 2020/01/balancear.c diff --git a/2020/01/balance.c b/2020/01/balance.c new file mode 100644 index 0000000..58a379d --- /dev/null +++ b/2020/01/balance.c @@ -0,0 +1,69 @@ +#include +#include +#include + +#define EPSILON 0.000001 + +typedef struct { + int no; + float juice, alcohool; +} Barrel; + +bool readInput(Barrel * line, Barrel * reservoir) { + int i; + float f; + + for (i = 0; i < 4; i++) { + if (!(scanf(" %f", &f)) || f <= 0) + return false; + if (i % 2 == 0) { + line[i / 2].no = i / 2 + 1; + line[i / 2].juice = f; + } + else { + if (f > 1) + return false; + line[i / 2].alcohool = f * line[i / 2].juice; + line[i / 2].juice -= line[i / 2].alcohool; + } + reservoir->juice = line[0].juice + line[1].juice; + reservoir->alcohool = line[0].alcohool + line[1].alcohool; + } + return true; +} + +void sortLine(Barrel * line) { + Barrel aux; + if (line[0].juice + line[0].alcohool > line[1].juice + line[1].alcohool) + return; + aux = line[0]; + line[0] = line[1]; + line[1] = aux; +} + +int loadBarrel (Barrel * reservoir, Barrel b) { + float capacity = b.juice + b.alcohool; + + if (reservoir->juice - capacity * 0.86 >= -EPSILON + && reservoir->alcohool - capacity * 0.14 >= -EPSILON) { + reservoir->juice -= capacity * 0.86; + reservoir->alcohool -= capacity * 0.14; + return b.no; + } + return 0; +} + +int balance() { + int i, result = 0; + Barrel line[2], reservoir; + + if (!readInput(line, &reservoir)) + return EOF; + + sortLine(line); + + for (i = 0; i < 2; i++) + result += loadBarrel(&reservoir, line[i]); + + return result; +} diff --git a/2020/01/balancear b/2020/01/balancear index 0b5daecb1b5d00d547c27cbe62fcc2d3b8e22c4f..a377c9e7d9abf0eadf56bf6c600c554a2207d29a 100755 GIT binary patch delta 1862 zcmZWqeQZ-z6o2ovW!)I>V=McR!MgE)F2K5OgOz};-3ogn)q(3A%mS-)3*rRa2E+u@ zkq)KKD)UB#M3NCP;m=_;K`_!eM-T{ZkSGZnCo!>P8~X$mna|(t+d{;foO|v$_k8@$ zIrrrq545$h$1H4HXWlPK>*p}>wSEpsVe^xA={0eeKC+R`XLH(eHTg;I(bSBGoZv=H z>W>X|rxUNTR^m{Bgt*S?&Li+_6ObVh));9{HHw0_H5Ih5w<3S(0e|IQ0@Tan~KNw|| zu<3aa32~ExRHlbVIkqk30WsLePC5l?LtJO1I#XOW2B-D=JI}EcK!-;*`jzFTIGp{P zl;F4Gi`$%D=Qii|ULm^;CX8S;+~*nQpf#TJxDwVoKtUu@5P56Qq~N`b)DC2j6#d;p zs;UavE+)X(qC;J=j~-Dm9ta*)FcNDipb8OyDoof0P};#vrK2`k=}1sQ=^eEuB~+0d zs-*#|Oudalc00v^Zner|aB#^}=*V{yf;is?V3R^!l^()EuO>t%gsuG(Lcn{aQLtWZ zUI5Xs5m&T}u&p&t2;P2N-E2v)MNy=KnGos_t?ovLi^i9#fKRG5_8!Bm?EjgS#THe< zt+HMTACkq`!hck?9fQh3CsC1CMm3^G&cN=L%TuHStX58@n19cqt-ACgWfb-AhPv9FH;v{SW5UD8_a-UneY24yn_W6Qf=HD) zhx3I;zUcbnQuo)xo6jveGSpMbF3_!|A8{h6YeZF#f{%gQF&guzs_uhq9#hqB@Pctw zodVwnZp8f{I31y55`N&_;Qi!m?y}4?_f*viOU9KTQYM3nK_VH?%?>zl@`83Dej@ys zGG2U_ThC{Nb!EKy9lgR^-ZYf+1;IHLyn{QL#1}Yui<38(@folzGaT%tAYfv$*g`8Mi zZa9R~t;ny7-%BL1m3Gda7Rk;3P{;XYa^7};Z6mhAWyD;pC*H!Wyn;09&oBm!F)QGk z!tl&ks-~DlR6=}3>1+=&2f2m zZ;gDgx|bzUP9ND~uh(&X26BFFe$s3Y?P+9U?FI~P%{r^}zkeBd n9ok#D8roTYEb`^LQVuSEJyVi6NFOoQ5wfPVgl!~TZq8Rtbm{~N-GBX>KX_i=i7@1*2)ak}d_9KhI0E2;B5Y}DKYr#LzlbrkA z`+et}d*8XY?d!us;Xx-B-!HpqDKVjxm6&J_uCOc_(#s`7d>^jBMJF8T^;YzzY2>9J zbBnnj?OUDvjDJ-sj2e94bi{q${DR!AUxqnkMA zmPz|OED|tZT_(XKeAGfWk(0f zS@98L`p0P@ZAbb#j+p+8aE#b|h{z@rlzL5$UYlOkhBh0mx6=r{Z68@7 z!HHDMp}7KZfA&9Stb0(o#K7iG&3?MhSQW8BD+%39}&hJ5VPHd8on4zso6B@oj@^yC{CCjkbX7iXr?}cCh#Q%kB78AuuTxjG zTyPHZ`TxoPTCcuq0#tz$k#9@&t2z&Puyx9eX+U>@&p}pnDwnQRKa0PlMeh8jzc$I7 zbX2N=FntU>j|!0H+sNJk3zsg^le!3miXl!nLf>@f7dS!HkF+(*O)t3fP0xespclB@ z_-*$NOf}PXT3sX1=9)L?bdAm2)p@k@l_M{8_QwCN8N=~}r^CRVF;a)O!m`;UF^>kk xd!hBiURn6hzahO1>_tcVK%3}^7uD5s*h4$(Yt2LYs{wnN4%gRWOt06M{sZmhlnej> diff --git a/2020/01/balancear.c b/2020/01/balancear.c deleted file mode 100644 index 0f5cb69..0000000 --- a/2020/01/balancear.c +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -typedef struct { - int no; - float juice, alcohool; -} Barrel; - -int balancear() { - int i, result = 0; - float f, capacity; - Barrel line[2], sortedLine[2], * finalLine, reservoir; - - /* Read Input */ - for (i = 0; i < 4; i++) { - if (!(scanf(" %f", &f)) || f <= 0) - return EOF; - if (i % 2 == 0) { - line[i / 2].no = i / 2 + 1; - line[i / 2].juice = f; - } - else { - if (f > 1) - return EOF; - line[i / 2].alcohool = f * line[i / 2].juice; - line[i / 2].juice -= line[i / 2].alcohool; - } - reservoir.juice = line[0].juice + line[1].juice; - reservoir.alcohool = line[0].alcohool + line[1].alcohool; - } - - /* Sort Line */ - if (line[0].juice + line[0].alcohool < line[1].juice + line[1].alcohool) { - sortedLine[0] = line[1]; - sortedLine[1] = line[0]; - finalLine = sortedLine; - } - else - finalLine = line; - - /* Load Barrels */ - for (i = 0; i < 2; i++) { - capacity = finalLine[i].juice + finalLine[i].alcohool; - if (reservoir.juice - capacity * 0.86 >= 0 && - reservoir.alcohool - capacity * 0.14 >= 0) { - reservoir.juice -= capacity * 0.86; - reservoir.alcohool -= capacity * 0.14; - result += finalLine[i].no; - } - } - printf("%d\n", result); - - return result; -} diff --git a/2020/01/main.c b/2020/01/main.c index ffc8de7..1bef1ca 100644 --- a/2020/01/main.c +++ b/2020/01/main.c @@ -1,5 +1,5 @@ #include -#include "./balancear.c" +#include "./balance.c" int main () { int i, n; @@ -12,7 +12,7 @@ int main () { for (i = 0; i < n; i++) { printf("\nDigite os valores de volume e concentração para ambos o barris do %dº par, respectivamente:\n", i + 1); - switch (balancear()) { + switch (balance()) { case EOF: printf("Valores inválidos\n"); return 1;