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

#751
Cita de: Xafi en  7 Julio 2013, 02:21 AMtypedef unsigned int Uint
Uint x=5;//Bien
Uint x= -1; Mal solo acepta positivos.
No. La ultima asignación es valida (operaciones de ese tipo pueden causar un verdadero dolor de cabeza).

Ello porque si un valor esta fuera del rango valido (tipo entero sin signo) a este se le suma (o resta, dependiendo del caso) MAX + 1 hasta que este en el rango valido.

Por cierto el ejemplo que pones es la forma usual para calcular el valor máximo sin tener que utilizar el encabezado <limits.h>. Un ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(void)
{
   /* Imprime el valor maximo para el tipo unsigned int */
   printf("%u\n", (unsigned) -1);
   printf("%u\n", UINT_MAX);
   
   /* Imprime el valor maximo para el tipo unsigned long */
   printf("%lu\n", (unsigned long) -1);
   printf("%lu\n", ULONG_MAX);
   
   return EXIT_SUCCESS;
}


Otro escenario problemático son las expresiones donde se utilizan valores de tipo signed y unsigned. Por ejemplo este programa en C:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int a = -1;
   int b = 0;
   unsigned x = 0;
   
   printf("%d < %d  ? %s\n", a, b, a < b ? "Si" : "No");
   printf("%d < %uU ? %s\n", a, x, a < x ? "Si" : "No");
   
   return EXIT_SUCCESS;
}


Genera la salida:
-1 < 0  ? Si
-1 < 0U ? No


Ello porque los operandos de un operador binario deben ser del mismo tipo, en este caso el valor -1 de tipo signed int se convierte automáticamente al tipo unsigned int resultando en el valor mencionado (el máximo) y solo entonces se realiza la comparación.

Y si bien un compilador en modo estricto puede generar un mensaje de advertencia al compilar ese programa (o uno similar) ello no esta garantizado (y a veces uno las desactiva al saber que son inocuas).

Un saludo
#752
Cita de: feedf en  5 Julio 2013, 05:21 AMveo mucha gente q usa cin y cut o veo q vos ahora usaste puts, tienen alguna diferencia?
En C cuando se requiere imprimir texto con formato se utiliza printf, por ejemplo:
int a = 123;

/* ... */

printf("El valor de a es %d\n", a);


Para imprimir una cadena literal terminada con un avance de linea se puede utilizar printf o puts, aquí es mejor la segunda ya que el carácter '\n' se imprime automáticamente después del texto:
printf("hola, mundo\n");

/* O bien */
puts("hola, mundo");


Un saludo
#753
Otra opción es utilizar una sentencia "break;" dentro del bucle:
puts("Tienes 7 oportunidades para adivinar el numero");
for (*opcion = 1; *opcion < 8; (*opcion)++){
   printf("%d oportunidad---->", *opcion);
   fflush(stdout);
   scanf("%d", numero);
   
   if (*computadora < *numero)
      puts("Mi numero es menor");
   else if(*computadora > *numero)
      puts("Mi numero es mayor");
   else
      break;
}

if (*opcion < 8)
   printf("Acertaste en tu %d oportunidad\n", *opcion);
else {
   printf("Lastima se te acabaron las oportunidades");
   printf(" (%d)\n", *computadora);
}


La desventaja es el mentado salto mientras que la ventaja es evitar el uso de la bandera. Cuestión de estilos.

Un saludo
#754
Cita de: feedf en  4 Julio 2013, 22:31 PMel tema es que cuando i=1 funciona bien pero luego en 2 y 3 no me la valida aunq ponga bien los usuarios y contraseñas
Si apenas empiezas en tu aprendizaje del lenguaje C lo recomendado es evitar el uso de "fflush(stdin)", gets y la biblioteca conio de Borland. Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Dos errores en esa función son la falta de los nombres de los parámetros y no inicializar a cero la variable "h" antes del bucle donde se pide la contraseña. Esto ultimo es lo que provoca que la función no reconozca la contraseña como valida.

Tampoco es necesario inicializar una variable con un valor cuando lo primero que haces con ella es almacenar otro valor:
i=0;

/* ... */

for (i = 1; i <= 3; i++)

En un caso así hay que eliminar (por superflua) la primera asignación.

La función con las correcciones:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void val_pas(char const *nombre_ok, char const *contrasena_ok) ;

int main(void)
{
   val_pas("foo", "bar");
   
   return EXIT_SUCCESS;
}


void val_pas(char const *nombre_ok, char const *contrasena_ok)
{
   char nombre[100];
   char contrasena[100];
   int i;
   int h;
   
   for (i = 0; i < 3; i++){
      printf("Ingrese nombre de usuario: ");
      fflush(stdout);
      gets(nombre); /* Hay que cambiar por fgets */
     
      printf("Ingrese la contrasena: ");
      fflush(stdout);
      for (h = 0; (contrasena[h] = getch()) != '\r'; h++){
         putchar('*');
         fflush(stdout);
      }
      contrasena[h] = '\0';
      putchar('\n');
     
      if (strcmp(nombre, nombre_ok) == 0 && strcmp(contrasena, contrasena_ok) == 0)
         break;
      else
         puts("Nombre y/o contrasena invalidos");
   }
   
   if (i ==3){
      puts("No tiene mas oportunidades para probar");
      exit(EXIT_FAILURE);
   }
}


Faltan algunos cambios como la sustitución de gets por fgets, no lo agregue para no hacer mas largo el programa pero es algo que debes evitar (de nuevo hay que leer la pagina sobre recomendaciones).

Un saludo
#755
Cuando tengas un problema con un programa y este sea pequeño por favor publica este completo.

El porque el programa no realiza una pausa al pedir cada uno de los elementos se debe a que el especificador "%c" se traga el primer carácter que encuentre en el bufer de la entrada estándar y, en tu caso y en varias ocasiones, este es el avance de linea de (valga la redundancia) la linea anterior.

Para evitarlo basta con utilizar " %c" en la llamada a scanf. El espacio en " %c" es necesario para descartar cualquier carácter de espacio blanco (espacio, tabulador, avance de linea) que se encuentre en el mentado bufer.

Un saludo
#756
Programación C/C++ / Re: Volver a programar
5 Julio 2013, 02:05 AM
Cita de: HastatusXXI en  5 Julio 2013, 00:47 AMAclaro que en C solo me falta aprender algunos conceptos más avanzados como los sockets y repasar los que ya sabía. Y, por supuesto, mucha práctica.
En ese caso termina de aprender el lenguaje C, por lo que indicas tardaras solo un poco. Después de eso nada impide que aprendas C++.

Un saludo
#757
Cita de: eferion en  2 Julio 2013, 17:10 PMY ahí exactamente cómo sabes qué escuelas se encuentran en cada ciudad ???
Me parece que se trata de un ejercicio sencillo, la parte clave del enunciado es:
CitarInicializar dos matrices, la primera tendra 5 escuelas y la segunda sus respectivas ciudades.
Yo supongo se deben declarar dos arrays de arrays de caracteres (usualmente los llaman "matrices"). El primero contiene los cinco nombres de las escuelas y el segundo los cinco nombres de las ciudades. Para conocer la escuela o ciudad correspondiente basta con utilizar el mismo indice.

Siendo estrictos la declaración de los arrays debería ser mas o menos así:
char escuela[5][20] = {
   "Lopez Portillo",
   "Miguel De la Madrid",
   "Lopez Mateos",
   "Benito Juarez",
   "Miguel Hidalgo"
};
char ciudad[5][20] = {
   "Guadalajara",
   "Guadalajara",
   "Monterrey",
   "Monterrey",
   "Merida"
};


Un saludo
#758
Lo primero que debes indicar es el lenguaje de programación.

Cita de: m@o_614 en  2 Julio 2013, 03:59 AMInicializar dos matrices, la primera tendra 5 escuelas y la segunda sus respectivas ciudades.
Si se trata de C, Mas o menos así:
char *escuela[] = {
   "Lopez Portillo",
   "Miguel De la Madrid",
   ...
};
char *ciudad[] = {
   "Guadalajara",
   "Guadalajara",
   "Monterrey",
   ...
};

Los nombres de las escuelas deben ser únicos, los de las ciudades no.

Cita de: m@o_614 en  2 Julio 2013, 03:59 AMPedir una escuela a buscar y si se encuentra imprimir la ciudad donde se encuentra, si no se encuentra imprimir el letrero respectivo.
Eso lo implementas con un bucle:
for (i = 0; i < 5 && strcmp(escuela[i], buscar) != 0; i++)
   ;
if (i != 5){
   /* Imprimir la ciudad con indice "i" */
}else {
   /* Indicar que la escuela no se encontro */
}


Cita de: m@o_614 en  2 Julio 2013, 03:59 AMPedir una ciudad a buscar y si se encuentra imprimir las escuelas de dicha ciudad, si no se encuentra imprimir el letrero respectivo.
Un bucle donde recorres el array de ciudades, si coincide la imprimes y tomas nota con una bandera. Al final del bucle revisas la bandera para conocer si al menos una ciudad coincidió:
existe = 0;
for (i = 0; i < 5; i++)
   if (strcmp(ciudad[i], buscar) == 0){
      existe = 1;
     
      /* La ciudad existe, imprimir la escuela correspondiente */
   }
if (!existe){
   /* Indicar que la ciudad no existe en el array */
}


Un saludo
#759
El problema se debe a la función donde obtienes los elementos sin repeticiones:
Código (cpp) [Seleccionar]
vector<int> unico(vector<int>&v)
{
   ordena_seleccion(v);
   unsigned i=0;
   vector<int>p;
   
   while (i < v.size()){
      if (v[i] != v[i+1]){
         p.push_back(v[i]);
         p.push_back(v[i+1]);
         i = i + 2;
      }
     
      i++;
   }
   
   return p;
}

Supongamos que el vector pasado como argumento contiene los valores 0, 1 y 2, entonces:

1) La variable "i" toma el valor 0.
2) Se entra al bucle ya que 0 es menor que 3.
3) Ya que el elemento v[0] es diferente de v[1] agregas ambos.

Aquí el error:

4) Se incrementa "i" en dos unidades, "i" es igual a 2.
5) Se incrementa "i" en una unidad, "i" es igual a 3.
6) Termina el bucle ya que el valor de i no es menor que el numero de elementos en el vector.

La corrección es simple, agregas el primer valor de forma manual y los restantes siempre y cuando el valor procesado sea distinto del anterior:
Código (cpp) [Seleccionar]
vector<int> unico(vector<int>& v)
{
   ordena_seleccion(v);
   vector<int> p;
   p.push_back(v[0]);
   
   for (unsigned i = 1; i < v.size(); i++)
      if (v[i] != v[i - 1])
         p.push_back(v[i]);
   
   return p;
}


También debes modificar la parte donde se imprime el vector sin duplicados, solo debes seguir la indicación de satu, la condición en el bucle:
Código (cpp) [Seleccionar]
for (unsigned i = 0; i < v.size(); i++){
   cout << p[i] << "  ";
}

Debe ser "i < p.size()".

Un saludo
#760
Programación C/C++ / Re: ordenar un vector
30 Junio 2013, 03:26 AM
Cita de: indict en 29 Junio 2013, 22:43 PMHola, quiero ordenar un vector en orden creciente.
Lo mejor para ordenar un vector es utilizar la función sort.

Cita de: indict en 29 Junio 2013, 22:43 PMPara ello he creado una función que me devuelva el valor máximo del vector
Errores en el programa hay varios. En la función "ordena":
Código (cpp) [Seleccionar]
int m = maxim(v);
v[0] = m;

Con eso pierdes el primer valor del vector ya que no lo resguardas y si la intención es ordenar en orden ascendente el elemento mayor debe colocarse en la ultima posición.

Otro error se encuentra en la función que busca el máximo:
Código (cpp) [Seleccionar]
int i = 0, m;

while (i < v.size()){
   if (v[i] >= v[m]){
      m = i;

Ahí falta inicializar la variable "m", lo usual es asumir que el máximo es el primer elemento buscando uno mayor entre los restantes.

Otro error en el bucle de la función "ordena":
Código (cpp) [Seleccionar]
void ordena(vector<int>&v)
{
   int m = maxim(v);
   v[0] = m;
   
   for (int i = 1; i < v.size(); i++){
      if (v[i] < v[i + 1]){
         intercambia(v[i], v[i + 1]);
      }
   }
}

En la ultima iteracion del bucle el valor de "i" es "size - 1" y la expresión "i + 1" termina como "size - 1 + 1" que es igual a "size". No puedes utilizar ese valor y acceder al elemento "v[size]" ya que este no existe (los indices validos van de 0 a size-1).

Por ultimo buscar el elemento mayor me hace pensar en el algoritmo SelectSort. Por otra parte en la función donde intentas ordenar intercambias elementos adyacentes y eso es propio del algoritmo BubbleSort.

Mejor indícanos que algoritmo deseas implementar en tu programa.

Un saludo