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 - AlbertoBSD

#861
Claro obviamente no tenemos que abusar, por ejemplo si sabemos que siempre vamos a Inicializar "Y" posición de un arreglo X Antes de realizar cualquier tipo de operaciones con ella o de leerla, pues no hay necesidad de inicializar en 0 todo  el Arrglo X..

Por ejemplo tenia un Codigo de Grafos donde inicializaba en 0 todo un Nodo unos cuantos miles de millones veces, y el programa tardaba X cantidad de tiempo, posteriormente lo hacia con memoria SIN inicializar y el programa funcionaba hasta 4 veces mas rápido y claro solo Leia Datos una vez que sabia que ya habían sido inicializados correctamente.

El tema lo publique por qu hay usuarios que no están cocientes de que la memoria puede tener basura y luego vienen aqui a preguntar por que su programa falla, o veces hace "ciertas" cosas y a veces no las hace..

En fin.

Saludos!
#862
Quien no ha visto ese concurso donde hay un solo premio detras de 3 puertas las otras 2 con  Cabras u Ovejas...



La opción adecuada es siempre "cambiar" de puerta cuando te pregunten si te quieres cambiar de la misma..

El programa simula 10 Millones de Juegos 2 veces, en la primera ronda el jugador siempre cambia de puerta y en la segunda ronda el jugador nunca cambia de puerta.

Se demuestra que se tiene 66.6% de probabilidad de ganar si se cambia de puerta, contra 33.3% de probabilidad de ganar si no se cambia  de puerta.

#include<stdio.h>
#include<stdint.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define GOAT 0 //CABRA 0
#define PRIZE 1 //PREMIO 1

#define MAX_SIMULATIONS 10000000

int main() {
/*unsigned char */
uint8_t position = 0; //Posicion del premio
uint8_t selected = 0; //Posicion seleccionada por el jugado
uint8_t doors[3]; //Puertas
uint8_t can_switch = 0; //La puerta a la cual se puede cambiar
register uint32_t count_win = 0;
register uint32_t simulations = 0;
srand(time(NULL)); //Semilla Random
memset(doors,GOAT,sizeof(uint8_t)*3); //Todas las puertas son Cabras
//< 10000000
while(simulations < MAX_SIMULATIONS) {
position = rand() % 3; //position del Premio Pseudo-Aleatoria
doors[position] = PRIZE; //Guardamos el premio en la position antes seleccionada
selected = rand() % 3; //position elejida por el Jugador

switch(selected) { //En base a lo elejido por el jugador
//El encargado del juego valida que puerta tiene otra Cabra y la destapa
//Dandole la oportunida al jugador de cambiar su puerta por la puerta restante
case 0: //Puerta 0 elejida por el Jugador
if(doors[1] == GOAT) { //Si otra puerta 1 Tiene cabra entonces
can_switch = 2; //Le damos la oportunidad de elegir entre la puerta 0 y la puerta 2
}
else { //Caso contrario
can_switch = 1; //Le damos la opotunidad de elegir entre la puerta 0 y la puerta 1
}
break;
case 1: //Repetimos en caso de que seleccione la puerta 1
if(doors[2] == GOAT) {
can_switch = 0;
}
else {
can_switch = 2;
}
break;
case 2: //Repetimos en caso de que seleccione la puerta 2
if(doors[0] == GOAT) {
can_switch = 1;
}
else {
can_switch = 0;
}
break;
}
if(doors[can_switch] == PRIZE) { //Evaluamos si la puerta elejida tiene el premio
count_win++; //Si es asi incrementamos el contador de premios
}
doors[position] = GOAT; //0 //Restablecemos la puerta con premio nuevamente a Cabra
simulations++; //Incrementamos el contador de Simulaciones
}

//Imprimimos totales
printf("Total simulations with change %u, win: %u rate: %f\n",simulations,count_win,(float)((float)count_win/(float)simulations));

count_win = 0; //Restablecemos contador de premios a 0
simulations = 0; //Restablecemos contador de simulaciones a 0

//Como en la siguiente similacion el jugador no cambiara de puerta no es necesario evaluar las otras puertas
while(simulations < MAX_SIMULATIONS) {
position = rand() % 3;
doors[position] = PRIZE;
selected = rand() % 3;
if(doors[selected] == PRIZE) {
count_win++;
}
doors[position] = GOAT; //0
simulations++;
}
printf("Total simulations without change %u, win: %u rate: %f\n",simulations,count_win,(float)((float)count_win/(float)simulations));
return(0);
}


Descripción del problema:

https://en.m.wikipedia.org/wiki/Monty_Hall_problem


Salida del codigo arriba mostrado:

Total simulations with change 10000000, win: 6665613 rate: 0.666561
Total simulations without change 10000000, win: 3335076 rate: 0.333508

Saludos!
#863
No creo, estas clases tienen sus constructores y no puedes acceder a posiciones donde no se han inicializado con un valor.

El detalle radica en que cuando aprenden a programar nunca les enseñan a inicializar la memoria y luego vienen aqui a preguntar por que falla su codigo.

Saludos!


#864
Compañero, da un poco de flojera leer un codigo tan largo y menos si mo esta con la etiqueta GeSHi para codigo en C

Ejemplo:

int var = 1;

Ve que se ve mejor.

Basicamente lo que pide se puede separar de 2 formas.


  • Procesar el dato como numero y atravez de divisiones y variables temporales ir separando en bloques de centenas y agregarles el valor adecuado
  • Convertir el Numero a cadena y procesar cada 3 caracteres y agregarles el valor adecuado

Ambas salidas deberian de devolver un string o (char*) listo para que se imprima en pantalla.

Saludos
#865
Programación C/C++ / Re: Duda programa c++
10 Agosto 2016, 20:17 PM
Lo mas recomenble para determinar si un numero es Capicua o no lo es, es leer el numero como cadena de texto.

Determinar la longitud de la cadena y evaluar en un ciclo hasta que recorras la mitad de la cadena.

Tedejo un ejemplo que ya tenia hecho ya que al momento de que pegas tu codigo sin GeSHi, se pierden los index de los arreglos:

#include<stdio.h>
#include<stdbool.h>
#include<string.h>

int main() {
bool capicua = true;
int longitud,i;
char numero[10] = "";
printf("Ingrese un numero: ");
fgets(numero,10,stdin);
longitud = strlen(numero);
numero[longitud-1] = 0;
longitud = strlen(numero);
longitud -=1;
printf("Longitud del numero %i\n",longitud );
i = 0;
while(i <= longitud && capicua) {
if(numero[i] != numero[longitud]) {
capicua = false;
}
i++;
longitud--;
}
if(capicua) {
printf("El numero es Capicua!\n");
}
else{
printf("El numero NO es Capicua!\n");
}
return 0;
}


#866
Voy a comentarte que si solo necesitas contar, no necesitas guardarlos.

La variable necesita ser char

Ahora que si necesitas guardarlos pues entonces se trata de otra cosa:

Citarmetiendo datos hasta que se introduzca el carácter punto '.'

Citartambién hay que mostrar los números introducidos por pantalla.

Son Datos o Numeros?

Codigo para solo contar caracteres independientemente si son numeros o otra cosa
#include<stdio.h>

int main(){
char c;
int cont=0;
int num;
int contador2=0;
printf("Introduzca texto: ");

do{
c = getchar();
cont++;
if(c == ' ' || c == '\t' ||c == '\n')
contador2++;
}while(c != '.');
printf("Ha introducido %i  tabuladores, espacios de linea..etc y también estos números: %i\n",contador2,cont);
}



Tu programa se cuelga por que tratas de meterle un "." a una variable Entera.

Saludos
#867
int calificaciones[5][8];

#868
Y cual es la duda  :-(
#869
Que raro agregale este:


Código (cpp) [Seleccionar]
std::cout << "Direccion de cadena: " << (void *)cadena << std::endl;

Ya que llegue a mi Computadora lo valido.

Saludos
#870
Suponiendo que puedes Leer TODO el contenido del archivo en Memoria y Guardarlo en un Buffer.

Lo que tendrias que hacer es lo siguiente:

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

int main() {
int  total = 0;
char **arreglo = NULL;
char *buffer; // Deberias de lee y guardar Todo el contenido del archivo en esta variable.
char *token = NULL;
token = strtok(buffer,",");
while(token != NULL) {
arreglo = realloc(arreglo, sizeof(char*) * (total +1));
arreglo[total] = token;
printf("Nombre %i: %s\n",total+1,arreglo[total]);
total++;
token=strtok(NULL,",");
}
}


Saludos!