| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
daniloarg007
Registrado: 21 Jun 2014 Mensajes: 2
| Publicado: 21/06/2014 7:47 pm | | | Título: Consultas |
| Tengo las siguientes preguntas para resolver. Alguien podría darme una mano, es un trabajo practico, tiene unas 20 preguntas pero las siguientes las tengo en duda. Gracias
- En las variables Pablo, Luis y Pedro, se encuentra almacenada la fecha de nacimiento de cada uno como aaammdd. Agregar el código necesario en C para que la variable PersMasGrande quede con la fecha de nacimiento de la persona mas grande. Es correcto definir a PersMasGrande como int?
int PersMasGrande Char Pablo[9]=19730520 Char Pedro[9]=19810612 Char Luis[9]=19781217
Para mi PersMasGrande debe ser Char de 9 igual que las otras tres. Y el código que yo propongo es
if Pablo[9] > Pedro[9] Then if Pablo[9] > Luis[9] then PersMasGrande[9] = Pablo[9] else PersMasGrande[9] = Luis[9] else if Pedro[9] > Luis[9] then PersMasGrande[9] = Pedro[9] else PersMasGrande[9] = Luis[9]
Pero no estoy seguro, porque creo que las variables Pablo, Pedro y Luis al ser char no puedo operar con ellas haciendo comparaciones sumas y restas, entonces en caso de ser asi, debería hacer un atoi de esas variables para que sean int y ahí si que seria correcto que PersMasGrande sea int, y recién ahí operar como lo hice en el código anterior, pero ya siendo todas int.
La otra pregunta es la siguiente
- Luego de ejecutar el siguiente código que queda en Val2?? int val1=48 int val2
val2=val1<<4
Creo que en Val2 lo que me quedaría seria 80 no?
Ultima consulta Tengo las variables siguientes int valor=24 int unidad int decena
Hacer un código que ponga en unidad el 4 de la variable valor, y en decena el 2 de la variable valor, no pudiendo usar / ni % ni <<
espero puedan ayudarme.
Gracias!! |
| | Volver arriba | |  | dehm
Registrado: 29 Abr 2011 Mensajes: 139
| Publicado: 22/06/2014 5:40 am | | | Título: |
| Una cosa:
Estas variables de arrays de nombre son como las has puesto o son así: char Pablo[9]="19730520"; (entrecomilladas)
La variable que guardará la fecha mas grande habrá de ser tambien char PersMasGrande [9], para poder ir almacenando los 8 valores que conforman la fecha, y dejar un espacio para almacenar el '\0' de fin de cadena. Deberás plantear un bucle desde 0 hasta 7 inclusive, y vas comparando los valores de Pedro[0], Pablo[0] y Luis [0], incorporando el valor mayor a PersMasGrande[0]. Luego haces igual con el resto de índices. Cuando salgas del bucle, no te olvides de añadir a PersMasGrande[8] el valor '\0' y ya tendrás formada la cadena con los valores que quieres.
Respecto al segundo punto, creo que no. El operador << te multiplica *2 tantas veces como marca el segundo operando. Entonces la expresión val2=val1<<4 es equivalente a val2=48*2*2*2*2
La última cuestión me ha pillado en blanco.  _________________ Aprendiendo |
| | Volver arriba | |  | dehm
Registrado: 29 Abr 2011 Mensajes: 139
| Publicado: 22/06/2014 7:17 am | | | Título: |
| Espera, lo que puse en el otro mensaje no es correcto.
De la forma que te dije, teniendo los valores que has puesto char Pablo[9]=19730520 char Pedro[9]=19810612 char Luis[9]=19781217
Se guardaría el valor char PersMasGrande[9]=19813227 que serían los valores mas altos de las fechas anteriores, pero entiendo que tú quieres conseguir: char PersMasGrande[9]=19810612, es decir, la fecha del mayor de los 3.
Lo siento por la respuesta equivocada _________________ Aprendiendo |
| | Volver arriba | |  | | _Leo_
Registrado: 20 Oct 2005 Mensajes: 399 Ubicación: Buenos Aires, Argentina
| Publicado: 22/06/2014 7:36 am | | | Título: |
| La forma más adecuada es utilizando la biblioteca estándar de C
| Código: | #include <stdio.h> #include <string.h>
int main(int argc, char ** argv) { char Pablo[9] = "19730520"; char Pedro[9] = "19810612"; char Luis[9] = "19781217"; char mayor[9];
if (strcmp(Pablo, Pedro) < 0) { // Pablo < Pedro if (strcmp(Pedro, Luis) < 0) { // Pedro < Luis strcpy(mayor, Luis); } else { // Pedro > Luis strcpy(mayor, Pedro); } } else { // Pablo > Pedro if (strcmp(Pablo, Luis) < 0) { // Pablo < Luis strcpy(mayor, Luis); } else { // Pablo > Luis strcpy(mayor, Pablo); } }
printf("La fecha mayor es %s\n", mayor);
return 0; }
|
_________________ _Leo_ Daphne - administrador de tareas Cine, tecnología, sociedad |
| | Volver arriba | |  | _Leo_
Registrado: 20 Oct 2005 Mensajes: 399 Ubicación: Buenos Aires, Argentina
| Publicado: 22/06/2014 7:47 am | | | Título: |
| Pero como usualmente en los trabajos prácticos esperan que utilices tus propios algoritmos (dependiendo del nivel del curso):
| Código: | #include <stdio.h> #include <string.h>
int esMenorQue(const char * menor, const char * mayor);
int main(int argc, char ** argv) { char Pablo[9] = "19730520"; char Pedro[9] = "19810612"; char Luis[9] = "19781217"; char mayor[9];
if (esMenorQue(Pablo, Pedro)) { // Pablo < Pedro if (esMenorQue(Pedro, Luis)) { // Pedro < Luis strcpy(mayor, Luis); } else { // Pedro > Luis strcpy(mayor, Pedro); } } else { // Pablo > Pedro if (esMenorQue(Pablo, Luis)) { // Pablo < Luis strcpy(mayor, Luis); } else { // Pablo > Luis strcpy(mayor, Pablo); } }
printf("La fecha mayor es %s\n", mayor); return 0; }
int esMenorQue(const char * menor, const char * mayor) {
// Recorro las cadenas while(*menor && *mayor) { // Comparo los dígitos if (*menor < *mayor) return 1; // Si hay un dígito menor, termino else if (*menor > *mayor) return 0; // Si hay uno mayor, también ++menor; ++mayor; }
// Si llegó acá es que son iguales return 0; }
|
Acá usé una función propia para compara las cadenas. Las fechas ordenadas AAAAMMDD son prácticas porque se pueden comparar numéricamente o como cadenas. Y guarda relación con el orden de la fecha. Así que una opción es comparar dígito por dígito entre dos fechas. Si aparece un dígito menor, la fecha es menor. Lo mismo si aparece un dígito mayor. Y si no ocurre ninguna de las dos cosas, son fechas iguales. _________________ _Leo_ Daphne - administrador de tareas Cine, tecnología, sociedad |
| | Volver arriba | |  | daniloarg007
Registrado: 21 Jun 2014 Mensajes: 2
| Publicado: 22/06/2014 11:45 am | | | Título: |
| Grascias por las respuestas y la ayuda. Consultas entonces.
- En las variables Pablo, Luis y Pedro, se encuentra almacenada la fecha de nacimiento de cada uno como aaammdd. Agregar el código necesario en C para que la variable PersMasGrande quede con la fecha de nacimiento de la persona mas grande. Es correcto definir a PersMasGrande como int? int PersMasGrande Char Pablo[9]=19730520 Char Pedro[9]=19810612 Char Luis[9]=19781217
Respecto a esta primera pregunta, me quedo mas claro lo del codigo, entonces es incorrecto definir a PersMasGrande como int no?????????
REspecto a la segunda pregunta:
- Luego de ejecutar el siguiente código que queda en Val2?? int val1=48 int val2
val2=val1<<4
No me quedo claro la respuesta. Es correcto lo que yo creo, que lo que se hace es un desplazamiento a la izquierda de 4 lugares por lo cual el 4 se puerte, queda el 8 en el nible altro y en el bajo se completa con ceros????????????????????????????????????????????????????????????????
La ultima pregunta: -Tengo las variables siguientes int valor=24 int unidad int decena Hacer un código que ponga en unidad el 4 de la variable valor, y en decena el 2 de la variable valor, no pudiendo usar / ni % ni <<
No veo que haya comentarios, o no los vi yo. Se le ocurre como poder hacerlo sin unsar esos operandos indicados??????????????????????????
GRACIAS!!!![/b] |
| | Volver arriba | |  | | dehm
Registrado: 29 Abr 2011 Mensajes: 139
| Publicado: 22/06/2014 1:12 pm | | | Título: |
| Bueno, la primera consulta creo que ha quedado más que clara  El valor mayor has de guardarlo en un array de char de 9 elementos.
Sobre los segundo, es cuestión de ver cómo es el número decimal, en binario, y que pasa si el número binario se desplaza. El número 48 es este binario (representado en 2 bytes): 00000000 00110000 //48 0x32768+0x16384+0x8192+0x4096+0x2048+0x1024+0x512+0x256+0x128+0x64+1x32+1x16+0x8+0x4+0x2+0x1=48
Si ahora lo desplazas 4 posiciones a la izquierda:
00000011 00000000 0x32768+0x16384+0x8192+0x4096+0x2048+0x1024+1x512+1x256 +0x128+0x64+0x32+0x16+0x8+0x4+0x2+0x1 = 768
Que es como hacer 48*2*2*2*2=768
Sobre la tercera cuestión....sigo estando en blanco  _________________ Aprendiendo |
| | Volver arriba | |  | _Leo_
Registrado: 20 Oct 2005 Mensajes: 399 Ubicación: Buenos Aires, Argentina
| Publicado: 22/06/2014 2:01 pm | | | Título: |
| Con respecto a la primera, lo más lógico es guardar el valor en una cadena, porque las variables originales son cadenas. A menos que decidieras empezar convirtiendo las fechas originales en números enteros y luego hacer la comparación numérica. Aunque en efecto ese código sería más rápido (porque es más fácil para la computadora comparar números enteros que cadenas de 9 bytes), no creo que sea lo que tu profesor espera.
Con respecto a la 2, la respuesta de dehm es muy clara.
Y la última es un poco extraña, ya que no te permite usar las operaciones más lógicas para resolverla. Supongo que quien redactó el enunciado tenía problemas de imaginación. Y supongo también que pretende que usés cadenas para resolverlo.
| Código: | #include <stdio.h>
int main(int argc, char ** argv) { int valor = 24; int unidad, decena; char str_valor[3]; // Sólo para dos dígitos itoa(valor, str_valor, 10); unidad = atoi(str_valor+1); str_valor[1] = 0; decena = atoi(str_valor); printf("Decena %d, unidad %d\n", decena, unidad); return 0; } |
Básicamente convertimos el número en cadena con itoa() y luego usamos (str_valor+1) que sería un puntero a la cadena comenzando en el segundo lugar (es decir en la unidad). Y finalmente pisamos la unidad en la cadena con un NULL para cortar la cadena justo después de la decena. En ambos casos convertimos a entero de nuevo con atoi().
NOTA: La cadena tiene tamaño justo para números de dos cifras. _________________ _Leo_ Daphne - administrador de tareas Cine, tecnología, sociedad |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |