• Viernes 8 de Noviembre de 2024, 20:08

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - NICOLASBLUES

Páginas: [1]
1
C/C++ / Re: el poco Recomendable scanf !!
« en: Jueves 20 de Mayo de 2010, 23:18 »
Hola

STDIN, como su nombre lo indica, significa 'Standard input'. Es decir, el ingreso por teclado.

Acorde al Standard, fflush espera solamente un stream de salida (STDOUT: 'Standard Output) por lo que el comportamiento con streams de entrada como STDIN es indefinido. Por mas que en algunas plataformas funcione, o que en algunos compiladores funcione, no deberia ser utilizado.

Por el otro lado, para evitar esas pausas fastidiosas es necesario evitar las funciones que dejan basura por doquier (como scanf();) y utilizar funciones como la ya mencionada fgets();

gracias por comentar

Saludos Cordiales

2
C/C++ / Re: Truncar teclas C Linux
« en: Domingo 16 de Mayo de 2010, 19:11 »
Gracias por responder no es exactamente lo que buscaba pero se acerca bastante, enverdad lo que buscaba es truncar ciertas teclas osea digamos que pido que se ingrese un numero la idea seria truncar todo los caracteres que no sean números con esta nueva info se me ocurre que puedo usar getch
no se bien como funciona pero si esta función devuelve el carácter ingresado podría hacer una verificación si es el carácter esperado ingresarlo donde corresponda sino que siga intentando lo voy a probar ahora...


GRACIAS!!


Saludos Cordiales...

3
C/C++ / el poco Recomendable scanf !!
« en: Sábado 15 de Mayo de 2010, 23:26 »
Hola Gente!!

SI NO OS INTERESA EL PORQUE DE NO USARLO PUDEN PASAR AL FINAL QUE SE EXPLICA COMO SUPLANTARLO

Hoy explico  porque el uso de scanf no es recomendable..
para empesar es un error decir que un programa lee del teclado en verdad lo que hace es leer de un area de memoria llamado "buffer de teclado"  y el buffer del teclado es "buffer de linea" esto quiere decir  que los datos que provienen del teclado se insertan linea por linea y no caracter a caracter . Es por eso que cuando leemos de ahí, por más que ingresemos muchos caracteres, hasta que no ingresamos el fin de línea (enter) el programa no lee nada y se queda trabado esperando que haya algo en el buffer.

si el buffer no está vacío, sí o sí hay al menos un fin de línea;
el buffer siempre tiene un carácter de fin de línea al final.

El gran problema con scanf es que no siempre leerá el fin de linea lo que nos lleva a que el buffer quede con basura, osea con caracteres no leídos los cuales la próxima vez que invoquemos a scanf los leerá de mas esta decir que esto podría causar algunos problemas al programador.
scanf solo lee hasta que encuentre el formato que le especificamos, esto conlleva a otro gran problema ya que si nosotros le decimos que lea un entero (%i") y nosotros ingresamos 2 enteros separados por un espacio scanf solo leerá hasta encontrar el formato especificado dejando al buffer sucio con ese entero de mas
Otro problema que tenemos es que no hace ningún tipo de chequeo a la hora de verificar los datos ingresados si se le indica que se ingresara un entero y el usuario ingresa una letra esté hace una conversión a entero lo cual genera un problema.


por estas razones no es recomendable usarlo siempre se puede suplantar con algo que no ensucie el buffer para eso utilsaremos sscanf y fgets :

Código: C
  1.  
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6.    char nombre[20]="", entrada[81]="";
  7.    unsigned int edad=0;
  8.  
  9.    printf( "Escriba su nombre y edad, separados por un espacio:n" );
  10.    fgets(entrada, 20, stdin ); //llenamos el buffer reservando 20 caracteres y stdin es la entrada standar
  11.    sscanf( entrada, "%s %u", nombre, &edad ); //con sscanf introducimos lo que tenemos en el buffer tanto en nombre como en edad    
  12.  
  13.    printf( "Has escrito: %sn", entrada ); //lo que tenemos en el buffer
  14.    printf( "Nombre: %s. Edad: %dn", nombre, edad ); //
  15.  
  16.  

El único inconveniente que tendremos con fgets es que como bien dice
Sorancio es que si nosotros ingresamos menos caracteres los que le indicamos en el segundo parámetro inserta un fin de linea en la cadena esto representa un pequeño inconveniente con el cual lidiar pero se podría de la siguiente manera:
 
Código: C
  1. if (letra2[strlen(letra2)-1]=='n')
  2.  letra2[strlen(letra2)-1]='';
  3.  


lo cual también representa una alternativa para gets la cual no tiene control interno y provoca muchas veces problemas inesperados.



bueno eso es todo...

Saludos Cordiales

4
C/C++ / Re: No me deja leer del fichero.
« en: Sábado 15 de Mayo de 2010, 22:15 »
yo lo probé y anda joya tuve un problema con el switch pero como tengo linux no tengo "getch"  fijate si el nombre del archivo esta perfectamente bien escrito por ahi en la carpeta lo tenes como "fichero.txt" ,osea , sin sin la "t" mayuscula  , otra cosa que esta mal es cuando contas los espacios en el la comparacion del "if" solomente pones un solo "=" y termina contando 30 espacios...



Saludos Cordiales. El Nico

5
C/C++ / Re: codigo erroneo en C al resolver un problema
« en: Viernes 14 de Mayo de 2010, 17:06 »
Hola


bien para empesar estas declarando la funcion dentro de la main tambien cuando haces la suma en vez de llamar a la matriz a[][] la llamas m[][] pero "m" es el nombre de la funcion :

Código: C
  1.  
  2. void m(int a[3][3])
  3. {
  4.  
  5.     int suma = 0;
  6.     int i, j;
  7.  
  8.  
  9.     for(i=0;i<3;i++)
  10.     {
  11.         for( j=0;j<3;j++)
  12.         {
  13.             suma += a[i][j];
  14.         }
  15.     }
  16.  
  17.  
  18.     printf("la suma es : %i",suma);
  19.  
  20. }
  21.  
  22.  

6
C/C++ / Truncar teclas C Linux
« en: Jueves 13 de Mayo de 2010, 03:44 »
Hola a todos!!

bueno tengo una pequeña duda estaba pensando en que si hay alguna manera de poder truncar o bloquear las teclas cuando se pide que se igresen datos, me explico, supongamos que se pide que se ingrese una cadena y a la hora de teclear por ejemplo la etra "n", nisiquiera se imprima en pantalla cuando la presiono... se que deve haber  alguna manera con directivas o algo asi
yo me imagino que puede ser revisando primero las letras que uno presiona con una funcion como getchar o algo asi pero no se me ocurre del todo como implementarlo
bueno espero que puedan ayudarme

os dejo Saludos.......
  

7
Cobol / porque se sigue usando cobol ¿?¿
« en: Martes 11 de Mayo de 2010, 19:37 »
por mas que me lo pregunte no entiendo porque se sigue usando cobol no conosco muchos lenguajes pero los poco que uso son 10.000 veces mucho mas legibles que este lenguaje
y por eso la gran pregunta.. porque se sigue usando?? no hay lenguajes mejores a la hora de tratar la parte contable???
o simplemente si los hay pero se sigue usando por el simple echo de quienes tienen un sistema echo en cobol les es mucho mas rentable seguir con ese sistema que renovarlo por completo???

8
Pascal / Re: secuencias ordenadas pascal URGE!!!
« en: Martes 11 de Mayo de 2010, 19:29 »
postia el codigo que tengas echo

9
C/C++ / Re: duda
« en: Lunes 10 de Mayo de 2010, 18:37 »
:S no seria 3 4 1 ???

10
C/C++ / Problema!! matriz Dinamica!!. C
« en: Lunes 10 de Mayo de 2010, 18:13 »
Hola gente!!!

bueno les cuento que estoy ante un gran dilema esto es asi:

mediante una matriz estatica de enteros de 20 x 20 hay que generar dinamicamente otra matriz cuyos elementos son todos aquellos que son unicos en la matriz estatica de 20 x 20, es decir si en la matriz estatica tenemos:
 pos[0][0]=1  
 pos[0][1]=1
 pos[0][2]=23

en la dinamica tendremos pos[0][0]=23

ya que 23 es unico en la matriz


el algoritmo responde bien hace exactamente eso pero me quedo muy confuso si alguien purde sugerir alguna manera de arreglarlo o de encararlo por otro lado seria grandioso !!


 
Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. void gen_matriz (int** nuevo, int matriz[20] [20])
  7.  
  8. {
  9.     int j, k, y;
  10.     int dup;
  11.     int num_elem[20];      
  12.  
  13.     nuevo = (int**) calloc(20, sizeof(int*));
  14.  
  15.  
  16.     for (y = 0; y < 20; y++)
  17.     {      
  18.         num_elem[y] = 0;
  19.  
  20.         for (k = 0; k < 20; k++)
  21.         {
  22.             dup = 0;
  23.             j = 0;      
  24.             while ((j < 20) && !dup)    
  25.             {          
  26.  
  27.               if (k != j)
  28.               {
  29.                 dup = matriz[y][k] == matriz[y][j];            
  30.                 printf ("y=%i %i %in",y, j, dup);
  31.               }
  32.               j++;
  33.             }
  34.             printf ("dup %in", dup);
  35.             if (!dup)
  36.             {                        
  37.  
  38.                 num_elem[y]++;
  39.                 if (nuevo[y] == NULL)
  40.                   nuevo[y] = (int*) malloc(sizeof (int));
  41.                 else
  42.                   nuevo[y] = (int*) realloc(nuevo[y], num_elem[y] * sizeof (int));
  43.  
  44.                 int indice = num_elem[y] - 1;                  
  45.                 nuevo[y][indice] = matriz[y][k];                
  46.                 printf (" posicion %i %i : %in", y, k, nuevo [y] [indice]);                    
  47.  
  48.             }      
  49.         }  
  50.  
  51.     }
  52.  
  53.     for(y = 0; y < 20; y++)
  54.         for(k = 0; k < num_elem[y]; k++)
  55.             printf("nuevo[%i][%i] = %in", y, k, nuevo[y][k]);
  56. }
  57.  
  58.  

   
esta un poco desprolijo espero que se entienda

espero que me puedan ayudar saludos!!!

Páginas: [1]