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

#1351
Porque en C las constantes numéricas enteras que inician con un cero se toman como base 8 y en esta base solo son validos los dígitos 0 a 7. Para eliminar ese error basta con eliminar el cero inicial.

Aparte de eso deberías eliminar el uso de la biblioteca conio de Borland. El porque de ello es explica en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Por ultimo en tu programa los casos son exclusivos (no se puede ser de un signo y otro a la vez) y todas las sentencias de selección "if" terminan con:
getch();
return 0;

Eso lo debes colocar solo una vez, justo antes del final de la función principal.

Un saludo
#1352
No aplica solo si estas ejecutando Dev-C++ en Linux mediante un emulador como Wine ...

Cuando indique "menú inicio" me refería al menú principal en MS Windows, el IDE que se utilice no importa.

Un saludo
#1353
No es necesario, al menos no en MS Windows XP.

Con este en el menú "Inicio" seleccionas la entrada "Ayuda y soporte técnico". En el cuadro de búsqueda tecleas "Interprete de comandos" y uno de los resultados es "Referencia A-Z de la línea de comandos". Ahí esta la descripción de todos lo comandos internos y externos.

Un saludo
#1354
Cita de: Anastacio en 20 Enero 2012, 19:33 PMi = 0;
while(i < algo) {
    /* codigo */
    ++i;
}


para que es el ++i?
Para incrementar el contador (la variable "i") en una unidad.

Un saludo
#1355
En mi opinión con solo la información que dio Xandrete ya debería estar solucionado el tema, a menos que busques algo mas y (en buen plan) no estés explicando de forma clara y precisa el problema.

Recopilando y extendiendo un poco:

* Puedes devolver la dirección en memoria de una variable local pero su uso (vía indirección) no sera valido ya que esas variables tienen el tipo de almacenamiento automático: se crean al inicio del bloque y se destruyen al finalizar este.

* Como indicas para solucionar esto puedes utilizar una variable "global" ya que su tipo de almacenamiento es estático: a partir de su definición la variable se crea y solo se destruye al finalizar el programa.

* Una mejor opción es seguir la recomendación de Xandrete: dependiendo del lenguaje utilizar malloc+free o new+delete ya que el objeto apuntado (como en el caso de las variables "globales") tiene el tipo de almacenamiento estático.

Un saludo
#1356
Cita de: satu en 19 Enero 2012, 20:40 PMEn C estándar CREO que no se puede, que alguien me corrija si me equivoco.

Si usas Windows puedes usar su API, para cambiar el color del texto la función que se utiliza es SetConsoleTextAttribute
Correcto, en C estandar no es posible. En este la salida estandar (stdout) se trata como un stream en modo "wt" (modo texto, escritura) con algunas limitaciones.

Un saludo
#1357
El problema se debe a la diferencia entre declaraciones y definiciones. Si necesitas de una variable "global" (técnicamente estas no existen en C, son una combinación de "file scope" y "external linkage") debes declarar la variable en el archivo de inclusión utilizando la palabra reservada "extern", por ejemplo:
/* Declaracion de la interfaz */

extern int x;


Esa variable la debes definir en una sola unidad (sin utilizar "extern") y, por supuesto, fuera de toda función:
int x;

De esa forma tienes la declaración de la variable en varias unidades (al incluir el encabezado) y sola una definición (en la unidad que lo requiera).

Un saludo
#1358
Un detalle a considerar es, en el lenguaje C, los valores máximos de los tipos están definidos con un mínimo garantizado pero nada impide que sean mayores (depende de la implementación).

Por ejemplo el tipo "signed int" consta de por lo menos 16 bits y puede almacenar como mínimo el rango de valores -32,767 a 32767.

Pero lo usual en sistema operativos como MS Windows y Linux es tener al tipo "signed int" constituido por 32 bits. Para conocer los máximos permitidos se pueden utilizar las macros definidas en los encabezados <limits.h> y <float.h> pero eso mejor déjalo para después.

Por el momento lo mejor (en mi opinión) no es memorizar esos limites, con la practica eso sucederá de forma natural.

Edito: lo siento, no vi el mensaje de Xandrete. Sorry.

Un saludo
#1359
Solo agregar que, si lo permite el enunciado, se puede agregar un borde de centinelas para así evitar los casos especiales (con su costo, por supuesto).

Por ejemplo en el caso de la matriz 5x5:
0 0 0 0 0 0 0
0 X X X X X 0
0 X X X X X 0
0 X X X X X 0
0 X X X X X 0
0 X X X X X 0
0 0 0 0 0 0 0

Donde las Xs son los valores de matriz y los 0s los centinelas. De esa forma se puede desarrollar una función que, dada una coordenada, verifique si esta es mayor que cualquiera de sus ocho vecinos retornando verdadero o falso (según corresponda).

Un saludo
#1360
El programa tal como esta no funcionara correctamente por varios errores críticos.

No quiero sonar como un [CENSORED] de lo mas pedante pero creo que acabas de romper todas (o casi todas) las recomendaciones del tema |Lo que no hay que hacer en C/C++. Nivel basico|. Espero no lo tomes a mal (solo es un comentario con humor).

Lo primero (si es posible) es cambiar de compilador por uno mas reciente y actualizado, recomendaciones hay muchas, solo tienes que usar el motor de búsqueda de los foros.

En cuanto al programa los errores mas importantes son utilizar las variables "nom" y "num" sin antes asignarles un valor (la dirección en memoria retornada por malloc, calloc o realloc). Al no hacerlo el valor inicial de ambas variables es NULL.

En cuanto a los bucles una forma mejor es verificar cada carácter. Aquí tienes el problema del espacio blanco antes y después de un numero así como el espacio intercalado en nombres compuestos como "Jose Maria".

Bueno, comparas cada carácter y si es valido continuas. Con ello al terminar el bucle basta con revisar si el ultimo carácter procesado es el '\0'. Si es así la cadena es valida.

Poco mas o poco menos (para el nombre):
for (i = 0; isalpha(nom[i]) || isspace(nom[i]); i++)
   ;
if (nom[i] == '\0'){
   /* La cadena es valida */
}else {
   /* No lo es */
}


Un saludo