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

#611
Programación C/C++ / Re: secuencia digital
12 Noviembre 2013, 15:13 PM
Tu programa no funcionara correctamente ya que lees el numero como un entero y después tratas de procesar cada uno de sus dígitos con bucles como este:
printf("Escriba una secuencia:");
scanf("%d", &num);

/* ... */


while ((num == '0') || (num == '1')){


En su lugar puedes leer la secuencia de dígitos binarios como una cadena con scanf y a continuación realizas el proceso de conteo de transiciones y media (NPI). Mas o menos así:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char bit[128];
   int num_bits;
   int i;
   
   printf("Introduce el numero: ");
   fflush(stdout);
   if (scanf("%127[01]%n", bit, &num_bits) != 1)
      return EXIT_FAILURE;
   
   /* Algun proceso, por ejemplo impresion de los bits */
   printf("Valor de cada bit (%d):\n", num_bits);
   for (i = 0; i < num_bits; i++)
      printf("bit[%2d] == \'%c\'\n", i, bit[i]);
   
   return EXIT_SUCCESS;
}


Un saludo
#612
Cita de: DanielC# en 12 Noviembre 2013, 14:44 PMIngreso 12.50 porque debo suponer que isspace me va a encontrar el punto
Correcto. La idea es permitir solo espacio blanco después del numero (por ello el uso de isspace).

Un saludo
#613
Cita de: Idmus en 11 Noviembre 2013, 16:31 PMtengo una duda, el el caso de que quisiera leer una matriz dentro de un archivo ".txt" desde una funcion... ¿como seria posible? , es decir tengo mi funcion

"int main()"

y dentro de esta funcion llamo a una funcion que se llama "leer matriz()"

pero nose como enviar ese archivo "matriz.txt" con la matriz a la funcion para que me lo lea desde adentro de la funcion "leermatriz()"
El escenario mas simple es aquel donde conoces el numero de filas y columnas. En ese caso solo debes pasar a la función el nombre del archivo y la dirección base del array. Dentro de la función abres el archivo, lo procesas y finalmente lo cierras.

Mas o menos así:
#include <stdio.h>
#include <stdlib.h>

#define NUM_FILAS  3
#define NUM_COLS   4

int leer_matriz(char const *nom_entrada, int mat[][NUM_COLS]);

int main(void)
{
   int mat[NUM_FILAS][NUM_COLS];
   char const *nombre = "Entrada.txt";
   
   /* ... */
   
   leer_matriz(nombre, mat);
   
   /* ... */
   
   return EXIT_SUCCESS;
}

int leer_matriz(char const *nom_entrada, int mat[][NUM_COLS])
{
   FILE *entrada;
   int rv;
   
   if ((entrada = fopen(nom_entrada, "rt")) == NULL){
      /* Manejo de error */
   }else {
      /* Procesar el contenido del archivo */
   }
   fclose(entrada);
   
   return rv;
}


Un saludo
#614
Cita de: DanielC# en 12 Noviembre 2013, 02:24 AMno es un espacio lo que me ocupa sino que se ingrese un número decimal.
La comprobación "!isspace(ch)" sera verdadera cuando se encuentre cualquier carácter que no sea espacio blanco, si eso sucede ya podemos concluir que la linea no es valida.

Un saludo
#615
Programación C/C++ / Re: Ayuda C++11
12 Noviembre 2013, 02:29 AM
Mi consejo es revisar si hay nuevas ediciones de libros (recomendados y/o favoritos) sobre C++ con la actualización a C++11. Ese es el caso de "The C++ Programming Language" (Stroustrup), "The C++ Standard Library" (Josuttis) y "C++ Primer" (Lippman, Lajoie y Moo).

Un saludo
#616
Cita de: DanielC# en 11 Noviembre 2013, 16:14 PMIgual tiene algo que no me gusta, si se ingresa 10.15 me toma el 10 me parece que voy a tener que modificar la validación.
Para solucionarlo en el bucle donde descartas el resto de la linea verificas si el carácter a procesar no es espacio blanco con isspace (prototipo en <ctype.h>), si es así cambias el valor de la variable "ok" a cero. Por ejemplo el primer bucle con el cambio:
do {
   system("CLS");
   printf("Ingrese dia...:");
   fflush(stdout);
   ok = scanf("%d", &dd) == 1 && dd >= 1 && dd <= 31;
   
   while ((ch = getchar()) != EOF && ch != '\n')
      if (!isspace(ch))
         ok = 0;
}while (!ok);


Un saludo
#617
* Lo primero que salta a la vista es el uso de las variables "actual" y "contador" sin antes asignarles un valor, eso sucede en la primera iteración del bucle.

* En la primera sentencia if del bucle:
if ((anterior == '0') && (actual = '1')){
Utilizas el operador de asignación "=" cuando debería ser el de comparación "==".

* Debes actualizar el valor de la variable "anterior" en cada iteración del bucle, una opción aquí es, si los dígitos son distintos, asignar el valor '\0' para descartar el par de dígitos (al parecer esa es la intención en tu programa).

El bucle corregido (se puede acortar utilizando el operador lógico OR "||"):
char anterior = '\0';

/* ... */

while (scanf("%c", &actual) == 1 && actual != '\n'){
   if ((anterior == '0') && (actual == '1')){
      anterior = '\0';
      contador++;
   }else if ((anterior == '1') && (actual == '0')){
      anterior = '\0';
      contador++;
   }else
      anterior = actual;
}


Una forma mas corta esta basada en el uso del especificador "%1[01]" con scanf, con el nos aseguramos de leer un solo carácter igual a '0' o '1' (seguido de un '\0', por eso se utilizan arrays) y en caso de que los bits sean iguales se puede regresar uno a la entrada estándar con ungetc:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char a[2];
   char b[2];
   int i;
   
   printf("Introduzca la serie digital:");
   fflush(stdout);
   
   i = 0;
   while (scanf("%1[01]%1[01]", a, b) == 2)
      if (*a != *b)
         i++;
      else
         ungetc(*b, stdin);
   
   printf("Numero de pares distintos: %d\n", i);
   
   return EXIT_SUCCESS;
}


Un saludo
#618
Programación C/C++ / Re: Ofuscación
10 Noviembre 2013, 15:16 PM
Cierto, la definición que di fue la del operador XOR '^'. Mea culpa.

Un saludo
#619
Programación C/C++ / Re: Ofuscación
10 Noviembre 2013, 02:44 AM
Es un operador de bits donde el bit resultante es 1 si los bits son distintos y 0 si son iguales. Una pagina con una explicación a detalle de esos operadores (en general, no especifico de C) es Wikipedia: Bitwise operation.

Un saludo
#620
Programación C/C++ / Re: Ayuda con ejercicio
9 Noviembre 2013, 16:17 PM
Tu programa tiene varios errores como utilizar bucles:
for (i=0;i<=10;i++)
Que iteran once veces, no diez. La condición debes cambiarla a "i < 10".

Otros dos son las expresiones "rand() % 1" ya que siempre resultara en cero y "rand() % 100 < 10" que resultara en 1 o 0 dependiendo del residuo de la división.

----

La forma mas fácil es con un array de arrays de caracteres para implementar la matriz, la base es:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   FILE *salida;
   char mat[10][10];
   int i;
   int j;
   
   /* ... */
   
   return 0;
}


A continuación los pasos que se deben realizar son:

1) Almacenas en todos los elementos de la matriz el carácter '0'. Eso lo realizas con dos bucles anidados cada uno iterando diez veces.

2) Un bucle que itere diez veces, la fila y columna se generan de forma aleatoria con "rand() % 10" para colocar ahí un '1'. Se debe verificar (mediante un bucle anidado) que la celda no contenga un '1'.

3) Se genera la fila y columna de forma aleatoria para el carácter 'A'. Utilizas un bucle para verificar que ahí no se encuentre un '1'.

4) Ya con todos los valores en la matriz abres el archivo, envías todos los datos (dos bucles anidados) y cierras el archivo.

En términos generales eso es todo.

Un saludo