Red de conocimientos turísticos - Información de alquiler - Estudio de caso de impresión en el aula

Estudio de caso de impresión en el aula

Este capítulo describe un caso de impresión simple que se puede completar con solo unas pocas líneas de código. Sin embargo, cuando nos enfrentamos a un problema cada vez más complejo, encontraremos que modificar el código del programa no es suficiente para satisfacer las necesidades cambiantes.

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 |

||| Primavera|

||+------+ |

|| ---+|

|en el|París |

|Primavera|en el||

|Primavera|

|Primavera|

| + ------+|

+-------------+

Nosotros solo necesita un cout

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.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