elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 ... 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 [93] 94 95 96 97 98 99 100 101 102
921  Programación / Programación C/C++ / Re: Ayuda con programa en: 3 Diciembre 2018, 23:14 pm
Lo siento pero sigo sin entender el funcionamiento del programa del todo. Como ya te comenté creo:
- Usar una variable <bool exit> que es <false> y si la opción es 0 se pone a <true> no tiene mucho sentido ya que esa variable no tiene ningún propósito.
- Y sustituye los <system("pause")> por <cin.get()>. Vas a conseguir lo mismo, una pausa hasta que teclees algo pero sin tener que hacer una llamada al sistema.
- Tienes que incluir el archivo de cabecera <iostream> ya que sino no puedes usar <cin> ni <cout>.

Ahora vamos a profundizar en el código:
- La función <menu()> la entiendo. Muestras un menú, el usuario elige una opción y esa se devuelve al programa principal. Hasta ahí todo bien. No sé que uso le vas a dar pero dentro de cada <case> puedes poner todo lo que hay que hacer en caso de elegir esa opción. Pero personalmente si la función se llama menú prefiero que sólo muestre el menú y no haga más todo lo demás se haga en el <main> o en otra función creada específicamente para esa tarea.
Lo que no sé es lo que vas a hacer en la función <lectura()> entonces no sé cómo ayudarte... :-X
Supongo que la función <lectura()> llama internamente a <modoA()> usando el fichero que ha abierto. Pero qué más hace? O qué hace la función <modoA()> porque sino sería hacer otro <switch> en la función <lectura()> y según el <modo> que le pases como parámetro llame a la función <modoA()> o <modoB()> (si existe) o lo que tenga que hacer.

Tampoco sé si te mandan usar unas funciones obligatorias o lo estás estructurando cómo tú quieres porque tal y como lo estás haciendo como la opción va de un lado para otro, tienes que estar comparándola un montón de veces para ver que hacer. Si puedes dime que funciones tienes o quieres usar y que tienes en la cabeza que haga cada una (si puedes especificar parámetros o valores de retorno mejor).
922  Sistemas Operativos / Windows / Re: Restaurar Windows 10 en: 3 Diciembre 2018, 16:03 pm
He ejecutado el comando ese en ambos ordenadores. En el que compré recientemente que trae Windows con licencia me sale:
Windows(R), Core edition:
El equipo está activado de forma permanente.

En cambio en el otro donde instalé Windows con una ISO y no tengo licencia me sale:
Windows(R), Core edition:
Windows está en modo de notificación.
923  Programación / Programación C/C++ / Re: necesito ayuda aqui, plox, me podrian ayudar? en: 3 Diciembre 2018, 15:50 pm
Hola, la entrada de datos podria ser asi:
Salu2.

Código
  1. while (opcion != 'n') {
  2.        printf("Nombre del alumno: ");
  3.        scanf("%s",nombre[i]);
  4.        printf("Apellido paterno: ");
  5.        scanf("%s",apellidoPaterno[i]);
  6.        printf("Apellido materno: ");
  7.        scanf("%s",apellidoMaterno[i]);
  8.        printf("Promedio del alumno: ");
  9.        scanf("%f",&promedio[i]);
  10.        getchar();
  11.  
  12.        printf("Capturar mas alumnos s/n: ");
  13.        scanf("%c",&opcion);
  14.        getchar();
  15.        printf("\n");
  16.  
  17.        if (opcion == 's')
  18.            i++;
  19.  
  20.        if (i > 100) {
  21.            printf("Lo siento, la lista esta llena.");
  22.            break;
  23.        }
  24.    }
  25.  

No es recomendable usar <break> para salir de un bloque que no sea un <switch>. Lo correcto sería un <do while> y en el <while> dos condiciones (opcion != 'n' && i < 100). :rolleyes:

Y no controlo demasiado de C sin compilar pero igual tienes problemas con los saltos de línea en el buffer...
924  Programación / Programación C/C++ / Re: Duda de compiladores en: 3 Diciembre 2018, 15:10 pm
En principio los errores son los mismos, un error es un error. Yo también empecé usando Dev en Windows y ahora compilo con gcc y g++ en Ubuntu. La diferencia es que gcc y g++ te añade más comentarios que Dev por ejemplo. Dev únicamente te dice cual es el error. Pero si te fijas con gcc los errores te los muestra en rojo mientras que el resto de comentarios en vez de "error" pone "note".
También puede ser que estés haciendo programas con librerías de Windows. Entonces en Dev en Windows funcionará y con gcc en GNU/Linux no.

Ya me contarás si descubres lo que era. Suerte. :rolleyes:
925  Programación / Programación C/C++ / Re: ahora si ya casi termino este en: 3 Diciembre 2018, 09:41 am
Ya estoy otra vez por aquí, primero un par de cosas que ya te dije ayer:
- No usar <system("pause")>. Cambiarlo por <getchar()>.
- No usar <fflush(stdin)>. AlbertoBSD te dejó un par de enlaces para solucionar ese y otros problemas básicos.

Cosas nuevas de este programa:
- <scanf_s> y <gets_s> son funciones muy fáciles de usar y que quitan trabajo a quien las usa... sin embargo, no son estándar, es decir que yo que compilo los programas en GNU/Linux no puedo compilar un programa con esas instrucciones.
- No es recomendable declarar tantas variables globales. Lo normal es declararlas en el <main> si las vas a usar durante el programa o en la propia función si son de uso temporal.
- Tus dos funciones reciben como primer parámetro un entero <int> pero tú lo que quieres es mandar un array de enteros (o un puntero al comienzo del array  :silbar:).
- Tu función de ordenar los sueldos has puesto que devuelva un entero pero no devuelve nada. Y no entiendo muy bien qué entero vas a devolver. Me equivocaba, sí devuelve algo, devuelve el primer sueldo que está desordenado y se sale por lo que no ordena más.
- Tu otra función además de cambiar el primer parámetro que no está del todo bien, imagino que compara todos los sueldos con el promedio para ver cuántos están por encima de la media. Y en el <for> recorres los 10 primeros sueldos sólo.
- No validas que no existan sueldos negativos. Eso se puede hacer un filtro de toda la vida con un <do while>.
- Y luego para repetir el programa, haces una comparación, si la comparación es 0, pones <w = 1> y si la comparación es distinta de 0, pones <w = 0>. Usa directamente el resultado de la comparación en el <do while> y no le des tantas vueltas a una variable (esto lo vi hace poco en otro programa, no recuerdo si también era tuyo...)

Mis recomendaciones para que trabajes con funciones:
- Una función que te vaya pidiendo los datos y compruebe que los sueldos son positivos. Como valor de retorno un entero con la cantidad de sueldos registrados y como parámetros de entrada un array de <float> para los sueldos y el máximo de sueldos a guardar. En esta función puedes crear las variables <fin> y <final> ya que sólo se usan para repetir la entrada de datos.
- Una función que te ordene los sueldos. Sin valor de retorno y como parámetros de entrada un array de enteros y un entero de cuántos sueldos se han introducido (date cuenta que justo eso es lo que devuelve la función anterior).
- Una función que calcule el total de sueldos. Recibe como entradas un array de <float> y la cantidad de sueldos introducidos. Devuelve un <float> con la suma total.
- Una función que calcule cuántos empleados están por encima de la media. Recibe como entradas un array de <float>, la cantidad de sueldos introducidos y el promedio. Devuelve un entero con la cantidad de ellos que están por encima de la media.

Con estas recomendaciones, las cuales ya sé que son ineficientes ya que recorremos el array más veces de las necesarias, pero que es con fines educativos y para practicar, el programa principal quedaría algo así:
Código
  1. const int MAX_SUELDOS = 100; // O con #define si te gusta más
  2. int main(){
  3.    float sueldos[MAX_SUELDOS];
  4.    float sumaSueldos, sueldoMedio;
  5.    int cantidadSueldosFinal, cantidadSueldosSuperior;
  6.  
  7.    cantidadSueldosFinal = pedirSueldos(sueldos, MAX_SUELDOS); // el segundo parametro no es necesario ya que la variable es global
  8.    sumaSueldos = sumarSueldos(sueldos, cantidadSueldosFinal);
  9.    sueldoMedio = totalSueldos / cantidadSueldosFinal;
  10.    cantidadSueldosSuperiores = superiorMedia(sueldos, cantidadSueldosFinal);
  11.  
  12.    ordenarSueldos(sueldos, cantidadSueldosFinal);
  13.    for(int i = 0; i < cantidadSueldosFinal; i++) // mostramos los sueldos que se vea que estan ordenados
  14.        printf("%.2f  ", sueldos[i]);
  15.  
  16.    // aqui muestras todos los resultados que has ido obteniendo
  17. }

Esto es muy mejorable, piensa por ejemplo que si primero ordenas los sueldos luego es más eficiente calcular cuántos están por encima de la media. Pero eso y como implementar cada función te lo dejo a ti. Lo he intentado hacer lo más sencillo posible para que se entienda bien. Ahora ya te toca trabajar a ti. Suerte :rolleyes:

PD: Te dejo aquí la función <sumarSueldos()> para que veas como se pasan los arrays como parámetros.
Código
  1. float sumarSueldos(float sueldos[], int cantidadSueldos){
  2.    float suma = 0;
  3.    for(int i = 0; i < cantidadSueldos; i++)
  4.        suma += sueldos[i];
  5.    return suma;
  6. }
926  Programación / Programación C/C++ / Re: necesito ayuda aqui, plox, me podrian ayudar? en: 3 Diciembre 2018, 00:31 am
Un par de cosas básicas que hay que arreglar:
- Tienes una variable <R> de tipo <int> y otra variable <R> de tipo <char>. Error, no pueden tener el mismo nombre.
- Como ya te han dicho la función <registro()> no devuelve ningún valor de retorno, no puedes hacer <R = registro(...)>.
- También te han comentado ya como concatenar el nombre con los apellidos, ya que si usas la función <strcpy> lo que haces es copiar una cadena en otra eliminando lo que tuviese la cadena destino. En todo caso infórmate sobre la función <strcat> o mejor aun la variante <strncat> por seguridad.
- Después de la condición de un <if> van las llaves "{}", no va un ";". Además tienes dos <if> seguidos con la misma condición pero con modificaciones que alteran el resultado de la condición y no entiendo muy bien eso.
- El contador <cont1> va a valer 0 o 1 ya que sólo se va a incrementar como mucho una vez. Y por qué hacer los contadores de tipo <float>?? Un contador vale 1 o 2 o 3... pero no 1.5...
- Tienes un bloque entre llaves en el <main> sin sentido. Osea unas llaves que se abren y se cierran pero no llevan ninguna sentencia antes como puede ser un <if> o un <while> o algo por el estilo.
- La función <registro()> recibe como parámetros matrices de tipo <char> y tú le mandas arrays en el <main>.

Otro par de cosas que deberías mejorar:
- No usar <fflush(stdin)>.
- No usar <system("pause")>. Sustitúyelo por <getchar()>.
- No usar <gets>. Usar <fgets> en su lugar.
- Qué narices es el parámetro <n> que pasas por referencia?? Creo entender que es el contador, pero...

Ahora sólo te queda investigar un poco lo que te hemos aconsejado y ver cómo modificas tu programa. Y ahora me voy a dormir que me iba a ir cuando he visto el programa pero iba a tener pesadillas si no hacía nada al respecto. Suerte :rolleyes:
927  Sistemas Operativos / Windows / Re: Restaurar Windows 10 en: 2 Diciembre 2018, 21:11 pm
Vale, muchas gracias por ayudarme a aclarar el montón de cosas que tenía mezcladas. :-X

Ahora lo raro es lo que comentas de que una vez acabado el período de prueba, la pantalla se queda en negro. En mi caso sigue funcionando como el primer día y lo tengo desde hace casi un año, lo que sí tengo es como una marca de agua del logo de Windows pero que es casi imperceptible y esa es una de las cosas que leí que tenías que aguantar mientras no tuviese licencia. Aclarar que no he hecho nada para conseguir una licencia; es decir, descargué la ISO de una página de microsoft, creé el usb booteable usando Rufus e instalé Windows 10 en una máquina en la que tenía Ubuntu 16.04 con arranque dual.
928  Sistemas Operativos / Windows / Re: Restaurar Windows 10 en: 2 Diciembre 2018, 20:05 pm
La imagen del sistema hecha con el creador de herramienta de recuperación del Windows 10 se crea en un USB, y el tamaño del mismo depende de lo que tengas guardado en la maquina...

Entonces lo que no termino de entender es que una imagen de Windows 10 descargada desde la página oficial (quiero decir que no la saqué de ningún sitio desconocido) ocupa 10GB y la imagen que intento crear yo de mi Windows 10 recién adquirido al cual no le he añadido nada ocupa más de 16GB... Eso es porque la mía incluye más cosas que la que se descarga de internet? Igual parece una pregunta tonta pero nunca me he metido en estos temas y estoy intentando empezar a entenderlos bien ahora :-X

Las ISO de Windows nunca traen la licencia, ellas se descargan libremente de gratis y dan un periodo de prueba de 30 días... la licencia se compra aparte...

Lo del período de 30 días no sabía que era así. Cuando yo descargué la ISO de Windows 10 se me especificaba que mientras no tuviese una licencia podía usarlo pero por ejemplo no puedes modificar la configuración. Como yo no uso Windows habitualmente y sólo lo quería para salir del paso cuando me veía obligado a utilizarlo, no quise comprar la licencia ya que no era necesaria.

Para activar el Windows hay varios métodos que se te pueden explicar una vez que lo necesites... o compra tu licencia...
El mejor programa para crear un USB bootable con una imagen ISO de Windows  es Rufus: https://rufus.ie/es_ES.html

Sí, Rufus fue el programa que usé para crear el USB booteable cuando descargué la ISO de internet. Sin embargo ahora lo estoy haciendo todo desde las herramientas que vienen preinstaladas en el Windows 10 que he adquirido.

Entonces lo que yo entiendo hasta ahora, juntando la información que he ido sacando de aquí y de allá, es que si creas únicamente una unidad de recuperación esta te permite arrancar tu pc para poder solucionar algún problema que tuvieses pero no te permite reinstalar el sistema operativo. Si creas la unidad de recuperación y le incluyes una copia del sistema de archivos entonces te sirve para reinstalar el sistema operativo. Y si quieres mantener todos tus documentos y programas entonces tiene que ser mediante una imagen del sistema. Es así?

Y ya para terminar, ahora que ya tengo la licencia de Windows 10; si por ejemplo formateo el pc y vuelvo a instalar este sistema operativo usando la unidad de recuperación que he creado, cómo hago para mantener mi licencia? Eso va almacenado en la cuenta de microsoft que usas para registrarte o hay que buscar algún número de licencia para cuando te lo vuelva a pedir o algo así?

Muchas gracias por la ayuda.  :-X
929  Sistemas Operativos / Windows / Re: Restaurar Windows 10 en: 2 Diciembre 2018, 14:44 pm
Entonces el problema es por el tamaño del USB? Lo digo porque estuve buscando información por ahí y en una página decían que la imagen del sistema no había que hacerla en un USB y entonces pensaba que no se podía hacer independientemente del tamaño.

Además cuando perdí el Windows 7 que tenía descargué una iso de Windows 10 sin licencia (es decir, con las limitaciones que trae) y esta la pude guardar en un USB de 16GB y acabo de mirarlo y me ocupó 10GB. Y ahora mismo no tengo nada personal guardado ni programas instalados quitando los que trae por defecto.

Pero en efecto, si con la unidad de recuperación puedo recuperar el sistema en caso de tener algún problema no necesito la imagen del sistema ya que lo que quiero es poder restaurar el sistema lo más limpio posible, por eso he querido hacer esto nada más adquirir el pc.
930  Programación / Programación C/C++ / Re: Ayuda, violación de segmento en: 2 Diciembre 2018, 12:35 pm
Envía el código de tu programa a ver cómo has hecho los cambios.

Edit: Te escribo aquí un par de cosas más para agilizar esto. Hay dos formas de hacer lo que quieres hacer (bueno igual hay más pero te voy a comentar dos):
- Forma 1: Pasar el puntero a <FILE> como parámetro y que el fichero se abra en la función. Para ello hay que pasar el puntero por referencia y en C todo el paso de parámetros se hace por valor. Entonces no tienes que pasar un <FILE*>, sino un <FILE**>.
Código
  1. void pedirNombre(char nombreFichero[], FILE **fichero){
  2.    do{
  3.        printf("Nombre del fichero: ");
  4.        scanf("%s", nombreFichero);
  5.        *fichero = fopen(nombreFichero, "r");
  6.        if(*fichero == NULL)
  7.            perror("Error al abrir el archivo\n");
  8.    }  while(*fichero == NULL);
  9. }
  10.  
  11. int main(){
  12.    char nombreFichero[STRMAX];
  13.    FILE *fichero;
  14.    pedirNombre(nombreFichero, &fichero);
  15.    // ahora ya haces lo que quieras con <fichero> pues ya esta el fichero abierto
  16. }

- Forma 2: Pasar como parámetro la cadena donde vas a guardar el nombre y hacer que la función devuelva <FILE*>. En ese caso tendrías que asignar el retorno de la función a una variable de tipo <FILE*>.
Código
  1. FILE* pedirNombre(char nombreFichero[]){
  2.    FILE *fichero;
  3.    do{
  4.        printf("Nombre del fichero: ");
  5.        scanf("%s", nombreFichero);
  6.        fichero = fopen(nombreFichero, "r");
  7.        if(fichero == NULL)
  8.            perror("Error al abrir el archivo\n");
  9.    }  while(fichero == NULL);
  10.    return fichero;
  11. }
  12.  
  13. int main(){
  14.    char nombreFichero[STRMAX];
  15.    FILE *fichero = pedirNombre(nombreFichero);
  16.    // Y ahora ya haces lo que quieras con <fichero>
  17. }

Ahora recomendaciones aparte:
- Usas una variable de tipo <float><cantidadNumeros> que siempre va a ser un entero ya que sumas de uno en uno y luego usas una variable tipo <int><i> que hace exactamente lo mismo que <cantidadNumeros>. Una de las dos sobra. Pensarás que para que en <media> se guarde un <float> ambos operandos deben ser <float> pero con que lo sea uno es suficiente, entonces con que <suma> sea de tipo <float>, la media también lo va a ser.

- Al finalizar el programa haces <%.0f> para mostrar la cantidad de números sin decimales. Usa <%d> que sirve para representar enteros y deja el <%.2f> por ejemplo para la media (o con los decimales que quieras).

- Para inicializar los contadores y sumas a 0 lo puedes hacer a la vez que los declaras y así lo haces de una vez. Porque si lo haces por separado puedes usar el valor de una variable antes de inicializarla por lo que tendría basura en ese momento.

- Tu programa también funciona si como has hecho tú abres el fichero en la función <pedirNombre()> y como no lo has pasado por referencia lo vuelves a abrir en el <main> pero es una solución un poco absurda tener que abrirlo en los dos sitios.

Corrige los fallos que tienes y fíjate en cómo están implementadas las dos formas de hacer la función que te he puesto arriba ya que tienen algunas sutiles diferencias por si hay algo que no entiendas. Suerte.
Páginas: 1 ... 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 [93] 94 95 96 97 98 99 100 101 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines