4 Replies - 524 Views - Last Post: 23 November 2014 - 11:16 PM Rate Topic: ***-- 2 Votes

#1 Moco_Loco   User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 5
  • Joined: 23-November 14

Question about code en C?

Posted 23 November 2014 - 06:25 PM

I MADE THIS CODE IN C AND I WAS WONDERING IF THERE'S A WAY TO SHORTEN IT?
#include <stdio.h>
struct fraccion {
	int num;
	int den;
};
int Mostrar_Menu(void);
struct fraccion suma(struct fraccion X1, struct fraccion X2);
struct fraccion multiplicar(struct fraccion X1, struct fraccion X2);
struct fraccion dividir(struct fraccion X1, struct fraccion X2);
struct fraccion opuesto(struct fraccion X);
struct fraccion inverso(struct fraccion X);
int main()
{
	struct fraccion X1,X2, resultado;
	int op;
	do{
		op=Mostrar_Menu();
		switch (op)
		{
		case 1:{
			printf("Introduzca num y denominador de X1\n");
			scanf("%d", &X1.num);scanf("%d", &X1.den);
			printf("Introduzca num y denominador de X2\n");
			scanf("%d", &X2.num);scanf("%d", &X2.den);
			resultado=suma(X1,X2);
			printf("El resultado de la suma es %d/%d\n",resultado.num, resultado.den);
			break;
		};		
		case 2:{
			printf("Introduzca num y denominador de X1\n");
			scanf("%d", &X1.num);scanf("%d", &X1.den);
			printf("Introduzca num y denominador de X2\n");
			scanf("%d", &X2.num);scanf("%d", &X2.den);
			resultado=multiplicar(X1,X2);
			printf("El resultado de la multiplicacion es %d/%d\n",resultado.num, resultado.den);
			break;	
		};
		case 3:{
			printf("Introduzca num y denominador de X1\n");
			scanf("%d", &X1.num);scanf("%d", &X1.den);
			printf("Introduzca num y denominador de X2\n");
			scanf("%d", &X2.num);scanf("%d", &X2.den);
			resultado=dividir(X1,X2);
			printf("El resultado de la division es %d/%d\n",resultado.num, resultado.den);
			break;
		};
		case 4:{
			printf("Introduzca num y denominador de X\n");
			scanf("%d", &X1.num);scanf("%d", &X1.den);
			resultado=opuesto(X1);
			printf("El opuesto de f1 es %d/%d\n",resultado.num, 
				resultado.den);
			break;
		};
		case 5:{
			printf("Introduzca num y denominador de X\n");
			scanf("%d", &X1.num);scanf("%d", &X1.den);
			resultado=inverso(X1);
			printf("El inverso de X1 es %d/%d\n",resultado.num, 	
				resultado.den);
			break;
		};
		case 6:
			break;
		default:
			printf("La operación seleccionada no es válida\n"); 
		}
	}while (op!=6);
	return(0);
}
int Mostrar_Menu(void)
{
	int op;
	printf("Seleccione la operacion a realizar\n");
	printf("1. Suma\n");
	printf("2. Multiplicacion\n");
	printf("3. Division\n");
	printf("4. Opuesto\n");
	printf("5. Inverso\n");
	printf("6. Salir\n");
	scanf("%d", &op);
	return (op);
}
struct fraccion suma(struct fraccion X1, struct fraccion X2)
{
	struct fraccion Z;
	Z.num=X1.num*X2.den+X2.num*X1.den;
	Z.den=X1.den*X2.den;
	
	return (Z);
}
struct fraccion multiplicar(struct fraccion X1, struct fraccion X2)
{
	struct fraccion Z; 
	Z.num=X1.num*X2.num;
	Z.den=X1.den*X2.den;
	
	return (Z);
}
struct fraccion dividir(struct fraccion X1,struct fraccion X2)
{
	struct fraccion Z; 
	Z.num=X1.num*X2.den;
	Z.den=X1.den*X2.num;
	return (Z);
}		
struct fraccion opuesto(struct fraccion X)
{
	struct fraccion Z; 
	Z.num=-X.den;
	Z.den=X.num;
	return (Z);
}
struct fraccion inverso(struct fraccion X)
{
	struct fraccion Z; 
	Z.num=X.den;
	Z.den=X.num;
	return (Z);
}



Is This A Good Question/Topic? 0
  • +

Replies To: Question about code en C?

#2 jimblumberg   User is offline

  • member icon

Reputation: 5916
  • View blog
  • Posts: 17,932
  • Joined: 25-December 09

Re: Question about code en C?

Posted 23 November 2014 - 07:11 PM

The first thing you can do is see if you can eliminate some of the code duplication. For example look a this snippet:

		{
		case 1:{
			printf("Introduzca num y denominador de X1\n");
			scanf("%d", &X1.num);scanf("%d", &X1.den);
			printf("Introduzca num y denominador de X2\n");
			scanf("%d", &X2.num);scanf("%d", &X2.den);
			resultado=suma(X1,X2);
			printf("El resultado de la suma es %d/%d\n",resultado.num, resultado.den);
			break;
		};		
		case 2:{
			printf("Introduzca num y denominador de X1\n");
			scanf("%d", &X1.num);scanf("%d", &X1.den);
			printf("Introduzca num y denominador de X2\n");
			scanf("%d", &X2.num);scanf("%d", &X2.den);
			resultado=multiplicar(X1,X2);
			printf("El resultado de la multiplicacion es %d/%d\n",resultado.num, resultado.den);
			break;	
		};


Do you see that you're repeating almost all of that code? The only difference appears to be the last couple of lines. Try to eliminate some of the duplication.

Jim
Was This Post Helpful? 1
  • +
  • -

#3 Moco_Loco   User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 5
  • Joined: 23-November 14

Re: Question about code en C?

Posted 23 November 2014 - 07:35 PM

The Problem is that each case represents an operation like the 1 case it show the result of the operation the 2 case is for a timetable the 3 case is for a division and so on...
Was This Post Helpful? 0
  • +
  • -

#4 jimblumberg   User is offline

  • member icon

Reputation: 5916
  • View blog
  • Posts: 17,932
  • Joined: 25-December 09

Re: Question about code en C?

Posted 23 November 2014 - 08:40 PM

So? With a little thought you should be able to drastically reduce the code duplication. A strategically planted function, breaking that large switch statement into different control structures, etc.

You asked how to make the program shorter. This is the biggest section of the code so reducing it should shrink the size.


Jim
Was This Post Helpful? 0
  • +
  • -

#5 jon.kiparsky   User is offline

  • Beginner
  • member icon


Reputation: 12350
  • View blog
  • Posts: 20,984
  • Joined: 19-March 11

Re: Question about code en C?

Posted 23 November 2014 - 11:16 PM

Think about the semantics of those lines. Can you put a single name on the action that you're doing there? As a rule, if you can name an action, it's probably a function. If you do it more than once, it's definitely a function.
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1