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 - K-YreX

#271
Nunca he trabajado con Visual Studio pero prueba las siguientes cosas:
  • Escribe la cabecera con comillas dobles:
    Código (cpp) [Seleccionar]
    #include "LibroCalificaciones.h"

  • Comprueba que el nombre del fichero de cabecera concuerda con lo que estás escribiendo, incluso la extensión.

  • Comprueba la ruta del fichero. Tiene que estar en el mismo directorio que el cpp al que lo estás importando. Si está en otro directorio tienes que especificarlo o asegurarte que el compilador está buscando en ese directorio.

    No sé si te haya pasado más veces o tengas otros proyectos en los que se importe correctamente. Si es así comprueba qué cosas estás haciendo de manera diferente y puede que ahí esté el fallo.

    Cualquier resultado, comenta cómo te ha ido.
    Suerte. :-X
#272
Bases de Datos / Re: Trigger SQL
29 Mayo 2020, 16:56 PM
Cita de: thebus4k en 29 Mayo 2020, 16:48 PM
Ya lo tengo, al final me ha quedado así, no entiendo muy bien el por qué del  DELIMITER $$ etc pero nos lo exigen así.
En MySQL es obligatorio que cada sentencia termine con punto y coma a diferencia de SQL Server por ejemplo. Si un trigger tiene varias instrucciones, cada una tiene que terminar en punto y coma. Entonces para delimitar el trigger completo tienes que usar un delimitador diferente de ahí el DELIMITER $$.

En estos casos como el trigger solo tiene una instrucción, puedes obviar el BEGIN...END y así no necesitas usar DELIMITER. Pero para otros casos en los que tus triggers tengan más de una instrucción, estarás obligado a utilizarlo.

PD: Utiliza las etiquetas de Código GeSHi para mostrar código. En tu caso selecciona la correspondiente a SQL.
#273
Bases de Datos / Re: Trigger SQL
29 Mayo 2020, 16:09 PM
Cita de: thebus4k en 29 Mayo 2020, 15:57 PM
Hola, gracias por responder, voy a probar y te comento.
El segundo según lo que me comentas sería sustituir new por old, y también habría que sustituir Insert on por delete on?
Y en el tercero al igual que en el segundo habría que sustituir algún valor más?
Claro, exactamente. En el segundo caso sería AFTER DELETE ON.

Y en el tercer caso sustituir el INSERT/DELETE por UPDATE. Es más, te diría que igual se puede (y debería ser) AFTER UPDATE. Porque en el caso de que no se confirme la actualización, no quieres que se guarde ese "intento de cambio".
No puedo confirmártelo, lo siento, pero haz ambas pruebas y una de las dos tiene que funcionar seguro.

Suerte. :-X
#274
Bases de Datos / Re: Trigger SQL
29 Mayo 2020, 15:47 PM
Cita de: thebus4k en 29 Mayo 2020, 14:39 PM
MariaDB que creo que es MySQL

En ese caso no puedes usar las tablas temporales INSERTED y DELETED pues estas son propias de SQL Server.
El símil que existe en MySQL son las partículas NEW y OLD antes del nombre de una columna.

El primer trigger quedaría:
Código (sql) [Seleccionar]

CREATE TRIGGER tr_persona_insert AFTER INSERT ON tb_persona FOR EACH ROW
  INSERT INTO tb_logs VALUES ('insert', new.dni, null);

La claúsula FOR EACH ROW sirve para los casos en los que insertas varios registros con una única sentencia INSERT. Así el trigger se ejecutará una vez por cada registro. El opuesto sería FOR EACH STATEMENT.

El siguiente trigger no tiene ninguna complicación. Tendrás que usar OLD en vez de NEW.

Para el tercer trigger, el de UPDATE, tendrás que usar BEFORE en vez de AFTER para poder acceder tanto al valor nuevo (NEW) como al viejo (OLD).

Inténtalo y comenta si tienes algún problema.
Suerte. :-X
#275
Programación C/C++ / Re: Punteros
29 Mayo 2020, 08:30 AM
Cita de: Marsi en 29 Mayo 2020, 02:18 AM
.-Realice un programa que tenga una función que mediante apuntadores pueda transformar un
número entero en una cadena de caracteres formada por los dígitos del número entero.
Los punteros dan mucha libertad. Es muy difícil saber qué es lo que te están pidiendo exactamente pero yo creo que podría ser algo así:

void numberToString(int *number, char *string);
char* numberToString(int *number);

En ambos casos es una función que recibe un entero por medio de un puntero, lo que sería el paso por referencia en C, y modifica (primer caso) o crea y devuelve (segundo caso) un puntero a una cadena en la que cada carácter es un dígito del número.

Cita de: Marsi en 29 Mayo 2020, 02:18 AM
.-Empleando apuntadores escribir un programa que lea una línea de texto y escriba en pantalla
las palabras de que consta la línea sin utilizar las funciones de string.h y particularmente sin usar
strtok ().
En este caso quiero entender que tienes que separar cada una de las palabras leídas. Podrías guardar la línea de texto en una cadena unidimensional char[] e ir separando y mostrando alternativamente o, crear un array de cadenas char[][] y en cada fila guardar una de esas palabras.

Todo esto tiene bastante sentido si estás trabajando con memoria dinámica. Si no es así, también podrías hacerlo con memoria estática pero los punteros adquieren menos relevancia en este caso.

De todas formas, tienes que darnos más información sobre el problema. A ser posible con una breve explicación de lo que tú crees que tienes que hacer y cómo estás intentando hacerlo. Ya partimos luego de ahí para poder ayudarte mejor.

Suerte.  :-X
#276
Cita de: l3mm en 28 Mayo 2020, 18:38 PM
hola YreX-DwX, te agradezco mucho el tiempo que has dedicado a la respuesta, la verdad es que mi profesor no nos ha dado muchas clases y no tengo las bases necesarias para resolver el problema, intente hacer el pseudo codigo para el problema, lo hice de la siguiente forma:

PEDIR numero
SI NUMERO es igual o menor que 9 ENTONCES
MOSTRAR "El numero "x9+1 = " Numero +1 veces 1"
SINO
MOSTRAR "Introduzca un numero entre 1 y 9"
FIN SI
Lo primero: ese pseudocódigo no es muy correcto. Estás pidiendo un número <= 9 para mostrar el número en sí. Lo que tienes que hacer es calcular el número en base al que tú pides.
Además es importante el uso correcto de las comillas para mostrar mensajes. Las comillas significan que debe aparecer tal cual. Si pones "numero", se escribirá "numero"; si escribes: numero, se escribirá el valor del numero.

Cita de: l3mm en 28 Mayo 2020, 18:38 PM
Hasta aquí creo entender el problema, sin embargo se me complica al querer escribir código para "numero+1" veces 1, no se en realidad como crear el bucle para ir colocando los 1 las veces que define numero.

Para crear bucles tienes que usar un sentencia while() o for():

SENTENCIA WHILE
Un bucle while(condicion) es un bucle que se repite mientras la condición que pongas dentro sea cierta. Es importante, dentro del bucle modificar algo que afecte a la condición pues sino el bucle siempre será cierto/falso y entonces nunca saldrás/entrarás.
Por ejemplo, para crear el primer número sabiendo el número de dígitos:

PEDIR numeroCifras
i := 1
numero := 0
MIENTRAS i <= numeroCifras HACER
  numero := numero + (i * pow(10, numeroCifras-i)) // pow(base, exponente)
  i := i + 1
FIN MIENTRAS
MOSTRAR "El numero de " + numeroCifras + " cifras es: " + numero




SENTENCIA FOR
Un bucle for(inicializacion, condicion, actualizacion) ejecuta lo que pongas en la inicialización cuando empieza, se repite como el while() cada vez que se cumple la condición y tras terminar cada iteración se ejecuta la actualización. El mismo ejemplo de antes con un for() sería:

PEDIR numeroCifras
numero := 0
PARA i := 1 HASTA numeroCifras INCREMENTO 1 HACER
  numero := numero + (i * pow(10, numeroCifras-i))
  // En este caso no se incrementa la i aqui porque ya lo hemos puesto en el INCREMENTO
FIN PARA


El for() puede parecer un poco más raro, te dejo la forma que tiene en C:

for(int i = 1; i <= numeroCifras; ++i){
  // lo que sea
}
// Intentar usar i aqui da error porque solo existe dentro del for()

También puedes declarar la variable fuera. La diferencia es que si la declaras en el for() solo podrás usarla dentro del for() y si la declaras fuera podrás usarla una vez termine el bloque for().

int i;
for(i = 1; i <= numeroCifras; ++i){
  // lo que sea
}
// Aqui puedes usar la i porque esta declarada fuera del for()



Te dejo que intentes pasar esto a C, no tiene mucha complicación y es más gratificante si lo consigues tú. Lo único un poco raro es la función pow() pero ya existe en C, para poder usarla tienes que incluir la biblioteca <math.h>.

PD: Un bloque while() se puede convertir en un bucle for() y viceversa. La norma general es que si el bucle depende de un contador o índice se use for() y si la condición es de otro tipo, se utilice un while(). Pero ambas soluciones van a ser correctas. En el caso anterior, el uso correcto sería el for() pues depende de un contador i.

Cita de: l3mm en 28 Mayo 2020, 18:38 PM
No se como hacer un arreglo, lo cheque en algunas paginas pero la verdad me perdí por completo, la forma en que puse el primer código, uso las funciones que me enseño el profesor pero no nos ha enseñado otras, solo conozco if y else ¿Podrías orientarme sobre que funciones estudiar para poder llegar a hacer el ejercicio?

Muchisimas gracias
No sé qué pretende que hagáis en este ejercicio pero me parece indispensable el uso de bucles para poder completarlo.
Creo que es mejor que primero lo intentes sin usar arrays/arreglos y luego le vayas introduciendo cosas. Mejor ir poco a poco comprobando que lo que tienes funciona que meter muchas cosas y luego hacerte un lío para arreglar los fallos.
Los arrays están muy relacionados con el bucle for(), te pongo un ejemplo básico de uso de un array con un for():

#include <stdio.h> // Biblioteca para la funcion printf()

#define LONGITUD 10 // Constante que se llama LONGITUD y vale 10. Es recomendable que las uses en vez de inventarte un numero dentro del codigo.
// Si en algun momento quieres cambiar la longitud, solo tendras que cambiar ese 10. Si has ido poniendo 10 por todo el codigo, tendras que cambiarlo muchas veces

int main(){
  int digitos[LONGITUD]; // Declaras un array estatico <digitos> con una longitud de lo que valga LONGITUD (10)
  // La primera posicion del array es 0 y la ultima es LONGITUD-1 (9). Se accede a cada posicion con []
  for(int i = 0; i < LONGITUD; ++i){
    digitos[i] = i; // Guardamos en cada posicion el valor del indice: 0, 1, 2, 3, 4, 5,...
  }
  printf("El contenido del array es:\n");
  for(int i = 0; i < LONGITUD; ++i){
    printf("%d  ", digitos[i]);
  }
  getchar();
  return 0;
}

Los arrays son un tema muy amplio, te recomiendo que busques algún recurso (libros, pdfs, vídeos,...) sobre programación en C. Y las dudas que te surjan las preguntes por aquí porque si tengo que explicarte todo, se va a hacer un tema enorme. Así puedes profundizar más y con más ejemplos.

Ya tienes bastantes cosas para probar.
Suerte. :-X
#277
Si es la primera vez que tocas la programación y este es el primer ejercicio que os ha mandado hacer, tiene toda la pinta de que tienes un profesor un poco duro  :rolleyes: pero bueno, no hay que desanimarse por eso. Con los profesores duros en con los que más se aprende, a base de sacarse las castañas del fuego.

El primer código que pones es, digamos... una locura  :xD.
No es algo malo pues es la forma de pensar de cualquier persona pero los programas crecen muy rápidamente y no se pueden tratar los casos uno por uno porque entonces los códigos serían interminables. Es por esto que te pide sacar la correspondencia entre una cosa y otra, es decir el patrón con el que puedes hacer un programa mucho más corto.

El patrón en este caso si te das cuenta es:
1. Número (que llamaremos A) con n cifras empezando en el que la cifra en la posición 0 (izquierda) es 1 y para cada posición i, la cifra es i+1.
2. (* 9 +), no tiene mayor misterio puesto que siempre es así.
3. Número (que llamaremos B) que se corresponde con n+1. Si n vale 5 en el último caso (12345), B valdrá n+1 = 6.
4. Cantidad de 1s (que llamaremos X). Este valor es igual a B. En el último caso hay 6 1s.

Eso es obtener la correspondencia del ejercicio para poder programarlo. Y este patrón te permite conocer X sin tener que hacer la operación matemática, ya que X siempre tendrá una cantidad de 1s igual al número de dígitos del número de la izquierda + 1.



PARÉNTESIS SOBRE EL PSEUDOCÓDIGO Y UN EJEMPLO MUY SENCILLO

El pseudocódigo es un "lenguaje" para escribir algoritmos de forma más o menos flexible y sencilla para que un programador lo pueda entender. Muchas veces se parecen al código en sí o se puede pasar de uno a otro de forma muy fácil. Por ejemplo:
El pseudocódigo de un algoritmo que solicite un número y muestre si es positivo o negativo:

PEDIR numero
SI numero >= 0 ENTONCES
  MOSTRAR "El numero " + numero + " es positivo"
SINO
  MOSTRAR "El numero " + numero + " es negativo"
FIN SI


El código en C, que parece que es el lenguaje de programación que utilizas, sería:

#include <stdio.h> // Cabecera / Biblioteca que contiene las funciones printf() y scanf() para poder usarlas

int main(){
  int numero;
  printf("Introduce un numero: ");
  scanf("%d", &numero);
  if(numero >= 0){
    printf("El numero %d es positivo", numero);
  }
  else {
    printf("El numero %d es negativo", numero);
  }
  // En caso de que ejecutes directamente el .exe en Windows hay que poner una pausa para que no se cierre hasta que pulses una tecla
  getchar(); // Si lo ejecutas en Linux o desde el IDE, no hace falta
  // La funcion principal main() devuelve un entero al final, normalmente 0 si todo va bien:
  return 0; // Si no lo pones, el compilador lo pondra solo pero solo en esta funcion
}


El pseudocódigo es más importante de lo que suele parecer de primeras. Con él puedes diseñar un algoritmo que hace cosas sin tener que poner cómo las hace. Esto te permite simplificar problemas grandes y compartir algoritmos para luego traducirlos a su correspondiente lenguaje.



Para no hacer el mensaje excesivamente largo, que ya lo es un poco, te recomiendo que intentes lo siguiente:
Un programa que le indiques un número de dígitos (n) y te muestre la fila correspondiente. Por ejemplo, para n = 5:
12345 * 9 + 6 = 111111
El número n puede ser cualquiera así que tendrás que usar algún tipo de bucle (while() o for()).

Cuando tengas lo anterior perfecto, agrega el arreglo. En vez de mostrar el resultado directamente por la pantalla, tienes que ir guardando cada carácter en el arreglo para que quede de tal forma:
arreglo = ['1' | '2' | '3' | '4' | '5' | ' ' | '*' | ' ' | '9' | '6' | ' ' | '=' | ' ' | '1' | '1' | '1' | '1' | '1' | '1'|
Cuando lo tengas ahí guardado, tendrás que recorrer el array para ir mostrando cada posición y que te aparezca el mismo resultado por pantalla.

Ahora es cuando te toca esforzarte a ti e intentar hacer eso  :rolleyes: :rolleyes:
Los problemas que tengas los puedes comentar aquí para orientarte.
Suerte.

PD: Tú estás programando en C (o eso te piden) y el código ese que has conseguido buscando en Internet es C++ con un poco de C. Ten cuidado con eso.
PD 2: Procura que cada función tenga solo un <return>.
#278
Programación C/C++ / Re: Ayuda
28 Mayo 2020, 03:38 AM
Si lo que quieres es buscar en tu array de Agenda, el que tenga el número telefónico igual al que introduces:

Pedir telefono
i := 0
encontrado := -1
MIENTRAS i < longitud(contactos) and encontrado = -1 HACER
  SI contactos[i].telefono = telefono ENTONCES
    encontrado = i
  FIN SI
FIN MIENTRAS

Con este pseudocódigo puedes localizar el índice del contacto que tiene el número de teléfono que buscas. Luego solo es modificar sus campos accediendo a él.
El problema que tienes es que estás mezclando los índices de los contactos con sus números de teléfono.




PD: Unas cuantas mejoras para el programa:
  • Ya que usas una constante para el tamaño de los contactos, por qué no usas también constantes para los arrays de agenda??
  • Algunos nombres de variables no ayudan. opc, opc2, opc12432454... no dice nada. Llámalas opcion_menu, telefono_buscado, indice_buscado... y verás como no tienes el problema que has tenido de confundir un índice con un teléfono.
  • La programación utiliza el principio de una única vez, es decir, no repetir fragmentos de código innecesarios. Tienes un bloque de al menos 30 líneas y otro de unas 10 líneas por lo pronto repetidos... Deberías hacer uso de funciones, no solo para esa parte sino para otras también. Saber modularizar un programa también es programar.
  • Para leer cadenas de caracteres es recomendable usar la función fgets(), no scanf().
  • La biblioteca <conio.h> no pertenece al estándar y no se recomienda su uso. La única función que le das es llamar a getch() y puedes utilizar la función getchar() perteneciente a <stdio.h> en su defecto. Así te ahorras la biblioteca <conio.h>.
  • El único uso recomendado de break es para finalizar cada case de un switch. En tu programa veo algún break con otro fin.
  • Es más seguro utilizar strncpy() para copiar cadenas que strcpy().
    Y el que más me ha dolido de todos: dicen que por cada fflush(stdin) que se utiliza, muere un gatito. No hagas eso a los pobres animalitos inocentes.

    Con aplicar uno o dos de los consejos de esta lista, ese código pasaría de tener 311 líneas a unas 100 o menos y sería más fácil de leer para ti y para los demás. Aunque lo suyo sería que las aplicases todas o prácticamente todas.

    Suerte. :-X
#279
Haber hay muchas y ya hay algunos temas abiertos en el foro destinados a libros para aprender a programar. Te dejo por aquí algunos enlaces:
https://foro.elhacker.net/dudas_generales/listado_de_libros_para_principiantes-t497312.0.html;msg2197810#msg2197810
https://foro.elhacker.net/programacion_general/que_lenguaje_es_mas_facil_para_aprender-t504547.0.html;msg2221135#msg2221135
https://foro.elhacker.net/programacion_cc/librospapers_cc-t296234.0.html;msg1467269#msg1467269

Aunque el último enlace es muy antiguo y puede que los enlaces de descarga ya no funcionen (no lo sé, no lo he probado), es una recopilación muy grande y siempre puedes buscar los títulos en Google.
#280
Cita de: palacio29 en 21 Mayo 2020, 08:17 AM
Modifique esta funcion y le agregue en la linea 8 el i<2.
Lo que no entiendo es porque funciona mal si en el while en la linea 10, como los nombres no son tan largos, lo primero que va a encontrar es el \n y la linea 21 por mas que la saque queda igual.
Aunque añadas la segunda condición en la línea 8 sigues teniendo el problema que tienes en la función lectura().
Te lo muestro por pasos (función auxiliares()):

1. i = 0 -> i < 2?? Sí -> Entra a los dos bucles -> Guarda "Juan Perez" -> Sale -> i++
2. i = 1 -> i < 2?? Sí -> Entra a los dos bucles -> Guarda "Graciela Arpe" -> Sale -> i++
3. i = 2 -> i < 2?? No -> Va a la línea 21 -> aux[2][0] = '\0'

Al final accedes a aux[2][0] y tu array es de 2 dimensiones por lo que solo tiene las filas {0,1}. Esto es un acceso fuera de la memoria permitida. Coincide que justo donde acaba tu array aux, empieza el espacio de memoria de arreglo. Entonces el programa accede sin querer a arreglo[0][0] (que repito, el programa calcula la posición de memoria en la que tendría que estar aux[2][0] pero se encuentra con que esa posición es la de arreglo[0][0]) y cambia su valor.

La forma de hacerlo con fgetc para que no pase esto es... haciéndolo bien  :xD. Es decir, tratando correctamente cada posible situación:

i = 0
letra = fgetc(fichero)
while(i < F && letra != NULL){
 j = 0
 // La ultima columna siempre va a tener \0 entonces no hace falta guardar nada del fichero ahi
 while (j < C-1 AND letra != NULL AND letra != '\n'){
   arreglo[i][j] = letra
   ++j
   letra = fgetc(fichero)
 }
 // Una vez salimos, siempre podemos poner el \0 sin miedo a salirnos porque solo hemos ido hasta C-1
 arreglo[i][j] = '\0'
  if(letra != NULL) letra = fgetc(fichero);
 ++i
}
return i


Igual que antes, en vez de poner un 0 en la primera línea vacía, es mejor que devuelvas el número de filas útiles que tiene tu array. Luego guarda dicho valor en una variable y úsalo cuando quieras mostrar el array. Así no malgastas una fila entera para nada.

Si sigo sin convencerte y quieres poner un 0 al final, recorre el bucle de fuera para i < F-1. Así siempre dejarás la última fila libre para poder guardar ese 0.


EDIT: En el código anterior me he dejado el leer otro carácter al salir del bucle interno. Ahora lo corrijo... :rolleyes: