Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - avesudra

#421
Si pero habría que parar de introducir de alguna manera , como pedirle al usuario que el último número sea un 0, o cuantos números piensa introducir que no es lo más común, en este programa que acabo de hacer he utilizado el algoritmo de ordenación Quicksort , y las funciones las he sacado de aquí:

http://blog.e-urrea.com/noticias/2011/03/23/metodo-de-ordenacion-burbuja-y-quicksort-en-c/

Tu código es complicado de entender porque no utilizas nombres de variables descriptivos :S .El código que tienes ahí abajo va introduciendo numeros a la variable arrayDeNumeros hasta que se introduce un 0, después ordena el array y mira si cada numero es primo. Es sencillo. Te dejo el que he hecho así rápido para que te hagas una idea:
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

bool esPrimo(unsigned int num);
void Quicksort(int *unarray, int izq, int der);
int pivot(int *unarray, int izq, int der);

int main(int argc, char *argv[])
{
    int *arrayDeNumeros= (int*) calloc(1000,sizeof(int*));
    int lenArray = 0;
    cout << "Ingrese una cadena de numeros terminada en 0:" << endl;
    cin>>arrayDeNumeros[0];
    for(register int i = 1; arrayDeNumeros[i-1]!=0 ; ++i)
    {
        cin>>arrayDeNumeros[i];
        lenArray = i;
    }
    /** El algoritmo que viene a continuación lo que hace
     *  es ordenar  el array  arrayDeNumeros de  menor  a
     *  mayor,sinceramente,no sé como funciona solo que he
     *  leído que era rápido y lo he buscado.
     */

    Quicksort(arrayDeNumeros,0,lenArray);
    /**
     *  El siguiente bucle mira si los enteros que ya están
     *  ordenados son primos o no.
     */
    for(register int i = 1; arrayDeNumeros[i]!=0; ++i)
    {
        if(esPrimo(arrayDeNumeros[i]))
            cout<<"El numero "<<arrayDeNumeros[i]<<" es primo."<<endl;
        else
            cout<<"El numero "<<arrayDeNumeros[i]<<" no es primo."<<endl;
    }
    return 0;
}

void Quicksort(int *unarray, int izq, int der)
{
    int pivote;
    if(izq < der)
    {
        pivote=pivot(unarray, izq, der);
        Quicksort(unarray, izq, pivote-1);
        Quicksort(unarray, pivote+1, der);
    }
}
int pivot(int *unarray, int izq, int der)
{
    int i;
    int pivote, valor_pivote;
    int aux;

    pivote = izq;
    valor_pivote = unarray[pivote];
    for (i=izq+1; i<=der; i++)
    {
        if (unarray[i] < valor_pivote)
        {
            pivote++;
            aux=unarray[i];
            unarray[i]=unarray[pivote];
            unarray[pivote]=aux;

        }
    }
    aux=unarray[izq];
    unarray[izq]=unarray[pivote];
    unarray[pivote]=aux;
    return pivote;
}
bool esPrimo(unsigned int num)
{
    if(num>2 && (num%2==0))/* Si el número es mayor que 2 y es divisible por el entonces no es primo*/
        return false;
    /**
     * Para comprobar si un número es primo se suele
     * utilizar el siguiente algoritmo, que consiste
     * en llegar hasta la raiz cuadrada del número de
     * dos en dos y empezando en 3, ya que un número
     * que no es par en la vida puede ser dividido por
     * un par.
     */
    unsigned int numSquare = (unsigned int)sqrt(num);
    for(register unsigned int i =3; i<=numSquare ; i+=2)
    {
        if(num%i==0)
        {
            return false;
        }
    }
    return true;
}
#422
Cierto durasno, un descuido  :-\ . Si que es mas fácil pero si el usuario no sabe que para comparar cadenas hay que utilizar strcmp , no me atrevo a poner eso 0xDani .
#423
Para comparar cadenas en C se utiliza la función:
int strcmp ( const char * str1, const char * str2 );
Valor de retorno:

  • 0 si son iguales
  • Un valor mayor que 0 si el primer caracter de str1 ,que no coincide con el de str2, es mayor que el primer carácter de str2. Un valor menor que 0 indica lo contrario.

Fuente --> http://www.cplusplus.com/reference/cstring/strcmp/

Así que si la cadena que viene del buffer tiene final de cadena puedes hacer esto:

if(strcmp(linea,"fin")== 0)
{
 printf("\nLlegoo");
}
#424
Pues es un despiste, date cuenta que si le pasas a la función esto:
Código (cpp) [Seleccionar]
for(i=0;i<fil;i++)
   {
       printf("Introdueix els valors de la fila %d\n", i);
       for(j=0;j<col;j++)
           scanf("%d", &mat[i][j]);
   }


   Trasposada(fil,col,mat[MAX][MAX]);//<------------------------- Me refiero a eso

Es lo mismo que hacer esto:
Código (cpp) [Seleccionar]
Trasposada(fil,col,mat[10][10]);
Y tu le tienes que pasar la dirección inicial de la matriz es decir la 0,0 para que la vaya recorriendo:
Código (cpp) [Seleccionar]
Trasposada(fil,col,mat[0][0]);
O si lo prefieres así:
Código (cpp) [Seleccionar]
Trasposada(fil,col,&mat);
El código no mantenía los valores porque estaba accediendo a una memoria que estaba inicializada pero con valores aleatorios  :silbar:
Así que el código quedaría así:
#include <stdio.h>
#include <stdlib.h>
#define MAX 10

void Trasposada(int fil,int col,int mat[MAX][MAX])
{
   int i, j;
   int tras[MAX][MAX];

   for(i=0; i<fil; i++)
       for(j=0; j<col; j++)
           tras[i][j]=mat[i][j];

   for(j=0; j<fil; j++)
   {
       for(i=0; i<col; i++)
           printf("%d",mat[i][j]);
       printf("\n");
   }

}

int main()
{
   int  i, j, fil=0, col=0, maxm, maxf;
   int mat[MAX][MAX];
   for(i=0; i!= MAX; ++i)
   {
       for(j=0; j!= MAX; ++j)
           mat[i][j]=0;
   }
   //leer nº de filas y columnas

   printf("Indica les FILES que tindra la matriu(max 10):\n");
   scanf("%d", &fil);
   while(fil>MAX)
   {
       printf("Error. Has d'introduir un valor menor de 10\n");
       scanf("%d", &fil);
   }

   printf("Indica les COLUMNES que tindra la matriu(max 10):\n");
   scanf("%d", &col);
   while(col>MAX)
   {
       printf("Error. Has d'introduir un valor menor de 10\n");
       scanf("%d", &col);
   }

  //meter valores

   for(i=0; i<fil; i++)
   {
       printf("Introdueix els valors de la fila %d\n", i);
       for(j=0; j<col; j++)
           scanf("%d", &mat[i][j]);
   }

   Trasposada(fil,col,&mat);

   return 0;
}
#425
Es que así solo con la función no se que hace, esta función que es ¿para mostrar la matriz? , que valores debo pasarle a fil y a col, ¿el valor de MAX? Es que si no no puedo probar xD. Si pudieses poner el código entero lo miramos mejor porque igual el problema no es la función si no los valores que se pasan.

¡Un saludo!
#426
Sí aunque es mejor dejarlo así(sin precision porque es un lío en C++ ponerle precisión a los enteros):
Código (cpp) [Seleccionar]
#include <iostream>
#include <iomanip>
using namespace std;

int main(int argc, char *argv[])
{
    float i;
    cout<< "Escriu quants diners tens amb euros i sabras si ets milionari"<< endl;
    cin>>i;
    cout<< "Tens " << fixed << i << " d euros"<<endl;// Esto te va a poner 0's al final al poner fixed
    if(i < 1000000)
        cout<< "Ho sento, no ets milionari..."<<endl;
    else if(i >= 1000000)
        cout<< "Ets milionari!!!"<<endl;
    cin.sync();
    cin.get();
    return 0;
}

Te dejo el programa compilado para que le eches un vistazo:
http://www.mediafire.com/?bhhpgdzgwm2sono
#427
Hola bigbonsai una traducción podría ser esta:
Código (cpp) [Seleccionar]
#include <iostream>
#include <iomanip>
using namespace std;

int main(int argc, char *argv[])
{
    float i;
    cout<< "Escriu quants diners tens amb euros i sabras si ets milionari"<< endl;
    cin>>i;
    cout<< "Tens " << setprecision(10) << i << " d euros"<<endl;
    if(i < 1000000)
        cout<< "Ho sento, no ets milionari..."<<endl;
    else if(i >= 1000000)
        cout<< "Ets milionari!!!"<<endl;
    cin.sync();
    cin.get();
    return 0;
}
#428
Hola alvr , tu tienes que introducir un texto no letra a letra por lo tanto el:
scanf("%c",&letra);
No puede ser , ya que estás leyendo una sola letra.Además tienes que declarar un array de carácteres para albergar un texto no una sola letra, así que así no es:
char letra;
Debería de ser así:
char frase[20];/** El 20 lo puedes cambiar por la cantidad de carácteres que quieras **/
Entonces ahora para leer la frase que vas a introducir terminada en un punto debes usar el especificador de formato '%s'(sin las comillas) así:
scanf("%s",&frase);
Pero esta función solo lee palabras. Así que tendrás que lidiar con esta(mejor dicho con la segura):
gets(frase);
Aunque esta función no es muy segura ( echale un vistazo a |Lo que no hay que hacer en C/C++. Nivel basico| ) Esta función se sustituye por fgets:
fgets(frase,20,stdin);
Una vez tienes la frase leída e introducida en el array de carácteres trabajas con punteros o con el índice dentro de los corchetes y vas comprobando. En tu programa el problema principal es que solo lees letras no una frase.La función de comprobar si es mayúscula está bien. Si necesitas más ayuda aquí estamos.
#429
Pero es que ¿donde has puesto el IDI ICON "uno.ico"? ¿Lo has puesto en el .cpp? Tienes que hacer un archivo .rc que contenga esto:
IDI ICON "uno.ico"
Y compilarlo con un main.cpp que contenga algo:
Código (cpp) [Seleccionar]
#include <iostream>

int main(int argc, char *argv[])
{
  std::cout<<"Hello world!";
  return 0;
}

Todo en el mismo proyecto.
#430
ASM / Re: Shellcode direcciones
2 Enero 2013, 21:43 PM
Por lo que he estado leyendo no se puede hacer push con registros de 32 bits tiene que ser con el de 64 entero si se está programando en 64 bits ya que la pila se maneja así.. Yo no tengo mucha idea aviso eh  :laugh: pero no se ¿se podría hacer esto?:
Código (asm) [Seleccionar]
   .section .text
.globl _start
_start:

pushq %rax
pushq $0x6c746366
pushq $0x702f6e69
pushq $0x62732f2f
movq %rsp, %rdi
pushq %rax
pushq $0x642d
pushq %rdi
movq %rsp, %rsi
xorq %rax, %rax
movb $0x3b, %al
int $0x80
   
xorq %rax, %rax
movb $0x01, %al
int $0x80


¿O la he liado demasiado?
He sacado esto de la documentación de AMD:
CitarIn 64-bit mode, the operand size of all PUSH instructions defaults to 64 bits, and there is no prefix available to encode a 32-bit operand size. Using the PUSH CS, PUSH DS, PUSH ES, or PUSH SS instructions in 64-bit mode generates an invalid-opcode exception.
Pushing an odd number of 16-bit operands when the stack address-size attribute is 32 results in a misaligned stack pointer.
Fuente: http://support.amd.com/us/Processor_TechDocs/24594_APM_v3.pdf