Estudio de caso de impresión en el aula
El autor creó la clase Imagen para resumir los detalles de los requisitos y comprender cómo manejar estos detalles, especialmente en la parte "Diseño de interfaz", puede considerarse un cliente y hacerse preguntas. ("I ¿Qué operaciones desea y cómo las expresa? ") En la sección "Diseño de interfaz", analizará gradualmente requisitos cada vez más complejos y luego abstraerá la interfaz. El autor le dice que una buena manera de decidir la forma de una operación particular es intentar usarla, y que es mucho más fácil deducir la forma de una operación a partir de ejemplos de su uso que inventar la operación desde cero.
1. El requisito inicial es imprimir el siguiente texto:
París
en
Primavera
2, clase de imagen construida, si imprime el siguiente texto, solo necesita un constructor y una salida para completar:
+-------+
|Paris |
|en la |
|Primavera|
+-------+
3. estilo El código de proceso necesita realizar algunos cambios en el contenido de impresión para completarse. El autor agregó un marco (Imagen) a la clase Imagen para completarlo. Si el contenido de impresión cambia, creo que el autor del código C se rascará la cabeza. :
París+-------+
en|París|
Primavera|en|
|primavera|
+-------+
4. La clase Imagen tendrá una interfaz de operador Imagen (const Imagen, const Imagen) y usará el carácter '|'. operar en dos objetos de Imagen Para la fusión horizontal, use la interfaz del operador de Imagen (Imagen const, Imagen const) y use el carácter '' para la fusión vertical, cuando necesitemos imprimir el siguiente texto:
+-- -------- ----+
||+------+ |
||| París||
|| En | p>
||| Primavera|
||+------+ |
|| ---+| p>
|en el|París |
|Primavera|en el||
|Primavera|
|Primavera|
| + ------+|
+-------------+
Nosotros solo necesita un cout p>
frame(frame(p)
(p | frame(p)))
endl está bien.
El siguiente es el código fuente de la clase Picture (hay algunos errores en el código del libro original, ahora modificado y probado):
1 #include iostream
2
p>3
4 usando el espacio de nombres std;
5
6 clase Imagen
7 {
8 marco de imagen amigo(imagen const); //agregar marco
9 operador de imagen amigo(imagen const, imagen const);
Operador de imagen de 10 amigos|(imagen const, imagen const); // fusionar horizontalmente
operador de ostream de 11 amigos
(ostream o, imagen const p);
12 privado:
13 int alto, ancho;
14 datos char*;
15 posición char(int fila, int col){
16 datos de retorno[fila * ancho + columna];
17 };
18 posición de caracteres (int fila, int col) const{
19 datos de retorno[fila * ancho + col];
20 };
21 void copyblock(int,int,const Imagen);
22 público :
23 Imagen(): altura(0),ancho(0),datos(0){};
24 Imagen(const char* const*, int);
25 Imagen( Imagen constante );
26 ~Imagen();
27 Operador de imagen=(Imagen constante);
28 static int max(int m, int n )
29 {
30 return m
n ?m : n;
31 };
32 void init(int h, int w);
33 void clear(int, int, int, int);
34 };
35
36 ostream
37 operador
(ostream o, const Imagen p)
38 {
39 para (int i = 0; i
p.height; ++i)
40 {
41 for(int j = 0; j
p.position(i,j);
43 o
endl;
44 }
45 return o ;
46 };
47
48
49 void Imagen:: init(int h, int w)
50 {
51 altura = h;
52 w
idth = w;
53 datos = nuevo carácter[alto * ancho];
54 };
55
56 Imagen::Imagen(const char* const* array, int n)
57 {
58 int w = 0;
59 int i;
60 for(i = 0; i
n; i++)
61 w = Imagen::max(w, strlen(array[i]) );
62 init(n,w);
63 for(i = 0; i
n; i++)
64 {
65 const char* src = array[i];<
66 int len = strlen(src);
67 int j = 0;
68 mientras(j
len)
69 {
70 posición(i,j) = src[j] ;
71 ++j;
72 }
73 mientras(j
ancho)
74 {
75 posición(i, j) = ' ';
76 ++j;
77 }
78 }
79 }
80
81 Imagen::Imagen(const Imagen p):
82 alto(p.alto), ancho (p .width),
83 datos(nuevo carácter[p.height * p.width])
84 {
85 copyblock(0,0 ,p );
86 }
87
88 Imagen Imagen::~Imagen()
89 {
90 eliminar []datos;
91 }
92
93 Imagen Imagen::operador=(const Imagen p)
94 {
95 si(¡esto! = p)
96 {
97 Eliminar []datos;
98 init(p.height,p.width);
99 copyblock(0,0,p);
100 }
101 return *this
102 }
103
104 Imagen vacía::copyblock(int fila,int col,const Imagen p)
105 {
106 for(int i =0; i p>
p.altura; ++i )
107 {
108 para(int j = 0; j
p.ancho; + +j)
109 posición(i+fila, j+col) = p.posición(i,j);
110 }
111 }
112
113 Imagen vacía::clear(int h1,int w1,int h2,int w2)<
/p>
114 {
115 for(int r = h1; r
h2; ++r)
116 for(int c = w1; c
w2;++c)
117 posición(r,c) = ' '; 119
120 Marco de imagen(const Imagen p)
121 {
122 Imagen r;
123 r.init(p. alto + 2, p.ancho + 2);
124 for(int i = 1; i
r.alto -1; ++i)
125 {
126 r.posición(i,0) = '|';
127 r.posición(i, r.ancho - 1) = '|';
128 }
129 for(int j = 1; j
r.width - 1; ++j)
130 {
131 r.position(0, j) = '-';
132 r.position(r.height - 1, j) = '-';
133 }
134 r.posición(0, 0) = '+';
135 r.posición(0, r.ancho-1) = '+' ;
136 r.posición(r.altura-1, 0) = '+';
137 r.posición(r.altura-1, r.ancho-1) = '+';
138 r.copyblock(1,1,p);
139 return r;
140 }
141
142 Operador de imagen(imagen constante p, imagen const q)
143 {
144 Imagen r;
145 r .init(p.height + q. height, Imagen::max(p.width ,q.width));
146 r.clear(0,p.width,p.height,r. ancho);
147 r.clear(p.alto,q.ancho,r.alto,r. ancho);
148 r.clear(0,p.ancho, p.height,r.width);
149 r.clear(0,p.height,q.width,r.height,r.width);
141copyblock(0 ,0,p);
149 r.copyblock(p.height,0,q);
150 return r;
151 }
152
153 Operador de imagen|(Imagen const p, Imagen const q)
154 {
155 Imagen r;
156 r.init(Picture::max(p.height,q.height),p.width + q. width);
157 r.clear(p.height,0,r. alto
t,q.width);
158 r.clear(q.height,p.width,r.height,q.width);
159 clear(q.height, p.ancho,r.alto,r.ancho);
159 r.copyblock(0,0,p);
160 r.copyblock(0,p.ancho, q);
161 return r;
162 }
Código de prueba:
1 char *init[]= {"París ", "en el", "Primavera"};
2 Imagen p(init,3);
3 cout
frame(frame(p)
(p | marco(p)))
endl;
1