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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


  Mostrar Mensajes
Páginas: 1 [2] 3 4
11  Programación / Programación C/C++ / Re: Evitar leer el salto de línea cuando leemos cadenas en C en: 8 Marzo 2016, 21:08 pm
Hola ivancea96, definiticamente voy a evitar usarlo para estos casos. Leí sobre el scanf(" %c", &c) y una de las formas que encontré de solucionar el problema es colocando scanf( "%*c %c", &b ); dejando el código así:

Código
  1. #include <stdio.h>
  2. int main(int argc, char const *argv[])
  3. {
  4.   char a,b,c;
  5.  
  6.   printf( "Introduzca primer caracter: " );
  7.   scanf( "%c", &a );
  8.   printf( "Introduzca segundo caracter: " );  
  9.   scanf( "%*c %c", &b );
  10.   printf( "Introduzca tercer caracter: " );
  11.   scanf( "%*c %c", &c );
  12.   printf( "Los valores son: %c, %c, %c \n", a, b, c );
  13. return 0;
  14. }
  15.  
Lo que hacemos en la novena y onceaba línea es primero leer con "%*c" el caracter de salto de línea que quedó en el buffer de haber leído la entrada anterior del teclado (lo que queda al apretar Enter) y luego leemos el caracter ingresado.

MAFUS, había leido también sobre tu método, es la primer forma que encontré para soluciónar el problema y funciona muy bien para este caso. El código quedó así:

Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4.   char a, b, c;
  5.  
  6.   printf( "Introduzca primer caracter: " );
  7.   scanf( "%c", &a );
  8.   printf( "Introduzca segundo caracter: " );
  9. while(getchar()!='\n');
  10.  
  11.   scanf( "%c", &b );
  12.   printf( "Introduzca tercer caracter: " );
  13. while(getchar()!='\n');
  14.   scanf( "%c", &c );
  15.   printf( "Los valores son: %c, %c, %c \n", a, b, c );
  16.  
  17.   return 0;
  18. }
  19.  

Aún no termino de entender como es que funciona getchar, ese while sin una sentencia o bloque de código a ejecutar me cayó muy raro jaja.
Veo que en C hay muchísimas maneras para resolver un mismo problema!

mester también había leído sobre lo que comentaste, en su momento usaré ese método.

Muchas gracias nuevamente a todos.

Saludos!
12  Programación / Programación C/C++ / Evitar leer el salto de línea cuando leemos cadenas en C en: 8 Marzo 2016, 02:26 am
Me da cosa hacer tantas preguntas en este foro, averiguo en Internet sobre el tema, pero no se me está haciendo fácil conseguir las respuetas. De ahí que consulto por aquí, encuentro que es un lugar muy activo donde hay personas que están interesados en ayudar y de esa forma aprenden también.

Vuelvo con un tema de las más tontos, pero no le encuentro una solución. El problema se le debe presentar indudablemente a todo aquel que se incia en C. De hecho en este foro Littlehorse se encargó de hacer una lista de las cosas que no debemos hacer en C como novatos.

El problema que se presenta cuando usamos el scanf y queremos leer varias cadenas de caracteres.

Pongo el siguiente ejemplo que encontré en Internet: http://www.carlospes.com/curso_de_lenguaje_c/01_11_la_funcion_fflush.php
EJEMPLO:
Si nosotros escribimos este código:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.   char a, b, c;
  6.  
  7.   printf( "Introduzca primer caracter: " );
  8.   scanf( "%c", &a );
  9.   printf( "Introduzca segundo caracter: " );
  10.   scanf( "%c", &b );
  11.   printf( "Introduzca tercer caracter: " );
  12.   scanf( "%c", &c );
  13.   printf( "Los valores son: %c, %c, %c ", a, b, c );
  14.  
  15.   return 0;
  16. }
  17.  
vamos a ver que nos muestra por pantalla esto:
         
         Introduzca primer caracter: f 
         Introduzca segundo caracter: Introduzca tercer caracter: h
         Los valores son: f,
         , h


Vemos que por pantalla los mensajes no aparecen como queremos. En el ejemplo se comenta que una solución para que no ocurra eso es usando la función fflush. Dejando el código así:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.   char a, b, c;
  6.  
  7.   printf( "Introduzca primer caracter: " );
  8.   scanf( "%c", &a );
  9.   printf( "Introduzca segundo caracter: " );
  10.   fflush( stdin );
  11.   scanf( "%c", &b );
  12.   printf( "Introduzca tercer caracter: " );
  13.   fflush( stdin );
  14.   scanf( "%c", &c );
  15.   printf( "Los valores son: %c, %c, %c ", a, b, c );
  16.  
  17.   return 0;
  18. }
  19.  

Ahora bien, yo compile este programa en mi pc y no me funcionó. Me siguen apareciendo mal los mensajes. Alguno de ustedes que está en el tema, hace uso de la función fflush o qué hacen en este caso? Me debería haber funcionado la función fflush?

Me gustaría hacer uso de otra función como lo es fgets, pero veo que tampoco consigo la solución. Estoy lidiando con la lectura del salto de línea.
13  Programación / Programación C/C++ / Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio en: 8 Marzo 2016, 01:58 am
iivancea96 pude compilar como indicaste al final. Muchas gracias. La verdad es todo un tema para mi acostumbrarme a este lenguaje. Pero ME ENCANTA!
14  Programación / Programación C/C++ / Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio en: 7 Marzo 2016, 02:58 am
ivancea96 hay algunas cosas que no entiendo, por ejemplo, si yo no incluyo una linea de código dentro del programa que me diga cuál es la biblioteca que quiero enlazar, como indico eso? Si coloco los comandos -I y -L que sólo contienen la dirección del directorio de la biblioteca pero no indica cuál es la misma, como le indico cual es?

Subo mi código para tener una guia de lo que estoy haciendo:

POR UN LADO LA BIBLIOTECA:

Código
  1. //Etcheverry Pablo
  2. //etcheverrypablol@gmail.com
  3. //3-3-2016
  4. //
  5. //Introducción a la Algorítmica y Programación
  6. //
  7. //Práctico 17: Tipos Abstractos de Datos: uso e implementación
  8. //
  9. // Implementación del TAD PILA(Enteros) con arreglos en el lenguaje C
  10. #include <stdio.h>
  11.  
  12. struct TPila
  13. {
  14. int a[10]; //Arreglo de enteros
  15. int tope; //Número de elementos de la pila  
  16. };
  17. struct TPila p;
  18. /*
  19. Parámetros:
  20. p:pila
  21. Función: Retona verdadero si la pila está vacía (valor de tope cero) o falso. Observa que no es necesario pasar la pila como puntero.
  22. */
  23. int Vacia (struct TPila p){
  24.  
  25. return p.tope==-1;
  26. }
  27. /*
  28. Parámetros:
  29. p: pila
  30. Lo que hace la función es inicializar la pila dándole el valor 0 a tope. Se debe pasar la pila como puntero, para al momento de llamar la función, darle la dirección de memoria de la pila que le pasemos como parámetro (Inicializar struct TPila &p). Al darle la dirección de memoria, estamos logrando un pasaje de parámetro por REFERENCIA, lo que significa que al retornar un valor la función, quedará modificada la variable que se le haya pasado como parámetro.
  31. */
  32. void Inicializar (struct TPila *p){
  33. p->tope=-1;
  34. }
  35. /*
  36. Parámetros:
  37. p:pila
  38. x:número a insertar
  39. max:número máximo de elementos que soporta la pila
  40. Función: Inserta un elemento pasado como parámetro en el tope de la pila. Observar que se deben pasar p como puntero, ya que se debe pasar por referencia para poder modificar su valor.
  41.  */
  42. void Insertar (struct TPila *p, int x, int max){
  43.  
  44. if(p->tope!=max){
  45. p->tope=p->tope+1;
  46. p->a[p->tope]=x;
  47. }
  48. }
  49. /*
  50. Parámetros:
  51. p:pila
  52. num:variable donde se alamacena el valor del tope
  53. Función: Guardar el valor del tope de la pila en una variable
  54.  */
  55. void Tope (struct TPila p, int *num){
  56. *num=p.a[p.tope];
  57. }
  58. /*
  59. Parámetros:
  60. p:pila
  61. Función: Disminuye el valor de la varible tope de la pila, lo que es análogo a suprimir el tope de la misma.
  62. */
  63. void Suprimir (struct TPila *p){
  64. p->tope--;
  65. }
  66.  

Y POR OTRO, EL PROGRAMA QUE LA USA:

Código
  1. //Etcheverry Pablo
  2. //etcheverrypablol@gmail.com
  3. //5 de marzo de 2016
  4. //
  5. //Introducción a la Algorítmica y Programación
  6. //
  7. //Práctico 17: Tipos Abstractos de Datos: uso e implementación
  8. //
  9. //Ejercicio 1: Dada una pila de números enteros, usando el TAD PILA(enteros) desarrolla un algoritmo que imprima en pantalla el contenido de dicha pila. La pila debe quedar en su estado original.  
  10.  
  11. #include <stdio.h>
  12. #include "/home/etcheverry/Documentos/Algoritmica/2016/bibliotecas/tadPila.h"
  13.  
  14. void MostrarPila (struct TPila p,int max);
  15. void CargarPila(struct TPila *pnumeros, int max);
  16.  
  17. int main(int argc, char const *argv[])
  18. {
  19.  
  20. struct TPila pnumeros; //Pila donde se van a almacenar los enteros
  21. int max=sizeof(pnumeros.a)/(sizeof(pnumeros.a[0])); //Se utiliza para asegurar una carga máxima de 10 enteros
  22.  
  23. printf("El numero máximo que soporta la pila es: %d\n",max );
  24. CargarPila(&pnumeros,max);
  25. printf("Tope de la fila al salir de la carga: %d\n", pnumeros.tope);
  26. MostrarPila(pnumeros,max);
  27.  
  28. return 0;
  29. }
  30. /*
  31. Parámetros:
  32. pnumeros: pila
  33. max: número máximo de elementos que soporta la pila
  34. Función: Se encerga sólo de la cuestión de carga de la pila. Observar que se debe pasar como puntero la pila, ya que al terminar esta función, nos interesa que se haya modificado la misma.
  35. */
  36. void CargarPila(struct TPila *pnumeros, int max){
  37. int i; //Para llevar el control de cantidad de elementos que se ingresan
  38. int num; //Para almacenar el valor tope de la pila
  39. char resp; //Respuesta del usario para cargar elemento o no
  40.  
  41. i=0;
  42. Inicializar(pnumeros);
  43. puts("CARGA DE LA PILA.");
  44. puts("Desea ingresar un numero a la pila? s/n: ");
  45. scanf("%s",&resp);
  46. while ((resp=='s' || resp=='S' ) && i<max){
  47. puts("Ingrese un numero: ");
  48. scanf("%d",&num);
  49. Insertar(&(*pnumeros),num,max);
  50. puts("Desea ingresar otro numero? s/n: ");
  51. scanf("%s",&resp);
  52. i++;
  53. }
  54. }
  55.  
  56. void MostrarPila (struct TPila p,int max){
  57. int num; //Variable utilizada para el tope
  58. struct TPila pAux; //Para guardar la pila en esta variable y luEgo colocarla en la original
  59.  
  60. puts("LOS ENTEROS QUE SE INGRESARON A LA PILA SON: ");
  61. if(Vacia(p)){
  62. puts("Pila vacia.");
  63. }else{
  64. while(!(Vacia(p))){
  65. Inicializar(&pAux);
  66. Tope(p,&num);
  67. printf("%d ", num);
  68. Insertar(&pAux,num,max);
  69. Suprimir(&p);
  70. }
  71. printf("\n");
  72. /* El código que sigue es para dejar la pila en el estado original.IMPORTANTE: Este código no es necesario, ya que la pila se ha pasado como un parámetro por valor */
  73. while(!(Vacia(pAux))){
  74. Tope(pAux,&num);
  75. Insertar(&p,num,max);
  76. Suprimir(&pAux);
  77. }
  78. }
  79.  
  80. }
  81.  

15  Programación / Programación C/C++ / Re: compilar programa con una biblioteca que no se encuentra en el mismo directorio en: 6 Marzo 2016, 02:42 am
Hola ivancea96, probé como dijiste, pero me salta el mensaje de que no se encuentra:
Error que salta en consola:
practica17-1.c:13:22: error fatal: mibiblio.h: No existe el fichero o el directorio
compilación terminada.

Intneté colocanco la biblioteca en el mismo directorio que el programa, pero me salra el siguiente error:

usr/bin/ld: no se puede encontrar -lmibiblio
collect2: error: ld devolvió el estado de salida 1

A qué se debe este error?
16  Programación / Programación C/C++ / compilar programa con una biblioteca que no se encuentra en el mismo directorio en: 5 Marzo 2016, 23:29 pm
Estoy haciendo varios programas y quiero comenzar a hacer una biblioteca (o librería) mia.

Me di cuenta que la estaba incluyendo en mis programas con:
     #include "mibilio.h"
Ya que la tengo en el mismo directorio que el programa.

Resulta que los programas son varios, y van a estar en distintas carpetas, por lo que va a haber programas que van a estar en un directorio distinto al de la biblioteca.

La pregunta es, ¿cómo hago compilar esos programas con esta bibilioteca?

Yo estoy haciendo lo siguiente:
Compilo la función que va a ir a la biblio con:
     gcc -c primerFuncion.c
Luego creo la biblioteca con:
    ar -r libmibiblio.a primerFuncion.o
Y acá sigue el paso que no se cual es. Si la biblioteca estuvira en el mismo programa que quiero compilar (Digamos programa.c) haría lo siguiente:
   gcc -o programa programa.c -L. -lbiblio
Y listo, pero ese no es mi caso. Se que -L. indica que la biblioteca se encuentra en el mismo directorio. Probé con el siguiente comando pero no funcionó:
   gcc -o programa programa.c -L/direccióndelabiblioteca

Alguien me puede orientar un poco?

Gracias.

17  Programación / Programación C/C++ / Re: funcion en c que pueda ser llamada con parámetros de distintos tipos en: 5 Marzo 2016, 16:06 pm
MUCHAS GRACIAS POR sus respuestas.

MAFUS, veo que tu método es de una forma distinta a la que me imaginaba, pero con un casteo, cumple con lo que yo estaba buscando.

Class, tu método se acerca más a lo que yo pensaba, me gustó la idea de declarar una macro.

Queda en cada uno analizar las ventajas y desventajas de cada método. Por el momento han respondido a mi pregunta.

:-)
18  Programación / Programación C/C++ / Re: funcion en c que pueda ser llamada con parámetros de distintos tipos en: 4 Marzo 2016, 05:28 am
Hola class, no esperaba esa respuesta.
Pensé que si se podía. Sé que en pascal no se puede, pero me pareció escuchar en clase que sí en C.
19  Programación / Programación C/C++ / funcion en c que pueda ser llamada con parámetros de distintos tipos en: 4 Marzo 2016, 04:29 am
Hola gente.

Quiero crear una función que tenga parámetros que no restrinjan el tipo de dato que se la pase (ya sea int, char, etc.)

¿Cómo se hace y cómo se llama a este tipo de parámetros que no tiene un tipo en particular?

Por ejemplo:

void Sumar( tipoGenerico x, tipoGnerico y){
      return x+y;
}

Me gustaría que la función Sumar, permita pasarle como parámetro un tipo char, un tipo float o un tipo int.

Busqué en internet pero no pude encontrar nada. :-(
20  Programación / Programación C/C++ / Re: Que es lo que esta mal? Ayuda!!! en: 7 Febrero 2016, 02:02 am
Hola cinfi.

Observando tu código, deduzco que lo que quieres hacer es cargar una matriz de 4x6 con el primer ciclo for y con el segundo mostrarla. Pues, compilando únicamente esa parte del programa, te encontrarás que esas líneas no hacen eso.

Observa el siquiente código:

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.    int a[4][6], vecrenglon[6]={0}, veccolumna[4]={0};
  5.    int i,j;
  6.  
  7.    for(i=0;i<4;i++){
  8.       for(j=0;j<6;j++){
  9.          printf("Ingresa cada valor de la matriz %d,%d: ",i+1,j+1);
  10.          scanf("%d", &a[i][j]);
  11.       }
  12.    }
  13.    printf("\nMatriz final:\n\n");
  14.    //Ciclo de impresion de la matriz dada
  15.     for(i=0;i<4;i++){
  16.           for(j=0;j<6;j++){
  17.                 printf("%d\t",a[i][j]);
  18.           }
  19.           printf("\n");
  20.     }
  21.     system("pause");
  22.    return 0;
  23. }

Por un lado, verás que en los primeros dos ciclos for anidados, el primero se utiliza para moverse en las columnas (de arriba para abajo). Al ejecutarse una sola vez este for, abrás cargado 1 renglón. El segundo for hace referencia a las columnas.

Por otro lado, observa que al momento de leer, yo he utilizado las dos variables: i y j.En tu caso, vos sólo utilizaste la j.

Como ejemplo te muestro la siguiente ejecución de esa parte del código:

Ingresa cada valor de la matriz 1,1: 1
Ingresa cada valor de la matriz 1,2: 1
Ingresa cada valor de la matriz 1,3: 1
Ingresa cada valor de la matriz 1,4: 1
Ingresa cada valor de la matriz 1,5: 1
Ingresa cada valor de la matriz 1,6: 1
Ingresa cada valor de la matriz 2,1: 2
Ingresa cada valor de la matriz 2,2: 2
Ingresa cada valor de la matriz 2,3: 2
Ingresa cada valor de la matriz 2,4: 2
Ingresa cada valor de la matriz 2,5: 2
Ingresa cada valor de la matriz 2,6: 2
Ingresa cada valor de la matriz 3,1: 3
Ingresa cada valor de la matriz 3,2: 3
Ingresa cada valor de la matriz 3,3: 3
Ingresa cada valor de la matriz 3,4: 3
Ingresa cada valor de la matriz 3,5: 3
Ingresa cada valor de la matriz 3,6: 3
Ingresa cada valor de la matriz 4,1: 4
Ingresa cada valor de la matriz 4,2: 4
Ingresa cada valor de la matriz 4,3: 4
Ingresa cada valor de la matriz 4,4: 4
Ingresa cada valor de la matriz 4,5: 4
Ingresa cada valor de la matriz 4,6: 4

Matriz final:

1       1       1       1       1       1
2       2       2       2       2       2
3       3       3       3       3       3
4       4       4       4       4       4
Presione una tecla para continuar . . .

Tienes que entender bien esta parte antes de continuar.
Saludos
Páginas: 1 [2] 3 4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines