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 - leosansan

#481
Cita de: terrateck en  9 Enero 2014, 04:32 AM
..................................................................

¿Cual sería la manera más optima de crear el array sin desperdiciar memoria?
He pensado que quizá podría contar el número de lineas del fichero y luego volver al comienzo de nuevo. ¿Alguna otra solución?
..............................................


Bien lo que propones o crear array con memoria dinámica y luego con calloc ampliar la memoria si necesitas más.

Saluditos! ..... !!!!       

#482

Antes que nada cuando postees código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

¿A qué te refieres con lo de convertir en un procedimiento?. Perdona pero el madrugón me vuelve torpe. :-\ :-\ :-\


Saluditos! ..... !!!!       
#483
Cita de: dato000 en  7 Enero 2014, 15:08 PM
Pues en tu código lo que esta haciendo es hacer una sumatoria con todos los digitos, no una conversión de cadena a int. De todas maneras sigue, yo también estoy haciendo mi investigación.

Totalmente de acuerdo amigo dato000.

En principio lo que parece es querer usar la cadena a[],


#include <stdio.h>

int main(void){

char a[] = {2,1,4,7,4,8,3,6,4,9};
........................................................
}


donde está el INT_MAX. Lo cual me lleva a la lógica de comparar los dígitos de la cadena número con los de la cadena a[]. ¡Y vaya si funciona!, aunque me ha quedado un poco, como decirlo, poco compacto. Vamos, que lo tendría que mirar mejor para afinarlo, pero menos da una piedra. ;) ;) ;)

Aquí mi propuesta a lo que en principio pareces plantear. Si no es así ya nos lo comunicas:


Código (cpp) [Seleccionar]

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

int main(){
char numero[101] = "",a[] = {2,1,4,7,4,8,3,6,4,7}
;
int ok=0, i=0,flag=0,ch=0;
long long int num=0;
do{
//system("CLS");
ok=0;
printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:",163, INT_MAX);
fflush(stdout);
scanf ("%101[^\n]s",numero);
while((ch = getchar()) != EOF && ch != '\n');
num = atoll (numero);
   if((strlen (numero)>10) ){
       ok=1;
       printf("\nTe has pasado en n%cmero de cifras. \n",163);
       break;
     }
     else if((numero[i] <=47 || numero[i] >=58) ){
       ok=1;
       printf("\n Solo debe ingresar n%cmeros. \n",163);
       break;
     }
     /*else if((num> INT_MAX) ){
       ok=1;
       printf("\n Te has pasado en tama%co.\n",164);
       break;*/
       else {
         for (i=0;numero[i];i++){
           if ((int)(numero[i]-48)<(int)(a[i])){
             printf ("\nEl numero es %s menor que %d \n",numero,INT_MAX);
             flag=1;
             break;
             }
           else if (numero[i]-48==(int)(a[i]) )
             continue;
           else {
             printf ("\nEl numero es %s mayor que %d \n",numero,INT_MAX);
             flag=1;
             ok=1;
             break;
           }
         }
       if (flag==0)
           printf ("\n\nEl numero es %s igual que %d \n",numero,INT_MAX);
       }
   putchar ('\n');
   system ("pause");
}while(ok == 1);
printf("\n %s\n", numero);
return 0;
}


El código, caso da que el número justito tenga diez cifras, diferencia si es menor, mayor o igual al INT_MAx. ;) ;) ;)

¡¡¡¡ Saluditos! ..... !!!!


P.D: Claro que también podemos usar las funciones de la librería string.h, stcmp  o strncmp, pero no tendría tanta gracia.

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

int main(){
char numero[101] = "",ch=0,a[] = {"2147483647"};
int ok=0, i=0,flag=0;
long long int num=0;
do{
//system("CLS");
ok=0;
printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:",163, INT_MAX);
fflush(stdout);
scanf ("%101[^\n]s",numero);
while((ch = getchar()) != EOF && ch != '\n');
num = atoll (numero);
   if((strlen (numero)>10) ){
       ok=1;
       printf("\nTe has pasado en n%cmero de cifras. \n",163);
       break;
     }
     else if((numero[i] <=47 || numero[i] >=58) ){
       ok=1;
       printf("\n Solo debe ingresar n%cmeros. \n",163);
       break;
     }
     else {
       flag=strcmp   (numero,a);
       if (flag==0)
         printf ("\n\nEl numero es %s igual que %d\n ",numero,INT_MAX);
       else if (flag<0)
         printf ("\nEl numero es %s menor que %d \n",numero,INT_MAX);
       else if (flag>0){
         printf ("\nEl numero es %s mayor que %d \n",numero,INT_MAX);
         ok=1;
       }
     }
   putchar ('\n');
   system ("pause");
}while(ok == 1);
printf("\n %s\n", numero);
return 0;
}
#484
Cita de: dato000 en  7 Enero 2014, 13:31 PM
Pues justamente llegue a un punto bastante parecido al del post, y estuve intentando lo de los acentos en C:

printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:", 163, INT_MAX);

Una cosa, esta al reves, primero deberia ir la variable tipo ASCII (163 ---> ù) y luego la que contiene el valor máximo de una variable tipo entera (INT_MAX---> #define INT_MAX 0x7FFF/0x7FFFFFFF ---> 2.247.483.647)

Ahora, lo de los acentos, pues bueno. No me funciono...[/size]
...............................................................................

Curiosamente, a pesar de estar mal ordenados los dos valores, me funcinó. No obstante gracias por la observación, ya lo corregi. Y una muestra de que sí funciona lo de los acentos y la ñ:


;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

¡¡¡¡ Saluditos! ..... !!!!


#485
Cita de: amchacon en  7 Enero 2014, 11:51 AM
.......................................................................
Si es mayor de 2.247.483.648 pero menor que 3 mil millones, entonces al pasarlo a entero desbordará y se quedará negativo.

Me he levantado, muy de madrugada, y estoy "pijito". ;)

Esta vez te sobra en la frase lo de "pero menor que 3 mil millones". Es suficiente que sea mayor de 2.247.483.647, y digo bien mayor que no igual, para que se produzca desbordamiento.

Lo dicho, estoy "pijito". ;)

Un fuerte abrazo y que en este año, y los venideros, te sean favorables los hados.  :rolleyes: :rolleyes: :rolleyes:

¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:

P.D. Por cierto, yo el código lo tengo bien indentado:


pero al hacer el pegado entre las etiquetas code no sé que pasa que los distorsiona. ¡¡¡Horror!!!,espero que no se trate de un mal augurio, lo que me faltaba.  :huh: :huh: :huh:
#486
Como es mi costumbre, sin tratar de modificar en exceso el código que planteas, hago una simple comparación entre la variable num, convertida a long long int, con INT_MAX, suponiendo que lo que se trata es de un INT positivo, si no coméntalo.

¿Y por qué uso el tipo long long int?. Porque si uso el tipo INT para num, si introduzco un número de 10 cifras, pero mayor que INT_MAX por ser mayor a ese límite, tomaría un valor basura y la comparación no sería correcta. Simple pero efectivo. ;) ;) ;)


Código (cpp) [Seleccionar]

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
int main(){
char numero[101] = "";
int ok=0, i=0,ch=0;
long long int num=0;
do{
system("CLS");
ok=0;
printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:",163, INT_MAX);
fflush(stdout);
scanf ("%101[^\n]s",numero);
num = atoll (numero);
while((ch = getchar()) != EOF && ch != '\n');
for(i=0;numero[i]; i++){
if((strlen (numero)>10) ){
ok=1;
printf("\nTe has pasado en n%cmero de cifras. \n",163);
break;
}
else if((numero[i] <=47 || numero[i] >=58) ){
ok=1;
printf("\n Solo debes ingresar n%cmeros. \n",163);
break;
}
else if((num> INT_MAX) ){
ok=1;
printf("\n Te has pasado en tama%co.\n",164);
break;
}
     }
   system ("pause");
}while(ok == 1);
printf("\n %s\n", numero);
return 0;
}


Por cierto, los números que aparecen al final de los printf son los códigos ASCII par poder ver en pantalla la ñ y los acentos :rolleyes: :rolleyes: :rolleyes:.

¡¡¡¡ Saluditos! ..... !!!!


:rolleyes: ;) ;) ;) :rolleyes:

P.D:

Cita de: amchacon en  6 Enero 2014, 23:41 PM
...........................................
- Si el número tiene 10 cifras y la primera cifra es 3 o más, entonces cabe.
.....................................

Te despistaste, no cabe.

#487
Cita de: SoyelRobert en  6 Enero 2014, 14:31 PM
...........................................................................
Una duda que me ha surgido ahora al leer tu codigo es que en todas las printfs hay al final un 163 0 un 162 que no se para que sirven. :-X
..................................................

Son los códigos ASCII de los acentos implicados, si los pones directamente en el código salen símbolos raros, para eso está el ASCII. Googlea sobre códigos ASCII versión extendida y amplia tus conocimientos. Por cierto, existe otra forma abreviada de ponerlos usando el modo hexadecimal, tipo \xA4 y cosas así. Lo dicho, googlea un poco sobre ese tema.

Y de nada, para eso estamos.


¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:
#488
Cita de: alexandra.vargas en  6 Enero 2014, 03:21 AM
ayudame tu!!!

¡¡¡Y encima con esas!!!

¿Y un cafetito también no se te apetece?

Perdona, igual no lo sabes por no haberte leído las reglas del foro: no se hacen tareas desde cero, sólo se resuelven dudas sobre un código que previamente has tenido que hacer tú. ¿Lo pillas?.

:rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:

Y para cuando postees el código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

¡¡¡¡ Saluditos! ..... !!!!



#489
Antes que nada un par de detallitos:

* la función main es de tipo int, así lo establece el estándar del C, y por tanto hay que declararla como tal, con su consiguiente return al final de la misma.

* tienes que acostumbrarte a indentar y/o sangrar y/o tabular el código, si no es casi imposible seguirlo.

Respecto al código:

* hay que poner printf o puts antes de la introducción de datos, si no queda la pantalla parpadeando y quien vaya a usarlo y no sepa de que va se quedará muy, pero que muy, mosqueado. ;) ;) ;)

* tal como lo tienes faltaría un break en el if  de la función, sin el else,  si no no sale del bucle y se queda la pantalla como si no ocurriera nada.

* no hay mayor problema con el segundo while de la función main, salvo que está de más y te complica todo el código.

* un error frecuente en este  tipo de ejercicios es que haces uso de una variable aplicándole una operación, tipo "num/=10" y pasa  lo que pasa, que al volver a querer usar esa variable con su valor original ya no es el valor actual, de ahí que yo use num y num_0 para no perder el valor inicial por si te hiciera falta, que efectivamente te va a hacer falta.

* debes habituarte a poner printf, tantos como sean necesarios, para ver como evolucionan las variables a lo largo del código. En tu caso es conveniente que pongas un printf justo antes del último if de la función y veras que sorpresa te llevas con los valores de suma y cont. No paran  de salir distintos valores  para cada una de las variables y, curiosamente el valor de la variable "cont" siempre vale dos. Hazlo y piensa en el por qué.

* no tiene como mucho sentido un for y que dentro de su cuerpo de sentencias lo que aparezca sea un if, con su condición correspondiente. Te puedes ahorrar el if poniendo la condición entre los dos puntos y coma del for, que para eso está.

Y me dejo de rollo. He aquí una salida al código que te propongo:

Citar

Introduzca un número:2411 135 20305 111 15 22 69 102 12356 68259 0

 2411 cumple la condición
  135  no cumple la condición
20305 cumple la condición
  111 cumple la condición
   15  no cumple la condición
   22 cumple la condición
   69  no cumple la condición
  102 cumple la condición
12356  no cumple la condición
68259 cumple la condición


He cambiado, además de quitar el segundo while que está en main, sencillamente estaba de más, la forma de calcular el número de dígitos o cifras del número y la forma de obtener la primera cifra; no hacía falta el uso de la función pow y,por ende, de la librería math,h. también te cambié la forma de obtener la suma, la que tenías puesta no había por donde cogerla.  ;) ;) ;)

Y ya está bien de rollo, ya te dejo con el código. Si tienes dudas ya sabes donde estamos y enhorabuena por el curro que te has pegado. Aunque el código es cortito no deja de ser denso y/o espeso, especialmente esa forma tan peculiar de introducir los datos. ;) ;) ;)


Código (cpp) [Seleccionar]

/*
Imprimir los N primeros numeros de una secuencia separados
por un espacio y terminado en cero y comprobar que la
 primera cifra por el numero total de digitos sea igual
 a la suma de los digitos.
*/
#include <stdio.h>
#define N 5

int funcion(int num);

int main()
{
   int i,y,num, contmain=0,num_0;
   printf ("Introduzca un n%cmero:",163);
   fflush (stdout);
   while((scanf("%d", &num) && num!= 0)!=0)
       {
           num_0=num;
           if(funcion(num)==1)
               {
                   contmain ++;
                   printf("\n%6d cumple la condici%cn", num_0,162);
                   fflush (stdout);
               }
           else if(funcion(num)==0)
               {
                   contmain ++;
                   printf("\n%6d  no cumple la condici%cn", num_0,162);
                   fflush (stdout);
               }
       }
   if (contmain<N)
   {
       printf("\nSe han introducido %d n%cmeros que cumplen la condicion", contmain,163);
       fflush (stdout);
   }
       
   return 0;
}


int funcion(int num)
{
   int i,sum_dig=0,num_0,num_1,n_cifras=0;
   num_0=num_1=num;
   int primeracifra;
   for(i=10;num_0/i!=0;i*=10)//obtengo cifras de cada numero
       n_cifras++;
   while (num!=0)  //
       {
           sum_dig+=(num%10); //para sacar el ultimo digito del numero
           num=num/10; //elimina el ultimo digito de numero
       }
   for (i=1;num_1>=10;i--) //obtengo primera cifra
       num_1/=10;
   primeracifra=num_1;
   if(primeracifra*(n_cifras+1)==sum_dig)
       return 1; //si se cumple la condicion retorna 1
   else
       return 0;
}

#490

¡¡¡Sorry, muchos sorry!!!

¡¡¡¡ Saluditos! ..... !!!!