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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


  Mostrar Mensajes
Páginas: 1 ... 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 [67] 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 ... 102
661  Programación / Programación C/C++ / Re: Reemplazar información de un fichero en: 4 Mayo 2019, 03:14 am
Muy bien, vamos por partes.
  • ¿Por qué es más fácil si "Nombre_alumno_n" va todo junto?
Muy simple. Porque es "una sola palabra". Entiéndase como una sola palabra que no va separado por espacios lo cual permite leerlo de otra forma, en vez de usando <getline()> podemos usar el operador >> como hacemos cuando ponemos < cin >> variable >.
En este caso lo que te propuse para evitar darle tantas vueltas a esto fue lo siguiente, si recuerdas:
Citar
Igual que antes copias las líneas pares pero antes intercalas esto:
Código
  1. file << "Nombre alumno " << contador << "  Alumno " << contador++ << endl;
Inicializando contador en 1 para que vaya incrementándose en cada iteración.
Como conocíamos el formato de la línea podíamos escribirla nosotros sin necesidad de usar lo que habíamos leído. Pero imagina que desconocemos el formato, o que en algún momento cambiaremos el formato del fichero de entrada y cambiamos "Nombre alumno n" por "Nombre". Entonces tendríamos que cambiarlo en nuestro código si queremos que siga quedando igual.
En cambio si lo tenemos en una sola palabra (usando _) podemos leer esa primera palabra, copiarla en el fichero de salida y reemplazar el nombre únicamente. Para ello podemos leer palabra a palabra de la siguiente manera:
Código
  1. string palabra;
  2. while(!fichero.eof())
  3.    fichero >> palabra;
No sé si lo ves. Si leyésemos la línea entera tendríamos que ver dónde empieza el nombre para ver dónde empezar a reemplazar. De esta forma leemos la primera palabra, la copiamos, leemos la segunda (para poder avanzar en el fichero) pero la obviamos y reemplazamos por lo que nosotros queramos poner. También podemos leer el nombre si fuera una sola palabra y modificar el <string> que almacena el nombre y volver a guardarlo. Por hacerlo menos manual.

Esto que te comento se ve mucho mejor en la otra línea, en la que se encuentran las notas. Si leemos la línea entera pues luego tendríamos que calcular nosotros dónde empieza la nota para separarla y convertirla en un <double> por ejemplo y luego guardarla en otra variable para poder trabajar con ella... En definitiva, un rollo :-\
Al poder leer por palabras podemos guardar la primera en un <string> que sea siempre el mismo ya que no lo necesitamos y la segunda palabra (la nota en este caso) en otra variable.
Para ello cómo te he comentado antes debemos usar el operador >> en lugar de <getline()>. Te pongo un ejemplo de cómo quedaría:
Código
  1. string palabra, linea; // linea es innecesaria, podemos usar la misma variable para todo pero es para verlo mejor
  2. double notas[SIZE]; // si no trabajamos con memoria dinamica ponemos un SIZE suficientemente grande
  3. int num_notas = 0;
  4. while(!fichero.eof()){
  5.    getline(fichero, linea);
  6.    fichero >> palabra >> notas[num_notas++];
  7. }
Con ese código vamos almacenando las líneas impares en línea (que son las que menos nos interesan ahora) y luego de las líneas pares guardamos la primera palabra (notas_alumno_n) en <palabra> y la nota en <notas>. Repito, como no estamos utilizando ni <linea> ni <palabra> para trabajar podemos usar la misma variable para ambas cosas, pero lo he puesto así para que fuera más visual.
Hecho esto tenemos en el array <notas> todas las notas almacenadas para trabajar con ellas y en la variable <num_notas> el número de notas que hemos almacenado para no recorrer el array entero en caso de que nos sobren posiciones.

Respecto a lo que has mencionado de la función <seekg()>, eso son funciones para acceso aleatorio de un fichero pero si estás empezando te recomiendo trabajar con acceso secuencial hasta que hayas cogido práctica al menos. Casi siempre tendrás que usar alguna variable "vertedero" donde ir dejando lo que no te interesa pero se como has visto, se puede hacer.

Espero que te sirva para completar tu programa. Suerte :-X
662  Programación / Programación C/C++ / Re: AYUDA! C en: 1 Mayo 2019, 00:36 am
Si quieres comprobar si un valor ya existe en un array, tienes que comparar ese elemento con cada uno de los elementos del array. Para mejorar la eficiencia puedes crear una variable de tipo <bool> para dejar de recorrer el array cuando ya lo has encontrado. Por ejemplo:
Código
  1. for(size_t i = 0; i < size and !encontrado; ++i)
  2.    if(v[i] == elemento_buscado)
  3.        encontrado = true;
663  Programación / Programación C/C++ / Re: Matriz sin areas cerradas(punteros) en: 29 Abril 2019, 18:05 pm
La forma más sencilla es que recorras toda la matriz y compares cada casilla que rodea a la que estás situado con el valor contrario al de esa casilla.
664  Programación / Programación C/C++ / Re: Reemplazar información de un fichero en: 27 Abril 2019, 15:40 pm
Claro a ver, todo depende de cuál quieras que sea el resultado. Pongamos el supuesto de ejemplo que has comentado tú:
Código:
Nombre alumno 1   Pepito Pérez
nota_alumno_1      5.8
Nombre alumno 2   Juan Gómez
nota_alumno_2      3.3
...               ...
Nombre alumno n   Mauricio Colmenero
nota_alumno_n      8.2
Supongo que "Nombre alumno n" no va con _ (lo cuál sería más fácil de leer todo el bloque junto).

  • OPCION 1: Como tú dices copiar sólo las líneas pares.
Código:
nota_alumno_1   5.8
nota_alumno_2   3.3
...                         ...
nota_alumno_n   8.2
Para conseguir esto debes ir leyendo línea a línea y escribir en el fichero de salida sólo las pares. Para leer una línea usa la función <getline()>
Código
  1. istream& getline(istream&, string&, char delimitador) // esta es la funcion para que veas los parametros
  2. // el char es opcional y es para que lea solo hasta un caracter delimitador
  3.  
  4. // Te pongo un ejemplo de uso
  5. string linea;
  6. while(!file.eof()){
  7.    getline(file, linea);
  8.    cout << linea << endl;
  9. }

  • OPCION 2: Sustituir el nombre del alumno por "Alumno 1", "Alumno 2", ... , "Alumno n". Para esto sabiendo el formato de la línea que es "Nombre alumno n" no hace falta copiar esa línea sino simplemente sustituirla y hacer algo así:
Código:
Nombre alumno 1   Alumno 1
nota_alumno_1      5.8
Nombre alumno 2   Alumno 2
nota_alumno_2      3.3
...               ...
Nombre alumno n   Alumno n
nota_alumno_n      8.2
Igual que antes copias las líneas pares pero antes intercalas esto:
Código
  1. file << "Nombre alumno " << contador << "  Alumno " << contador++ << endl;
Inicializando contador en 1 para que vaya incrementándose en cada iteración.

Espero que te sirva y suerte :-X
665  Programación / Programación C/C++ / Re: Reemplazar información de un fichero en: 25 Abril 2019, 15:08 pm
Los ficheros son de lectura/escritura por lo que para trabajar con los datos debes guardar esos datos en variables. Para ello debes conoces la estructura que tiene el fichero.
Imagina que el fichero tiene la siguiente estructura:
Código:
Nombre Nota 
Vamos a dividir el problema en dos partes:
  • PARTE 1: Modificar los nombres
Como no puedes usar estructuras de datos (arrays) necesitarás una variable para el nombre <string> o <char*> y otra para la nota <double> o <float>. Entonces deberás seguir la siguiente estructura:
Código:
mientras !fin_fichero_entrada
    nombre <-- leer(fichero_entrada)
    edad <-- leer(fichero_entrada)
    nombre := nuevo_nombre
    escribir(nombre, fichero_salida)
    escribir(edad, fichero_salida)
fin mientras

  • PARTE 2: Calcular la media
Para esto necesitas otras dos variables <suma_notas> y <num_alumnos>. Entonces la estructura es la siguiente:
Código:
suma_notas := 0
num_alumnos := 0
mientras !fin_fichero_entrada
    nombre <-- leer(fichero_entrada) // aunque no lo usamos debemos recorrer todo el fichero
    edad <-- leer(fichero_entrada)
    suma_notas := suma_notas + edad
    num_alumnos := num_alumnos + 1
fin mientras

media := suma_notas / num_alumnos

Espero que te sirva para resolver el problema. Si tienes algún problema más puedes dejar tus avances para poder ayudarte mejor. Tampoco sé si estás programando en C o C++...
Suerte :-X
666  Programación / Programación C/C++ / Re: PROGRAMA Y ARREGLOS en: 25 Abril 2019, 03:48 am
Como estás empezando y parece que quieres aprender te comento un par de cosas más:
  • La librería <iostream> es sin la h.
  • Las librerías que terminan en ".h" son características de C, aunque se pueden usar en C++, las de C++ pierden el ".h" y se añade una "c" al principio. (<math.h> -> <cmath>).
  • La librería <conio.h> no es recomendable usarla ya que no es estándar. Es decir, que no está disponible en todos los compiladores por lo que puede dar errores. Además no es necesaria. En tu caso la incluyes para usar la función <getch>. Esta función se puede sustituir en C++ por <cin.get()> (incluida en <iostream>).
También usas la función <clrsrc()> para limpiar la pantalla. Primero te recomendaría, como estás empezando, no usar funciones fanzy (funciones de adorno) y centrarte en resolver el problema que se propone.
  • En caso de querer limpiar la pantalla tienes <system("cls")> (Windows) y <system("clear")> (Linux) para las cuales solo es necesaria la librería <cstdlib>.

Ahora vamos al problema. Para comprobar si un elemento existe en un array/arreglo/vector hay que recorrer dicho array elemento por elemento. La idea sería la siguiente:
Código:
i := 0
encontrado = false
mientras !encontrado and i < n
    si v[i] == elemento_buscado
        encontrado = true
    fin si
fin mientras

si encontrado
    "El elemento esta en el array"
sino
    "El elemento no esta en el array"
fin si

Usamos una variable de tipo booleana <bool> para determinar si ya hemos encontrado el elemento que buscamos. Recorremos el array y comparamos cada elemento con el elemento buscado, si coinciden, actualizamos el valor de <encontrado> para que termine el bucle. Así una vez encuentra el elemento, no sigue recorriendo el array.
El bucle puede terminar por dos razones: por haber llegado al final del arreglo, lo que podemos traducir como (i == n) siendo <n> el tamaño del array o porque la variable <encontrado> vale <true>. Entonces cuando termina el bucle, comprobamos si la variable <encontrado> vale <true>, si es así es que el elemento existe, sino es que ha terminado el bucle por la otra condición y entonces no existe el elemento.

Te dejo que conviertas ese pseudocódigo a C++ para que practiques y cualquier duda, puedes comentarla aquí.
Suerte :-X
667  Programación / Programación C/C++ / Re: Símbolos no encontrados para arquitectura x86/x64 en: 23 Abril 2019, 19:37 pm
No sé exactamente a qué se debe ese error, por lo que he leído puede ser un problema debido a que estés trabajando con varios ficheros y tengas un error en la orden de compilación.

Lo que sí puedo decirte es que estás guardando una cadena de <char> en unos punteros a <char> sin reservar memoria y después estás liberando esa memoria (memoria que no has reservado)... Espero que te sirva de ayuda.

Suerte :-X
668  Programación / Programación C/C++ / Re: Dev-C++ en: 21 Abril 2019, 20:22 pm
Lo primero coloca tu código entre etiquetas de código GeSHi (encima del cuadro de texto tienes un menú desplegable para elegir el lenguaje en el que está el código)...

A ver tienes un par de errores y unas cuántas mejoras que puedes hacer.
Vamos a ver los errores que tienes:
  • Antes de las declaraciones de las funciones <menu()>, <suma()> y <resta()> tienes un punto y coma que no debería estar ahí.
  • En la implementación de la función <menu()> te sobra el punto y coma antes del corchete. Cuando declaras prototipos las funciones terminan en punto y coma, pero cuando implementas el cuerpo de la función, no se pone punto y coma.
  • En la función <menu()> tienes escrito <Printf()> en lugar de <printf()>. En C/C++ hay distinción entre minúsculas y mayúsculas, es decir; la función <sumar()> no es la misma que la función <Sumar()> y la variable <numero> no es la misma que la variable <Numero>.
  • En C/C++ las comparaciones se hacen con dos iguales "==" y las asignaciones con un igual "=". En el <while> de <menu()> estás usando un solo igual por lo que estás asignando a respuesta el valor 1 y entonces siempre se considera la condición como verdadera (ya que se entiende 0 = false y 1 = true).
  • No haces operaciones sobre la variable <res>. Entonces el resultado siempre se muestra 0.

Y ahora vamos a ver algunos consejos:
  • No usar la librería <conio.h>. La función <getch()> de <conio.h> se puede sustituir por <getchar()> de <stdio.h> (para C) o <cin.get()> de <iostream> para C++
  • No usar variables globales innecesarias.
  • Las funciones es mejor que retornen el resultado en vez de mostrarlo porque a veces querrás calcular muchas sumas y no querrás que todas se muestren por pantalla. Hay que darle generalidad a las funciones para poder reutilizarlas.

Suerte :-X
669  Programación / Programación C/C++ / Re: typedef struct con punteros en: 19 Abril 2019, 20:50 pm
Como bien has comentado, lo estás interpretando mal. Lo primero que debemos tener en cuenta es un poco de teoría.
  • ¿Cómo funciona una cola?
Una cola es un contenedor de tipo FIFO (first in, first out) o lo que es lo mismo "el primero en entrar es el primero en salir". Es decir, es como una lista en el que las inserciones se hacen por un extremo y las expulsiones, por el otro. Pongamos un ejemplo de una cola en la que queremos meter los números del 1 al 5 en orden ascendente:
Código:
Cola1: 1
Cola2: 2 1
Cola3: 3 2 1
Cola4: 4 3 2 1
Cola5: 5 4 3 2 1
Y ahora vamos a sacar los elementos de la cola. Como hemos dicho antes se sacan por el extremo opuesto, entonces en este caso, por la derecha:
Código:
Expulsion1: 1    Cola: 5 4 3 2
Expulsion2: 2    Cola: 5 4 3
Expulsion3: 3    Cola: 5 4
Expulsion4: 4    Cola: 5
Expulsion5: 5    Cola: (vacia)

Teniendo esto claro, pasamos al código que tienes:
  • El puntero <siguiente> de <ultimo> siempre debe apuntar a NULL
  • Las inserciones siempre se hacen en <primero>. Entonces para una nueva inserción se hace siguiendo los siguiente pasos:
1. Crear nodo nuevo.
2. <siguiente> del nodo nuevo apunta al mismo nodo que <primero>
3. <primero> apunta al nuevo nodo.
  • Las expulsiones se hacen siempre del último nodo. Y los pasos serían los siguientes:
1. Llegamos hasta el penúltimo elemento.
2. Borramos la memoria del último elemento.
3. Hacemos que <ultimo> apunte al penúltimo.
4. Hacemos que <ultimo->siguiente> apunte a NULL.

Creo que no me he dejado nada; si no es así, pueden decírmelo para corregir lo que sea necesario.
Suerte :-X
670  Programación / Programación C/C++ / Re: Necesito ayuda con un trabajo Para solo ingresar numeros en: 15 Abril 2019, 23:28 pm
No entiendo muy bien la pregunta, pero imagino que quieres controlar que no se introduzcan otros caracteres que no sean números. Para ello debes usar un filtro <do while>.
Por ejemplo un filtro para controlar que se introduzca un número entre [0,9] sería:
Código
  1. do{
  2.    cout << "Introduce un numero [0,9]: ";
  3.    cin >> respuesta;
  4. }   while(respuesta < 0 || respuesta > 9);

PD: Coloca tu código entre etiquetas de código GeSHi (hay un desplegable encima del cuadro de texto para elegir el lenguaje deseado). :-X
Páginas: 1 ... 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 [67] 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines