Skip to content
Snippets Groups Projects
Commit ae2efe20 authored by Pedro Folloni Pesserl's avatar Pedro Folloni Pesserl
Browse files

initial commit

parents
No related branches found
No related tags found
No related merge requests found
File added
#include <stdio.h>
typedef struct rac {
int num;
int den;
} racional;
int mdc(int a, int b) {
int resto;
if (a != 0 && b != 0) {
resto = a % b;
while (resto) {
a = b;
b = resto;
resto = a % b;
}
return b;
}
return 0;
}
racional le_racional() {
racional r;
scanf("%d %d", &r.num, &r.den);
return r;
}
racional multiplica_rs(racional r, racional s) {
racional p;
p.num = r.num * s.num;
p.den = r.den * s.den;
return p;
}
racional divide_rs(racional r, racional s) {
racional p;
p.num = r.num * s.den;
p.den = r.den * s.num;
return p;
}
racional soma_rs(racional r, racional s) {
racional p;
p.den = r.den * s.den;
p.num = r.num * s.den + s.num * r.den;
return p;
}
racional subtrai_rs(racional r, racional s) {
racional p;
p.den = r.den * s.den;
p.num = r.num * s.den - s.num * r.den;
return p;
}
void formata_racional(racional r) {
int fator = mdc(r.num, r.den);
if (fator) {
r.num /= fator;
r.den /= fator;
}
if (!r.num) {
printf("0\n");
} else {
if (r.den == 1) {
printf("%d\n", r.num);
} else {
printf("%d/%d\n", r.num, r.den);
}
}
return;
}
int valida_racional(racional r) {
if (!r.den) return 0;
return 1;
}
int main() {
racional r = le_racional();
racional s = le_racional();
while(valida_racional(s) && valida_racional(r)) {
racional soma = soma_rs(r, s);
formata_racional(soma);
racional subtracao = subtrai_rs(r, s);
formata_racional(subtracao);
racional multiplicacao = multiplica_rs(r, s);
formata_racional(multiplicacao);
racional divisao = divide_rs(r, s);
formata_racional(divisao);
r = le_racional();
if (r.den) { s = le_racional(); }
}
return 0;
}
#include <stdio.h>
#include "lib_racionais.h"
int mdc(int a, int b) {
int resto;
if (a != 0 && b != 0) { resto = a % b;
while (resto) {
a = b;
b = resto;
resto = a % b;
}
return b;
}
return 0;
}
racional le_racional() {
racional r;
scanf("%d %d", &r.num, &r.den);
return r;
}
racional multiplica_rs(racional r, racional s) {
racional p;
p.num = r.num * s.num;
p.den = r.den * s.den;
return p;
}
racional divide_rs(racional r, racional s) {
racional p;
p.num = r.num * s.den;
p.den = r.den * s.num;
return p;
}
racional soma_rs(racional r, racional s) {
racional p;
p.den = r.den * s.den;
p.num = r.num * s.den + s.num * r.den;
return p;
}
racional subtrai_rs(racional r, racional s) {
racional p;
p.den = r.den * s.den;
p.num = r.num * s.den - s.num * r.den;
return p;
}
void formata_racional(racional r) {
int fator = mdc(r.num, r.den);
if (fator) {
r.num /= fator;
r.den /= fator;
}
if (!r.den) {
printf("Erro: divisao por 0\n");
} else {
if (!r.num) {
printf("0\n");
} else {
if (r.den == 1) {
printf("%d\n", r.num);
} else {
printf("%d/%d\n", r.num, r.den);
}
}
}
return;
}
int valida_racional(racional r) {
if (!r.den) return 0;
return 1;
}
typedef struct {
int num;
int den;
} racional;
/* le um numero racional (dois inteiros) */
racional le_racional();
/* multiplica dois numeros racionais e retorna o resultado como um racional */
racional multiplica_rs(racional r, racional s);
/* divide dois numeros racionais e retorna o resultado como um racional */
racional divide_rs(racional r, racional s);
/* soma dois numeros racionais e retorna o resultado como um racional */
racional soma_rs(racional r, racional s);
/* subtrai dois numeros racionais e retorna o resultado como um racional */
racional subtrai_rs(racional r, racional s);
/* simplifica um numero racional na sua forma irredutivel e imprime o numero na tela */
void formata_racional(racional r);
/* checa se um numero racional eh valido, i.e. ele nao possui 0 como denominador */
int valida_racional(racional r);
# Makefile para o projeto racionais_2
OPCOES = -Wall -std=c90 -g
CC = gcc
tp2: tp2.o lib_racionais.o
$(CC) -o tp2 tp2.o lib_racionais.o
tp2.o: tp2.c
$(CC) -c $(OPCOES) tp2.c
lib_racionais.o: lib_racionais.c
$(CC) -c $(OPCOES) lib_racionais.c
clean:
rm -f ./*.o
tp2/tp2 0 → 100755
File added
#include <stdio.h>
#include "lib_racionais.h"
int main() {
racional r, s;
r = le_racional();
if (r.den) { s = le_racional(); }
while(valida_racional(s) && valida_racional(r)) {
racional soma = soma_rs(r, s);
formata_racional(soma);
racional subtracao = subtrai_rs(r, s);
formata_racional(subtracao);
racional multiplicacao = multiplica_rs(r, s);
formata_racional(multiplicacao);
racional divisao = divide_rs(r, s);
formata_racional(divisao);
printf("\n");
r = le_racional();
if (r.den) { s = le_racional(); }
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "lib_racionais.h"
int aleat(int min, int max) {
return (rand() % (max - min + 1) + min);
}
racional *criar_r() {
racional *r;
if ( !(r = malloc(sizeof(racional))) )
return NULL;
return r;
}
racional *liberar_r(racional *r) {
free(r);
r = NULL;
return r;
}
racional *sortear_r() {
racional *r;
r = criar_r();
r->num = aleat(0, 100);
r->den = aleat(1, 100);
simplifica_r(r);
return r;
}
int ler_r(racional *r) {
if (!scanf("%d %d", &r->num, &r->den))
return 0;
if (!r->den)
return 0;
return 1;
}
void imprimir_r(racional *r) {
if (!r->num) {
printf("0");
return;
}
if (r->den == 1) {
printf("%d", r->num);
return;
}
printf("%d/%d", r->num, r->den);
return;
}
int mdc(int a, int b) {
int r;
while (b) {
r = a % b;
a = b;
b = r;
}
return a;
}
int mmc(int a, int b) {
if (a && b)
return ((a * b) / mdc(a, b));
return 0;
}
int valido_r(racional *r) {
if (r->den)
return 1;
return 0;
}
void simplifica_r(racional *r) {
int fator = mdc(r->num, r->den);
if(fator) {
r->num /= fator;
r->den /= fator;
}
}
int menor_r(racional *r1, racional *r) {
int a = r1->num * r->den;
int b = r1->den * r->num;
if (a < b)
return 1;
return 0;
}
int iguais_r(racional *r1, racional *r) {
int a = r1->num * r->den;
int b = r1->den * r->num;
if (a == b)
return 1;
return 0;
}
racional *somar_r(racional *r1, racional *r2) {
racional *soma;
soma = criar_r();
soma->den = r1->den * r2->den;
soma->num = r1->num * r2->den + r2->num * r1->den;
simplifica_r(soma);
return soma;
}
racional *subtrair_r(racional *r1, racional *r2) {
racional *dif;
dif = criar_r();
dif->den = r1->den * r2->den;
dif->num = r1->num * r2->den - r2->num * r1->den;
simplifica_r(dif);
return dif;
}
racional *multiplicar_r(racional *r1, racional *r2) {
racional *mult;
mult = criar_r();
mult->den = r1->den * r2->den;
mult->num = r1->num * r2->num;
simplifica_r(mult);
return mult;
}
racional *dividir_r(racional *r1, racional *r2) {
racional *div;
div = criar_r();
div->den = r1->den * r2->num;
div->num = r1->num * r2->den;
simplifica_r(div);
return div;
}
/*
* Arquivo de headers para manipular ponteiros para racionais.
* feito em 09/11/2022 para o tp3 da disciplina prog1.
*/
/*********** NAO ALTERE ESTE ARQUIVO *********************/
typedef struct racional {
int num;
int den;
} racional;
/* retorna um numero aleatorio entre min e max, inclusive.
* a rigor esta funcao poderia estar em outro arquivo, mas
* deixamos aqui para nao complicar demais
*/
int aleat (int min, int max);
/* cria um racional sem valores atribuidos, so aloca o espaco */
racional *criar_r ();
/* libera a memoria de um racional alocado */
racional *liberar_r (racional *r);
/* aloca espaço para um ponteiro para um racional contendo
* numeros aleatorios no numerador e denominador.
* Retorna o ponteiro para o racional simplificado. */
racional *sortear_r ();
/* le um racional, retorna 1 em caso de sucesso ou 0 em caso de falha
* a qual pode ocorrer por uma entrada de racional invalido ou falha no scanf */
int ler_r (racional *r);
/* imprime um racional sem espaco em branco apos o numero e sem mudar de linha */
void imprimir_r (racional *r);
/* calcula o mdc pelo metodo de Euclides */
int mdc (int a, int b);
/* mmc = (a * b) / mdc (a, b) */
int mmc (int a, int b);
/* retorna 1 se o racional r eh valido ou 0 caso contrario */
int valido_r (racional *r);
/* simplifica um racional para o menor denominador possivel */
/* caso o racional seja da forma n/n, retorna 1 */
void simplifica_r (racional *r);
/* retorna 1 caso *r1 seja menor do que *r2 */
int menor_r (racional *r1, racional *r);
/* retorna 1 caso os racionais *r1 e *r2 sejam iguais ou 0 caso contrario */
int iguais_r (racional *r1, racional *r);
/* soma dois racionais e devolve um ponteiro para o resultado */
/* retorna NULL em qualquer caso de falha */
racional *somar_r (racional *r1, racional *r2);
/* subtrai dois racionais e devolve um ponteiro para o resultado */
/* retorna NULL em qualquer caso de falha */
racional *subtrair_r (racional *r1, racional *r2);
/* multiplica dois racionais e devolve um ponteiro o resultado */
/* retorna NULL em qualquer caso de falha */
racional *multiplicar_r (racional *r1, racional *r2);
/* divide dois racionais e devolve um ponteiro para resultado */
/* retorna NULL em qualquer caso de falha */
racional *dividir_r (racional *r1, racional *r2);
# Makefile de exemplo (Manual do GNU Make)
CFLAGS = -Wall -std=c90 -g # flags de compilacao
CC = gcc
all: tp3.o lib_racionais.o
$(CC) -o tp3 tp3.o lib_racionais.o
lib_racionais.o: lib_racionais.c
$(CC) -c $(CFLAGS) lib_racionais.c
tp3.o: tp3.c
$(CC) -c $(CFLAGS) tp3.c
clean:
rm -f *.o tp3
#include <stdio.h>
#include <stdlib.h>
#include "lib_racionais.h"
#define MAX 100
/* le um inteiro na faixa [0..MAX-1] */
int ler_tamanho() {
printf("Insira o tamanho do vetor (entre 1 e MAX):\n");
int n;
scanf("%d", &n);
return n;
}
/* imprime os racionais apontados pelo vetor de ponteiros para racionais */
void imprimir_vetor_racional(defina os parametros) {
/* coloque aqui seu codigo */
}
/* retorna um vetor de tam ponteiros para numeros racionais validos gerados aleatoriamente */
/* retorna NULL em caso de falha */
racional** aleatorio_vetor_racional(defina os parametros) {
/* coloque aqui seu codigo */
}
/* retorna um vetor de tam ponteiros para numeros racionais que apontam em ordem crescente para os
* racionais apontados pelo vetor recebido no parametro. Defina outras funcoes para te ajudar caso
* ache necessario */
racional** ordenar_vetor_racional(defina os parametros) {
/* coloque aqui seu codigo */
}
int main() {
racional **v, **w;
/* v e w são vetores de ponteiros para racionais (racional *)
alternativamente poderia ser declarado como racional *v[] */
int tam;
/* inicializa semente randomica */
/* depois pode trocar para, por exemplo, srand (time (0)); */
srand(0);
/* ler o tamanho do vetor de racionais */
tam = ler_tamanho();
/* aloca v com tam ponteiros para racional */
v = aletorio_vetor_racional(tam);
/* lembre-se que a funcao acima retorna NULL em caso de falha */
/* chama a funcao para ordenar o vetor */
w = ordenar_vetor_racional(v, tam);
/* lembre-se que a funcao acima retorna 0 em caso de falha */
/* imprime o vetor ordenado */
imprimir_vetor_racional(w, tam);
/* libera toda memoria alocada dinamicamente */
/* nao esqueca de testar com valgrind para conferir */
/* coloque aqui seu codigo */
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment