Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 11 Junio 2018, 22:43 pm



Título: Ayuda con un problema de Estructura de Datos
Publicado por: Beginner Web en 11 Junio 2018, 22:43 pm
Necesito ayuda con la creacion de un TDA Simple,
El problema dice asi;
Definir el TDA Pixel con las siguientes operaciones;
*Crear pixel: Dado 3 valores enteros devuelve un pixel
*Validar Pixel: Dado un pixel, determinar si sus valores son correctos. Considere que los puntos asumen valores solo en el rango[0,255]
*Mostrar pixel: Muestra el valor de sus componentes
*Crear blanco: Dado un pixel genera a sus  puntos los valores apropiados para generar blanco
*Crear negro: Dado un pixel genera a sus  puntos los valores apropiados para generar negro

Implementar el TDA PIxel utilizando a) arreglos, b)registros.

No entiendo bien como y que es lo que tengo que hacer si alguien me ayuda, estare muy agradecido, cualquer ayuda , manual lo que sea me sirve desde ya muchas gracias.

Código
  1. #include <iostream>
  2. #include <string.h>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. typedef struct{
  8. int rojo;
  9. int azul;
  10. int verde;
  11. }tpixel;
  12.  
  13. const int x=255, y=255;
  14.  
  15. void crear_pixel(tpixel &color);
  16. bool validar_pixel(tpixel color);
  17. void mostrar_pixel(tpixel color);
  18. void generar_blanco();
  19. void generar_negro();
  20.  
  21. int main()
  22. {
  23. tpixel color_pixel;
  24. crear_pixel(color_pixel);
  25. mostrar_pixel(color_pixel);
  26. generar_blanco();
  27. generar_negro();
  28. system("pause");
  29. return 0;
  30. }
  31.  
  32. void crear_pixel(tpixel &color)
  33. {
  34. do{
  35. cout << "Ingrese rojo : "; cin >> color.rojo;
  36. cout << "Ingrese verde: "; cin >> color.verde;
  37. cout << "Ingrese azul : "; cin >> color.azul;
  38. }while(validar_pixel(color)!=true);
  39. }
  40.  
  41. bool validar_pixel(tpixel color)
  42. {
  43. if((color.rojo<0 || color.rojo>255) || (color.verde<0 || color.verde>255) || (color.azul<0 || color.azul>255)){
  44. return false;
  45. }
  46. else{
  47. return true;
  48. }
  49. }
  50.  
  51. void mostrar_pixel(tpixel color)
  52. {
  53. cout << "Rojo : " << color.rojo << endl;
  54. cout << "Verde: " << color.verde << endl;
  55. cout << "Azul : " << color.azul << endl;
  56. }
  57.  
  58. void generar_blanco()
  59. {
  60. ofstream img("picture.ppm");
  61. img << "P3" << endl;
  62. img << x << " " << y << endl;
  63. img << "255" << endl;
  64. for(int i=0; i<x; i++){
  65. for(int k=0; k<y; k++){
  66. int r=x%255;
  67. int g=y%255;
  68. int b=y*x%255;
  69. img << r << " " << g << " " << b << endl;
  70. }
  71. }
  72. system("open picture.ppm");
  73. }
  74.  
  75. void generar_negro()
  76. {
  77.  
  78. }
  79.  
  80.  
  81.  


Título: Re: Ayuda con un problema de Estructura de Datos
Publicado por: Serapis en 11 Junio 2018, 23:21 pm
Más o menos como lo llevas...


con registros:
Código:
Estructura Pixel
    byte rojo
    byte verde
    byte azul
fin estructura

* Crear pixel: Dado 3 valores enteros devuelve un pixel
Código:
pixel = funcion CrearPixel(entero rojo, entero Verde, entero Azul)
    pixel px
    
    // Como pide que entren enteros y no bytes es preciso verificar que están en el rango dado (y si no se truncan al límite).
    px.Rojo = FijarRangoByte(rojo)
    px.Verde = FijarRangoByte(verde)
    px.Azul = FijarRangoByte(azul)

    devolver px
fin funcion

*Validar Pixel: Dado un pixel, determinar si sus valores son correctos. Considere que los puntos asumen valores solo en el rango[0,255]
OJO: esta función no es exactamente 'validar', validar supone rechazar si no están en el rango reclamado, aquí se trunca, se fuerza un valor si o sí...
Código:
// Trunca un entero a byte si queda fuera de los límites de byte.
byte = FijarRangoByte(entero Valor)
    byte b
    Si valor <0
        b= 0
    osi valor> 255
        b= 255
    sino
        b = valor
    fin si

    devolver b
fin funcion


*Validar Pixel: Dado un pixel, determinar si sus valores son correctos. Considere que los puntos asumen valores solo en el rango[0,255]
Código:
// Aquí se valida, pero no se indica queé hacer en caso de que falle la validación... luego no resulta útil por sí misma.
buleano = ValidarRangoByte(entero Valor)
    Si ((valor >= 0) y (valor <= 255))
        devolver TRUE
    sino
        devolver FALSE
    fin si
fin funcion

*Mostrar pixel: Muestra el valor de sus componentes
Código:
funcion MostrarPixel(pixel px)
    imprimir "los valores del píxel son: " + nuevalinea + "   Rojo: " + px.rojo + nuevalinea + "   Verde: " + px.verde + nuevalinea + "   Azul: " + px.azul
fin funcion

*Crear blanco: Dado un pixel genera a sus  puntos los valores apropiados para generar blanco
Te pongo 2 funciones. Realmente las dos son iguales, pero la enunciación parece pedirte la 2ª...
Código:
pixel = funcion  CrearPixelBlanco
    devolver CrearPixelGris(255)
fin funcion

funcion CrearPixelBlanco(pixel px)
    ModificarPixelGris(px, 255)
fin funcion

*Crear negro: Dado un pixel genera a sus  puntos los valores apropiados para generar negro
Te pongo 2 funciones. Realmente las dos son iguales, pero la enunciación parece pedirte la 2ª...
Código:
pixel = funcion  CrearPixelNegro
    devolver CrearPixelGris(0)
fin funcion

funcion CrearPixelNegro(pixel px)
    ModificarPixelGris(px, 0)
fin funcio

Crear Gris: genera los valores apropiados para generar un nivel de gris (0-255)
Código:
// Asigna el mismo valor a los 3 canales del pixel CREADO...
pixel = funcion CrearPixelGris(byte valor)
    pixel px
    px.Rojo = valor
    px.verde = valor
    px.Azul = valor

    devolver px
fin funcion

// Asigna el mismo valor a los 3 canales del pixel RECIBIDO...
funcion ModificarPixelGris(pixel px, byte valor)
    px.Rojo = valor
    px.verde = valor
    px.Azul = valor
fin funcion






Luego te pide lo mismo (o de forma alternativa?), pero en vez de usar una estructura, usar un array, como se muestra aquí:
Código:
Array bytes Pixel[0 a 2]

es básicamente lo mismo pero usando un array en vez de una estructura, luego solo te pongo la 1ª función...
* Crear pixel: Dado 3 valores enteros devuelve un pixel
Código:
array bytes = funcion CrearPixel(entero rojo, entero Verde, entero Azul)
    array bytes px[0 a 2]
    
    // Como pide que entren enteros y no bytes es preciso verificar que están en el rango dado (y si no se truncan al límite).
    px[0] = FijarRangoByte(rojo)
    px[1] = FijarRangoByte(verde)
    px[2] = FijarRangoByte(azul)

    devolver px
fin funcion


p.d.: en el enunciado que pones no señala nada acerca de alguna imagen , todo parece referirse in situ a un píxel individual... si al final debe aplicarse sobre una imagen las funciones deben modificarse (para lojar el bucle que recorra la imagen entera en la función) o bien añadir un bucle para llamarlas por cada píxel (esto es mucho más lento, pero vale si su único propósito es un ejercicio).


Título: Re: Ayuda con un problema de Estructura de Datos
Publicado por: Beginner Web en 12 Junio 2018, 07:53 am
Gracias @NEBIRE ahora lo entiendo un poco mas, lo que no se es como mostrar pixel/color en la consola de comandos.  ;-)

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. typedef struct{
  6. int rojo;
  7. int verde;
  8. int azul;
  9. }tpixel;
  10.  
  11. void crear_pixel(tpixel &color);
  12. bool validar_pixel(tpixel color);
  13. void mostrar_pixel(tpixel color);
  14. void generar_blanco(tpixel color);
  15. void generar_negro(tpixel color);
  16.  
  17. int main()
  18. {
  19. tpixel p;
  20. crear_pixel(p);
  21. mostrar_pixel(p);
  22. generar_blanco(p);
  23. generar_negro(p);
  24. system("pause");
  25. return 0;
  26. }
  27.  
  28. void crear_pixel(tpixel &color)
  29. {
  30. do{
  31. cout << "Ingrese rojo : "; cin >> color.rojo;
  32. cout << "Ingrese verde: "; cin >> color.verde;
  33. cout << "Ingrese azul : "; cin >> color.azul;
  34. }while(validar_pixel(color)!=true);
  35. }
  36.  
  37. bool validar_pixel(tpixel color)
  38. {
  39. if((color.rojo<0 || color.rojo>255) || (color.verde<0 || color.verde>255) || (color.azul<0 || color.azul>255)){
  40. return false;
  41. }
  42. else{
  43. return true;
  44. }
  45. }
  46.  
  47. void mostrar_pixel(tpixel color)
  48. {
  49. cout << "Rojo : " << color.rojo << endl;
  50. cout << "Verde: " << color.verde << endl;
  51. cout << "Azul : " << color.azul << endl;
  52. }
  53.  
  54. void generar_blanco(tpixel color)
  55. {
  56. color.rojo=255;
  57. color.verde=255;
  58. color.azul=255;
  59. cout << "Blanco" << endl;
  60. mostrar_pixel(color);
  61. }
  62.  
  63. void generar_negro(tpixel color)
  64. {
  65. color.rojo=0;
  66. color.verde=0;
  67. color.azul=0;
  68. cout << "Negro" << endl;
  69. mostrar_pixel(color);
  70. }
  71.