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ú

Temas - jamatbar

#1
Buenas tengo el siguiente ejercicio:

Implementa una lista interactiva a través de flechas que permita mover los elementos hacia arriba y hacia abajo.

https://ibb.co/10dDKqS

Descarga los ficheros proporcionados en esta carpeta compartida de Google Drive e implementa las funciones descritas en el fichero JS.

Consideraciones:

Los ficheros HTML y CSS no deben modificarse.
Antes de empezar a escribir código javascript, analiza la estructura del documento HTML, cómo están formados los elementos de la lista y las clases que utilizan.

-----------------------------------------
Basicamente son 5 elementos li que hay que mover arriba y abajo con la particularidad de que el primer y ultimo elemento tienen los botones de arriba o abajo deshabilitados, y esa ultima parte es la que no consigo.

Yo tengo lo siguiente:

Código (javascript) [Seleccionar]
window.onload = function()
{
/**
* 1. Obtén todos los elementos li como una HTMLCollection dinámica en la
* constante "oElementosLi". [0,5 puntos]
*/
const oElementosLi = document.getElementsByTagName("li");

/**
* 2. Obtén una NodeList estática con todas las flechas (elementos span que
* contienen la clase "flechaArriba" y "flechaAbajo") en la constante
* "oFlechas". [0,75 puntos]
*/
const oFlechas = document.querySelectorAll('span.flechaArriba, span.flechaAbajo');


/**
* 3. Añade un manejador del evento click a cada flecha usando la NodeList
* "oFlechas", un bucle "forEach" y la notación flecha. Al hacer click en
* una flecha se debe llamar a la función "actualizarLista". [1,75 puntos]
*/

oFlechas.forEach(oFlecha => {
    oFlecha.addEventListener("click", actualizarLista);
});

/**
* 4. Implementa la función "actualizarLista" para que:

*  -Intercambie el elemento li sobre el que se ha hecho click con su hermano
*  anterior o posterior dependiendo si se ha pulsado la flecha arriba o
*  abajo. Pulsar la flecha arriba en el primer elemento o la flecha abajo en
*  el último no realizará ninguna operación. Utiliza la función
*  "insertAdjacentElement" y las referencias "parentNode", previousElementSibling"
*  y "nextElementSibling". [4 puntos]
*
*  -Elimine la clase "flechaDeshabilitada" de los elementos que la contengan
*  y la añada a la flecha arriba del primer elemento y a la flecha abajo del
*  último elemento. [3 puntos]
*/
function actualizarLista(event) {
    const oFlecha = event.target;
    const oFlechaActual = oFlecha.parentNode;
    const oFlechaAnterior = oFlechaActual.previousElementSibling;
    const oFlechaSiguiente = oFlechaActual.nextElementSibling;

    oFlechas.forEach((oFlecha) => {
        if (oFlecha.classList.contains("flechaDeshabilitada")) {
        oFlecha.classList.remove("flechaDeshabilitada");
        }
        });

    if(oFlecha.className == "flechaArriba"){
        oFlechaAnterior.insertAdjacentElement("beforebegin", oFlechaActual);
    }else if(oFlecha.className == "flechaAbajo"){
        oFlechaSiguiente.insertAdjacentElement("afterend", oFlechaActual);
    }
}
}


Esta es la estructura HTML:

Código (html4strict) [Seleccionar]
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="style.css">
  <title>Lista interactiva</title>
</head>
<body>
  <h1>Lista interactiva</h1>
  <ul>
    <li>
      <span class="flechaArriba flechaDeshabilitada"></span>
      <span class="flechaAbajo"></span>
      <span class="texto">Texto colocado inicialmente en la posición 1.</span>
    </li>
    <li>
      <span class="flechaArriba"></span>
      <span class="flechaAbajo"></span>
      <span class="texto">Texto colocado inicialmente en la posición 2.</span>
    </li>
    <li>
      <span class="flechaArriba"></span>
      <span class="flechaAbajo"></span>
      <span class="texto">Texto colocado inicialmente en la posición 3.</span>
    </li>
    <li>
      <span class="flechaArriba"></span>
      <span class="flechaAbajo"></span>
      <span class="texto">Texto colocado inicialmente en la posición 4.</span>
    </li>
    <li>
      <span class="flechaArriba"></span>
      <span class="flechaAbajo flechaDeshabilitada"></span>
      <span class="texto">Texto colocado inicialmente en la posición 5.</span>
    </li>
  </ul>
  <script type="text/javascript" src="index.js"></script>
</body>
</html>


¿Alguien sabría explicarme como poner la clase deshabilitada en el primer y ultimo elemento?

Muchísimas gracias de antemano!
#2
PHP / Sacar dato de una select sql en php y html
21 Noviembre 2020, 08:41 AM
Buenas, tengo una tabla con un dato que quiero sacarlo por un option de html para seleccionarlo y eliminarlo posteriormente, pero no consigo sacar dicho dato por el option. Este es mi codigo:

Código (php) [Seleccionar]
echo "<h3>Escoge el dato a eliminar:</h2>";
                    echo "<select name='datoeliminar'>";
                   
                        //Aquí recorremos las tablas para ver los datos en el select
                        $listadodatos = array_column(mysqli_fetch_all($conexion->query("SELECT * FROM $tabla")), 0);
                        for ($i = 0; $i < count($listadodatos); $i++) {
                            $sql = mysqli_query("SELECT `nomconsola` FROM `consolas` WHERE 1");
                            $query = mysqli_query($conexion, $sql) or die (mysqli_error($conexion));
                            while ($row= mysqli_fetch_array($query)){
                                $nombre = $row[0];
                            }
                            echo "<option value='{$listadodatos[$i]}'>$nombre</option>";
                        }
                    $tablaasig = $tabla;
                    echo "</select>";
                    echo "<input name='tablaasig' type='hidden' value='{$tabla}'>";
                    echo "<input type='submit' name='eliminar' value='Eliminar'>";
                    echo "</form>";


Cuando lo ejecuto el campo option me sale una vez y vacío. ¿Alguna ayuda?
#3
Buenas, estoy haciendo una base de datos (videojuegos) con 3 tablas (consolas, estudios y juegos), la tabla juegos tiene dos claves foráneas, una que referencia a consolas y otra a estudios.

Tengo una página en la que conecto con sql y creo las tablas con los siguientes CREATES:

Código (php) [Seleccionar]
$sql2 = "CREATE TABLE IF NOT EXISTS CONSOLAS (NOMCONSOLA VARCHAR(50), ID INT, PRIMARY KEY (NOMCONSOLA))";


Código (php) [Seleccionar]
$sql4 = "CREATE TABLE IF NOT EXISTS ESTUDIOS (NOMESTUDIO VARCHAR(50), ID INT, PRIMARY KEY (NOMESTUDIO))";


Código (php) [Seleccionar]
$sql6 = "CREATE TABLE IF NOT EXISTS JUEGOS ( NOMJUEGO VARCHAR(50) PRIMARY KEY, CONSOLA VARCHAR(50), "
                         . "ESTUDIO VARCHAR(50), CONSTRAINT fk_nombre_consola FOREIGN KEY (consola) REFERENCES consolas "
                         . "(nomconsola) ON DELETE CASCADE, CONSTRAINT fk_nombre_estudio FOREIGN KEY (estudio) REFERENCES "
                         . "estudios (nomestudio) ON DELETE CASCADE)";


Pues bien, el problema viene al querer eliminar una de las tablas (que no sea la tabla juegos). Escribo la siguiente sentencia:

Código (php) [Seleccionar]
if($tablaeliminar == "estudios"){
                        $sql = "ALTER TABLE JUEGOS DROP FOREIGN KEY fk_nombre_estudio; DROP TABLE IF EXISTS ESTUDIOS";
                        if (mysqli_query($conexion, $sql)) {
                            echo "<script>alert('Tabla estudios borrada correctamente');</script>";
                            header("refresh:0; url=administrador.php");
                        } else {
                            echo "Error: " . $sql . "<br>" . mysqli_error($conexion);
                        }
                        mysqli_close($conexion);


Y al intentar ejecutarlo en la web me aparece un fallo en la sql:

Error: ALTER TABLE JUEGOS DROP FOREIGN KEY fk_nombre_estudio; DROP TABLE IF EXISTS ESTUDIOS
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DROP TABLE IF EXISTS ESTUDIOS' at line 1

Lo extraño viene cuando pego esa misma sql sin cambiarla en la linea de comandos de la base de datos de phpmyadmin y me borra la tabla sin problemas.

Me estoy volviendo loco para solucionarlo. ¿Alguna ayuda?

Gracias de antemano y un saludo.
#4
PHP / Duda con PHP y base de datos
28 Octubre 2020, 17:46 PM
Buenas, tengo un par de formularios, uno hace la conexión a la base de datos y otro la desconexión, pero tengo un problema y es que en la desconexión no se "encuentra" los datos para realizarla. Aquí tengo el código:

        <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>" method="POST">
            <label for="equipo">Equipo</label>
            <input type="text" value="Equipo" name="equipo">
            <label for="usuario">Usuario</label>
            <input type="text" value="Usuario" name="usuario">
            <label for="contrasena">Password</label>
            <input type="password" value="Contraseña" name="password">
            <label for="basededatos">Base de datos</label>
            <input type="text" value="Nombre BD" name="bd">
            <input type="submit" value="Conectar" name="conectar">
        </form>
        <br>
        <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'])?>" method="POST">
            <input type="submit" value="Desconectar" name="desconectar">
        </form>
            <?php
            
//Comprobamos que hayamos pulsado el botón Conectar
            
if (isset($_POST['conectar'])) {
                
Conectar($_POST["equipo"], $_POST["usuario"], $_POST["password"], $_POST["bd"]);
                
$conec Conectar($_POST["equipo"], $_POST["usuario"], $_POST["password"], $_POST["bd"]);
 
            }
          
            if (isset(
$_POST['desconectar'])) {
                
Desconectar($conec);
                }

            function 
Conectar($equipo$usuario$password$bd)
            {   
                
//Conectar a BD
                
$conexion mysqli_connect($equipo$usuario$password$bd);

                if (!
$conexion) {
                    die(
"Error de conexión, has introducido algún dato mal");
                } else {
                    echo 
"<script>alert('Te has conectado correctamente a la base de datos {$bd} con el usuario {$usuario}');</script>";
                }
                return 
$conexion;
            }
            
            function 
Desconectar($conec){
                echo 
"<script>alert('El usuario {$_POST["usuario"]} se ha desconectado de la base de datos {$_POST["bd"]}');</script>";
                
mysqli_close($conec);
            }
            
?>


¿Alguna solucion?

Gracias y un saludo
#5
PHP / Duda tonta con ejercicio en PHP
14 Octubre 2020, 15:34 PM
Buenas tengo un problema, necesito un programa que al introducir una frase te la escriba cada caracter con su siguiente, ejemplo:

Hola que tal --> Ipmb rvf ubm

Los espacios los debe dejar igual, y la "z" debe cambiarse por la "a". ahí viene mi problema, ya que no se por que funciona todo salvo este caso, si meto una "z" por cualquier lado me repite la "a" 25 veces (como el abecedario) y no veo el error. Os dejo el código:

<?php

$frase 
$_POST["frase"];

//Creamos el array del abecedario
        
$abecedario = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
       
// $abecedariomayus = array_change_key_case($abecedario, CASEUPPER);
        
$numletras count($abecedario);
        
        
/*for($i=0;$i<$numletras;$i++){
            echo $abecedario[$i] . "<br>";
            echo strtoupper($abecedario[$i]) . "<br>";
        }*/
        
$resultado="";
        for(
$i=0;$i<strlen($frase);$i++){
            for(
$j=0$j<count($abecedario);$j++){
                if(
$frase[$i]=="z"){
                    
$resultado $resultado.$abecedario[0];
                }else if (((
$frase[$i] == $abecedario[$j])) && ($frase[$i] != "z")){
                    
$resultado $resultado.$abecedario[$j+1];
                }else if(
$frase[$i]==" "){
                    
$resultado $resultado." ";
                }
            }
        }
        
        echo 
$resultado;
?>
#6
Android / Problema Xiaomi no sale de fastboot
29 Julio 2020, 08:50 AM
Buenas, ayer se me cayó el móvil con la consiguiente rotura de pantalla, aún así funcionaba perfectamente. Hoy ya no.

Al intentar encender se me queda el logo de Xiaomi con fondo negro eternamente y lo único que puedo hacer es pulsar el bóton "volumen -" y "apagar" para entrar en fastbood, pero de ahí ya no puedo hacer nada.

No me deja entrar en el modo depuración, he intentado usar la aplicación de PC miflash pero también me da error y lo único que quiero es poder recuperar los pocos datos que tengo en la memoria interna.

¿Algún modo?, ¿es posible acceder desde Windows aunque el móvil no pase del logo?

Gracias de antemano y un saludo!
#7
Redes / Duda con práctica con servidor dnsmasq
6 Febrero 2017, 19:28 PM
Buenas me han puesto la siguiente práctica y no sé por dónde cogerla:

https://docs.google.com/document/d/1Afi05MtHln5cnGBg_X8lpJRiRgSHg5JymHXYrfR07DA/mobilebasic

Siempre usamos un cliente con ubuntu 14.04 y un servidor ubuntu server, nos conectamos por ssh al servidor desde el cliente y ya realizamos la práctica.

¿Alguna ayuda? Gracias de antemano

Saludos!
#8
Redes / Problema con IP estática Ubuntu Server
30 Noviembre 2016, 10:15 AM
Estoy intentando poner la siguiente IP estática a mi Ubuntu Server: 192.168.1.053

Para hacerlo abro el archivo interfaces con sudo nano /etc/network/interfaces y escribo lo siguiente:

# Configuración de dirección IP fija para el interfaz eth0
auto enp0s3
iface enp0s3 inet static
address 192.168.1.053
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 8.8.8.8
dns-nameservers 8.8.4.4


Hago un restart a la red con sudo /etc/init.d/networking restart y reinicio la máquina con sudo init 6

Hago un ifconfig y me sale que tengo la IP 192.168.1.43, lo he probado poniendo en el último dígito .052 y me sale la IP 192.168.1.42. La conexión funciona perfectamente haciendo ping.

¿Cuál es el problema?, ¿no puedo poner ese 0 delante?

Muchas gracias de antemano y saludos.
#9
Desarrollo Web / Duda con arrays en javascript
5 Octubre 2016, 23:46 PM
Buenas, quiero un javascript que me pida "x" nombres y los liste luego, el problema es que no sé como crear un array de "x" posiciones, he probado de mil formas y no me sale. Os pongo el código a ver si me podéis ayudar.

Código (javascript) [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ejercicio 7 string</title>
</head>
<body>
<script type="text/javascript">
var arraynombres=new array(10);
var nombre;
var contador=0;
do{

for(var i=0; i<arraynombres.length;i++){
nombre=prompt("Introduce el nombre");
arraynombres[i]= ""+nombre;
contador++;
if(nombre!="ultimo"){
document.write("Nombre: "+arraynombres[i]+ " y se han leído "+contador+" nombres <br>");
}
}
}
while(nombre!="ultimo");
</script>
</body>
</html>


Gracias de antemano y saludos.
#11
Buenas, tengo éste enunciado: .Realizar un programa en JAVA que realice la suma de varios números que se le pasan como argumentos.

El profesor lo ha hecho de ésta forma:

Código ("java") [Seleccionar]
package ejerciciosR2;

public class Ejercicio13 {

public static void main(String[] args) {

int suma = 0;

for(int i = 0;i<args.length;i++){
suma = suma+Integer.parseInt(args[i]);
System.out.println(args[i]);

}
System.out.println(suma);
}

}


En el bucle entiendo que se inicializa una variable índice (i), la comparamos con la longitud del argumento para contabilizar los argumentos que debemos sumar.

Pero, no entiendo ésto:

                       
Código ("java") [Seleccionar]
suma = suma+Integer.parseInt(args[i]);
System.out.println(args[i]);


Entiendo que la suma se debe hacer así y que el Integer.parseInt es para convertir el argumento a entero, pero...¿por qué ese args tanto en esa expresión como en el Syso?

Gracias de antemano y un saludo
#12
Buenas, hay un HDD que me está dando el coñazo. El programa Intel Rapid de almacenamiento me avisa de que hay un HDD que está en riesgo (evento SMART).



Le doy a suprimir dicho evento pero sigue pasando lo mismo. Al volver a iniciar el PC es cómo si no le hubiera hecho nada.

Me he metido en la BIOS pero no sé dónde deshabilitar el S.M.A.R.T del HDD, me meto en la configuración SATA y me sale ésto:



Sin poder hacer nada. (El HDD que me interesa en cuestión es el del puerto 3, está igual configurado que el que está en el puerto 2).

Mi placa base es una H97M-D3H por si eso ayuda.

El HDD está vacío (es de datos) y le he pasado el Seatools como la comprobación de errores de Windows y me han puesto que el HDD está en buen estado.

Muchas gracias de antemano.

Saludos!
#13
¿Alguien me puede ayudar con éste ejercicio?, estoy empezando a estudiar C pero aún entiendo muy poco de tablas, pero me exigen entregar unas prácticas para poder presentarme a la convocatoria de Enero, por eso tengo que hacerlo bien sí o sí =/:

El enunciado es el siguiente:

Paso de Tablas Bidimensionales como Parámetro

En este ejercicio se practicarán los diferentes métodos para pasar una tabla multimensional como parámetro a una función. En todos los casos deberá implementar la función imprimeTabla, dependiendo de cómo se declare dicha función.

Ejercicio1:
a) En este primer caso se pasan tres parámetros a la función: una tabla multidimensional de la que no es necesario especificar su dimensión más interna (y sólo esa) y las dos dimensiones de la tabla.

/* Includes del sistema */
#include <stdio.h>


/* Includes de la aplicacion */


/* Definición de constantes */
#define TAMV  6
#define TAMH  4


/* Tipos definidos por el usuario */


/* Declaración de funciones locales. */

/*
**   Parámetros:  tabla   tabla bidimensional que se desea imprimir.
**                        En este caso el parámetro es del tipo tabla
**                        bidimensional.
**                tamh    número de columnas de la tabla bidimensional.
**                tamv    número de filas de la tabla bidimensional.
**
**     Devuelve:  Nada
**
**  Descripcion:  Muestra los elementos de una tabla bidimensional que se
**                proporciona como parámetro.
**                Los elementos se muestran por filas
**                mediante el uso de un doble bucle.
*/
void imprimeTabla(char tabla[][TAMH], int tamh, int tamv);


/************************************************************/

int main ()
{
 char tabla [ TAMV ][ TAMH ] = {    
   {'A', 'B', 'C', 'D'},
   {'E', 'F', 'G', 'H'},
   {'I', 'J', 'K', 'L'},
   {'M', 'N', 'O', 'P'},
   {'Q', 'R', 'S', 'T'},
   {'U', 'V', 'W', 'X'}
 };
 
 imprimeTabla(tabla, TAMV, TAMH);

 return 0;
}

void imprimeTabla(char tabla[][TAMH], int tamv, int tamh)
{

}


Compile y ejecute el programa. Hágalo también utilizando el makefile proporcionado tecleando:

make -f multidimensionales tablasMultdim1

¿Alguien me puede decir como hacerlo?

Muchísimas gracias de antemano y saludos!
#14
Hardware / Ayuda con elección de portátil
22 Octubre 2014, 20:10 PM
Buenas, estoy por jubilar a mi viejo portátil que ya va para los 7 años de vida y quisiera pillarme uno nuevo para la universidad y demás.

Lo que busco es lo siguiente:

- Precio máximo unos 300-350€
- Windows (necesito programas que sólo hay aquí)
- Entre 13-17 pulgadas
- A poder ser buena duración de batería

Y para lo que lo voy a usar es:

- Programas ofimáticos
- Máquinas virtuales de Linux
- Matlab
- Lo típico: navegar, ver pelis HD y demás

Gracias de antemano por las recomendaciones!

Saludos!
#15
GNU/Linux / Duda comandos consola Linux
20 Octubre 2014, 23:37 PM
Buenas, antes que nada no sé si este tema va aquí, estoy empezando a estudiar C pero tengo unas dudas con unos comandos en consola:

Tengo una práctica para familiarizarme con el uso de los comandos en la consola de Linux, y me piden lo siguiente:

a) Liste las líneas del fichero /etc/pam.d/login que contengan la palabra auth

Estando en el directorio pam.d he puesto el comando "grep auth login"

b) Obtenga las líneas del fichero /etc/pam.d/login que comiencen con la palabra auth

Aquí he usado el comando "grep "^auth" login

c) Haga lo mismo con las líneas que terminen con dicha palabra, indicando además el número de línea correspondiente

Aquí "grep -n "$auth" login

d) Liste todas las líneas del fichero /etc/pam.d/login que no sean comentarios (las líneas de comentarios son las que empiezan con el carácter #)

Aquí "grep -V "^#" login

e) Repita lo anterior, eliminando también las líneas vacías. Para ello ejecute dos comandos grep conectados por una tubería.

f) Determine en cuántas líneas del fichero /etc/pam.d/login aparece la palabra pam, independientemente que sea en mayúsculas o minúsculas

¿Alguien me puede ayudar con los apartados e y f?, y decirme también si los anteriores están bien :S

Muchas gracias de antemano!
#16
Buenas, aquí estoy empezando con C++ y tengo una duda con un ejercicio de una práctica de la facultad.

Tengo un programa (muy rudimentario) que tengo que ir mejorando poco a poco, el programa me dice si un número no es primo y si sí es primo sale del programa, este es el código:

#include <stdio.h>

#define RESPUESTANOPRIMO " %d no es primo\n"
#define RESPUESTAPRIMO   " %d es primo\n"

int main()
{
  /* Almacenara el numero leido por teclado */
  int valor;
  /* Servira como indice del bucle for que vamos a utilizar. */
  int i;
  /* Solicitamos el numero que queremos saber si es primo */
     printf("Introduzca un valor: ");
     scanf(" %d", &valor);
     
/* El bucle lo comenzamos en 2: todo numero es divisible por 1
* y lo terminamos antes de valor: todo numero es divisible por si mismo */

for ( i = 2; i < valor; i++ )
     if (0 == (valor % i))
     /* Si el resto es cero, es porque i divide
     * No es primo. */
     printf(RESPUESTANOPRIMO, valor);

  return 0;
}


Y me pide que una vez comprobado que el dos no es divisor, probar sólo con los números impares.

Yo creo que debo cambiar ese i++ por un i+=2, para que desde el 3 todas las demás comprobaciones se hagan con números impares, pero no sé como inicializar la variable i en el 3 después de la primera "pasada" del bucle for. Lo que he hecho es esto:

#include <stdio.h>


#define RESPUESTANOPRIMO    "%d no es primo\n"
#define RESPUESTAPRIMO      "%d es primo\n"



int main()
{
  /* Almacenara el numero leido por teclado */
  int valor;
  /* Servira como indice del bucle for que vamos a utilizar. */
  int i;

  /* Solicitamos el numero que queremos saber si es primo */
  printf("Introduzca un valor: ");
  scanf("%d", &valor);

  if (valor == 2);

  else

    {
      if (0 == (valor % 2))


/* Si el resto es cero, es porque i divide  a numero:
* No es primo. */
        printf(RESPUESTANOPRIMO, valor);
      else
        {
          for (i = 3; i < valor; i += 2)
            if (0 == (valor % i))
              /* Si el resto es cero, es porque i divide a numero:
               * No es primo. */
              printf(RESPUESTANOPRIMO, valor);
        }

    }

  return 0;
}


Que hace lo que quiero pero no creo que deba sacar el 2 "a lo bruto" del bucle for, ¿alguna ayuda?

No hace falta mejorar el programa, sólo hacer dicha modificación para luego poder hacer otros apartados que me piden.

Gracias de antemano y un saludo!
#17
Buenas, tengo el siguiente código que convierte dos caracteres hexadecimales en su correspondiente número decimal, y que al meter la secuencia qq sale del programa:

#include <stdio.h>

#define NOERROR 1
#define ERROR 0

int hexDec(char c1, char c2);
int main()
{

  /* Declaramos las variables */
  char car1;
  char car2;

  /* Bucle While para que salga con qq */
  do
    {
      printf("Introduzca dos caracteres hexadecimales: ");
      scanf(" %c %c", &car1, &car2);
     
      hexDec(car1, car2);
     
    }
while(car1 != 'q' && car2 != 'q');

  return 0;
}


int hexDec(char c1, char c2)
{

char v1;
char v2;
int cuno = NOERROR;
int cdos = NOERROR;
int resultado;

if (c1 != 'q' && c2 != 'q')
        {

          if ('0' <= c1 && c1 <= '9')
            v1 = c1 - '0';
          else if ('A' <= c1 && c1 <= 'F')
            v1 = c1 - 'A' + 10;
          else if ('a' <= c1 && c1 <= 'f')
            v1 = c1 - 'a' + 10;
          else
            {
              cuno = ERROR;
              printf("Error en el primer valor introducido\n");

            }
          if ('0' <= c2 && c2 <= '9')
            v2 = c2 - '0';
          else if ('A' <= c2 && c2 <= 'F')
            v2 = c2 - 'A' + 10;
          else if ('a' <= c2 && c2 <= 'f')
            v2 = c2 - 'a' + 10;
          else
            {
              cdos = ERROR;
              printf("Error en el segundo valor introducido\n");

            }

          if (cuno == NOERROR && cdos == NOERROR)
            {
              resultado = 16 * v1 + v2;

              printf("El valor decimal de 0x%c%c es %d\n", c1, c2,
                     resultado);

            }
        }

cuno = NOERROR;
        cdos = NOERROR;


return resultado;

}


Este código lo entiendo, pero ahora me piden lo siguiente:

Modifique el código añadiendo una nueva función leeCaracter que solicite los dos caracteres hexadecimales, y que devuelva:

- 0 si se ha introducido el código qq de salida.
- 1 si se han introducido dos caracteres hexadecimales correctos

La función también devolverá por referencia los dos caracteres hexadecimales leídos. En el caso de que los caracteres hexadecimales no fuesen correctos, la función deberá volver a solicitarlos. Es decir, la función sólo puede devolver 1 y dos caracteres hexadecimales correctos por referencia, o 0 en caso de que se haya introducido el código qq.

El programa debe quedar así:

salas@318CDCr12: ̃$ ./hexDec7
Introduzca dos caracteres hexadecimales: 22
El valor decimal de 0x22 es 34
Introduzca dos caracteres hexadecimales: 3a
El valor decimal de 0x3a es 58
Introduzca dos caracteres hexadecimales: 3A
El valor decimal de 0x3A es 58
Introduzca dos caracteres hexadecimales: 3G
Error en el segundo valor introducido
Introduzca dos caracteres hexadecimales: -1
Error en el primer valor introducido
Introduzca dos caracteres hexadecimales: tA
Error en el primer valor introducido
Introduzca dos caracteres hexadecimales: qq
salas@318CDCr12: ̃$



Este ejercicio está en el tema de punteros, vamos, que hay que usar punteros en la nueva función, y no sé como meterle mano al problema. Agradecería mucho alguna explicación o modo de actuar.

Gracias de antemano y un saludo!
#18
Buenas, tengo este programa que pasa de decimal a binario:

#include <stdio.h>
#include "decBin.h"

void decBin(int n);
int leeNumero();

int main ()
{

int n;

n = leeNumero();
decBin(n);
printf("\n");
return 0;

}




int leeNumero()

{

int numero;

do{

printf(T_INTRODUZCA_NUMERO);
scanf("%d", &numero);

}
while(numero < 0);


return numero;

}


void decBin (int n)

{

if (n == 0)
    printf("0");
else if (n == 1)
    printf("1");

else
{
decBin (n/2);
printf("%d", n % 2);

}

}


El diagrama de flujo de la función main como de la función leeNumero sé hacerlos, pero no sé como hacer el de la función recursiva decBin, ¿alguna ayuda?

Gracias de antemano y saludos!
#19
Buenas, tengo un programa que convierte dos caracteres hexadecimales a su correspondiente número en decimal, admite tanto mayúsculas como minúsculas y si se introduce los caracteres qq el programa termina.

El código es el siguiente:

#include <stdio.h>

#define NOERROR 1
#define ERROR 0

int hexDec(char c1, char c2);
int main()
{

 /* Declaramos las variables */
 char car1;
 char car2;

 /* Bucle While para que salga con qq */
 do
   {
     printf("Introduzca el numero hexadecimal: ");
     scanf(" %c %c", &car1, &car2);
     
     hexDec(car1, car2);
   
   }
while(car1 != 'q' && car2 != 'q');

 return 0;
}


int hexDec(char c1, char c2)
{

char v1;
char v2;
int cuno = NOERROR;
int cdos = NOERROR;
int resultado;

if (c1 != 'q' && c2 != 'q')
       {

         if ('0' <= c1 && c1 <= '9')
           v1 = c1 - '0';
         else if ('A' <= c1 && c1 <= 'F')
           v1 = c1 - 'A' + 10;
         else if ('a' <= c1 && c1 <= 'f')
           v1 = c1 - 'a' + 10;
         else
           {
             cuno = ERROR;
             printf("Error en el primer valor introducido\n");

           }
         if ('0' <= c2 && c2 <= '9')
           v2 = c2 - '0';
         else if ('A' <= c2 && c2 <= 'F')
           v2 = c2 - 'A' + 10;
         else if ('a' <= c2 && c2 <= 'f')
           v2 = c2 - 'a' + 10;
         else
           {
             cdos = ERROR;
             printf("Error en el segundo valor introducido\n");

           }

         if (cuno == NOERROR && cdos == NOERROR)
           {
             resultado = 16 * v1 + v2;

             printf("El valor decimal de 0x%c%c es %d\n", c1, c2,
                    resultado);

           }
       }

cuno = NOERROR;
       cdos = NOERROR;


return resultado;

}


Hasta ahí bien, el problema es que me piden una función hexValidos (la función hexDec debe seguir existiendo) que reciba dos caracteres como parámetros, y devuelva una indicación de si los dos caracteres son caracteres hexadecimales válidos o no (con el mensaje "Invalido).

El problema es que no sé muy bien como hacerlo, por ahora he hecho lo siguiente (qué seguro que está mal, pero no se me ocurre otra cosa):

void hexValidos(char a, char b)
{

int v1;
int v2;
int valor;
int ca = NOERROR;
int cb = NOERROR;

if (a != 'q' && b != 'q')

{
   if ((('0' <= a && a <= '9') || ('A' <= a && a <= 'F') || ('a' <= a && a <= 'f')) && (('0' <= b && b <= '9') || ('A' <= b && b <= 'F') || ('a' <= b && b <= 'f')))
   
    hexDec(c1,c2);

   else
printf("Invalido\n");

return;

}



¿Alguna ayuda?, no pido que me hagan el código pero si me gustaría al menos tener alguna indicación o consejo sobre como hacerlo.

Gracias de antemano y un saludo!
#20
Buenas, me piden hacer el diagrama de flujo de este programa:

/* Includes del sistema */
#include <stdio.h>

/* Includes de la aplicacion */
/* Constantes del fichero */
#define RESPUESTANOPRIMO " %d no es primo\n"
#define RESPUESTAPRIMO   " %d es primo\n"

/* Tipos definidos por el usuario para el fichero */

/* Prototipo de funciones locales */
int main()
{
  /* Almacenara el numero leido por teclado */
  int valor;
  /* Servira como indice del bucle for que vamos a utilizar. */
  int i;
  /* Solicitamos el numero que queremos saber si es primo */
  printf("Introduzca un valor: ");
  scanf(" %d", &valor);

  /* El bucle lo comenzamos en 2: todo numero es divisible por 1
   * y lo terminamos antes de valor: todo numero es divisible por si mismo */

  for ( i = 2; i < valor; i++ )
    if (0 == (valor % i))

      /* Si el resto es cero, es porque i divide
       * No es primo. */
      printf(RESPUESTANOPRIMO, valor);

  return 0;
}


Y lo he hecho así:



¿Modificaríais algo?

Gracias de antemano y un saludo!
#21
Buenas, me han pedido un programa en la facultad en el que ,mediante estructuras, me pida dos fechas y el programa me dice si una fecha es posterior/anterior/igual a otra fecha y si los años son bisiestos o no.

Tengo dos ficheros, el primero es fecha.c que hace la lectura, comprobación, comparación, comprobación si es bisiesto o no,  con el código que me ha quedado así:

#include <stdio.h>
#include "fecha.h"

struct fecha leeFecha(void)

{

  struct fecha Fech;

    printf("Introduzca la fecha en formato dd/mm/aaaa: ");

    scanf("%d/%d/%d", &Fech.dia, &Fech.mes, &Fech.año);


  return Fech;
}


int compruebaFecha(struct fecha *pFecha)
{
  int compru;
//  int dia;
// int mes;
  int bis;

  {
    if (pFecha->dia < 1 || pFecha->dia > 31)

      compru = 0;

    else if (pFecha->mes < 1 || pFecha->mes > 12)

      compru = 0;

    else if ((pFecha->mes == 4 || pFecha->mes == 6 || pFecha->mes == 9 || pFecha->mes == 11) && (pFecha->dia > 30))

      compru = 0;

    else if (pFecha->mes == 2)

      {
        if ((bis = 1) && (pFecha->dia > 29))

          compru = 0;

        else if ((bis = 0) && (pFecha->dia > 28))

          compru = 0;
      }

    else

      compru = 1;
  }

  return compru;

}


int comparaFecha(struct fecha f1, struct fecha f2)
/* Función comparaFecha, devuelve:
   -1 si fecha1 < fecha2
   0 si fecha1 = fecha2
   1 si fecha1 > fecha2
*/
{
  int compara;

  if (f1.año < f2.año)
    compara = -1;
  else if (f1.año > f2.año)
    compara = 1;
  else
    {
      if (f1.mes < f2.mes)
        compara = -1;
      else if (f1.mes > f2.mes)
        compara = 1;
      else
        {
          if (f1.dia < f2.dia)
            compara = -1;
          else if (f1.dia > f2.dia)
            compara = 1;
          else
            compara = 0;
        }
    }

  return compara;
}



void imprimeFecha(struct fecha f)
{

  printf("%02d/%02d/%d", f.dia, f.mes, f.año);

  return;
}



// Funcion para comprobar si un año es bisiesto:
int esBisiesto(struct fecha f)
{
  int bis = 0;

  // año bisiesto: {divisible por 4 y no por 100} o {divisible por 400}

  if (((f.año % 4 == 0) && (f.año % 100 != 0)) || (f.año % 400 == 0))
    bis = 1;

  return bis;
}


Aquí está el fichero estructura.c que contiene a la función main y usa las funciones de fecha.c


#include <stdio.h>
#include "fecha.h"

int main()
{
  struct fecha f1;
  struct fecha f2;
  // struct fecha *pf1;
  // struct fecha *pf2;
  int a;
  int compara;
  int bis1;
  int bis2;

  f1 = leeFecha();
  a = compruebaFecha(&f1);

  if (a == 0)
    {
      printf("Formato de fecha incorrecto\n");
    }

  else
    {
      f2 = leeFecha();
      a = compruebaFecha(&f2);

      if (a == 0)
        {
          printf("Formato de fecha incorrecto\n");
        }

      else

        {

          compara = comparaFecha(f1, f2);

/* Imprimir */

          imprimeFecha(f1);
          {
            if (compara > 0)

              printf(" es posterior a ");

            else if (compara == 0)

              printf(" es igual a ");

            else

              printf(" es anterior a ");
          }

          imprimeFecha(f2);

          bis1 = esBisiesto(f1);
          bis2 = esBisiesto(f2);

          {
            if (bis1 == 1 && bis2 == 0)

              printf("\nLa primera fecha es en bisiesto\n");

            else if (bis1 == 0 && bis2 == 1)

              printf("\nLa segunda fecha es en bisiesto\n");

            else if (bis1 == 1 && bis2 == 1)

              printf("\nAmbas fechas son en bisiesto\n");

            else

              printf("\nNinguna de las dos fechas es en bisiesto\n");

          }
        }
    }
  return 0;
}


Y aquí está fecha.h:

#ifndef FECHA_H
#define FECHA_H

struct fecha {
  int dia;
  int mes;
  int año;
};

#define AMBAS_BISIESTO   "Ambas fechas son en bisiesto\n"
#define PRIMERA_BISIESTO "La primera fecha es en bisiesto\n"
#define SEGUNDA_BISIESTO "La segunda fecha es en bisiesto\n"
#define NINGUNA_BISIESTO "Ninguna de las dos fechas es en bisiesto\n"

struct fecha leeFecha( void );
int compruebaFecha( struct fecha *pFecha );
int comparaFecha( struct fecha f1, struct fecha f2 );
void imprimeFecha( struct fecha f );
int esBisiesto( struct fecha f );

#endif



Pues bien, el programa me funciona perfectamente salvo por un pequeño error que no consigo solucionar, puede ser una tontería pero llevo tanto tiempo haciendo el programa que no lo veo.

En la ejecución, si le pongo las fechas 06/01/1981 y 02/06/1980 me dice:

6/1/1981 es posterior a 2/6/1980
La segunda fecha es en bisiesto

¿Cómo consigo que en vez de 6/1/1981 y 2/6/1980 me ponga 06/01/1981 y 02/06/1980?

Es decir, que no se "coma" esos ceros.

¿Alguna ayuda?, gracias de antemano

Necesito que me de la ejecución tal y como digo por que si no no me lo dan como válido el programa, aunque funcione correctamente

Un saludo!
#22
Buenas, tengo un programa que pasa de decimal (solo números positivos) a binario, pero no entiendo muy bien como hace la conversión, este es el código:

#include <stdio.h>

int leeNumero();
void decBin(int n);

int main()
{
  int n;
  n = leeNumero();
  decBin(n);
  printf("\n);

 return 0;
}

int leeNumero()
{
   int numero;
   do
      {
        printf("Introduzca un número no negativo: ");
        scanf("%d", &numero);
      }
    while (numero<0);

return numero;
}

void decBin(int n)
{
    if (n == 0)
       printf("0");

    else if (n == 1)
       printf("1");

    else
       {
          decBin(n / 2);
          printf("%d", n % 2);
       }
}



Yo el programa lo entiendo de esta manera:

Declaramos las funciones leeNumero y decBin, entramos en la función main, a través de la función leeNumero se comprueba que el número no sea negativo, volvemos a la función main y entramos en la función decBin, y es ahí donde me surge la duda, ya que no entiendo muy bien como hace la conversión a binario :S

¿Alguna ayuda?, gracias de antemano!

P.D: El programa funciona perfectamente
#23
Buenas, he hecho el siguiente código que convierte dos caracteres hexadecimales a decimal, y sale del programa al ingresar "qq":



// Biblioteca del sistema
#include <stdio.h>

// Constantes del fichero
#define CTE       16
#define VALOR     "El valor decimal de 0x%c%c es %d\n"
#define NOERROR   1
#define ERROR     0


// Funciones que usaremos
int hexDec(char car1, char car2);
int leeCaracter(char * ccar1, char * ccar2);

int main()
{
  // Declaramos las variables
  char car1;
  char car2;

  // Declaramos las variables de control
  int cuno;
  int cdos;

  // Solicitamos los caracteres hexadecimales

  do
    {
     
      // Llamamos a la función leeCaracter
      leeCaracter(&car1, &car2);
     
      cuno = NOERROR;
      cdos = NOERROR;
      if (!((('0' <= car1) && (car1 <= '9'))
            || (('A' <= car1) && (car1 <= 'F'))
            || (('a' <= car1) && (car1 <= 'f'))))
        {
          cuno = ERROR;
        }

      if (!((('0' <= car2) && (car2 <= '9'))
            || (('A' <= car2) && (car2 <= 'F'))
            || (('a' <= car2) && (car2 <= 'f'))))
        {
          cdos = ERROR;
        }
      if ((NOERROR == cuno) && (NOERROR == cdos))
       
//Llamamos a la funcion hexDec
hexDec(car1, car2);
      if ((cuno == ERROR) && (car1 != 'q'))
        {
  printf("Error en el primer valor introducido\n");
}
      if ((cdos == ERROR) && (car2 != 'q'))
        {
  printf("Error en el segundo valor introducido\n");
}
      getchar();
    }
  while ((car1 != 'q')  || (car2 != 'q'));
 
  return 0;
}

// Definimos la funcion hexDec

int hexDec(char car1, char car2)
{
  int valor1;
  int valor2;
  int valor;

  if (('0' <= car1) && (car1 <= '9'))
    {
      valor1 = car1 - '0';
    }
  else if (('A' <= car1) && (car1 <= 'F'))
    {
      valor1 = car1 - 'A' + 10;
    }
  else if (('a' <= car1) && (car1 <= 'f'))
    {
      valor1 = car1 - 'A' + 10 - 32;
    }

  if (('0' <= car2) && (car2 <= '9'))
    {
      valor2 = car2 - '0';
    }
  else if (('A' <= car2) && (car2 <= 'F'))
    {
      valor2 = car2 - 'A' + 10;
    }
  else if (('a' <= car2) && (car2 <= 'f'))
    {
      valor2 = car2 - 'A' + 10 - 32;
    }
  valor = CTE * valor1 + valor2;
  printf(VALOR, car1, car2, valor);
  return valor;
}

// Definimos la funcion leeCaracter

int leeCaracter(char * ccar1, char * ccar2)
{

  printf("Introduzca un valor hexadecimal: ");
  scanf("%c%c", ccar1, ccar2);
 
  if ((*ccar1 == 'q') && (*ccar2 == 'q'))
    {
      return 0;
    }
  else
    if (((('0' <= *ccar1) && (*ccar1 <= '9'))
         || (('A' <= *ccar1) && (*ccar1 <= 'F'))
         || (('a' <= *ccar1) && (*ccar1 <= 'f')))
|| ((('0' <= *ccar2) && (*ccar2 <= '9'))
    || (('A' <= *ccar2) && (*ccar2 <= 'F'))
    || (('a' <= *ccar2) && (*ccar2 <= 'f'))))
      {
     
return 1;
      }
}


Pero al compilar me da el siguiente aviso:

hexDec7.c: En la función 'leeCaracter':
hexDec7.c:138:1: aviso: el control alcanza el final de una función que no es void

¿Alguien me puede decir como solucionarlo?

Saludos y gracias de antemano!
#24
Buenas, tengo un ejercicio en el que me piden hacer un programa que pase de números positivos decimales a binario (incluyendo el 0), y yo he hecho esto:

//Incluimos las librerías propias y del sistema

#include <stdio.h>
#include "decBin.h"

//Declaramos las funciones

int leeNumero();
void decBin(int n);

int main()
{
 int n;
 n = leeNumero();
 if (n > 0)
   {
     decBin(n);
   }
 printf("\n");

 return 0;
}


int leeNumero()
{
 int numero;
 do
   {
     printf(T_INTRODUZCA_NUMERO);
     scanf("\n%d", &numero);
   }
 while (numero < 0);           /*Con este bucle hacemos que si el numero introducido
                                  es negativo, no lo procese y vuelva a pedirlo */


 return numero;
}

//La funcion decBin realiza la conversión decimal-binario

void decBin(int n)
{
 if (n == 0)
   printf("0");

 else if (n == 1)
   printf("1");

 else
   {
     decBin(n / 2);
     printf("%d", n % 2);
   }
}


Aquí os pongo el fichero decBin.h:

#ifndef DECBIN_H
#define DECBIN_H

#define T_INTRODUZCA_NUMERO  "Introduzca un numero no negativo: "
#define T_INTRODUZCA_NUMERO2 "Introduzca un numero: "

#endif



Me compila bien, sin avisos ni nada, y funciona bien salvo cuando le digo que me convierta el 0 en binario (qué evidentemente sigue siendo 0), lo que hace es salir del programa, ¿alguna solución?

Gracias de antemano y un saludo!
#25
Buenas, tengo que hacer el siguiente programa:

potencia.c: realice un programa que obtenga la potencia de un número elevado a otro, dados ambos
por teclado. Para ello:
a ) escriba la función potencia, que recibe dos números como parámetros, la base y el exponente, y devuelve el resultado de elevar el primero al segundo.
b ) escriba la función leeNumero, que no recibe ningún dato como parámetro y solicita un número no negativo (mayor o igual que 0) por teclado, que devolverá como resultado. La función debe solicitar la introducción del número tantas veces como sean necesarias hasta que el número sea correcto (no negativo).
c ) escriba la función main, que haga uso de las dos funciones anteriores, para calcular la potencia de un número elevado a otro.

Pues bien, tengo hecho esto:

//Incluímos las librerías propias y del sistema
#include "potencia.h"
#include <stdio.h>

//Declaramos las funciones
int potencia(int base, int exponente);
int leeNumero();

int main()
{

//Declaramos las variables a usar
 int base;
 int exponente;
 int resultado;
 int numero;

 printf(T_BASE, base);
 base = leeNumero(numero);
 printf(T_EXPONENTE, exponente);
 exponente = leeNumero(numero);        //Llamamos a la funcion leeNumero

 resultado = potencia(base, exponente);        //Llamamos a la funcion potencia
 printf(T_RESULTADO, base, exponente, resultado);
 return 0;
}


int potencia(int base, int exponente)
{

 int resultado = 1;
 if (exponente == 0)
   {
     resultado = 1;
   }

 else
   {

     for (; exponente >= 1; exponente--)
       {
         resultado *= base;
       }
   }

 return resultado;
}

int leeNumero()
{
 int numero;
 do
   {
     printf(T_INTRODUZCA_NUMERO);
     scanf("%d", &numero);
   }
 while (numero < 0);


 return numero;
}


Este es el código de potencia.h:

#ifndef POTENCIA_H
#define POTENCIA_H

/*Textos a utilizar en la funcion printf*/
#define T_BASE              "BASE:\n"
#define T_EXPONENTE         "EXPONENTE:\n"
#define T_RESULTADO         "%d elevado a %d es %d\n"
#define T_INTRODUZCA_NUMERO "Introduzca un numero no negativo: "

#endif


Pues bien, si lo compilo con el comando en consola:

gcc -W -Wall -o potencia potencia.c

Me salen los siguientes avisos:

salas@313CDC38:~/Escritorio/pfunciones2$ gcc -W -Wall -o potencia potencia.c
potencia.c: En la función 'main':
potencia.c:29:3: aviso: demasiados argumentos para el formato [-Wformat-extra-args]
potencia.c:31:3: aviso: demasiados argumentos para el formato [-Wformat-extra-args]
potencia.c:29:9: aviso: se utiliza 'base' sin inicializar en esta función [-Wuninitialized]
potencia.c:30:8: aviso: se utiliza 'numero' sin inicializar en esta función [-Wuninitialized]
potencia.c:31:9: aviso: se utiliza 'exponente' sin inicializar en esta función [-Wuninitialized]

¿Alguna forma de solucionarlo?

Compilándolo con el comando gcc -o potencia potencia.c me compila y hace lo que me piden, pero me gustaría tenerlo hecho sin que me de avisos. Gracias de antemano!

Saludos!
#26
Buenas, tengo el siguiente programa básico para pasar de número decimal a hexadecimal:

#include <stdio.h>

int main()
{

  /* Declaramos las variables */
  char car1;
  char car2;
  char valor1;
  char valor2;
  int valor;
 
  printf("Introduzca el numero hexadecimal: ");
  scanf("\n%c%c", &car1, &car2);

  /* Condiciones para el primer caracter*/
  if ('0' <= car1 && car1 <= '9')
    valor1 = car1 - '0';
  else if ('A' <= car1 && car1 <= 'F')
    valor1 = car1 - 'A' + 10;

  /* Condiciones para el segundo caracter*/
  if ('0' <= car2 && car2 <= '9')
    valor2 = car2 - '0';
  else if ('A' <= car2 && car2 <= 'F')
    valor2 = car2 - 'A' + 10;


  valor = 16 * valor1 + valor2;

  printf("El valor decimal de 0x%c%c es %d\n", car1, car2, valor);

  return 0;
}


Me pide el profesor que cambie cada sentencia "if else if" por una "if else", pero he probado y siempre me da error al compilar, ¿alguna ayuda?

Saludos!
#27
Seguridad / ¿Qué me puede pasar?
21 Agosto 2012, 20:57 PM
Buenas, hace unas semanas me enfadé con una persona que conozco y cometí el error de meterme en su tuenti, la forma en la que lo hice fue averiguando la respuesta a la pregunta secreta de su hotmail y después dando a olvidar contraseña en tuenti.

Me arrepentí y admití mi culpa y le pedí perdón a la persona en cuestión, sé que estuvo bastante mal, pero aun así dicha persona dice que va a denunciarme.

Si conoceís algún caso así, ¿que me puede pasar?, ¿qué le dirá la policia?

Gracias y un saludo
#28
Buenas, me han dado el enunciado siguiente: Modifique el programa hexdec4 (que os pongo a continuación), añadiendo una función que solicite los dos carácteres hexadecimales, y que devuelva:

-0 si se ha introducido el código qq de salida
-1 si se han introducido dos carácteres hexadecimales correctos.

En este último caso, también devolverá los dos caracteres hexadecimales convertidos.


Una aclaración, si introducimos un caracter que no sea hexadecimal, por ejemplo el mm, el programa nos debe pedir de nuevo que introduzcamos dos nuevos carácteres hexadecimales, así hasta que metamos uno correcto.

El programa lo que hace es una conversión de hexadecimal a decimal.
El programa que hay que modificar es el siguiente:


#include <stdio.h>

int hexadecimal (char car1, char car2); //Declaramos la funcion hexadecimal

int main ()
{
   //Declaramos las variables
   char car1;
   char car2;
   int valor;
   
   //Iniciamos el bucle while
   while (1){
      printf("Introduzca un valor hexadecimal:");
      scanf(" %c%c", &car1, &car2);
      if (car1 == 'q' && car2 == 'q'){
         printf ("Presione enter para salir\n");
         while (getchar() != '\n');   
         getchar();
         break;
      }if ((valor = hexadecimal (car1, car2)))  //Llamamos a la funcion hexadecimal
         
         printf("El valor decimal de 0x%c%c es %d\n", car1, car2, valor);
   }

   return 0;
}

int hexadecimal(char car1, char car2)   //Funcion hexadecimal
{
   char valor1;
   char valor2;

   if ('0' <= car1 && car1 <= '9')
      valor1 = car1 - '0';
   else if ('A' <= car1 && car1 <= 'F')
      valor1 = car1 - 'A' + 10;
   else if ('a' <= car1 && car1 <= 'f')
      valor1 = car1 - 'a' + 10;
   else
      return -1;

   if ('0' <= car2 && car2 <= '9')
      valor2 = car2 - '0';
   else if ('A' <= car2 && car2 <= 'F')
      valor2 = car2 - 'A' + 10;
   else if ('a' <= car2 && car2 <= 'f')
      valor2 = car2 - 'a' + 10;
   else
      return -1;

   return valor1 * 16 + valor2;
}


Y lo he modificado de tal forma:


#include <stdio.h>

int* hexadecimal (char car1, char car2); //Declaramos la funcion hexadecimal

int main ()
{
   //Declaramos las variables
   
   char car1;
   char car2;
   int valor, valor1,valor2;
   int*v;
   
   
   
   //Iniciamos el bucle while
   while (1)
   {
      printf("Introduzca un valor hexadecimal:");
      scanf("%c%c", &car1, &car2);
     
      v = hexadecimal (car1, car2);  //Llamamos a la funcion hexadecimal
     
      if(v==0) printf("Presione enter para salir\n");
      else
           v= hexadecimal (car1, car2);
           
         
         printf("El valor decimal de 0x%c%c es %d\n", car1, car2, valor);
   
   }
   return (0);
}

int* hexadecimal(char car1, char car2)   //Funcion hexadecimal
{
   char valor1;
   char valor2;
   int*p;
   p=NULL;
   p=(int*)malloc(2*sizeof(int));
   if(!p) printf("Error en la reserva dinamica de memoria:");
   else
   {
   if (car1 == 'q' && car2 == 'q')
   {
   *p=0;
   }
   return(p);
   
   else ((('0' <= car1 && car1 <= '9')||('A' <= car1 && car1 <= 'F')||('a' <= car1 && car1 <= 'f'))&&(('0' <= car2 && car2 <= '9')||('A' <= car2 && car2 <= 'F')||('a' <= car2 && car2 <= 'f')))   {
    {
    valor=valor1 * 16 + valor2;
    return(valor);   
    }
   }
}



Me da errores y no hace lo que busco, ¿alguna ayuda?

Saludos!
#29
Programación C/C++ / Duda funcíon potencia
3 Diciembre 2011, 16:23 PM
Buenas, me piden que realice un programa que use la función que calcula la potencia de un número, la función potencia la tengo que crear yo, el programa compila pero no me da el resultado bien, y quisiera saber donde me equivoco, el código es el siguiente:


#include <stdio.h>

float potencia (float a, float b);
int main ()

{

float base;
float exponente;
float valor;

printf("Introduce la base de la potencia\n");
scanf("%f", &base);
printf("Indique el exponente\n");
scanf("%f",&exponente);

valor = potencia(base,exponente);
printf("La potencia de base %f y exponente %f es %f\n", base, exponente, valor);
return (0);

}

float potencia (float a, float b)

{
int i=1;
float valor;
for(i=0; i<=b;i++)
{
valor=valor*a;
}

return (valor);
}


Saludos
#30
Buenas, tengo el siguiente programa, que hace lo siguiente;

Un programa que lea dos caracteres hexadecimales y dé como salida su valor en decimal, en el que se permiten el uso de minusculas y además, que si se introduce un caracter invalido te lo indicará con un mensaje de error, y por ultimo, que si escribes la sentencia qq el programa se termine.

El codigo del programa es el siguiente (ya hace todo lo que se pide);

#include <stdio.h>

int main ()
{
 // Declaramos las variables
 char car1;
 char car2;
 char valor1;
 char valor2;
 int valor;
 int flag; // Declaramos la variable de control
   
do { // Iniciamos el bucle do-while
   flag=0;
   printf("Introduzca un valor hexadecimal:\n");
   scanf("\n%c%c", &car1, &car2);
   
   if (car1 == 'q' && car2 == 'q') // Con esta sentencia hacemos que el programa finalice al escribir qq
       {
       printf("Presione enter para salir\n");
       while (getchar()!='\n');
       getchar ();
       return 0;
       }
   
   else
    {
       if('0'<=car1 && car1<='9')
       valor1=car1-'0';
       else if ('A'<=car1 && car1<='F')
       valor1=car1-'A'+10;
       else if ('a'<=car1 && car1<='f')
       valor1=car1-'a'+10;
       else
         {
         flag=1;
         printf("Valor erroneo\n\n");
         }
       
       if('0'<=car2 && car2<='9')
       valor2=car2-'0';
       else if ('A'<=car2 && car2<='F')
       valor2=car2-'A'+ 10;
       else if ('a'<=car2 && car2<='f')
       valor2=car2-'a'+10;
       else
         {
           flag=1;
           printf("Valor erroneo\n\n");
         }

       if (flag==0)
         {
           valor= 16*valor1 + valor2;
           printf("EL valor decimal de 0x%c%c es %d\n",car1,car2,valor);
         }
    }
   
}  
   while(1);
   
   return 0;
}


Y ahora me piden lo siguiente: Modificar el programa de tal forma que, además de la función main, exista una función que tome como parámetros dos caracteres hexadecimales y devuelva su valor decimal: Esto supone: declarar la nueva función, definir la nueva función y modificar la función main para que use la nueva funcion.

Pues bien, haciendo algunos cambios he llegado a esto:

#include <stdio.h>

int hexadecimal (char car1, char car2);
int main ()

{

 char car1;
 char car2;
 char valor1;
 char valor2;
 int valor;
 int flag;
   

   flag=0;
   printf("Introduzca un valor hexadecimal:\n");
   scanf("\n%c%c", &car1, &car2);
   
   valor=hexadecimal(car1,car2);
   
   int hexadecimal (char car1, char car2)
   
   {
   
   if (car1 == 'q' && car2 == 'q')
       {
       printf("Presione enter para salir\n");
       while (getchar()!='\n');
       getchar ();
       return 0;
       }
   
   else
    {
       if('0'<=car1 && car1<='9')
       valor1=car1-'0';
       else if ('A'<=car1 && car1<='F')
       valor1=car1-'A'+10;
       else if ('a'<=car1 && car1<='f')
       valor1=car1-'a'+10;
       else
         {
         flag=1;
         printf("Valor erroneo\n\n");
         }
       
       if('0'<=car2 && car2<='9')
       valor2=car2-'0';
       else if ('A'<=car2 && car2<='F')
       valor2=car2-'A'+ 10;
       else if ('a'<=car2 && car2<='f')
       valor2=car2-'a'+10;
       else
         {
           flag=1;
           printf("Valor erroneo\n\n");
         }

       if (flag==0)
         {
           valor= 16*valor1 + valor2;
           printf("EL valor decimal de 0x%c%c es %d\n",car1,car2,valor);
         }
    }
    }
   

   
   return 0;
}


Pero me da una serie de errores al compilar, ¿alguna ayuda o sugerencia?

Gracias de antemano y saludos!
#31
Programación C/C++ / Calculo de números primos
12 Noviembre 2011, 14:26 PM
Me han dado el siguiente código de programa en c, es un programa que pide un numero por teclado e indica si el número es o no primo, comprobando todos los posibles divisores:



#include <stdio.h>
int main()
{

int valor;

int i;

printf("Introduzca un valor: ");
scanf(" %d", &valor);

for ( i = 2; i < valor; i++ )
if (0 == (valor % i))

printf(" %d no es primo\n", valor);
return 0;
}


He probado el código y es un poco malo, si el número es primo directamente se sale del programa, y si el número no lo es, te lo repite por cada divisor que tenga, y me han pedido que haga que solo se imprima un mensaje indicando si el número es primo o no al final del bucle. Para esto, nos dicen que utilicemos una variable de control, cuando encuentre un divisor se active dicha variable. Y al final del bucle se mostrará el mensaje adecuado segun el valor de la variable de control.

He pensado que se tendría que usar la variable de control flag, pero no sé como implementarla muy bien, ¿alguien podría aclararmelo?, yo lo he intentado poniendo esto:

#include <stdio.h>
int main()
{

int valor;
int i;
int flag;
printf("Introduzca un valor: ");
scanf(" %d", &valor);

flag=0;

for ( i = 2; i < valor; i++ )
if (0 == (valor % i))
{flag=1;
printf(" %d no es primo\n", valor);
}
else
flag=0;
printf(" %d es primo\n", valor);
return 0;
}


Pero aun así, al probarlo me sigue dando error, ¿alguna solución?

Saludos
#32
He realizado este programa que hace lo siguiente: Según el més que indiques, te dirá de que estación se trata, te pide que introduzcas otro numero de mes, hasta que pongas un 0, que el programa saldrá, el código es el siguiente:


// Ficheros include del sistema
#include <stdio.h>
// Ficheros include de la aplicacion
// Constantes de la aplicacion
#define ERROR     0
#define INVIERNO  1
#define PRIMAVERA 2
#define VERANO    3
#define OTONO     4

int main ()
{
int mes;
int estacion;

do
{

printf("Introduzca un mes: ");
scanf(" %d", &mes);
if (mes == 12 || mes == 1 || mes == 2)
estacion = INVIERNO;
else if (mes == 3 || mes == 4 || mes == 5)
estacion = PRIMAVERA;
else if (mes == 6 || mes == 7 || mes == 8)
estacion = VERANO;
else if (mes == 9 || mes == 10 || mes == 11)
estacion = OTONO;
else
estacion = ERROR;
if (mes >= 1 && mes <=12)
printf("El mes %d pertenece a la estacion %d\n", mes, estacion);
}
while (mes > 0 );

return 0;
}


Pero ahora me piden sustituir el if-else anidado por una sentencia switch, y la verdad, no sé como implementarla, ¿alguna sugerencia?

Saludos
#33
Buenas, tengo el siguiente programa que me pide un valor hexadecimal y lo transforma en decimal, sin importar que sea letras mayusculas o minúsculas, es código es el siguiente:

#include <stdio.h>

int main ()
{

char car1;
char car2;
char valor1;
char valor2;
int valor;
printf("Introduzca un valor hexadecimal:\n");
scanf("\n%c%c", &car1, &car2);

if('0'<=car1 && car1<='9')
valor1=car1-'0';
else if ('A'<=car1 && car1<='F')
valor1=car1-'A'+10;
else if ('a'<=car1 && car1<='f')
valor1=car1-'a'+10;

if('0'<=car2 && car2<='9')
valor2=car2-'0';
else if ('A'<=car2 && car2<='F')
valor2=car2-'A'+ 10;
else if ('a'<=car2 && car2<='f')
valor2=car2-'a'+10;

valor= 16*valor1 + valor2;

printf("EL valor decimal de 0x%c%c es %d\n",car1,car2,valor);
return 0;
}


Pero me han pedido que proteja el programa de tal forma que detecte si alguno de los carácteres es inválido, indicándolo con un mensaje de error y no procesándolos.

Lo he intentado poniendo otro if else, pero no sé como sacarlo, ¿alguna ayuda?

Gracias y un saludo