elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 ... 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ... 160
211  Programación / Programación C/C++ / Re: Programa en C en: 26 Octubre 2014, 02:22 am
El programa funcionara correctamente siempre y cuando ninguna palabra tenga una longitud mayor a 19 caracteres pero, si existe una, el programa puede terminar reventando.

Para evitarlo dentro del bucle debes verificar el valor del contador "n_char", si este tiene un valor mayor al permitido le asignas el máximo, de esta forma:
Código
  1. while ((c = getchar()) != EOF)
  2.   if (c != ' ' && c != '\n' && c != '\t')
  3.      ++n_char;
  4.   else if (n_char > 0){
  5.      if (n_char > 19)
  6.         n_char = 19;
  7.  
  8.      index[n_char]++;
  9.      n_char = 0;
  10.   }

Un saludo
212  Programación / Programación C/C++ / Re: Programa en C en: 25 Octubre 2014, 03:56 am
soy estudiante de ingeniería y estoy tratando de resolver un ejercicio. Un programa que muestre un histograma de las longitudes de las palabras de un texto de entrada (usando la entrada estándar). Mi codigo es este [...]
Por partes.

El programa que presentas es uno de los ejemplos del primer capitulo del libro "The C Programming Language", una versión sencilla del comando wc (abreviación de word count). En el los autores enseñan como detectar la transición fuera-->dentro, cuando esta sucede se incrementa el contador de palabras en una unidad.

Paginas mas adelante uno de los ejercicios a resolver es el que comentas: imprimir las frecuencias de las palabras obtenidas de la entrada estándar. Para esto se debe detectar la transición opuesta (dentro-->fuera) y cuando esto suceda incrementar el contador de frecuencia correspondiente.

El primer error importante ya te lo indico reich: utilizar el operador de asignación "=" cuando deberías utilizar el de comparación "==". Otros son no colocar a cero el contador de longitud cuando se sale de una palabra y la falta de los paréntesis en la expresión que controla al bucle:
Código
  1. while (c = getchar() != EOF) ...
Hay que cambiarla a:
Código
  1. while ((c = getchar()) != EOF) ...

Otros mas son imprimir el primer elemento del array cuando este no se utiliza y no tomar previsiones en caso de una palabra de mas de diez caracteres (lo cual llevaría a utilizar un indice invalido al acceder al array).

Por ultimo no es necesario la bandera de estado, en su lugar se utiliza al contador de longitud para conocer este (cero es fuera de una palabra, mayor que cero es dentro). El bucle en pseudocódigo:
Código:
Asignar al contador de longitud el valor cero
Mientras se pueda leer un caracter
   Si el caracter NO es espacio blanco
      Incrementar el contador de longitud en una unidad
   Caso contrario: si el contador de longitud es mayor que cero
      Si el contador de longitud es mayor que el indice maximo del array
         Asignar al contador de longitud el indice maximo del array
     
      Incrementar el elemento del array de indice "contador de longitd" en una unidad
      Asignar al contador de longitud el valor cero

Un saludo
213  Programación / Programación C/C++ / Re: Gusano básico en C++ en: 25 Octubre 2014, 02:18 am
muchas variables y demasiados if. ¿Por qué no lo intentas con un array?
Ya que solo se trata de un contador con la salida NN:NN:NN se puede reducir el numero de bucles a dos y el numero de expresiones mediante un centinela. Un programa para explicarlo mejor (C90):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int num[4] = {0}; /* num[0] es un centinela */
  7.   int i;
  8.  
  9.   while (num[0] == 0){
  10.      printf("%02d:%02d:%02d\n", num[1], num[2], num[3]);
  11.  
  12.      for (i = 3; ++num[i] == 100; --i)
  13.         num[i] = 0;
  14.   }
  15.  
  16.   return EXIT_SUCCESS;
  17. }

Un saludo
214  Programación / Programación C/C++ / Re: Ordenar alfabeticamente Nombres (Struct) en: 22 Octubre 2014, 03:03 am
No veo cual sea el problema ya que puedes copiar las estructuras mediante el operador de asignación y en cuanto a comparar los campos (tipo string) "Naame" de dos estructuras puedes utilizar los operadores relacionales.

Para darte una idea si se quiere verificar si los dos primeros elementos están desordenados e intercambiarlos si es el caso el condicional seria:
Código
  1. if (emp[0].Naame > emp[1].Naame){
  2.   Employees aux;
  3.  
  4.   aux = emp[0];
  5.   emp[0] = emp[1];
  6.   emp[1] = aux;
  7. }
Donde "emp" es el nombre del array de estructuras. Por ultimo si no se desea realizar el intercambio manualmente se puede utilizar la función swap.

Un saludo
215  Programación / Programación C/C++ / Re: Leer registro encabezado de archivo | C en: 22 Octubre 2014, 00:46 am
Mi problema es que cuando creo el archivo e inicializo el encabezado (numero de registros igual 0) funciona perfecto, pero cuando voy a leer luego el encabezado en ese campo esta un valor "extraño".
El problema principal se debe a que en la función "subMenu" abres el archivo en modo "a+t" y con ello todas las operaciones de escritura se realizaran al final del archivo sin importar el uso de funciones de posicionamiento como fseek y rewind. En su lugar debes abrir el archivo en el modo "r+b" cuidando que antes de cualquier operación de escritura te posiciones al principio o final del archivo (dependiendo si vas a escribir el encabezado o agregar un registro) mediante la función fseek.

Ademas se debe cambiar/corregir una parte significativa del programa:

* Si declaras una macro no debes darle un nombre que inicie con un guion bajo ya que esos nombres se reservan para la implementación (algunos ejemplos son __DATE__, __FILE__, __LINE__, etc.).

* Cuando se declara una función con paréntesis vacíos:
Código
  1. int readInt();
  2.  
  3. /* ... */
  4.  
  5. void menu();
Ello indica un numero no determinado de argumentos, para indicar que no recibe argumentos debes utilizar "(void)".

* Si no utilizas los argumentos pasados mediante la linea de comandos cambia la definición de la función principal a "int main(void) ..." o "int main() ...".

* La biblioteca estándar de C no incluye una función con el nombre "fgetchar", en su lugar utiliza getchar o mejor todavía elimina por completo esa llamada.

* En el bloque de prototipos falta la declaración de la función "seeAll".

* En la función "subMenu" en la llamada a "readLine":
Código
  1. readLine(&buffer.firstName, TAM_CADENA);
El operador "dirección de" (el '&') esta de mas en su primer argumento, eliminalo.

* En la función "readInt" no se especifica el valor a retornar si ocurre un error y si la linea es demasiado larga el restante se quedara en el bufer de la entrada estándar (para el caso mejor utiliza scanf para leer el entero y a continuación descarta el resto de la linea con un bucle.

* En la función "readLine" si el ultimo carácter no es el avance de linea no es necesario sobrescribir este con un '\0' porque fgets lo agrega automáticamente. Y el tipo de retorno de getchar es int, la función hay que cambiarla a:
Código
  1. void readLine (char cadena[], int tam)
  2. {
  3.   if (fgets(cadena, tam, stdin) != NULL){
  4.      size_t i = strlen(cadena) - 1;
  5.  
  6.      if (cadena[i] == '\n')
  7.         cadena[i] = '\0';
  8.      else {
  9.         int ch;
  10.  
  11.         while ((ch = getchar()) != EOF && ch != '\n')
  12.            ;
  13.      }
  14.   }
  15. }

* En la funcion "seeAll" el bucle para imprimir todos los registros:
Código
  1. while (fread (&buffer, 1, header.recordLength, fd) == 1){
  2.   /* ... */
  3. }
No funcionara correctamente, las razones de ello te las explique en tu tema Funcion que no puede retornar un struct [C].

Un saludo
216  Programación / Programación C/C++ / Re: Obtener los valores nulos sobre la diagonal principal.(Array 2D) en: 19 Octubre 2014, 16:15 pm
Aparte de lo ya comentado por leosansan otro cambio a realizar son eliminar las declaraciones:
Código
  1. int nonul=0;
  2.  
  3. // ...
  4.  
  5. int i,j;
Ya que no las utilizas en tu programa.

Y no es necesario utilizar "<= N - 1" cuando se puede utilizar con el mismo efecto "< N", con ese cambio los bucles terminan así:
Código
  1. for (int i = 0; i < TAM - 1; i++)
  2.   for (int j = i + 1; j < TAM; j++)
  3.      if (M[i][j] == 0)
  4.         c++;
  5. cout << "nulos:" << c << endl;

Un saludo
217  Programación / Programación C/C++ / Re: Array bidimensional y uni. ¿Por qué el arreglo d[i] no se imprime en pantalla??? en: 19 Octubre 2014, 03:54 am
¿Qué cosa debería modificar?
Ademas (y respondiendo a tu otro tema sobre el mismo programa, deberías haber respondido en este) para obtener la diagonal principal solo necesitas de un bucle, la funcion "Diag" hay que cambiarla a:
Código
  1. void Diag(int a[TAM][TAM], int n, int d[TAM])
  2. {
  3.   cout << "Te voy a dar la diagonal principal:" << endl;
  4.  
  5.   for (int i = 0; i < n; i++)
  6.      d[i] = a[i][i];
  7. }

Un saludo
218  Programación / Programación C/C++ / Re: [Ayuda] piramide de numeros c++ en: 16 Octubre 2014, 17:31 pm
Otra aproximación se basa en considerar la salida esperada (la alineación solo es para facilitar la lectura):
Código:
    1
   212
  32123
 4321234
543212345

Como el resultado del absoluto mas uno de las series:
Código:
            0
         -1 0 1
      -2 -1 0 1 2
   -3 -2 -1 0 1 2 3
-4 -3 -2 -1 0 1 2 3 4

La implementación en C++ consiste en dos bucles anidados (antes de utilizar la función abs se debe incluir el encabezado <cstdlib>):
Código
  1. for (int i = 0; i != 5; ++i){
  2.   for (int j = -i; j <= i; ++j)
  3.      cout << abs(j) + 1;
  4.  
  5.   cout << endl;
  6. }

Un saludo
219  Programación / Programación C/C++ / Re: Programa operaciones no muy bien acabado en: 16 Octubre 2014, 16:10 pm
La salida que mencionas sucede porque al detectar la división por cero imprimes el mensaje de error pero realizas de todos modos la operación cuando no deberías.

Para solucionarlo debes utilizar una sentencia "if ... else ..." donde si el divisor es cero presentas el mensaje y en caso contrario (divisor diferente de cero) realizas la operación. En el caso de la primera operación el condicional debe cambiarse a:
Código
  1. if (operation == "/" || operation == "div"){
  2.   if (seconnum == 0)
  3.      cout << "cero is impossible to operate" << endl;
  4.   else
  5.      cout << "The first div is: " << (firstnum / seconnum) << endl;
  6. }
El cambio en la segunda operación es similar.

Por ultimo puedes eliminar las variables donde almacenas el resultado (plus, minus, etc.) ya que no son necesarias, puedes imprimir el resultado directamente.

Un saludo
220  Programación / Programación C/C++ / Re: Validador de contraseña en c++ en: 15 Octubre 2014, 15:46 pm
Como puedo crear un código en c++ que me cumpla con las siguientes especificaciones:
El password debe contener:
letras mayúsculas y minúsculas
números
longitud de 8 a 32
Pides la entrada al usuario y lees esta como una linea mediante la función getline, para conocer el numero de caracteres utilizas la función miembro size y para verificar si un carácter es alfanumérico utilizas la función isalpha isalnum.

Editado: agregue la corrección indicada por ivancea96. Gracias.

Un saludo
Páginas: 1 ... 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines