selección de casos de diseño de cursos de visual c y guía de programación 8-1 respuestas
#includelt;iostream.hgt;
#includelt;stdlib.hgt;
//usando el espacio de nombres std;
// -------------------------------------------------- -
typedef enum Tipo {Array, Punteros} Tipo;
typedef int Datos;
//------------ ---------------------------------------
clase UList // Clase base
{
público:
virtual int Size()=0;
virtual bool Insert(const Dataamp;, int )=0;
virtual bool Eliminar(int)=0;
virtual int Buscar(const Dataamp;)=0
virtual bool Obtener(int) , Dataamp;)=0;
virtual void Print()const=0;
};
//--------- -------------------------------------------------- --------------------------
clase PList: public UList //clase de operación de lista enlazada
{
clase Nodo{
Elemento de datos
Nodo *siguiente
público:
Nodo (const Data amp; dat): elemento (dat), siguiente (NULL) {} //Datos de inicialización
Nodo (const Node amp; nod): elemento (nod.item), siguiente (NULL) { } //
clase de amigo PList
};
Nodo *begin; //Puntero al encabezado
Nodo * end ; //Puntero a la cola
int num;
public:
PList(): comenzar(NULL), end(NULL), num( 0 ){}
~PList(){
Nodo *tmp=begin;
while(numgt;0){
comenzar =begin-gt;siguiente;
eliminar tmp;
tmp=begin;
}
}
/*Función*/ int Tamaño(){return num;}
/*Número*/ bool Insert(const Dataamp;, int);
/*Extensión*/ booleano Quitar
(int);
int Buscar(const Datosamp;);
bool Obtener(int, Datosamp;
/*明*/ void Imprimir( )const;
};
//----------------------------- --- ----------------------------------------------- --- ---
clase AList: public UList //Clase de operación matricial
{
Datos *arr // contiene la matriz dinámica
; p>
int num; // celdas llenas hasta el momento
public:
static const int MAX_SIZE; // valor inicial max_size
AList() : arr( nuevos datos[MAX_SIZE]), num(0){}
~AList(){delete[] arr;}
int Size(){return num;}
bool Insert(const Dataamp;, int);
bool Remove(int
int Find(const Dataamp;); p> bool Get(int, Dataamp;);
void Print()const;
};
//-------- --- ----------------------------------------------- --- -------
UList* init_list(Tipo
//-----------------); --- ---------------------------------------- p>
clase UStack // Clase de operación de pila
{
UList *stk;
público:
UStack(Tipo k): stk( init_list(k)){};
bool Push(const Dataamp;);
bool Top(Dataamp;)
bool Pop(Dataamp; );
void Print()const{stk-gt;Print(); return;};
};
// ----- --------------------------------------- ----- ---------------------
const int AList::MAX_SIZE = 4;
/ /---- --------------------------------------- ----- ---------------------
UList* init_list(Kind k) //Función de inicialización
<p>{
UList *tmp;
switch(k){
case Matriz:
tmp=new AList; p> p>
descanso;
caso Punteros:
tmp=new PList
descanso
predeterminado:
coutlt;lt;endllt;lt;"opción desconocida"lt;lt;endl;
return NULL;
}
return tmp;
}
//------------------------------- ------------------------------------------------------
bool PList::Insert(const Data amp; x, int place) //Operación de inserción de lista enlazada
{
Nodo *tmp;
if ((placelt ;=0)||(placegt;num 1))
return false;
if (place==1) // insertar al principio del list
{ //Insertar al principio de la lista enlazada
tmp=begin;
begin=new Node(x);
comenzar-gt; next=tmp ;
if (num==0) // en caso de que sea el único elemento en la lista
{ //Solo un dato p>
end=begin;
end-gt; next=NULL
}
}
si ( place==num 1) // insertar al final de la lista
{ //Insertar al final de la lista enlazada
tmp=end;
end=nuevo Nodo(x);
end-gt; next=NULL;
tmp-gt; next=end;
else
{
Nodo *titular;
tmp=begin
for(int i=1; ilt; place-1; i) // reenviar hasta la lista (lugar -1)
tmp=tmp-gt; //Púltimo en la lista vinculada
holder=tmp -gt; siguiente;
tmp-gt ;siguiente=nuevo Nodo(x);
tmp-gt;siguiente-gt;siguiente=titular;
}
num;
devuelve verdadero;
}
//------------- -------------- -----------------------
----------------------------------
bool PList::Eliminar(int lugar) // Operación de eliminación de lista enlazada
{
Nodo *tmp=begin;
if((placelt;=0)||(placegt;num 1) )
return false;
if(place==1) // eliminar el primer elemento
{ //eliminar los primeros datos
comenzar=begin-gt; siguiente;
eliminar tmp;
}
else if(place==num) // eliminar el último elemento
{ //Eliminar los últimos datos
for(int i=1; ilt; place-1; i)
tmp=tmp-gt; // Encuentra el final desde el principio
eliminar final
end=tmp
end-gt; > }
else
{
Nodo *titular;
for(int i=1; ilt; place-1; i )
tmp=tmp-gt;siguiente;
titular=tmp-gt;siguiente;
tmp-gt;siguiente=titular-gt;siguiente;
p>
eliminar titular
}
if(num==1)
end=begin=NULL;
--num;
devuelve verdadero;
}
//------------ ------ -------------------------------------------- ------ ------------
int PList::Find(const Data amp;x) //Búsqueda de nodos de lista vinculada
{
Nodo *tmp=begin;
int i=1;
while((tmp!=NULL)amp;amp;(tmp-gt; elemento!=x))
{
i;
tmp=tmp-gt;
}
if (tmp= =NULL)
devuelve 0;
devuelve i
}
//--- ------- ------------------------------------------- ------- ---------------------
bool PList::Get(int place, Data amp; ret) / /Obtener datos del nodo
{
Nodo *tmp=begin;
if((placelt;=0)||(placegt;num 1))
<p> devuelve falso;
for(int i=1; ilt; lugar; i)
tmp = tmp-gt;
ret = tmp -gt;item;
devuelve verdadero;
}
//------------------ -------------------------------------------------- ---------------
void PList::Print(void)const{ //Salida de lista enlazada
if (num==0 ) retorno;
coutlt; lt; "cabeza";
for(Nodo *tmp=begin; tmp!=NULL; tmp=tmp-gt; siguiente){
coutlt;lt;"-gt;"lt;lt;tmp-gt;item;
}
coutlt;lt;endl;
regresar;
}
//------------------------------ ---- ---------------------------------------------- ---- ---------------
bool AList::Insert(const Data amp; x, int place=1) //Inserta un elemento en el matriz
{
if (num==MAX_SIZE) // si la matriz está llena
return false;
if(( placelt;=0)| |(placegt;num 1))
return false;
for(int i=num;igt;=place-1;--i)
arr[i 1]=arr[i];
arr[place-1]=x;
num;
retorno verdadero;
}
//------------------------------- -------------- ------------------------------------ -------------- ------
bool AList::Remove(int place) //Elimina un elemento de la matriz
{
if((placelt;=0 )||(placegt;num 1))
return false;
for(int i=place- 1;ilt;num; i)
arr [i]=arr[i 1];
--num;
devuelve verdadero;
}
//-- ---------------------------------- ---------------- ---------------------------------- -----
int AList:: Find(const Data amp;x) //La matriz encuentra un elemento<
/p>
{
int i=0;
while((ilt; num)amp; amp; (arr[i]!=x)) i;
if (i==num) i=-1; // llegamos al final del array
return i 1;
}
//---------------------------------------------------- -------------- ------------------------------------ ---- p>
bool AList::Get(int place, Data amp; ret) //Obtener el valor del elemento
{
if((placelt ;=0)||( placegt;num 1))
devuelve falso;
ret = arr[lugar-1];
devuelve verdadero;
}
//---------------------------------- ------- ------------------------------------------- -------
void AList::Print()const //Matriz de salida
{
coutlt;lt;"head";
for (int i=0; ilt; num; i) coutlt; "-gt; "lt; arr[i];
retorno;
}
//------------------------ ---------- ---------------------------------------- ---------- ----------
bool UStack::Push(const Data amp; dat) //Operación de inserción
{
return stk-gt; Insert(dat, stk-gt; Tamaño()
}
//------ --------- ----------------------------------------- ---------
bool UStack::Top(Data amp; ret)const //Operación superior de la pila
{
int n =stk-gt;Tamaño();
si (nlt;=0) devuelve falso;
(void)stk-gt; Get(n, ret);
devuelve verdadero;
>}
//-------------------------- ------------- -----------------------
bool UStack::Pop(Datos amp; ret) //Operación pop
{
int n=stk-gt;Size();
if (nlt;=0) return false ;
(nulo)st
k-gt; Obtener(n, ret);
(void)stk-gt; Eliminar(n);
devolver verdadero; p>
//------------------------------------------- -- ------------------
// todas las funciones de prueba devuelven falso si una de las pruebas falla o verdadero si todas las pruebas tuvieron éxito p>
// la función informa fallas al dispositivo de salida de errores estándar
bool Test_insert (Kind k) //Inserción de prueba
{
bool res = true;
UList *tmp=init_list(k);
if (!tmp-gt;Insert(5,1))
{
cerr lt; "Error al insertar la prueba número 1: insertar en un número de celda válido" lt; > }
else
cout lt; lt; "Éxito en la prueba de inserción n.° 1: insertar en un número de celda válido" lt; > if (tmp-gt;Insert(3, tmp-gt;Size() 2))
{
cerr lt;lt; "Error en la prueba de inserción n.° 2 - insertar en el número de celda superior" lt; lt; endl;
res = false;
}
else
cout lt; lt ; "Exito en la prueba de inserción n.° 2: insertar en el número de celda superior" lt;
if (tmp-gt; Insert(3, 0))
{ p>
cerr lt; "Error al insertar la prueba número 3: insertar en el número de celda inferior" lt; > }
else
cout lt; lt; "Éxito en la prueba de inserción n.° 3: insertar en el número de celda inferior" lt; if ( k==Array)
{
bool ares=true
for(int i=0; ilt; AList:: MAX_SIZE 1; i )
{
un
res=tmp-gt;Insertar(i, 1);
}
if (ares)
{
cerr lt; lt; "Error en la prueba de inserción n.º 4: la matriz está llena" lt;
res = false
}
else; p>
cout lt;lt; "Exito en la prueba de inserción n.º 4: la matriz está llena" lt;lt; endl;
}
return res;
}
//------------------------------------ --------- ----------------------------------------- --------- -----
bool Test_remove (Tipo k) //Eliminación de prueba
{
bool res = true ;
UList *tmp=init_list(k);
for (int i=0; ilt; 10; i) // llenando la lista
{
(void )tmp-gt;Insert(i, 1);
}
if (!tmp-gt;Remove(5)) p>
{
cerr lt; lt; "Error al eliminar la prueba número 1 - eliminar del número de celda válido" lt;
res = false;
}
else
cout lt; "Exito en Eliminar prueba número 1 - eliminar del número de celda válido" lt; /p>
if (tmp -gt; Remove(12))
{
cerr lt; "Error en la prueba de eliminación n.° 2: eliminar de la celda superior número" lt; lt; endl;
res = false;
}
else
cout lt; lt; "Éxito en Eliminar prueba n.° 2: eliminar del número de celda superior" lt; lt; endl;
if (tmp-gt; Remove(0))
{
cerr lt; "Error en la prueba de eliminación n.º 3: eliminar del número de celda inferior" lt;
res = false;
else
cout lt;lt; "Exito en la prueba de eliminación n.° 3 - remo
ve desde el número de celda inferior" lt; lt; endl;
return res;
}
//----------- -------------------------------------------------- ----------------------------------
bool Test_push (Tipo k) //Prueba push
p>{
bool res = true;
UStack *tmp = new UStack(k); tmp-gt; Push (7))
{
cerr lt; "Error en la prueba de Push n.º 1 - Push normal" lt; >
res = false;
}
else
cout lt; "Éxito en la prueba de empuje n.° 1 - Empuje normal" lt; lt; endl;
if (k==Array)
{
bool ares=true
for(int i= 0; ilt; AList ::MAX_SIZE 1; i)
{
ares=tmp-gt;
}
if (ares)
{
cerr lt; "Error en la prueba de inserción n.º 2: la matriz está llena" lt;
res = false;
}
else
cout lt; "Éxito en la prueba Push n.º 2: la matriz está llena" lt; lt; endl;
}
devolver res;
}
//----------- ----- --------------------------------------------- ----- -----------------------
bool Test_pop (Tipo k) //Prueba emergente
{
bool res = true;
UStack *tmp = new UStack(k);
Datos ret; >
(void)tmp-gt;Push(2);
if (!tmp-gt;Pop(ret))
{
cerr lt; "Fallo en la prueba Pop n.° 1 - Pop normal" lt;
res = false;
cout lt; "Éxito en la prueba Pop
no. 1 - Pop normal" lt;lt; endl;
if (tmp-gt;Pop(ret))
{
cerr lt;lt ; "Error en la prueba Pop nº 2 - Pop de la pila vacía" lt; endl; p>
cout lt; lt; "Éxito en la prueba Pop n.° 2 - Pop de la pila vacía" lt;
return res; p>
//------------------------------------------- ------------------------------------------------
int main()
{
while (1) //Múltiples bucles
{
int ch ;
Tipo k;
coutlt;lt;"elegir Tipo"lt;lt;endllt;lt;"1. Matriz"lt;lt;endllt;lt;"2. Punteros "lt;lt;
endllt;lt;"cualquier otro número para salir"lt;lt;endl;
cingt;gt;ch;
switch(ch){ //Seleccione tipo
caso 1: //
k=Array //
break;
caso 2: //
k=Punteros; //
break; //
predeterminado: //
coutlt ;lt; "adiós"lt;endl; //
salida(0); //
} //
coutlt;lt; ; "elegir prueba"lt;lt;endllt;lt;"1. insertar (LISTA)"lt;lt;endllt;lt;"2. eliminar (LISTA)"lt;lt;endl
lt ; lt;"3. push (STACK)"lt;lt;endllt;lt;"4. pop (STACK)"lt;lt;endllt;lt;"cualquier otro número para salir"lt;lt;endl;< / p>
cingt; ch;
cambiar(ch){
caso 1:
if(Test_insert(k)) p >
coutlt;lt;endllt;lt;"insertar prueba exitosa"lt;lt;endl; //Inserción de prueba
bre
ak;
caso 2:
if(Test_remove(k))
coutlt;lt;endllt;lt;"eliminar prueba exitosa"lt;lt; endl; //Prueba de eliminación
break;
caso 3:
if(Test_push(k))
coutlt;lt; endllt;lt;"push test seccessful"lt;lt;endl; //Prueba push en la pila
break;
caso 4:
if( Test_pop( k))
coutlt;lt;endllt;lt;"prueba pop exitosa"lt;lt;endl; //Prueba emergente
break;
predeterminado:
coutlt;lt;"adiós"lt;lt;endl;
salida(0);
}
cout lt ;lt; endl lt;lt; endl;
}
devuelve 0;
}