elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11
41  Programación / Programación C/C++ / Convertidor de número literal a número real en: 6 Mayo 2012, 21:34 pm
Hola, había observado en el foro que un usuario había preguntado sobre como hacer algo así, y otros usuarios le dieron ciertas ideas..
Entonces decidí tratar de hacerlo ya que me había parecido algo complicado, y logré buenos resultados. pero estoy seguro que faltan validaciones y muchos otros casos para que el programa interprete y pueda realizar la conversión.

Entonces voy a postear el programa funcionando para algunos casos, pero como ya dije no puede estar completo ya que si ingresan una cadena de un número literal grande entonces no va a interpretarla.

El objetivo es mostrar la idea, y por supuesto si alguien quiere postear su propia idea o mejorar mi código, bienvenido

Dejo el project en VS6.0 para descargarlo

A continuación describo un poco el code,

Estas son las estructuras de datos (matrices char o vector de string) en donde guardo ciertas cadenas con nombres particulares.. me refiero a nombres de números o nombres los cuales pueden combinarse y significar un número.

Código:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// UTN FRGP TSP
// 2012
// BS
// david_bs@live.com
// Etalking.Com.Ar
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <stdio.h>

char otros[100][30] = {

"cero",
"X",
"X",
"X",
"X",
"X",
"X",
"X",
"X",
"X",
"X",
"once",
"doce",
"trece",
"catorce",
"quince",
"dieciseis",
"diecisiete",
"dieciocho",
"diecinueve",
"X",
"veintiuno",
"veintidos",
"veintitres",
"veinticuatro",
"veinticinco",
"veintiseis",
"veintisiete",
"veintiocho",
"veintinueve",
"X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X",
"X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X",
"X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X",
"X","X","X","X","X","X","X"
};

char especiales[][30] = {

"veintiun",
"ciento",
"millon"
"billon"
"millones",
"billones"
};

char cadenas1[][30] = {

"uno",
"un",
"diez",
"cien",
"mil",
};

char cadenas2[][30] = {

"dos",
"veinte",
"doscientos",
};

char cadenas3[][30] = {

"tres",
"treinta",
"trescientos",
};

char cadenas4[][30] = {

"cuatro",
"cuarenta",
"cuatrocientos",
};

char cadenas5[][30] = {

"cinco",
"cincuenta",
"quinientos",
};

char cadenas6[][30] = {

"seis",
"sesenta",
"seiscientos",
};

char cadenas7[][30] = {

"siete",
"sententa",
"setecientos",
};

char cadenas8[][30] = {

"ocho",
"ochenta",
"ochocientos",
};

char cadenas9[][30] = {

"nueve",
"noventa",
"novecientos",
};

Luego una función auxiliar que no viene al caso explicar..
Código:
unsigned int DivisionesDeVector(unsigned int* vec, unsigned int veclen){

unsigned int c=0;
for(unsigned int i=0; i<veclen; i++){

if(vec[i]>0) c++;
}
return c;
}


Esta función si es importante porque recibe la cadena ingresada por partes, y las va interpretando.. parece que tiene muchos fores pero son pequeños XD
Código:
unsigned int Equivalencia(const char* str){

unsigned int len = strlen(str);
char str_test[30];
memset(str_test,0,sizeof(str_test));
strcpy(str_test,str);

if(!strcmpi(str, "veintiun")){

return 21;
}

if(!strcmpi(str, "ciento")){

return 100;
}

if(!strcmpi(str, "millon")){
return 1000000;
}

if(!strcmpi(str, "billon")){
return -1;
}

if(!strcmpi(str, "millones")){
return 1000000;
}

if(!strcmpi(str, "billones")){
return -1;
}

{
for(unsigned int i=0; i<100;i++)
{
if(otros[i][0]!='X')
if(!strcmpi(str_test, otros[i])){
return i;
}
}
}

{
for(unsigned int i=0; i<5;i++)
{
if(!strcmpi(str_test, cadenas1[i])){
if(i==0) return 1;
if(i==1) return 1;
if(i==2) return 10;
if(i==3) return 100;
if(i==4) return 1000;
}
}
}

{
for(unsigned int i=0; i<3;i++)
{
if(!strcmpi(str_test, cadenas2[i])){
if(i==0) return 2;
if(i==1) return 20;
if(i==2) return 200;
}
}
}

{
for(unsigned int i=0; i<3;i++)
{
if(!strcmpi(str_test, cadenas3[i])){
if(i==0) return 3;
if(i==1) return 30;
if(i==2) return 300;
}
}
}

{
for(unsigned int i=0; i<3;i++)
{
if(!strcmpi(str_test, cadenas4[i])){
if(i==0) return 4;
if(i==1) return 40;
if(i==2) return 400;
}
}
}

{
for(unsigned int i=0; i<3;i++)
{
if(!strcmpi(str_test, cadenas5[i])){
if(i==0) return 5;
if(i==1) return 50;
if(i==2) return 500;
}
}
}

{
for(unsigned int i=0; i<3;i++)
{
if(!strcmpi(str_test, cadenas6[i])){
if(i==0) return 6;
if(i==1) return 60;
if(i==2) return 600;
}
}
}

{
for(unsigned int i=0; i<3;i++)
{
if(!strcmpi(str_test, cadenas7[i])){
if(i==0) return 7;
if(i==1) return 70;
if(i==2) return 700;
}
}
}

{
for(unsigned int i=0; i<3;i++)
{
if(!strcmpi(str_test, cadenas8[i])){
if(i==0) return 8;
if(i==1) return 80;
if(i==2) return 800;
}
}
}

{
for(unsigned int i=0; i<3;i++)
{
if(!strcmpi(str_test, cadenas9[i])){
if(i==0) return 9;
if(i==1) return 90;
if(i==2) return 900;
}
}
}

return -1;
}

El main es largo y lo voy a hacer por partes en otro momento, pero por ahora está así y supongo que se puede apreciar así.

Lo que tiene el main es que se divide en ciertas partes, la primera es la cadena que se va a ingresar para ser procesada, la segunda es el procesamiento por partes de la cadena; y la tercera es como se realizan ciertas operaciones matemáticas para lograr el resultado final.
Las operaciones se hacen con los valores acumulados en un vector auxiliar.

Como ya les dije, no hagan pruebas con números literales de mas de 7 divisiones porque el programa no va a hacer nada al respecto.

Por ejemplo, esta cadena:
Código:
const char* cadenax = "ciento sesenta y dos mil trescientos treinta y seis\0";

el programa la reconoce como de 7 divisiones, pero no traten con cadenas de más divisiones porque no se maneja esa situación.

Código:

int main(){

// const char* cadenax = "ocho\0";
// const char* cadenax = "ocho mil seiscientos veintitres\0";
// const char* cadenax = "novecientos mil\0";
// const char* cadenax = "mil trescientos\0";
// const char* cadenax = "dos mil treinta y cinco\0";
// const char* cadenax = "cinco mil treinta y dos\0";
// const char* cadenax = "treinta y tres\0";
// const char* cadenax = "cinco mil\0";
// const char* cadenax = "veinte mil\0";
// const char* cadenax = "treinta y tres mil\0";
// const char* cadenax = "veintitres mil\0";
// const char* cadenax = "cuarenta y cinco mil quinientos\0";
// const char* cadenax = "veinticuatro mil quinientos\0";
// const char* cadenax = "veinticuatro mil quinientos veintiocho\0";
// const char* cadenax = "veinticuatro mil quinientos cuarenta y ocho\0";
// const char* cadenax = "veinticuatro mil quinientos ocho\0";
// const char* cadenax = "veinticuatro mil cien\0";
// const char* cadenax = "mil cuatrocientos cinco\0";
// const char* cadenax = "dos mil cinco\0";
// const char* cadenax = "dos mil cuarenta\0";
// const char* cadenax = "dos mil veintitres\0";
// const char* cadenax = "dos mil treinta y cinco\0";
// const char* cadenax = "cuarenta y cinco mil treinta y tres\0";
// const char* cadenax = "uno\0";
// const char* cadenax = "doscientos mil treinta y uno\0";
// const char* cadenax = "doscientos mil veintiuno\0";
// const char* cadenax = "doscientos mil uno\0";
// const char* cadenax = "ciento veinte mil\0";
// const char* cadenax = "ciento veinte mil dos\0";
// const char* cadenax = "ciento veinte mil trescientos seis\0";
// const char* cadenax = "ciento veinte mil trescientos veintisiete\0";
// const char* cadenax = "ciento veintiun mil dos\0";
// const char* cadenax = "ciento veinte mil trescientos treinta y seis\0";
// const char* cadenax = "ciento sesenta y un mil trescientos treinta y seis\0";
// const char* cadenax = "ciento sesenta y dos mil trescientos treinta y seis\0";
// const char* cadenax = "cero\0";
// const char* cadenax = "diez y nueve\0";
const char* cadenax = "diecinueve\0";

unsigned int len = strlen(cadenax);
unsigned int pos =0;
unsigned int vec_resultado[20]={0};
char str[256];
memset(str,0,sizeof(str));
for(unsigned int i=0; i<len;i++){

memset(str,0,sizeof(str));
if(cadenax[i] == ' '){

if(cadenax[i-1] == 'y') continue;

unsigned int x=1;
unsigned int j=i-1;
while(cadenax[j] != ' ' && j>0) {x++;j--;}
if(cadenax[j]==' ') {x--;j++;}
for(unsigned int l=0;l<x;l++){
str[l]=cadenax[j];
j++;
}
vec_resultado[pos++]= Equivalencia(str);
}

else if(i==(len-1)){

unsigned int x=1;
unsigned int j=i-1;
while(cadenax[j] != ' ' && j>0) {x++;j--;}
if(cadenax[j]==' ') {j++;}
else x++;
for(unsigned int l=0;l<x;l++){
str[l]=cadenax[j];
j++;
}
vec_resultado[pos++]= Equivalencia(str);
}
}

int resultado=0;
printf("Contenido del vector auxiliar: \n");
for(unsigned int k=0; (k<20&&vec_resultado[k]>0); k++) printf("%d\n",vec_resultado[k]);
int divisiones = DivisionesDeVector(vec_resultado,20);
// printf("divisiones: %d\n",divisiones);
// system("pause");

switch(divisiones){

case 1:{

resultado = vec_resultado[0];

  }break;
case 2:{

if(vec_resultado[1]>=1000)
resultado = vec_resultado[0]*vec_resultado[1];
else
resultado = vec_resultado[0]+vec_resultado[1];

  }break;
case 3:{

if(vec_resultado[0]>=1000){
resultado = vec_resultado[0]+vec_resultado[1];
resultado += vec_resultado[2];
} else
if(vec_resultado[1]>=1000){
resultado = vec_resultado[0]*vec_resultado[1];
resultado += vec_resultado[2];
} else
if(vec_resultado[2]>=1000){
resultado = vec_resultado[0]+vec_resultado[1];
resultado *= vec_resultado[2];
} else {
resultado = vec_resultado[0]*vec_resultado[1];
resultado += vec_resultado[2];
}

  }break;
case 4:{

if(vec_resultado[0]>=1000){

/* ????? */

} else
if(vec_resultado[1]>=1000){

resultado = vec_resultado[0]*vec_resultado[1];
resultado += vec_resultado[2];
resultado += vec_resultado[3];

} else
if(vec_resultado[2]>=1000){

resultado = vec_resultado[0]+vec_resultado[1];
resultado *= vec_resultado[2];
resultado += vec_resultado[3];

} else {

}

  }break;
case 5:{

if(vec_resultado[0]>=1000){

/* ????? */

} else
if(vec_resultado[1]>=1000){

resultado = vec_resultado[0]*vec_resultado[1];
resultado += vec_resultado[2];
resultado += vec_resultado[3]+vec_resultado[4];

} else
if(vec_resultado[2]>=1000){

resultado = vec_resultado[0]+vec_resultado[1];
resultado *= vec_resultado[2];
resultado += vec_resultado[3]+vec_resultado[4];

} else {

/* ????? */
}

  }break;
case 6:{

if(vec_resultado[0]>=1000){

/* ????? */

} else
if(vec_resultado[1]>=1000){

resultado = vec_resultado[0]*vec_resultado[1];
resultado += vec_resultado[2];
resultado += vec_resultado[3]+vec_resultado[4]+vec_resultado[5];

} else
if(vec_resultado[2]>=1000){

resultado = vec_resultado[0]+vec_resultado[1];
resultado *= vec_resultado[2];
resultado += vec_resultado[3]+vec_resultado[4]+vec_resultado[5];

} else {

/* ????? */
}

  }break;

case 7:{

if(vec_resultado[0]>=1000){

/* ????? */

} else
if(vec_resultado[1]>=1000){

resultado = vec_resultado[0]*vec_resultado[1];
resultado += vec_resultado[2];
resultado += vec_resultado[3]+vec_resultado[4]+vec_resultado[5]+vec_resultado[6];

} else
if(vec_resultado[2]>=1000){

resultado = vec_resultado[0]+vec_resultado[1];
resultado *= vec_resultado[2];
resultado += vec_resultado[3]+vec_resultado[4]+vec_resultado[5]+vec_resultado[6];

} else
if(vec_resultado[3]>=1000){

resultado = vec_resultado[0]+vec_resultado[1];
resultado += vec_resultado[2];
resultado *= vec_resultado[3];
resultado += vec_resultado[4]+vec_resultado[5]+vec_resultado[6];

} else {

/* ????? */
}

  }break;
}

printf("\n");
printf("resultado: %d\n",resultado);

while(getchar()!='\n');
return 0;
}
42  Programación / Programación C/C++ / Re: Busqueda recursiva en: 6 Mayo 2012, 02:46 am
es cierto, es que hice esto sin pensarlo demasiado y ni había considerado el caso de números negativos pero la solución es solamente saltearse ese número.

me parece que está arreglado XD

43  Programación / Programación C/C++ / Re: Busqueda recursiva en: 6 Mayo 2012, 01:54 am
muchas gracias por si ayuda, ya esta funcionando, saludos

#include <stdio.h>
#include <stdlib.h>


int buscar(int vec[], int tam, int max);
 
int main()
{
 
 int max, i, vector[100], tam, resultado;
         
   
    printf("Ingrese el tamaño del vector: \n");
    scanf("%d", &tam);
   
    for(i=0;i<tam;i++)
    {
         printf("Ingrese elemento [%d]: ",i);
         scanf("%d",&vector);
    }
         
         
            max=vector[0];
 
            resultado = buscar(vector, tam, max);
 
            printf("el numero mayor es: %d", resultado);
 
            getch();
}
 
 
int buscar(int v[], int tam, int max)
{   
    if(tam==1)
              return max;
 
       if(max<v[tam-1])
              max=v[tam-1];       
         return buscar(v,tam-1,max);         
 
}

Amigo, por qué usás el scanf de esa forma?
Código:
scanf("%d",&vector);

es decir, puedes usarlo así pero sólo si incrementás el puntero "vector", algo como:

Código:
scanf("%d",&vector);
vector++;

de otra forma se usaría así:
Código:
scanf("%d",&vector[i]);

44  Programación / Programación C/C++ / Re: Pregunta sobre herencia y polimorfismo en: 6 Mayo 2012, 01:51 am
La única "Incrementar" propia de la clase B no lleva parámetros, y aunque B herede de la clase A, el compilador acepta como referencia de nombre a la de la clase B, osea a la primera y única "Incrementar" de B, ya que el objeto es de clase B.

aparte los constructores son del mismo nombre de la clase, no se a que estás haciendo referencia con tu pregunta sobre los constructores..

en resumen, se trata de un problema a causa de que ambas clases tienen una función propia llamada "Incrementar", por lo que para usar herencia vas a tener que especificar que la referencia es a la clase A, en este caso

Código:
objeto.ClaseA::Incrementar(); 
objeto.ClaseA::Incrementar(10);

45  Programación / Programación C/C++ / Re: Busqueda recursiva en: 5 Mayo 2012, 21:00 pm
tu código tiene un error en la carga del vector, es que no le pasás el índice..
debe estar de esta manera:
Código:
scanf("%d",&vector[i]);

y me tomé la libertad de hacer tu problema ya que parece que lo has intentado.

EDITADO: gracias exel
Código:
#include <stdlib.h>
#include <stdio.h>


int buscar(int vec[], int tam);

int main()
{
    int vector[100]={0},tam, i, resultado;
    
    printf("Ingrese el tamaño del vector: \n");
    scanf("%d", &tam);
    
    for(i=0;i<tam;i++)
    {
         printf("Ingrese elemento [%d]: ",i);
         scanf("%d",&vector[i]);
    }
            
          
    resultado = buscar(vector, tam);
    
    printf("el numero mayor es: %d\n", resultado);
            
    system("pause");
return 0;
}

int buscar(int v[], int tam)
{
    int max=0;
int c=tam;

    if(tam==0){

return -1;
}
    else
{
if((c-1)>=1){

if(v[c-1]>max){

max=v[c-1];

c--;

if(v[c-1]<max)
v[c-1]=max;
}
                        else
                              c--;

if(c>0)
return buscar(v,c);
else
return -1;
}

return v[0];
}
}

aparte había estado con ese tema hasta hace poco ;-D
http://foro.elhacker.net/programacion_cc/recursividad-t359491.0.html
46  Programación / Programación C/C++ / Re: Intento comparar cadenas [novato] en: 5 Mayo 2012, 20:18 pm
yo había hecho una función para comparar dos cadenas, te puede servir si deseás alguna comparación con el fin de realizar un ordenamiento alfabético por ejemplo.
http://foro.elhacker.net/programacion_cc/ejemplo_de_ordenamientos_basicos-t358139.0.html

47  Programación / Programación C/C++ / Re: Problema con el uso de corrimientos de bits (bitshift) en: 5 Mayo 2012, 20:11 pm
http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx

si se usa unsigned long long que le sigue a unsigned long


48  Programación / Programación C/C++ / Re: Como compilar un Kernel desde cero a ISO en: 30 Abril 2012, 20:20 pm

Fijate estos links

http://www.rohitab.com/discuss/forum/41-operating-system-development-osdev/

http://www.rohitab.com/discuss/topic/24959-simple-os-example/

49  Programación / Programación C/C++ / Argumentos Variables en: 30 Abril 2012, 19:44 pm
Hola, en este post voy a mostrar como se puede crear una función tipo 'printf' la cual puede recibir una cantidad de argumentos variables..
Para poder hacer eso se usa el archivo header llamado stdarg.h que trae algunas declaraciones y definiciones para este usar ante esta situación.

La idea fue tomada de un código público por lo tanto no es mi código.. pero si me pareció buena la idea de dar un ejemplo así para tenerlo en cuenta.

Dejo el proyectín para descargarlo
Proyecto en MSVC+++ 6.0

Código:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// UTN FRGP TSP
// 2012
// BS
// Etalking.Com.Ar
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include <stdio.h>
#include "stdarg.h" // defines ANSI-style macros for variable argument functions

void PrintString(const char* fmt, ... )
{
va_list va_alist;
char buf[256];
va_start (va_alist, fmt);
_vsnprintf (buf, sizeof(buf), fmt, va_alist);
va_end (va_alist);

printf(buf);
}

int main()
{
char* cadena1 = "\nSola.. Vino a.. mi Ficcion..\0";
char* cadena2 = "\nSin Dudar.. Acompaniarme..\0";
char* cadena_a = "\nCerca.. de su.. Atraccion..\0";
char* cadena_b = "\nTropiezo.. con mis Manos..\0";
int a = 2012;

PrintString("%s%s\n", cadena1,cadena2);

PrintString("\n");

PrintString("%s%s\n", cadena_a,cadena_b);

PrintString("\n");

PrintString("%d\n", a);

PrintString("\n");

PrintString("Presione ENTER para Salir");

while(getchar() != '\n');
return 0;
}

S2


50  Programación / Programación C/C++ / Re: ¿Cómo crear un videojuego en C? en: 29 Abril 2012, 17:54 pm

y generalmente esos juegos de tablero, inclusive los de laberinto como ser el pacman, se plantean como que el tablero es una matriz de tipo 'struct posicion', donde dentro de esa struct tenés algo como..

Código:
struct posicion {

      int id_pos; // identificador de celda
      float pos[2]; //guarda coordenadas x;y
      bool bloqueado; //para saber si es una pos libre o bloqueada
};

entonces vos ya tenés que saber cuanto va a ser la dimensión de tu tablero y crear la matríz.

después tenés que dibujar las paredes del laberinto como si fueran líneas, eso lo hacés con alguna librería gráfica... que si lo hicieras en modo consola directamente podés usar funciones de consola para dibujar líneas..

y te faltaría el tema de las colisiones , que es el caso de que quieras crear alguna 'entidad' como puede ser el pacman en sí, y esta entidad tiene que poder detectar si puede desplazarse hacia una posición que no esté bloqueada (ver struct).

en cuanto a la 'entidad' , obviamente te convendría dedicarle una clase o struct para manejarla, es decir los movimientos por ejemplo, en donde tendrías que usar algo que detecte las teclas asignadas al desplazamiento y en base a eso redibujar el pacman en la posición actualizada.

Algunos consejos solamente, yo estuve en una curso en donde hacían juegos 2D pero realmente no me interesaba mucho :p



 
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines