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

#521
Programación C/C++ / Re: Problema con while
4 Enero 2014, 20:11 PM
Cita de: leosansan en  4 Enero 2014, 19:49 PMLo que suucede no es nada raro, es lo habitual en un scanf dentro de un bucle especialmente. Ocurre porque el último ENTER que introduces por teclado se queda en lo que se llama memoria intermedia o buffer, de forma que al corre el programa un bucle y encontrarse con otro scanf, como se había quedado con el ENTER en memoria, ejecuta la siguiente instrucción que requiera de un ENTER, lo tenía en memoria y antes de coger  nuevos datos suelta ese que tiene.

[...]

Una forma simple, en este caso, es lo que te comente de dejar un espacio en blanco en el scanf antes de escribir el %c.
Esa es la solucion pero, por alguna razón, no la agregaste a tu programa. La sentencia en cuestión debe ser:
scanf(" %c",&sex);

Un saludo
#522
Extendiendo la solución de do-while puedes eliminar el cuerpo del bucle si en su condición colocas la comparación con strcmp. Ademas no es necesario declarar la variable local "ptr" cuando puedes utilizar el parámetro "cabeza" y el mensaje que imprimes se encuentre o no la cadena es el mismo.

Con los cambios:
#include <stdio.h>
#include <string.h>

typedef struct nodo
{
   char *codigo;
   struct nodo *sig;
} CODOP;

void buscarCodop(CODOP *p)
{
   while (p != NULL && strcmp(p->codigo, "BLE") != 0)
      p = p->sig;
   
   if (p)
      puts("Se encontro el codop");
   else
      puts("No se encontro el codop");
}


Eso en el caso de una lista vinculada sin ordenar, si los nodos están ordenados la búsqueda debe terminar en cuanto el puntero sea NULL o se encuentre un nodo con un valor igual o mayor al buscado.

Un saludo
#523
Cita de: jamatbar en  4 Enero 2014, 16:31 PMY aquí está el fichero fecha.h:

#ifndef FECHA_H
#define FECHA_H

struct fecha {
  int dia;
  int mes;
  int año;
};

/* ... */
La solución ya la dio amchacon, otra parte a cambiar en el programa es el nombre del campo "año" ya que en C solo son validos (como parte de un identificador) los caracteres del alfabeto ingles (ello excluye a la 'ñ').

Un saludo
#524
Otra forma es multiplicar el acumulado por la base y agregar el dígito:
int convertir_a_decimal(char cad[])
{
   int rv = 0;
   int i;
   
   for (i = 0; cad[i] != '\0'; i++)
      rv = rv * 2 + cad[i] - '0';
   
   return rv;
}


Una opción mejor es la función strtol, parte de la biblioteca estándar de C y con soporte para las bases 2 a 36.

Un saludo
#525
Cita de: joanj94 en  3 Enero 2014, 17:59 PMPor eso en el que yo le hice, uso el else if
En este caso se puede utilizar cualquiera de las dos sentencias de selección (if, switch) sin problemas, que la sentencia switch requiera sentencias "break;" para su correcto funcionamiento no la invalida.

Un saludo
#526
Cita de: DanielC# en  2 Enero 2014, 18:19 PMBueno el caso es que ahora necesito que me digan cómo seguir,  ¿como paso el nuevo binario a la "d"  para que se transforme en "D"?
Si la intención es realizar las operaciones a nivel de bits entonces para pasar de:
A) Mayúsculas a minúsculas, debes activar el sexto bit mediante el operador "|" y una mascara (el valor 32).
B) Minúsculas a mayúsculas, debes desactivar el sexto bit mediante el operador "&" y una mascara (el valor opuesto al anterior, 223).

Un programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char ch[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   int i;
   
   puts("Mayusculas a minusculas:");
   for (i = 0; i < 26; i++){
      ch[i] |= 32;
      printf("%c", ch[i]);
   }
   putchar('\n');
   
   puts("Minusculas a mayusculas:");
   for (i = 0; i < 26; i++){
      ch[i] &= 223;
      printf("%c", ch[i]);
   }
   putchar('\n');
   
   return EXIT_SUCCESS;
}


----

Por ultimo tal vez tu programa no tenga el comportamiento esperado debido a esta declaración:
char cadena[6] = "daniel";
Con ella se crea un array de seis elementos inicializados con los caracteres indicados pero falta el indicador de fin de cadena (el '\0'), para que este se agregue de forma automática debes eliminar el numero de elementos del array o bien indicar el numero correcto (siete).

Un saludo
#527
Cita de: SoyelRobert en  3 Enero 2014, 17:31 PMexactamente, justo lo acabo de sacar yo tambien
Todavía hay un error en el programa, cuando se ejecuta la primera iteracion del bucle:
int main()
{
   char c;
   
   do {
      if (esVocal(c))
         printf("%c", sigVocal(c));
      else
         printf("%c", c);
   }while (scanf("%c", &c) != EOF);
   
   return 0;
}

El valor inicial de la variable "c" es no definido o basura, para procesar la variable solo después de almacenar en ella un valor se debe cambiar el bucle por uno con la condición al principio de este:
int main()
{
   char c;
   
   while (scanf("%c", &c) != EOF)
      if (esVocal(c))
         printf("%c", sigVocal(c));
      else
         printf("%c", c);
   
   return 0;
}


Cita de: joanj94 en  3 Enero 2014, 17:35 PMPD: Un consejo los break, goto, y uso de librerias estilo conio.h evitalos si no son requeridos
En el caso del programa de SoyelRobert las sentencias "break;" en la función "sigVocal" son necesarias para tener el efecto deseado, si se eliminaran la función siempre retornaría 'a' como la siguiente vocal.

Un saludo
#528
Programación C/C++ / Re: funcion strcmpi()
31 Diciembre 2013, 16:22 PM
Cita de: m@o_614 en 31 Diciembre 2013, 05:05 AMtengo una duda con respecto a si la funcion strcmpi esta recomendada usarla o no. tengo entendido que a diferencia de strcmp, esta no es estandar, y si tengo que comparar dos cadenas pero sin diferenciar mayusculas de minusculas no se si hacerlo con esta funcion o hacerlo yo todo el procedimiento
Si en tu programa debes realizar esa operación bien utilizas la función provista por tu compilador o desarrollas una propia, cada opción con sus ventajas: con la primera no reinventas la rueda y con la segunda mantienes el programa portable (apegado al estándar).

Cual elegir depende de los requisitos del programa (si se trata de un trabajo de clase).

Un saludo
#529
Cita de: DanielC# en 31 Diciembre 2013, 14:38 PMsolo me encontré con algo que no puedo resolver (en mayúscula).
El problema se debe a la conversión del espacio en "Roberto Daniel", este se sustituye por el carácter '\0' y es la causa de que solo se imprime la primera palabra.

Para solucionarlo solo debes convertir los caracteres alfabéticos, esa verificación la puedes realizar con la función isalpha (prototipo en <ctype.h>).

Un saludo
#530
Cuando tengas una duda o problema con alguno de tus programas por favor indica el lenguaje de programación. En el caso de C ...

Cita de: clupin en 29 Diciembre 2013, 13:35 PMdeberia devolverme 0 si son iguales, 1 si son distintos
Lo usual es devolver verdadero (un valor distinto de cero, usualmente uno) si se cumple la condición y falso (cero) en caso contrario.

Cita de: clupin en 29 Diciembre 2013, 13:35 PMel programa solo me devuelve el lado de la derecha y no compara la izq
Eso sucede porque falta retornar el valor en el caso de que ambos nodos sean diferentes de NULL y con igual valor:
if (a->dato == b->dato){ /* <== No hay valor de retorno en esta rama de ejecucion */
   iguales(a->izq, b->izq);
   iguales(a->der, b->der);
} else {
   return 1;
}


Por ultimo se pueden ahorrar algunas comparaciones. Por ejemplo (retornando verdadero si son iguales):
struct nodo {
   int valor;
   
   struct nodo *izq;
   struct nodo *der;
};

/* ... */

int equ(struct nodo *p, struct nodo *q)
{
   if (p != NULL && q != NULL && p->valor == q->valor)
      return equ(p->izq, q->izq) && equ(p->der, q->der);
   else
      return p == q;
}


Un saludo