/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Consultas

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
daniloarg007



Registrado: 21 Jun 2014
Mensajes: 2

MensajePublicado: 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

MensajePublicado: 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. Wink
_________________
Aprendiendo
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 139

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 22/06/2014 1:12 pm
Título:

Bueno, la primera consulta creo que ha quedado más que clara Wink
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 Wink
_________________
Aprendiendo
Volver arriba
_Leo_



Registrado: 20 Oct 2005
Mensajes: 399
Ubicación: Buenos Aires, Argentina

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com