PRACTICA 4:
PRACTICA 4: PUNTEROS(IIPUNTEROS(II)) EJERCICIO GUIADOS
EJERCICIO GUIADOS Ejercicio 1
Ejercicio 1
En este ejercicio se va a implementar un programa que permite al usuario introducir un En este ejercicio se va a implementar un programa que permite al usuario introducir un número determinado de palabras y da como resultado la impresión de las palabras por número determinado de palabras y da como resultado la impresión de las palabras por consola ordenadas de forma descendente. Para ello se va a utilizar la función
consola ordenadas de forma descendente. Para ello se va a utilizar la función strcmp(char*, strcmp(char*, char*)
char*) de la librería estándar del C++ que permite comparar dos cadenas de caracteres.de la librería estándar del C++ que permite comparar dos cadenas de caracteres.
Dicha función está declarada en el fichero
Dicha función está declarada en el fichero string.h string.h..
Escribir el siguiente código:
Escribir el siguiente código:
#include <iostream.h>
#include <iostream.h>
#include <string.h>
#include <string.h>
void
void Ordena(Ordena(charchar **,**, intint););
void
void ImprimePalabras(ImprimePalabras(charchar **,**, intint););
char
char** ReservayPide(** ReservayPide(intint););
void
void Libera(Libera( charchar **,**, intint););
void
void main( main(voidvoid)) {
{ char
char **palabras;**palabras;
int int num;num;
cout <<
cout << "Numero de palabras:""Numero de palabras:";; cin >> num;
cin >> num;
palabras = ReservayPide(num);
palabras = ReservayPide(num);
cout <<
cout << "Palabras Introducidas: ""Palabras Introducidas: " << endl;<< endl;
ImprimePalabras(palabras,num);
ImprimePalabras(palabras,num);
Ordena(palabras,num);
Ordena(palabras,num);
cout <<
cout << "Palabras Ordenadas: ""Palabras Ordenadas: " << endl;<< endl;
ImprimePalabras(palabras,num);
ImprimePalabras(palabras,num);
} } char
char** ReservayPide(** ReservayPide(intint num)num) {
{ char
char tmp[120];tmp[120];
char
char **words;**words;
words =
words = new charnew char*[num];*[num];
for
for ((intint i=0;i<num;i++){i=0;i<num;i++){
cout <<
cout << "Introduce la ""Introduce la " << i+1 <<<< i+1 << " palabra:"" palabra:";; cin >> tmp;
cin >> tmp;
words[i] =
words[i] = new charnew char[ strlen(tmp)+1 ];[ strlen(tmp)+1 ];
strcpy( words[i], tmp);
strcpy( words[i], tmp);
} } return
return words;words; //devuelve matriz//devuelve matriz }
} void
void Ordena(Ordena(charchar **words,**words, intint num)num) {
{ for
for ((intint i=0;i<num-1;i++){i=0;i<num-1;i++){
Laboratorio de Programación II. Grupo A Laboratorio de Programación II. Grupo A 3
3 for
for ((intint j=i+1;j<num;j++){j=i+1;j<num;j++){
if
if ( strcmp( words[i], words[j]) < 0) {( strcmp( words[i], words[j]) < 0) { //al cambiar hay que destruir los vectores //al cambiar hay que destruir los vectores int
int len1 = strlen(words[i]);len1 = strlen(words[i]);
int
int len2 = strlen(words[j]);len2 = strlen(words[j]);
char
char *tmp1 =*tmp1 = new charnew char[len1 +1];[len1 +1];
char
char *tmp2 =*tmp2 = new charnew char[len2 +1];[len2 +1];
strcpy(tmp1,words[i]);
strcpy(tmp1,words[i]); //copiar antes de borrar//copiar antes de borrar strcpy(tmp2,words[j]);
strcpy(tmp2,words[j]);
delete [] words[i];
delete [] words[i]; //eliminar vectores//eliminar vectores delete [] words[j];
delete [] words[j];
words[i] =
words[i] = new charnew char[len2+1];[len2+1]; //nuevos vectores//nuevos vectores words[j] =
words[j] = new charnew char[len1+1];[len1+1];
strcpy(words[i],tmp2);
strcpy(words[i],tmp2); //Permutar las cadenas//Permutar las cadenas strcpy(words[j],tmp1);
strcpy(words[j],tmp1);
delete [] tmp1;
delete [] tmp1; //eliminar vectores temporales//eliminar vectores temporales delete [] tmp2;
delete [] tmp2;
} } } } } } } } void
void ImprimePalabras(ImprimePalabras(charchar ** words,** words, intint Num)Num) {
{ for
for ((intint i=0;i<Num;i++){i=0;i<Num;i++){
cout <<
cout << "\t""\t" << words[i] << endl;<< words[i] << endl;
} } } } void
void Libera(Libera( charchar **words,**words, intint Num)Num) {
{ for
for ((intint i=0;i<Num;i++) delete [] words[i];i=0;i<Num;i++) delete [] words[i];
delete [] words;
delete [] words;
} }
Como se puede ver en el código del programa , se aprovechan las ventajas de las funciones Como se puede ver en el código del programa , se aprovechan las ventajas de las funciones para dar mudularidad al ejercicio, con lo cual se logra que la función principal
para dar mudularidad al ejercicio, con lo cual se logra que la función principal main() main()tengatenga poco código, sólo incluye las llamadas a las funciones. Se han creado 4 funciones:
poco código, sólo incluye las llamadas a las funciones. Se han creado 4 funciones:
1. Función
1. Función char** ReservayPide(int num) char** ReservayPide(int num): Esta función reserva memoria para almacenar : Esta función reserva memoria para almacenar las cadenas y pide al mismo tiempo los datos de cada palabra. Devuelve el vector de las cadenas y pide al mismo tiempo los datos de cada palabra. Devuelve el vector de cadenas.
cadenas.
2. Función
2. Función Ordena(char **, int)Ordena(char **, int): Esta función se encarga de ordenar de forma descendente: Esta función se encarga de ordenar de forma descendente las palabras que hay en el vector de cadenas. Para ello utiliza la función strcmp(...). Notar las palabras que hay en el vector de cadenas. Para ello utiliza la función strcmp(...). Notar que si hay que cambiar las palabras, se deben copiar las cadenas primero, luego borrar el que si hay que cambiar las palabras, se deben copiar las cadenas primero, luego borrar el espacio que cada cadena ocupa (esto debido a que la longitud de las cadenas pueden ser espacio que cada cadena ocupa (esto debido a que la longitud de las cadenas pueden ser diferentes). Finalmente se reserva nuevamente memoria para almacenar las cadenas diferentes). Finalmente se reserva nuevamente memoria para almacenar las cadenas cambiadas.
cambiadas.
3. Funcion
3. Funcion Imprime(char **, int) Imprime(char **, int): Se encarga de imprimir a la consola las cadenas que hay: Se encarga de imprimir a la consola las cadenas que hay en el vector.
en el vector.
4. Función
4. Función Libera(char **, int) Libera(char **, int): Su función es liberar la memoria utilizada.: Su función es liberar la memoria utilizada.
Ejercicio 2 Ejercicio 2
Para reservar memoria dinámica para matrices se
Para reservar memoria dinámica para matrices se siguen los siguientes pasos:siguen los siguientes pasos:
a. Se crea un puntero a
a. Se crea un puntero a punteros del tipo de datos:punteros del tipo de datos: float **datos; float **datos;
b. Se reserva memoria para el array de
b. Se reserva memoria para el array de filas:filas: datos = new float*[fil]; datos = new float*[fil];
c. Se hace un bucle para
c. Se hace un bucle para reservar memoria parareservar memoria para col col columnas de cada fila:columnas de cada fila:
for (int i=0;i<fil;i++) datos[i] = new
for (int i=0;i<fil;i++) datos[i] = new float[col];float[col];
d. Creada la matriz, se puede trabajar con
d. Creada la matriz, se puede trabajar con ella con los índices y los corchetes [].ella con los índices y los corchetes [].
e. Finalmente, se debe hacer otro bucle para liberar la memoria de cada fila y la asignada al e. Finalmente, se debe hacer otro bucle para liberar la memoria de cada fila y la asignada al vector de filas.
vector de filas.
En el siguiente ejemplo se ve cómo asignar memoria a una matriz de
En el siguiente ejemplo se ve cómo asignar memoria a una matriz de fil fil x x col col ::
{ {int
int fil = 8;fil = 8; //numero de filas//numero de filas int
int col = 5;col = 5; //numero de columnas//numero de columnas float
float **datos;**datos;
datos =
datos = new floatnew float*[fil];*[fil]; //vector filas//vector filas
//reserva memoria para las columnas de cada fila //reserva memoria para las columnas de cada fila for
for ((intint i=0;i<fil;i++)i=0;i<fil;i++) datos[i] =
datos[i] = new floatnew float[col];[col];
//ya puedes usar la matriz //ya puedes usar la matriz for
for ((intint f=0;f<fil;f++)f=0;f<fil;f++) for
for ((intint c=0;c<col;c++) datos[f][c] = (c=0;c<col;c++) datos[f][c] = (floatfloat)rand()/RAND_MAX;)rand()/RAND_MAX;
//imprime los valores //imprime los valores for
for ( f=0;f<fil;f++){( f=0;f<fil;f++){
for
for ((intint c=0;c<col;c++) {c=0;c<col;c++) { cout << f <<
cout << f << ",""," << c <<<< c << ":"":"<<datos[f][c]<<<<datos[f][c]<< " "" ";; }
}
cout <<endl;
cout <<endl;
} }
//liberar memoria //liberar memoria for
for (f=0;f<fil;f++) delete datos[f];(f=0;f<fil;f++) delete datos[f]; //libera filas//libera filas delete [] datos;
delete [] datos; //libera vector//libera vector }
}
Ejercicio 3 Ejercicio 3
En este ejercicio se va a crear un
En este ejercicio se va a crear un programa capaz de leer desde el teclado un conjunto de frases,programa capaz de leer desde el teclado un conjunto de frases, almacenarlas en un "
almacenarlas en un "vector de punteros a caracteresvector de punteros a caracteres". Cada letra (". Cada letra ( char char) es "tratado como si) es "tratado como si fuera un número" (una casilla) y por lo tanto almacenar una frase se asemeja a almacenar una fuera un número" (una casilla) y por lo tanto almacenar una frase se asemeja a almacenar una fila de una matriz. Por lo tanto se necesita un doble puntero (
fila de una matriz. Por lo tanto se necesita un doble puntero ( char **pfrases char **pfrases) para poder ) para poder almacenar un conjunto de frases o palabras. En esta "matriz de letras" el número de columnas almacenar un conjunto de frases o palabras. En esta "matriz de letras" el número de columnas puede variar para cada fila (es
puede variar para cada fila (es strlen(frase)+1 strlen(frase)+1). Utilizando una única llamada a la función). Utilizando una única llamada a la función strcpy()
strcpy() es posible rellenar una fila completa de dichaes posible rellenar una fila completa de dicha matriz de caracteres matriz de caracteres. Para utilizar dicha. Para utilizar dicha función es necesario incluir el fichero
función es necesario incluir el fichero string.h string.h..
// fichero frases.cpp // fichero frases.cpp
#include <iostream.h>
#include <iostream.h>
#include <string.h>
#include <string.h>
#include <stdio.h>
#include <stdio.h> //para gets()//para gets() void
void main(main(voidvoid)) {
{ char
char frase[120];frase[120];
char
char** pfrases;** pfrases;
int
int NumFrases;NumFrases;
cout <<
cout << "Cuantas frases desea almacenar:""Cuantas frases desea almacenar:";; cin >> NumFrases;
cin >> NumFrases;
pfrases =
pfrases = new charnew char*[NumFrases];*[NumFrases]; //Espacio para NumFrases//Espacio para NumFrases //pedir datos
//pedir datos for
for ((intint i=0;i<NumFrases;i++) {i=0;i<NumFrases;i++) { cout <<
cout << "Escriba la frase ""Escriba la frase " << i+1 <<<< i+1 << ":"":" << flush;<< flush;
gets(frase);
gets(frase);
// +1 porque strlen no guarda para el '\0' // +1 porque strlen no guarda para el '\0' pfrases[i] =
pfrases[i] = new charnew char[strlen(frase)+1];[strlen(frase)+1];
strcpy(pfrases[i], frase);
strcpy(pfrases[i], frase);
} }
//sacar datos por consola //sacar datos por consola for
for (i=0;i<NumFrases;i++)(i=0;i<NumFrases;i++) cout <<
cout << "Frase ""Frase " << i+1 <<<< i+1 << ":"":" << pfrases[i] << endl;<< pfrases[i] << endl;
//liberar memoria //liberar memoria for
for (i=0;i<NumFrases;i++) delete pfrases[i];(i=0;i<NumFrases;i++) delete pfrases[i];
delete [] pfrases;
delete [] pfrases;
} }
EJERCICIO PROPUESTOS EJERCICIO PROPUESTOS Ejercicio 1
Ejercicio 1
Se pide crear un programa que haciendo uso de la reserva dinámica de memoria almacene un Se pide crear un programa que haciendo uso de la reserva dinámica de memoria almacene un número determinado de valores (obtenidos de forma aleatoria, entre 0 y 100) y los ordene de número determinado de valores (obtenidos de forma aleatoria, entre 0 y 100) y los ordene de mayor a menor. El código para obtener los números y para la reserva dinámica de memoria es mayor a menor. El código para obtener los números y para la reserva dinámica de memoria es dado, y el
dado, y el resto debe ser resto debe ser implemeimplementado.ntado.
//fichero ordena.cpp //fichero ordena.cpp
// ordena usando memoria dinamica // ordena usando memoria dinamica
#include <iostream.h>
#include <iostream.h>
#include <stdlib.h>
#include <stdlib.h> //para rand()//para rand() void
void main(main(voidvoid)) {
{int
int Num;Num; //Numero de datos//Numero de datos int
int *datos;*datos; //puntero a int//puntero a int cout <<
cout << "Cuantos numeros deseas generar:""Cuantos numeros deseas generar:";; cin >> Num;
cin >> Num;
//asignacion de memoria //asignacion de memoria datos =
datos = new intnew int[Num];[Num];
if
if (datos == NULL) cout <<(datos == NULL) cout << "Error""Error";; //Llenar el vector
//Llenar el vector for
for ((intint i=0;i<Num;i++){i=0;i<Num;i++){
datos[i] = rand() * 100 /
datos[i] = rand() * 100 / RAND_MAX;RAND_MAX;
} }
//ordena los datos -> Hacer aquí el
//ordena los datos -> Hacer aquí el algoritmoalgoritmo . . .
. . . . . . . . .
//imprime los datos ordenados //imprime los datos ordenados for
for (i=0;i<Num;i++) cout << i <<(i=0;i<Num;i++) cout << i << ":"":" << datos[i] <<endl;<< datos[i] <<endl;
//liberar memoria //liberar memoria delete [] datos;
delete [] datos;
} }
Ejercicio 2 Ejercicio 2
Se pide crear un programa que pida una serie de números al usuario y halle el máximo, el Se pide crear un programa que pida una serie de números al usuario y halle el máximo, el mínimo y la media aritmética de ellos. Para ello se debe crear una variable puntero tipo mínimo y la media aritmética de ellos. Para ello se debe crear una variable puntero tipo float
float , pedir al usuario que introduzca el número de datos, y después los datos a calcular., pedir al usuario que introduzca el número de datos, y después los datos a calcular.
Recordar que se debe reservar memoria de forma dinámica para almacenar el vector de Recordar que se debe reservar memoria de forma dinámica para almacenar el vector de dato. La salida del programa debe ser algo así:
dato. La salida del programa debe ser algo así:
Numero de datos: 10 Numero de datos: 10 Máximo: 25
Máximo: 25 Minimo: 4 Minimo: 4
Media Aritmética: 14.6 Media Aritmética: 14.6
Ejercicio 3 Ejercicio 3
Basándose en el ejercicio 2) guiado, se pide realizar un programa que calcule el producto de Basándose en el ejercicio 2) guiado, se pide realizar un programa que calcule el producto de dos matrices MatA y MatB con asignación dinámica de memo
dos matrices MatA y MatB con asignación dinámica de memoria. Los pasos a ria. Los pasos a seguir son:seguir son:
1- Crear dos punteros a punteros.
1- Crear dos punteros a punteros.
2- Pedir por teclado las dimensiones de la matriz
2- Pedir por teclado las dimensiones de la matriz MatAMatA(filas y columnas).(filas y columnas).
3- Pedir por teclado sólo las columnas de la matriz
3- Pedir por teclado sólo las columnas de la matriz MatBMatB, ya que las , ya que las filas tienen que ser filas tienen que ser igual a las columnas de
igual a las columnas de MatAMatA para la para la multiplicacimultiplicación.ón.
4- Realizar la reserva
4- Realizar la reserva dinámica de memoria, usando el operador dinámica de memoria, usando el operador new. new.
5- Pedir los datos de las dos
5- Pedir los datos de las dos matricesmatricesMatAMatAyyMatBMatB..
6- Realizar la
6- Realizar la multiplicmultiplicación en dos buclesación en dos bucles for for anidados.anidados.
Ejercicio 4 Ejercicio 4
En este ejercicio se va evaluar un
En este ejercicio se va evaluar un polinomio de cualquier grado polinomio de cualquier grado::
P(X)=a
P(X)=a
00+a +a
11x+a x+a
22x x
22+a +a
33x x
33+ +
……+a +a
nnx x
nnComo en un principio no se sabe de qué grado va a ser este polinomio, se debe crear una Como en un principio no se sabe de qué grado va a ser este polinomio, se debe crear una variable puntero del tipo double:
variable puntero del tipo double:
double *
double *coeficientes;coeficientes;
A continuación se debe pedir el
A continuación se debe pedir el grado grado del polinomio y reservar memoria para el array dedel polinomio y reservar memoria para el array de coeficientes (utilizando el operador
coeficientes (utilizando el operador new new). Luego, a través de un bucle se empezará a pedir ). Luego, a través de un bucle se empezará a pedir los coeficientes del polinomio. Finalmente se
los coeficientes del polinomio. Finalmente se debe pedir el punto (x) debe pedir el punto (x) en el que se va aen el que se va a evaluar el polinomio, cuyo resultado se sacará por la consola. También se debe sacar por la evaluar el polinomio, cuyo resultado se sacará por la consola. También se debe sacar por la consola el polinomio que se ha evaluado.
consola el polinomio que se ha evaluado.
La entrada y salida de datos por la consola podría ser:
La entrada y salida de datos por la consola podría ser:
>> Introduce el numero de coeficientes:
>> Introduce el numero de coeficientes: 22
>> Introduce el coeficiente 1:
>> Introduce el coeficiente 1: 2.52.5
>> Introduce el coeficiente 2:
>> Introduce el coeficiente 2: 3.53.5
>> Introduce el valor de x:
>> Introduce el valor de x: 2.02.0
>> El polinomio es:
>> El polinomio es: 2.5*X^0 + 3.5*X^12.5*X^0 + 3.5*X^1
>> El valor del polinomio en el punto
>> El valor del polinomio en el punto 2.02.0 eses 9.59.5
Ejercicio 5 Ejercicio 5
Este ejercicio consiste en implementar un algoritmo para el cálculo de la integral definida Este ejercicio consiste en implementar un algoritmo para el cálculo de la integral definida de un polinomio entre dos puntos (A y B) dados. El
de un polinomio entre dos puntos (A y B) dados. El polinomio debe ser de cualquier polinomio debe ser de cualquier grado
grado::
P(X)=a
P(X)=a
00+a +a
11x+a x+a
22x x
22+a +a
33x x
33+ +
……+a +a
nnx x
nnLos pasos a seguir son:
Los pasos a seguir son:
1. Pedir el grado del polinomio.
1. Pedir el grado del polinomio.
2. Crear un
2. Crear un array array de tipode tipo double double para albergar el polinomio (utilizar para albergar el polinomio (utilizar new new).).
3. Pedir los coeficientes del polinomio.
3. Pedir los coeficientes del polinomio.
4. Pedir los puntos A y B pa
4. Pedir los puntos A y B para evaluar la integral (A < B).ra evaluar la integral (A < B).
5. Pedir el número de subintervalos “ 5. Pedir el número de subintervalos “ n n”.”.
6. Sacar el valor de la integral por consola.
6. Sacar el valor de la integral por consola.
El algoritmo se basa en la división del intervalo (A, B de la figura ) en
El algoritmo se basa en la división del intervalo (A, B de la figura ) en n nsubintervalos,subintervalos, sumando las áreas de éstos. Si los
sumando las áreas de éstos. Si los subintervalos son lo suficientemente pequeños el área desubintervalos son lo suficientemente pequeños el área de cada subintervalo se puede aproximar al área de un trapecio. En definitiva, la integral se cada subintervalo se puede aproximar al área de un trapecio. En definitiva, la integral se puede aproximar como:
puede aproximar como:
∫ ∫
a a
b b
x x f
f (( ))≈≈
∑ ∑
((f(x((f(xii)+f(x)+f(xi+1i+1)/2)*(x)/2)*(xi+1i+1-x-xii))))Ejercicio 6 Ejercicio 6
Este ejercicio consiste en hacer un programa que cuente cuantas veces se repiten las vocales Este ejercicio consiste en hacer un programa que cuente cuantas veces se repiten las vocales (se deben contar las mayúsculas y las minúsculas)en un texto dado por el usuario. La (se deben contar las mayúsculas y las minúsculas)en un texto dado por el usuario. La estructura del programa debe ser la siguiente:
estructura del programa debe ser la siguiente:
#include
#include <iostream.h><iostream.h>
#include
#include <string.h><string.h>
char
char *PideTexto();*PideTexto();
void
void ContarVocales(charContarVocales(char *,*, intint []);[]);
void
void Imprime(intImprime(int []);[]);
void
void main()main() {
{
char
char *texto;*texto;
int
int Num[5];Num[5];
texto = PideTexto();
texto = PideTexto();
ContarVocales(texto,Num);
ContarVocales(texto,Num);
Imprime(Num);
Imprime(Num);
delete
delete [] texto;[] texto; //libera memoria//libera memoria }
}
A continuación se explican cada una de las funciones llamadas desde
A continuación se explican cada una de las funciones llamadas desdemainmain::
1.La función
1.La función PideTexto PideTexto devuelve un puntero a la cadena que el usuario ha escrito.devuelve un puntero a la cadena que el usuario ha escrito.
2.La función
2.La función ContarVocalesContarVocales recibe elrecibe el arrayarray que contiene el texto y otro array de enteros,que contiene el texto y otro array de enteros, en el cual va a devolver cuantas veces se repite cada una de las vocales, es decir, en en el cual va a devolver cuantas veces se repite cada una de las vocales, es decir, en Num[0] vendrán las veces que se repite la vocal
Num[0] vendrán las veces que se repite la vocalaa , en Num[1] la vocal, en Num[1] la vocal ee y asíy así sucesivamente.
sucesivamente.
3.La función
3.La función Imprime Imprime recibe elrecibe el arrayarray de enteros e imprime en la consola lo que hade enteros e imprime en la consola lo que ha encontrado.
encontrado.
ENTREGA DE LOS EJERCICIOS ENTREGA DE LOS EJERCICIOS
La forma de entregar la práctica será a través de la asignatura virtualizada en el campus virtual. En la La forma de entregar la práctica será a través de la asignatura virtualizada en el campus virtual. En la asignatura virtualizada verás una serie de enlaces, entre ellos, hay uno titulado como prácticas. Navega sobre asignatura virtualizada verás una serie de enlaces, entre ellos, hay uno titulado como prácticas. Navega sobre dicho enlace, y verás que hay un grupo con los apellidos de los integrantes de los grupos. Dicho grupo de dicho enlace, y verás que hay un grupo con los apellidos de los integrantes de los grupos. Dicho grupo de trabajo tiene asociado una carpeta sobre la que puedes subir , eliminar o editar archivos(Accedes usando trabajo tiene asociado una carpeta sobre la que puedes subir , eliminar o editar archivos(Accedes usando Editar Archivos). Zippea el trabajo correspondiente, y dentro del zip incluye un archivo de texto en que Editar Archivos). Zippea el trabajo correspondiente, y dentro del zip incluye un archivo de texto en que aparezcan los nombres de los que formáis el grupo. Etiqueta el archivo zip con el nombre aparezcan los nombres de los que formáis el grupo. Etiqueta el archivo zip con el nombre LabnApellidoApellido.zip. Por ejemplo si Juan Martínez Martin y Silvia Pérez García están en el laboratorio LabnApellidoApellido.zip. Por ejemplo si Juan Martínez Martin y Silvia Pérez García están en el laboratorio 1, y
1, y forman forman un un grupo etiquetgrupo etiquetan su an su zip como zip como Lab1MartinezPerez.Lab1MartinezPerez.zip. A zip. A continuación continuación usa la usa la opción cargar opción cargar que hay en la parte derecha del área donde te encuentras, y te permitirá subir archivos desde tu disco duro.
que hay en la parte derecha del área donde te encuentras, y te permitirá subir archivos desde tu disco duro.
Almacénalo en la carpeta correspondiente al grupo al
Almacénalo en la carpeta correspondiente al grupo al que perteneces.que perteneces.
Tenéis de plazo para subir la correspondiente práctica 4 hasta este viernes día 3 de Noviembre. Acabado el Tenéis de plazo para subir la correspondiente práctica 4 hasta este viernes día 3 de Noviembre. Acabado el plazo no se podrán subir las prácticas, y se considerará como práctica no entregada. Si tienes alguna duda o plazo no se podrán subir las prácticas, y se considerará como práctica no entregada. Si tienes alguna duda o problema sobre el procedimiento de entrega no dudes
problema sobre el procedimiento de entrega no dudes en preguntar.en preguntar.