Nuevas NORMAS para el foro

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación? - Agosto 21, 2008, 05:55:16
Boton Buscar
Inicio Ayuda Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: Mejorar este code... 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Mejorar este code...  (Leído 294 veces)
.FuRioUs.
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 2073


Hangyaku no Furious!

FuriousDami@hotmail.com
Ver Perfil WWW Email
« en: Diciembre 18, 2007, 01:19:29 »

Hola, ayer estaba leyendo un poco de C y se me ocurrio hacer este code:

Código:
#include <stdio.h>
main()
{
      int numero; /* Defino numero como entero */
      int multiplica;  /* Defino multiplica como entero*/
      int resultado; /* lo mismo con resultado... */
      /* Ahora les asigno valores */
      numero = 2000;
      multiplica = 3;
      resultado = numero * multiplica; /* Multiplico 200 * 3 */
      printf("Resultado=%d", resultado); /* Muestra el resultado */
      getchar();
      return 0;
}

pero quiero que antes de multiplicar te pida los 2 numeros y despues recien multiplique con los numeros que le diste.
O sea, que te pregunte que numeros queres multiplicar.
Solo que no se como hacerlo, agradesco si me explican como  Smiley

Saludos
En línea


Una persona se hace realmente fuerte cuando protege a un ser querido...
- Furious Zona -
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #1 en: Diciembre 18, 2007, 03:04:05 »

hola, mira furious dami quisa si leias unas paginas mas adelante encontrabas la solucion xD; a mi me paso lo mismo, busque en el libro como se hacia y resulta que lo explicaba un poquito mas adelante xD

con scanf, se usa parecido a printf
por ejemplo:
scanf("%d %d", &variable, &otra_variable);
con %d le indicas que lo que lea lo pase a numeros, osea, si vos pusieras %c leeria un caracter, si escribis 1 te lee el caracter 1, pero si pones %d le asigna el valor 1 a la variable
y tenes que usar & antes de las variables, exepto que esperes una cadena de caracteres (ya entenderas porque)

salu2!
En línea

Inside The Source Code



Linux Registred User #460377
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #2 en: Diciembre 18, 2007, 04:52:08 »

Buenas

La respuesta de Nio esta bien, aunque una respuesta mas acertada seria que visitaras esta pagina --> www.usaelputogoogle.com

Salu2
En línea

Connoisseurs of C semantics find C++ inferior to ++C

Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #3 en: Diciembre 18, 2007, 04:55:15 »

Buenas

La respuesta de Nio esta bien, aunque una respuesta mas acertada seria que visitaras esta pagina --> www.usaelputogoogle.com

Salu2
esa respuesta me hace recordar a un user resientemente banneado que su nik empieza con da y termina con rkiker xD

salu2!
En línea

Inside The Source Code



Linux Registred User #460377
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #4 en: Diciembre 18, 2007, 05:01:38 »

jajajaja no sabia que la pagina existia, jajajjajajajajajaja

salu2!
En línea

Inside The Source Code



Linux Registred User #460377
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #5 en: Diciembre 18, 2007, 05:07:01 »

esa respuesta me hace recordar a un user resientemente banneado que su nik empieza con da y termina con rkiker xD

Si, se la tome prestada por un tiempo jeje

Salu2
En línea

Connoisseurs of C semantics find C++ inferior to ++C

dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #6 en: Diciembre 18, 2007, 06:47:22 »

Citar
su nik empieza con da y termina con rkiker xD
jaajajjajajajja
Citar
Hola, ayer estaba leyendo un poco de C y se me ocurrio hacer este code:
puedes pedir los numeros que quieras y en el orden que quieras, solo deves imaginar que cada funcion cumple una acción precisa, el "para que" no importa.
puedes ayudarte con diagramas de flujo.

que libro lees?
En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #7 en: Diciembre 18, 2007, 11:57:50 »

puedes pedir los numeros que quieras y en el orden que quieras, solo deves imaginar que cada funcion cumple una acción precisa, el "para que" no importa.

  Es correcto que una funcion (idealmente) tenga una y solo una tarea pero lo que no debe importar es como dicha tarea se realiza. Ademas, creo que tener una funcion en un programa o sistema, y no saber para que la tenes, es un problema

Salu2, FreakMind
« Última modificación: Diciembre 18, 2007, 11:58:31 por ҒrεακΜιи∂ » En línea

Connoisseurs of C semantics find C++ inferior to ++C

[p3ll3]
Colaborador
*****
Desconectado Desconectado

Mensajes: 525

Read The Fucking Manual && STFU xDDD


Ver Perfil WWW
« Respuesta #8 en: Diciembre 19, 2007, 01:33:58 »

Como el tema es mejorar ese code aqui respondo , no se mucho de C pero ahi trate de hacerlo  Wink (si funciona)
Aclaro que solo sirve para numeros enteros ...

Código:
#include <stdio.h> // IO de datos
main()
{
      int numero,resultado=1; /* Defino numero y resultado como entero */
      int cont=1; // hago esta variable para controlar cuando parar de preguntar factores.
      // Antes de asignar pido los factores a multiplicar.

    while(cont == 1){ // ciclo de repeticion, ejecuta todo lo que esta dentro de las llaves hasta que no se cumpla la condicion.
     
       printf("\nDigite un factor a multiplicar: ");
       scanf  ("%d",&numero); // lee un numero entero.
   
       resultado*=numero; //aumenta la variable resultado multiplicandola por lo que se le asigno a la variable numero.
       printf("\nPara ver el resultado presione 0 y 1 para continuar: ");
       scanf  ("%d",&cont); // obtiene 1 o 0 para hacer lo que dice arriba.
       cont=cont; // le asigno el cero a la variable cont y se sale del while.
 
    } 
      printf("\n\nResultado=%d",resultado); /* Muestra el resultado */
      printf("\n\n"); // Deja espacios
      return 0;
}
« Última modificación: Diciembre 19, 2007, 01:39:08 por [p3ll3] » En línea



dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #9 en: Diciembre 19, 2007, 11:44:27 »

pero lo que no debe importar es como dicha tarea se realiza.
a menos que te pidan hacer dicha funcion.
estoy de acuerdo contigo
En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #10 en: Diciembre 19, 2007, 11:58:39 »

a menos que te pidan hacer dicha funcion.
estoy de acuerdo contigo
Obviamente si tenes que crear una funcion te va a importar como hacer que cumpla su tarea. Pero como dijiste "solo deves imaginar que cada cumple una acción precisa" y "puedes ayudarte con diagramas de flujo", me sono que estabas hablando la parte del diseño del programa

Salu2

En línea

Connoisseurs of C semantics find C++ inferior to ++C

Thornevald
Visitante
« Respuesta #11 en: Diciembre 19, 2007, 04:18:21 »

Pregunta off-topic:

hace mucho que no paso por aca, porque bannearon a darkiker?

estara en google tmb la respuesta? xD

Saludos
« Última modificación: Diciembre 19, 2007, 04:18:55 por Thornevald » En línea
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #12 en: Diciembre 19, 2007, 04:22:08 »

xD, por un link... se pelio con un moderador por un link que supuestamente era un compilador C/C++ y resulto ser un virus

salu2!
En línea

Inside The Source Code



Linux Registred User #460377
dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #13 en: Diciembre 19, 2007, 07:59:40 »

Pregunta off-topic:

hace mucho que no paso por aca, porque bannearon a darkiker?

estara en google tmb la respuesta? xD

Saludos
antes de leer tube un deja-bu de este post .

xD, por un link... se pelio con un moderador por un link que supuestamente era un compilador C/C++ y resulto ser un virus

salu2!
que??!! deve haver mucha bronca y confucion hay.
veo que el virus fue compilado con exito.
Que dé un link, darkIker, es tan raro como que nievé en Córdoba capital.
darkIker baneado temporalmente,
ojalá tengamos un "usuario temporal" que sepa como darkIker y que tambien te mande a googlear. Roll Eyes
En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #14 en: Diciembre 19, 2007, 08:09:58 »

Buenas

Que dé un link, darkIker, es tan raro como que nievé en Córdoba capital.
El link con el virus lo dejo un moderador no DarkIker. Y guarda que quizas la nieve de este año se nos vuelve costumbre Tongue

Salu2, FreakMind

En línea

Connoisseurs of C semantics find C++ inferior to ++C

dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #15 en: Diciembre 19, 2007, 09:04:19 »

si el no planto la bomba, porque lo detubieron?
 
Citar
Y guarda que quizas la nieve de este año se nos vuelve costumbre  Tongue
ello fue un proceso climatico ciclico, se repetira cuando estemos muertos dentro de cien años, lo explicarón.
al menos que en el proximo sea por un factor del cambio climatico.
En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #16 en: Diciembre 19, 2007, 09:56:11 »

si el no planto la bomba, porque lo detubieron?
Porque se ve que lo trato mal o algo asi... realmente no recuerdo

ello fue un proceso climatico ciclico, se repetira cuando estemos muertos dentro de cien años, lo explicarón..
Tambien dicen que hara sol y cae granizo del tamaño de un huevo de gallina xD

Para ir cerrando este thread (porque realmente se desvirtuo completamente) digo una cosita sobre el codigo de [p3ll3] y una posible solucion

scanf  ("%d",&cont); ya le asigna a cont un valor, por lo que hacer cont = cont; es innecesario (y hasta un poco ridiculo).

Código:
#include <stdio.h>

int main(void)
{
    int         n1, n2;
    char        op;

    printf("Ingrese calculo: ");
    scanf("%d %c %d", &n1, &op, &n2);
    fflush(stdin);  /* Esto es porque en el buffer queda el /n */
   
    switch(op){
        case '+':
            n1 += n2;
        break;
        case '-':
            n1 -= n2;
        break;
        case '*':
            n1 *= n2;
        break;
        case '/':
            n1 /= n2;
        break;
        default:
               printf("Error\n");
               return 1;
    }

    printf("Resultado: %d\n", n1);

    getchar();
    return 0;
}
En línea

Connoisseurs of C semantics find C++ inferior to ++C

[p3ll3]
Colaborador
*****
Desconectado Desconectado

Mensajes: 525

Read The Fucking Manual && STFU xDDD


Ver Perfil WWW
« Respuesta #17 en: Diciembre 20, 2007, 01:56:06 »

 Grin Grin, si tienes razon , pero toma en cuenta a la hora que yo hice el code y a la hora que lo hizo ud y hasta con tiempo de pensarlo y me imagino que sabes programar en C  Wink

Que pasaria si quiero poner mas de dos factores en la multiplicacion, en tu code Huh


Saludos............... Cool
[p3ll3]
« Última modificación: Diciembre 20, 2007, 01:59:52 por [p3ll3] » En línea



FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #18 en: Diciembre 20, 2007, 07:43:25 »

Buenas...

pero toma en cuenta a la hora que yo hice el code y a la hora que lo hizo ud
No te confies en la hora, ya que la hora del foro no tiene por que ser la hora en mi pais. El codigo lo postie tipo 12:30 - 1:00 am Wink

y hasta con tiempo de pensarlo
No habia demasiado para pensar y no es que me estuve matando durante el dia pensandolo. Decidi dejarlo cuando vi que el thread se desvio demasiado de su proposito original

Que pasaria si quiero poner mas de dos factores en la multiplicacion, en tu code Huh
Simple... no funcionaria... pero tampoco usaria este codigo para ese tipo de funcionalidad.  Usaria este (es largo, sepan disculpar)

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum{STATE_N,STATE_O,STATE_E};

#define LINE     100
#define isoperator(c) ((c == '+' || c == '-' || c == '*' || c == '/')? 1 : 0)
#define col(c)       (isdigit(c)? STATE_N : (isoperator(c)? STATE_O : STATE_E))
#define prio(c)      ((c == '+' || c == '-')? 0:(c == '/'? 1 : 2))
#define maxpriority(c,top)       (prio(c) <= prio(top)? c : top)

typedef struct tree{
int   value;
char type;
struct tree       *left;
struct tree       *right;
}tree_t;

typedef struct stack{
tree_t    *root;
struct stack *next;
}stack_t;

typedef struct op_stack{
unsigned char operator;
struct op_stack *next;
}op_t;

int o_addstk(op_t **, unsigned char);
int o_remstk(op_t **, unsigned char *);
int n_addstk(stack_t **, tree_t *);
int n_remstk(stack_t **, tree_t **);
int calcular(const char s[]);
int maketree(tree_t **, int ,tree_t *, tree_t *);
void recorrer(tree_t *root,int *);

int main(void)
{
char s[LINE];

while(1){
printf("\nEscriba un calculo:\n");
if(!fgets(s,LINE,stdin)){
printf("Error al leer calculo\n");
exit(EXIT_FAILURE);
}
s[strlen(s)-1] = '\0';

if(calcular(s))
printf("Error en el calculo\n");

}

exit(EXIT_SUCCESS);
}

int o_addstk(op_t **stk, unsigned char c)
{
op_t *ptr;

if(!(ptr = malloc(sizeof(op_t))))
return 1;

ptr->operator = c;
ptr->next = *stk;
*stk = ptr;

return 0;
}

int o_remstk(op_t **stk, unsigned char *c)
{
op_t *ptr;

if(!(*stk))
return 1;

ptr = *stk;
*stk = (*stk)->next;

*c = ptr->operator;

free(ptr);

return 0;
}

int n_addstk(stack_t **stk, tree_t *root)
{
stack_t *ptr;

if(!(ptr = malloc(sizeof(stack_t)))){
printf("n_addstk: Error al crear nodo\n");
return 1;
}

if(!(ptr->root = malloc(sizeof(tree_t)))){
printf("n_addstk: Error al crear root\n");
return 1;
}

memset(ptr->root,0x00,sizeof(tree_t));
memcpy(ptr->root,root,sizeof(tree_t));
ptr->next = *stk;

*stk = ptr;

return 0;
}

int n_remstk(stack_t **stk, tree_t **root)
{
stack_t *ptr;

if(!(*stk))
return 1;

ptr = *stk;
*stk = (*stk)->next;

if(!(*root = malloc(sizeof(tree_t))))
return 1;

(*root)->value = ptr->root->value;
(*root)->type = ptr->root->type;
(*root)->left = ptr->root->left;
(*root)->right = ptr->root->right;

free(ptr);

return 0;
}

int calcular(const char s[])
{
int num = 0,cur_state = 0, c, aux;
static int state_table [3][3] = {{0,1,2},{0,2,2},{2,2,2}};
tree_t *root,*n1,*n2;
stack_t *numbers = NULL;
op_t *operators = NULL;
char *tmp =(char*) s;

while((c = *s++)){
cur_state = state_table[cur_state][col(c)];
switch(cur_state){
case STATE_N:
num = (num * 10) + (c - '0');
break;

case STATE_O:
if(!(root = malloc(sizeof(tree_t))))
return 1;
root->value = num;
root->type = 'n';
root->left = root->right = NULL;

if(n_addstk(&numbers,root)){
printf("Error al almacenar operando\n");
return 1;
}
num = 0;

if(operators && (maxpriority(c,operators->operator) == c)){
while(operators && prio(c) <= prio(operators->operator)){
if(o_remstk(&operators,(unsigned char*)&aux)){
printf("calcular: error en o_remstk\n");
return 1;
}
if(n_remstk(&numbers,&n2)){
printf("calcular: Error en n_remstk\n");
return 1;
}

if(n_remstk(&numbers,&n1)){
printf("calcular: Error en n_remstk\n");
return 1;
}

if(maketree(&root,(unsigned char)aux,n1,n2)){
printf("calcular: Error en maketree\n");
return 1;
}

if(n_addstk(&numbers,root)){
printf("calcular: Error en n_addstk\n");
return 1;
}
}
}

if(o_addstk(&operators,c)){
printf("calcular: Error en o_addstk\n");
return 1;
}

break;

default:
printf("El caracter [%c] es invalido\n",c);
return 1;
break;
}
}

if(!c){
if(!(root = malloc(sizeof(tree_t))))
return 1;
root->value = num;
root->type = 'n';
root->left = root->right = NULL;

if(n_addstk(&numbers,root)){
printf("Error al almacenar operando\n");
return 1;
}
num = 0;
if(operators){
while(operators){
if(o_remstk(&operators,(unsigned char*)&aux)){
printf("calcular: error en o_remstk\n");
return 1;
}
if(n_remstk(&numbers,&n2)){
printf("calcular: Error en n_remstk\n");
return 1;
}

if(n_remstk(&numbers,&n1)){
printf("calcular: Error en n_remstk\n");
return 1;
}

if(maketree(&root,aux,n1,n2)){
printf("calcular: Error en maketree\n");
return 1;
}

if(n_addstk(&numbers,root)){
printf("calcular: Error en n_addstk\n");
return 1;
}
}
}

if(o_addstk(&operators,c)){
printf("calcular: Error en o_addstk\n");
return 1;
}
}

if(n_remstk(&numbers,&root)){
printf("Error al quitar nodo\n");
return 1;
}

num = 0;
recorrer(root,&num);
printf("Resultado de calculo [%s] es : %d\n",tmp,num);

return 0;
}

void recorrer(tree_t *root, int *rdo)
{
int n1 = 0, n2 = 0;

if(root){
recorrer(root->left,&n1);
if(root->type != 'o'){
*rdo = root->value;
return;
}
recorrer(root->right,&n2);
if(root->type != 'o'){
*rdo = root->value;
return;
}
switch(root->value){
case '+':
*rdo = n1 + n2;
return;
break;

case '-':
*rdo = n1 - n2;
return;
break;

case '*':
*rdo = n1 * n2;
return;
break;

case '/':
if(!n2){
printf("No se puede dividir por 0\n");
exit(EXIT_FAILURE);
}
*rdo = n1 / n2;
return;
break;
}
}
return;
}

int maketree(tree_t **root, int c,tree_t *left, tree_t *right)
{
if(!(*root = malloc(sizeof(tree_t))))
return 1;

(*root)->value = c;
(*root)->type = 'o';

if(!((*root)->left = malloc(sizeof(tree_t))))
return 1;
memset((*root)->left,0x00,sizeof(tree_t));
memcpy((*root)->left,left,sizeof(tree_t));

if(!((*root)->right = malloc(sizeof(tree_t))))
return 1;

memset((*root)->right,0x00,sizeof(tree_t));
memcpy((*root)->right,right,sizeof(tree_t));

return 0;
}

Salu2
En línea

Connoisseurs of C semantics find C++ inferior to ++C

[p3ll3]
Colaborador
****