Restored modular version, added EPSILON for float comparisons

This commit is contained in:
Abreu 2021-09-11 14:29:47 -03:00
parent 1d511f8c53
commit d9d27b6a94
No known key found for this signature in database
GPG Key ID: 64835466FF55F7E1
4 changed files with 71 additions and 57 deletions

69
2020/01/balance.c Normal file
View File

@ -0,0 +1,69 @@
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#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;
}

Binary file not shown.

View File

@ -1,55 +0,0 @@
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
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;
}

View File

@ -1,5 +1,5 @@
#include <stdio.h>
#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;