|
421
|
Programación / Programación C/C++ / Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
|
en: 5 Enero 2013, 14:25 pm
|
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: #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; }
|
|
|
424
|
Programación / Programación C/C++ / Re: Segmentation Fault al realizar funcion sobre Matriz
|
en: 4 Enero 2013, 17:38 pm
|
Pues es un despiste, date cuenta que si le pasas a la función esto: 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: 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: Trasposada(fil,col,mat[0][0]);
O si lo prefieres así: 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 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++) } } 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"); while(fil>MAX) { printf("Error. Has d'introduir un valor menor de 10\n"); } printf("Indica les COLUMNES que tindra la matriu(max 10):\n"); while(col>MAX) { printf("Error. Has d'introduir un valor menor de 10\n"); } //meter valores for(i=0; i<fil; i++) { printf("Introdueix els valors de la fila %d\n", i ); for(j=0; j<col; j++) } Trasposada(fil,col,&mat); return 0; }
|
|
|
425
|
Programación / Programación C/C++ / Re: Segmentation Fault al realizar funcion sobre Matriz
|
en: 4 Enero 2013, 17:15 pm
|
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
|
Programación / Programación C/C++ / Re: traduccion pascal/c++
|
en: 4 Enero 2013, 16:31 pm
|
Sí aunque es mejor dejarlo así(sin precision porque es un lío en C++ ponerle precisión a los enteros): #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
|
Programación / Programación C/C++ / Re: traduccion pascal/c++
|
en: 4 Enero 2013, 16:05 pm
|
Hola bigbonsai una traducción podría ser esta: #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
|
Programación / Programación C/C++ / Re: [C] Problema con bucle
|
en: 3 Enero 2013, 20:18 pm
|
Hola alvr , tu tienes que introducir un texto no letra a letra por lo tanto el:
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í:
Pero esta función solo lee palabras. Así que tendrás que lidiar con esta(mejor dicho con la segura):
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:
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.
|
|
|
430
|
Programación / ASM / Re: Shellcode direcciones
|
en: 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 pero no se ¿se podría hacer esto?: .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: In 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
|
|
|
|
|
|
|